diff --git a/0324-Bugfix-replace-tmp-pattern-split.patch b/0323-Bugfix-replace-tmp-pattern-split.patch
similarity index 100%
rename from 0324-Bugfix-replace-tmp-pattern-split.patch
rename to 0323-Bugfix-replace-tmp-pattern-split.patch
diff --git a/0325-bugfix-fix-vector-costs-for-hip09.patch b/0324-bugfix-fix-vector-costs-for-hip09.patch
similarity index 100%
rename from 0325-bugfix-fix-vector-costs-for-hip09.patch
rename to 0324-bugfix-fix-vector-costs-for-hip09.patch
diff --git a/0326-gcc-opts-common.cc-Fix-build-with-clang.patch b/0325-gcc-opts-common.cc-Fix-build-with-clang.patch
similarity index 100%
rename from 0326-gcc-opts-common.cc-Fix-build-with-clang.patch
rename to 0325-gcc-opts-common.cc-Fix-build-with-clang.patch
diff --git a/0327-BUGFIX-Fix-build-error-on-risv_64.patch b/0326-BUGFIX-Fix-build-error-on-risv_64.patch
similarity index 99%
rename from 0327-BUGFIX-Fix-build-error-on-risv_64.patch
rename to 0326-BUGFIX-Fix-build-error-on-risv_64.patch
index 6d91eaa85fe9d3b2dba947575dea1e8678f370e7..f37493c9e9ec50686aebd03f9c85fb8ad321dc5e 100644
--- a/0327-BUGFIX-Fix-build-error-on-risv_64.patch
+++ b/0326-BUGFIX-Fix-build-error-on-risv_64.patch
@@ -67,401 +67,401 @@ index 000000000..c3d99dd85
--- /dev/null
+++ b/gcc/ai-optimizer.cc
@@ -0,0 +1,395 @@
-+/* Lightweight AI Inference Framework.
-+ Copyright (C) 2024-2024 Free Software Foundation, Inc.
-+This file is part of GCC.
-+GCC is free software; you can redistribute it and/or modify it under
-+the terms of the GNU General Public License as published by the Free
-+Software Foundation; either version 3, or (at your option) any later
-+version.
-+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
-+WARRANTY; without even the implied warranty of MERCHANTABILITY or
-+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-+for more details.
-+
-+You should have received a copy of the GNU General Public License
-+along with GCC; see the file COPYING3. If not see
-+. */
-+
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include
-+#include "config.h"
-+#include "system.h"
-+#include "ai4c-infer.h"
-+
-+#define M_OPTION_SIZE 11
-+#define M_MODE_SIZE 6
-+#define NATIVE_TUNE_SIZE 128
-+#define CATS_STRINGS_ROW 34
-+#define CATS_STRINGS_COL 65
-+#define CATS_STRINGS1_ROW 10
-+#define CATS_STRINGS1_COL 65
-+#define OFFSET_ROW 6
-+#define SCALE_ROW 6
-+#define UNITY_ROW 1
-+#define COEFFICIENT_ROW 356
-+#define COEFFICIENT_COL 10
-+#define COEFFICIENT1_ROW 10
-+#define COEFFICIENT1_COL 1
-+#define INTERCEPTS_ROW 10
-+#define INTERCEPTS1_ROW 1
-+
-+/* Intermediate computation results from the ONNX model. */
-+static char cats_strings[CATS_STRINGS_ROW][CATS_STRINGS_COL];
-+static char cats_strings1[CATS_STRINGS1_ROW][CATS_STRINGS1_COL];
-+static float offset[OFFSET_ROW];
-+static float scale[SCALE_ROW];
-+static float unity[UNITY_ROW];
-+static float coefficient[COEFFICIENT_ROW][COEFFICIENT_COL];
-+static float coefficient1[COEFFICIENT1_ROW][COEFFICIENT1_COL];
-+static float intercepts[INTERCEPTS_ROW];
-+static float intercepts1[INTERCEPTS1_ROW];
-+
-+/* Return an integer that represents the comparison result of the
-+ two strings. */
-+
-+static int
-+compare_strings (const void *a, const void *b)
-+{
-+ const char *str_a = *(const char **)a;
-+ const char *str_b = *(const char **)b;
-+
-+ int len = strlen (str_a) < strlen (str_b) ? strlen (str_a) : strlen (str_b);
-+ for (int i = 0; i < len; i++)
-+ {
-+ char c1 = str_a[i];
-+ char c2 = str_b[i];
-+ if (ISUPPER (c1) && !ISUPPER (c2))
-+ return 0;
-+ else if (!ISUPPER (c1) && ISUPPER (c2))
-+ return 1;
-+ else if (c1 != c2)
-+ return c1 < c2;
-+ }
-+ return strlen (str_a) > strlen (str_b);
-+}
-+
-+/* Return the substring before the first underscore ('_') in the input
-+ string. */
-+
-+static void
-+truncate_prefix (const char *str, char *result)
-+{
-+ const char *underscore_pos = strchr (str, '_');
-+ if (underscore_pos == NULL)
-+ {
-+ strcpy (result, str);
-+ return;
-+ }
-+
-+ size_t len = underscore_pos - str;
-+ strncpy (result, str, len + 1);
-+ result[len + 1] = '\0';
-+}
-+
-+
-+static void
-+preprocess (int argc1, const char **argv1, const char *mops,
-+ int argc2, int64_t *argv2, char (*in_options)[1024],
-+ int64_t *in_modes)
-+{
-+ strcpy (in_options[0], mops);
-+
-+ const char *output_option = "-o";
-+ const char *marco_prefix = "-D";
-+ const char *needle = "--param";
-+ const char *flag_prefix = "-";
-+ const char *default_option = "-default-option";
-+ const int default_int_val = 0;
-+ int m_size = 0;
-+ for (int i = 0; i < argc1; i++)
-+ {
-+ if (strncmp (argv1[i], marco_prefix, 2) == 0)
-+ m_size ++;
-+ }
-+
-+ char *m_options[m_size];
-+ char output_file[1024];
-+ int m_index = 0;
-+ for (int i = 0; i < argc1; i++)
-+ {
-+ if (strncmp (argv1[i], marco_prefix, 2) == 0)
-+ {
-+ m_options[m_index] = (char *)argv1[i];
-+ m_index ++;
-+ }
-+ if (strcmp (argv1[i], output_option) == 0)
-+ truncate_prefix (argv1[i + 1], output_file);
-+ }
-+
-+ strcpy (in_options[1], output_file);
-+ int in_options_size = 2;
-+ qsort (m_options, m_size, sizeof (m_options[0]), compare_strings);
-+ for (int i = 0; i < m_size && in_options_size < M_OPTION_SIZE; i++)
-+ {
-+ strcpy (in_options[in_options_size], m_options[i]);
-+ in_options_size ++;
-+ }
-+
-+ for (int i = 0; i < argc1 && in_options_size < M_OPTION_SIZE; i++)
-+ {
-+ if (strncmp (argv1[i], marco_prefix, 2) != 0
-+ && strcmp (argv1[i], output_option) != 0
-+ && strncmp (argv1[i], needle, 7) != 0
-+ && strncmp (argv1[i], flag_prefix, 1) == 0)
-+ {
-+ strcpy (in_options[in_options_size], argv1[i]);
-+ in_options_size ++;
-+ }
-+ }
-+
-+ while (in_options_size < M_OPTION_SIZE)
-+ {
-+ strcpy (in_options[in_options_size], default_option);
-+ in_options_size ++;
-+ }
-+
-+ /* Use sha256 to encrypt the input. */
-+ char hash[65];
-+ char input[64];
-+ for (int i = 0; i < M_OPTION_SIZE; i++)
-+ {
-+ execute_sha256 (in_options[i], hash, sizeof (hash));
-+ strcpy (in_options[i], hash);
-+ }
-+
-+ for (int i = 0; i < argc2 && i < M_MODE_SIZE; i++)
-+ {
-+ if (i < argc2)
-+ in_modes[i] = argv2[i];
-+ else
-+ in_modes[i] = default_int_val;
-+ }
-+}
-+
-+/* To read model parameter information from optimizer.fdata and store it into
-+ the appropriate arrays. */
-+
-+static void
-+fill_node (const char *file_name)
-+{
-+ FILE *file = fopen (file_name, "rb");
-+
-+ if (!file)
-+ {
-+ perror ("Can not open file.");
-+ return;
-+ }
-+
-+ /* Read cats_strings from optimizer.fdata. */
-+ char hex_string[2];
-+ for (int i = 0; i < CATS_STRINGS_ROW; i++)
-+ {
-+ for (int j = 0; j < CATS_STRINGS_COL - 1; j++)
-+ {
-+ if (fscanf (file, "%2s", hex_string) != 1)
-+ {
-+ perror ("Can not read cats_strings from optimizer.fdata.");
-+ return;
-+ }
-+ cats_strings[i][j] = (unsigned char) strtol(hex_string, NULL, 16);
-+ }
-+ cats_strings[i][CATS_STRINGS_COL - 1] = '\0';
-+ }
-+
-+ /* Read cats_strings1 from optimizer.fdata. */
-+ for (int i = 0; i < CATS_STRINGS1_ROW; i++)
-+ {
-+ for (int j = 0; j < CATS_STRINGS1_COL - 1; j++)
-+ {
-+ if (fscanf (file, "%2s", hex_string) != 1)
-+ {
-+ perror ("Can not read cats_strings1 from optimizer.fdata.");
-+ return;
-+ }
-+ cats_strings1[i][j] = (unsigned char) strtol(hex_string, NULL, 16);
-+ }
-+ cats_strings1[i][CATS_STRINGS1_COL - 1] = '\0';
-+ }
-+
-+ /* Read offset from optimizer.fdata. */
-+ for (int i = 0; i < OFFSET_ROW; i++)
-+ {
-+ float result = read_float_from_file (file);
-+ offset[i] = result;
-+ }
-+
-+
-+ /* Read scale from optimizer.fdata. */
-+ for (int i = 0; i < SCALE_ROW; i++)
-+ {
-+ float result = read_float_from_file (file);
-+ scale[i] = result;
-+ }
-+
-+ /* Read unity from optimizer.fdata. */
-+ for (int i = 0; i < UNITY_ROW; i++)
-+ {
-+ float result = read_float_from_file (file);
-+ unity[i] = result;
-+ }
-+
-+ /* Read coefficient from optimizer.fdata. */
-+ for (int i = 0; i < COEFFICIENT_ROW; i++)
-+ for (int j = 0; j < COEFFICIENT_COL; j++)
-+ {
-+ float result = read_float_from_file (file);
-+ coefficient[i][j] = result;
-+ }
-+
-+ /* Read coefficient1 from optimizer.fdata. */
-+ for (int i = 0; i < COEFFICIENT1_ROW; i++)
-+ for (int j = 0; j < COEFFICIENT1_COL; j++)
-+ {
-+ float result = read_float_from_file (file);
-+ coefficient1[i][j] = result;
-+ }
-+
-+ /* Read intercepts from optimizer.fdata. */
-+ for (int i = 0; i < INTERCEPTS_ROW; i++)
-+ {
-+ float result = read_float_from_file (file);
-+ intercepts[i] = result;
-+ }
-+
-+ /* Read intercepts1 from optimizer.fdata. */
-+ for (int i = 0; i < INTERCEPTS1_ROW; i++)
-+ {
-+ float result = read_float_from_file (file);
-+ intercepts1[i] = result;
-+ }
-+
-+ fclose (file);
-+ return;
-+}
-+
-+/* The process of model inference. */
-+
-+static int
-+graph_infer (int argc1, const char **argv1, const char *mops,
-+ int argc2, int64_t *argv2)
-+{
-+ char *gcc_exec_prefix = getenv ("ONNX_FDATA_PATH");
-+ if (gcc_exec_prefix == NULL)
-+ return 0;
-+ char native_file[512];
-+
-+ if (gcc_exec_prefix)
-+ {
-+ const char *onnx_fdata = "optimizer.fdata";
-+ strncpy (native_file, gcc_exec_prefix, sizeof (native_file) - 1);
-+ native_file[sizeof (native_file) - 1] = '\0';
-+ char *last_slash = strrchr (native_file, '/');
-+ if (last_slash)
-+ strcpy (last_slash + 1, onnx_fdata);
-+ }
-+
-+ if (access (native_file, F_OK) == 0)
-+ fill_node (native_file);
-+ else
-+ return 0;
-+
-+ static int64_t in_modes[M_MODE_SIZE];
-+ static char in_options[M_OPTION_SIZE][1024];
-+
-+ preprocess (argc1, argv1, mops, argc2, argv2, in_options, in_modes);
-+
-+ /* concat_result and encoder_out are intermediate computation results from
-+ the ONNX model. concat_result is a 1 × 18 matrix, and encoder_out is a
-+ 1 × 12 matrix. */
-+
-+ const int concat_out_size = 350;
-+ float concat_result[concat_out_size];
-+ const int encoder_out_size = 34;
-+ const int encoder_last_size = 10;
-+ int concat_size = 0;
-+ const int size = encoder_out_size;
-+
-+ for (int i = 1; i < M_OPTION_SIZE; i++)
-+ {
-+ float encoder_out[size];
-+ one_hot_encoder (in_options[i], cats_strings, encoder_out, size);
-+ line_concat (encoder_out, size, concat_result, concat_size);
-+ concat_size += size;
-+ }
-+
-+ float encoder_out2[encoder_last_size];
-+ one_hot_encoder (in_options[0], cats_strings1, encoder_out2,
-+ encoder_last_size);
-+ line_concat (encoder_out2, encoder_last_size, concat_result, concat_size);
-+ concat_size += encoder_last_size;
-+
-+ float variable[M_MODE_SIZE];
-+ imputer (in_modes, M_MODE_SIZE, variable);
-+ float variable1[M_MODE_SIZE];
-+ scaler (variable, offset, scale, M_MODE_SIZE, variable1);
-+
-+ float transformed_column[concat_out_size + M_MODE_SIZE];
-+ /* line_concat is used to stro*/
-+ line_concat (variable1, M_MODE_SIZE, transformed_column, 0);
-+ line_concat (concat_result, concat_out_size, transformed_column, 6);
-+
-+ /* This requires performing matrix multiplication between a 1 × 356 matrix
-+ and an 356 × 10 matrix */
-+
-+ const int m = 1, k = 356, n = 10;
-+ float mul_result[n];
-+ matmul (transformed_column, coefficient[0], m, k, n, mul_result);
-+
-+ float add_result[n];
-+ add (mul_result, intercepts, n, add_result);
-+
-+ float next_activations[n];
-+ relu (add_result, n, next_activations);
-+
-+ /* This requires performing matrix multiplication between a 1 × 10 matrix
-+ and an 10 × 1 matrix */
-+
-+ const int m2 = 1, k2 = 10, n2 = 1;
-+ float mul_result1[n2];
-+ matmul (next_activations, coefficient1[0], m2, k2, n2, mul_result1);
-+
-+ float add_result1[n2];
-+ add (mul_result1, intercepts1, n2, add_result1);
-+
-+ float out_activations_result[n2];
-+ sigmoid (add_result1, n2, out_activations_result);
-+
-+ float negative_class_proba[n2];
-+ sub (unity, out_activations_result, n2, negative_class_proba);
-+ const int prob_size = n2 + n2;
-+ float probabilities[prob_size];
-+ line_concat (negative_class_proba, n2, probabilities, 0);
-+ line_concat (out_activations_result, n2, probabilities, n2);
-+
-+ int argmax_output = argmax (probabilities, prob_size);
-+ return argmax_output;
-+}
-+
-+int
-+get_optimize_decision_from_optimizer (int argc, const char **argv,
-+ const char *mops, int argc2,
-+ int64_t *argv2)
-+{
-+ int model_pred = graph_infer (argc, argv, mops, argc2, argv2);
-+ if (model_pred == 1)
-+ {
-+ putenv ("AI_INFER_LEVEL=1");
-+ }
-+ return model_pred;
-+}
++/* Lightweight AI Inference Framework.
++ Copyright (C) 2024-2024 Free Software Foundation, Inc.
++This file is part of GCC.
++GCC is free software; you can redistribute it and/or modify it under
++the terms of the GNU General Public License as published by the Free
++Software Foundation; either version 3, or (at your option) any later
++version.
++GCC is distributed in the hope that it will be useful, but WITHOUT ANY
++WARRANTY; without even the implied warranty of MERCHANTABILITY or
++FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
++for more details.
++
++You should have received a copy of the GNU General Public License
++along with GCC; see the file COPYING3. If not see
++. */
++
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include
++#include "config.h"
++#include "system.h"
++#include "ai4c-infer.h"
++
++#define M_OPTION_SIZE 11
++#define M_MODE_SIZE 6
++#define NATIVE_TUNE_SIZE 128
++#define CATS_STRINGS_ROW 34
++#define CATS_STRINGS_COL 65
++#define CATS_STRINGS1_ROW 10
++#define CATS_STRINGS1_COL 65
++#define OFFSET_ROW 6
++#define SCALE_ROW 6
++#define UNITY_ROW 1
++#define COEFFICIENT_ROW 356
++#define COEFFICIENT_COL 10
++#define COEFFICIENT1_ROW 10
++#define COEFFICIENT1_COL 1
++#define INTERCEPTS_ROW 10
++#define INTERCEPTS1_ROW 1
++
++/* Intermediate computation results from the ONNX model. */
++static char cats_strings[CATS_STRINGS_ROW][CATS_STRINGS_COL];
++static char cats_strings1[CATS_STRINGS1_ROW][CATS_STRINGS1_COL];
++static float offset[OFFSET_ROW];
++static float scale[SCALE_ROW];
++static float unity[UNITY_ROW];
++static float coefficient[COEFFICIENT_ROW][COEFFICIENT_COL];
++static float coefficient1[COEFFICIENT1_ROW][COEFFICIENT1_COL];
++static float intercepts[INTERCEPTS_ROW];
++static float intercepts1[INTERCEPTS1_ROW];
++
++/* Return an integer that represents the comparison result of the
++ two strings. */
++
++static int
++compare_strings (const void *a, const void *b)
++{
++ const char *str_a = *(const char **)a;
++ const char *str_b = *(const char **)b;
++
++ int len = strlen (str_a) < strlen (str_b) ? strlen (str_a) : strlen (str_b);
++ for (int i = 0; i < len; i++)
++ {
++ char c1 = str_a[i];
++ char c2 = str_b[i];
++ if (ISUPPER (c1) && !ISUPPER (c2))
++ return 0;
++ else if (!ISUPPER (c1) && ISUPPER (c2))
++ return 1;
++ else if (c1 != c2)
++ return c1 < c2;
++ }
++ return strlen (str_a) > strlen (str_b);
++}
++
++/* Return the substring before the first underscore ('_') in the input
++ string. */
++
++static void
++truncate_prefix (const char *str, char *result)
++{
++ const char *underscore_pos = strchr (str, '_');
++ if (underscore_pos == NULL)
++ {
++ strcpy (result, str);
++ return;
++ }
++
++ size_t len = underscore_pos - str;
++ strncpy (result, str, len + 1);
++ result[len + 1] = '\0';
++}
++
++
++static void
++preprocess (int argc1, const char **argv1, const char *mops,
++ int argc2, int64_t *argv2, char (*in_options)[1024],
++ int64_t *in_modes)
++{
++ strcpy (in_options[0], mops);
++
++ const char *output_option = "-o";
++ const char *marco_prefix = "-D";
++ const char *needle = "--param";
++ const char *flag_prefix = "-";
++ const char *default_option = "-default-option";
++ const int default_int_val = 0;
++ int m_size = 0;
++ for (int i = 0; i < argc1; i++)
++ {
++ if (strncmp (argv1[i], marco_prefix, 2) == 0)
++ m_size ++;
++ }
++
++ char *m_options[m_size];
++ char output_file[1024];
++ int m_index = 0;
++ for (int i = 0; i < argc1; i++)
++ {
++ if (strncmp (argv1[i], marco_prefix, 2) == 0)
++ {
++ m_options[m_index] = (char *)argv1[i];
++ m_index ++;
++ }
++ if (strcmp (argv1[i], output_option) == 0)
++ truncate_prefix (argv1[i + 1], output_file);
++ }
++
++ strcpy (in_options[1], output_file);
++ int in_options_size = 2;
++ qsort (m_options, m_size, sizeof (m_options[0]), compare_strings);
++ for (int i = 0; i < m_size && in_options_size < M_OPTION_SIZE; i++)
++ {
++ strcpy (in_options[in_options_size], m_options[i]);
++ in_options_size ++;
++ }
++
++ for (int i = 0; i < argc1 && in_options_size < M_OPTION_SIZE; i++)
++ {
++ if (strncmp (argv1[i], marco_prefix, 2) != 0
++ && strcmp (argv1[i], output_option) != 0
++ && strncmp (argv1[i], needle, 7) != 0
++ && strncmp (argv1[i], flag_prefix, 1) == 0)
++ {
++ strcpy (in_options[in_options_size], argv1[i]);
++ in_options_size ++;
++ }
++ }
++
++ while (in_options_size < M_OPTION_SIZE)
++ {
++ strcpy (in_options[in_options_size], default_option);
++ in_options_size ++;
++ }
++
++ /* Use sha256 to encrypt the input. */
++ char hash[65];
++ char input[64];
++ for (int i = 0; i < M_OPTION_SIZE; i++)
++ {
++ execute_sha256 (in_options[i], hash, sizeof (hash));
++ strcpy (in_options[i], hash);
++ }
++
++ for (int i = 0; i < argc2 && i < M_MODE_SIZE; i++)
++ {
++ if (i < argc2)
++ in_modes[i] = argv2[i];
++ else
++ in_modes[i] = default_int_val;
++ }
++}
++
++/* To read model parameter information from optimizer.fdata and store it into
++ the appropriate arrays. */
++
++static void
++fill_node (const char *file_name)
++{
++ FILE *file = fopen (file_name, "rb");
++
++ if (!file)
++ {
++ perror ("Can not open file.");
++ return;
++ }
++
++ /* Read cats_strings from optimizer.fdata. */
++ char hex_string[2];
++ for (int i = 0; i < CATS_STRINGS_ROW; i++)
++ {
++ for (int j = 0; j < CATS_STRINGS_COL - 1; j++)
++ {
++ if (fscanf (file, "%2s", hex_string) != 1)
++ {
++ perror ("Can not read cats_strings from optimizer.fdata.");
++ return;
++ }
++ cats_strings[i][j] = (unsigned char) strtol(hex_string, NULL, 16);
++ }
++ cats_strings[i][CATS_STRINGS_COL - 1] = '\0';
++ }
++
++ /* Read cats_strings1 from optimizer.fdata. */
++ for (int i = 0; i < CATS_STRINGS1_ROW; i++)
++ {
++ for (int j = 0; j < CATS_STRINGS1_COL - 1; j++)
++ {
++ if (fscanf (file, "%2s", hex_string) != 1)
++ {
++ perror ("Can not read cats_strings1 from optimizer.fdata.");
++ return;
++ }
++ cats_strings1[i][j] = (unsigned char) strtol(hex_string, NULL, 16);
++ }
++ cats_strings1[i][CATS_STRINGS1_COL - 1] = '\0';
++ }
++
++ /* Read offset from optimizer.fdata. */
++ for (int i = 0; i < OFFSET_ROW; i++)
++ {
++ float result = read_float_from_file (file);
++ offset[i] = result;
++ }
++
++
++ /* Read scale from optimizer.fdata. */
++ for (int i = 0; i < SCALE_ROW; i++)
++ {
++ float result = read_float_from_file (file);
++ scale[i] = result;
++ }
++
++ /* Read unity from optimizer.fdata. */
++ for (int i = 0; i < UNITY_ROW; i++)
++ {
++ float result = read_float_from_file (file);
++ unity[i] = result;
++ }
++
++ /* Read coefficient from optimizer.fdata. */
++ for (int i = 0; i < COEFFICIENT_ROW; i++)
++ for (int j = 0; j < COEFFICIENT_COL; j++)
++ {
++ float result = read_float_from_file (file);
++ coefficient[i][j] = result;
++ }
++
++ /* Read coefficient1 from optimizer.fdata. */
++ for (int i = 0; i < COEFFICIENT1_ROW; i++)
++ for (int j = 0; j < COEFFICIENT1_COL; j++)
++ {
++ float result = read_float_from_file (file);
++ coefficient1[i][j] = result;
++ }
++
++ /* Read intercepts from optimizer.fdata. */
++ for (int i = 0; i < INTERCEPTS_ROW; i++)
++ {
++ float result = read_float_from_file (file);
++ intercepts[i] = result;
++ }
++
++ /* Read intercepts1 from optimizer.fdata. */
++ for (int i = 0; i < INTERCEPTS1_ROW; i++)
++ {
++ float result = read_float_from_file (file);
++ intercepts1[i] = result;
++ }
++
++ fclose (file);
++ return;
++}
++
++/* The process of model inference. */
++
++static int
++graph_infer (int argc1, const char **argv1, const char *mops,
++ int argc2, int64_t *argv2)
++{
++ char *gcc_exec_prefix = getenv ("ONNX_FDATA_PATH");
++ if (gcc_exec_prefix == NULL)
++ return 0;
++ char native_file[512];
++
++ if (gcc_exec_prefix)
++ {
++ const char *onnx_fdata = "optimizer.fdata";
++ strncpy (native_file, gcc_exec_prefix, sizeof (native_file) - 1);
++ native_file[sizeof (native_file) - 1] = '\0';
++ char *last_slash = strrchr (native_file, '/');
++ if (last_slash)
++ strcpy (last_slash + 1, onnx_fdata);
++ }
++
++ if (access (native_file, F_OK) == 0)
++ fill_node (native_file);
++ else
++ return 0;
++
++ static int64_t in_modes[M_MODE_SIZE];
++ static char in_options[M_OPTION_SIZE][1024];
++
++ preprocess (argc1, argv1, mops, argc2, argv2, in_options, in_modes);
++
++ /* concat_result and encoder_out are intermediate computation results from
++ the ONNX model. concat_result is a 1 × 18 matrix, and encoder_out is a
++ 1 × 12 matrix. */
++
++ const int concat_out_size = 350;
++ float concat_result[concat_out_size];
++ const int encoder_out_size = 34;
++ const int encoder_last_size = 10;
++ int concat_size = 0;
++ const int size = encoder_out_size;
++
++ for (int i = 1; i < M_OPTION_SIZE; i++)
++ {
++ float encoder_out[size];
++ one_hot_encoder (in_options[i], cats_strings, encoder_out, size);
++ line_concat (encoder_out, size, concat_result, concat_size);
++ concat_size += size;
++ }
++
++ float encoder_out2[encoder_last_size];
++ one_hot_encoder (in_options[0], cats_strings1, encoder_out2,
++ encoder_last_size);
++ line_concat (encoder_out2, encoder_last_size, concat_result, concat_size);
++ concat_size += encoder_last_size;
++
++ float variable[M_MODE_SIZE];
++ imputer (in_modes, M_MODE_SIZE, variable);
++ float variable1[M_MODE_SIZE];
++ scaler (variable, offset, scale, M_MODE_SIZE, variable1);
++
++ float transformed_column[concat_out_size + M_MODE_SIZE];
++ /* line_concat is used to stro*/
++ line_concat (variable1, M_MODE_SIZE, transformed_column, 0);
++ line_concat (concat_result, concat_out_size, transformed_column, 6);
++
++ /* This requires performing matrix multiplication between a 1 × 356 matrix
++ and an 356 × 10 matrix */
++
++ const int m = 1, k = 356, n = 10;
++ float mul_result[n];
++ matmul (transformed_column, coefficient[0], m, k, n, mul_result);
++
++ float add_result[n];
++ add (mul_result, intercepts, n, add_result);
++
++ float next_activations[n];
++ relu (add_result, n, next_activations);
++
++ /* This requires performing matrix multiplication between a 1 × 10 matrix
++ and an 10 × 1 matrix */
++
++ const int m2 = 1, k2 = 10, n2 = 1;
++ float mul_result1[n2];
++ matmul (next_activations, coefficient1[0], m2, k2, n2, mul_result1);
++
++ float add_result1[n2];
++ add (mul_result1, intercepts1, n2, add_result1);
++
++ float out_activations_result[n2];
++ sigmoid (add_result1, n2, out_activations_result);
++
++ float negative_class_proba[n2];
++ sub (unity, out_activations_result, n2, negative_class_proba);
++ const int prob_size = n2 + n2;
++ float probabilities[prob_size];
++ line_concat (negative_class_proba, n2, probabilities, 0);
++ line_concat (out_activations_result, n2, probabilities, n2);
++
++ int argmax_output = argmax (probabilities, prob_size);
++ return argmax_output;
++}
++
++int
++get_optimize_decision_from_optimizer (int argc, const char **argv,
++ const char *mops, int argc2,
++ int64_t *argv2)
++{
++ int model_pred = graph_infer (argc, argv, mops, argc2, argv2);
++ if (model_pred == 1)
++ {
++ putenv ("AI_INFER_LEVEL=1");
++ }
++ return model_pred;
++}
diff --git a/gcc/ai4c-infer.cc b/gcc/ai4c-infer.cc
index 99f7a6b45..42922e1ca 100644
--- a/gcc/ai4c-infer.cc
diff --git a/0328-Bugfix-Adjust-the-same-gate-to-use-struct-option.patch b/0327-Bugfix-Adjust-the-same-gate-to-use-struct-option.patch
similarity index 100%
rename from 0328-Bugfix-Adjust-the-same-gate-to-use-struct-option.patch
rename to 0327-Bugfix-Adjust-the-same-gate-to-use-struct-option.patch
diff --git a/0329-Bugfix-if-split-Added-checking-for-ssa_name.patch b/0328-Bugfix-if-split-Added-checking-for-ssa_name.patch
similarity index 100%
rename from 0329-Bugfix-if-split-Added-checking-for-ssa_name.patch
rename to 0328-Bugfix-if-split-Added-checking-for-ssa_name.patch
diff --git a/0330-Fixed-work-with-loops-in-process_complex_cond.patch b/0329-Fixed-work-with-loops-in-process_complex_cond.patch
similarity index 100%
rename from 0330-Fixed-work-with-loops-in-process_complex_cond.patch
rename to 0329-Fixed-work-with-loops-in-process_complex_cond.patch
diff --git a/0331-bugfix-fix-typo-error.patch b/0330-bugfix-fix-typo-error.patch
similarity index 100%
rename from 0331-bugfix-fix-typo-error.patch
rename to 0330-bugfix-fix-typo-error.patch
diff --git a/0323-fix-function-missing-return-value.patch b/0331-fix-function-missing-return-value.patch
similarity index 100%
rename from 0323-fix-function-missing-return-value.patch
rename to 0331-fix-function-missing-return-value.patch
diff --git a/0332-Bugfix-Can-not-find-fdata-file.patch b/0332-Bugfix-Can-not-find-fdata-file.patch
index 71ed6c39aae10c1d3aaf68659d077de5ee0bf4fa..e9d81a4add22e8bcdc7fc825872355aa3d6ac343 100644
--- a/0332-Bugfix-Can-not-find-fdata-file.patch
+++ b/0332-Bugfix-Can-not-find-fdata-file.patch
@@ -15,65 +15,65 @@ index c3d99dd85..70ff24077 100644
--- a/gcc/ai-optimizer.cc
+++ b/gcc/ai-optimizer.cc
@@ -284,19 +284,50 @@ static int
- graph_infer (int argc1, const char **argv1, const char *mops,
- int argc2, int64_t *argv2)
- {
-- char *gcc_exec_prefix = getenv ("ONNX_FDATA_PATH");
-- if (gcc_exec_prefix == NULL)
-+ char gcc_exec_prefix[512];
-+ ssize_t len = readlink ("/proc/self/exe", gcc_exec_prefix,
-+ sizeof (gcc_exec_prefix) - 1);
-+ if (len == -1)
- return 0;
-- char native_file[512];
-
-- if (gcc_exec_prefix)
-+ char native_file[512];
-+ strncpy (native_file, gcc_exec_prefix, sizeof (native_file) - 1);
-+ const char *target = "bin/gcc";
-+ const char *target_cc1 = "cc1";
-+ const char *target_gpp = "bin/g++";
-+ const char *target_cc1plus = "cc1plus";
-+ const char *target_gfortran = "bin/gfortran";
-+ const char *target_f951 = "f951";
-+ const char *replacement = "../libexec/gcc/optimizer.fdata";
-+ const char *replacement_front_end = "../../optimizer.fdata";
-+
-+ /* Replace the part of the current executable file path after the last slash
-+ to locate the model file. */
-+ if (strstr (native_file, target) != NULL ||
-+ strstr (native_file, target_gpp) != NULL ||
-+ strstr (native_file, target_gfortran) != NULL)
- {
-- const char *onnx_fdata = "optimizer.fdata";
-- strncpy (native_file, gcc_exec_prefix, sizeof (native_file) - 1);
-- native_file[sizeof (native_file) - 1] = '\0';
- char *last_slash = strrchr (native_file, '/');
-- if (last_slash)
-- strcpy (last_slash + 1, onnx_fdata);
-+ if (last_slash != NULL)
-+ {
-+ size_t prefix_len = last_slash - native_file + 1;
-+ native_file[prefix_len] = '\0';
-+ strncat (native_file, replacement, sizeof (native_file) -
-+ strlen (native_file) - 1);
-+ }
-+ }
-+ else if (strstr (native_file, target_cc1) != NULL ||
-+ strstr (native_file, target_cc1plus) != NULL ||
-+ strstr (native_file, target_f951) != NULL)
-+ {
-+ char *last_slash = strrchr (native_file, '/');
-+ if (last_slash != NULL)
-+ {
-+ size_t prefix_len = last_slash - native_file + 1;
-+ native_file[prefix_len] = '\0';
-+ strncat (native_file, replacement_front_end, sizeof (native_file) -
-+ strlen (native_file) - 1);
-+ }
- }
-
- if (access (native_file, F_OK) == 0)
+ graph_infer (int argc1, const char **argv1, const char *mops,
+ int argc2, int64_t *argv2)
+ {
+- char *gcc_exec_prefix = getenv ("ONNX_FDATA_PATH");
+- if (gcc_exec_prefix == NULL)
++ char gcc_exec_prefix[512];
++ ssize_t len = readlink ("/proc/self/exe", gcc_exec_prefix,
++ sizeof (gcc_exec_prefix) - 1);
++ if (len == -1)
+ return 0;
+- char native_file[512];
+
+- if (gcc_exec_prefix)
++ char native_file[512];
++ strncpy (native_file, gcc_exec_prefix, sizeof (native_file) - 1);
++ const char *target = "bin/gcc";
++ const char *target_cc1 = "cc1";
++ const char *target_gpp = "bin/g++";
++ const char *target_cc1plus = "cc1plus";
++ const char *target_gfortran = "bin/gfortran";
++ const char *target_f951 = "f951";
++ const char *replacement = "../libexec/gcc/optimizer.fdata";
++ const char *replacement_front_end = "../../optimizer.fdata";
++
++ /* Replace the part of the current executable file path after the last slash
++ to locate the model file. */
++ if (strstr (native_file, target) != NULL ||
++ strstr (native_file, target_gpp) != NULL ||
++ strstr (native_file, target_gfortran) != NULL)
+ {
+- const char *onnx_fdata = "optimizer.fdata";
+- strncpy (native_file, gcc_exec_prefix, sizeof (native_file) - 1);
+- native_file[sizeof (native_file) - 1] = '\0';
+ char *last_slash = strrchr (native_file, '/');
+- if (last_slash)
+- strcpy (last_slash + 1, onnx_fdata);
++ if (last_slash != NULL)
++ {
++ size_t prefix_len = last_slash - native_file + 1;
++ native_file[prefix_len] = '\0';
++ strncat (native_file, replacement, sizeof (native_file) -
++ strlen (native_file) - 1);
++ }
++ }
++ else if (strstr (native_file, target_cc1) != NULL ||
++ strstr (native_file, target_cc1plus) != NULL ||
++ strstr (native_file, target_f951) != NULL)
++ {
++ char *last_slash = strrchr (native_file, '/');
++ if (last_slash != NULL)
++ {
++ size_t prefix_len = last_slash - native_file + 1;
++ native_file[prefix_len] = '\0';
++ strncat (native_file, replacement_front_end, sizeof (native_file) -
++ strlen (native_file) - 1);
++ }
+ }
+
+ if (access (native_file, F_OK) == 0)
diff --git a/gcc/ai4c-infer.cc b/gcc/ai4c-infer.cc
index 42922e1ca..4cd4bfb00 100644
--- a/gcc/ai4c-infer.cc
diff --git a/0333-CSPGO-Update-the-gate-of-cspgo.patch b/0333-CSPGO-Update-the-gate-of-cspgo.patch
new file mode 100644
index 0000000000000000000000000000000000000000..bd5307c3c0514e84c1cf8129f55d9af6dcf92d3a
--- /dev/null
+++ b/0333-CSPGO-Update-the-gate-of-cspgo.patch
@@ -0,0 +1,88 @@
+From 25f3b77d288e26b198c7836c3ed9b4fb0a85a48a Mon Sep 17 00:00:00 2001
+From: liyancheng <412998149@qq.com>
+Date: Mon, 16 Dec 2024 15:52:22 +0800
+Subject: [PATCH] [CSPGO] Update the gate of cspgo
+
+Update gate to allow CSPGO to be enabled after PGO
+---
+ gcc/tree-profile.cc | 59 +++++++++++++++++++++++++++------------------
+ 1 file changed, 36 insertions(+), 23 deletions(-)
+
+diff --git a/gcc/tree-profile.cc b/gcc/tree-profile.cc
+index ace1fe31c..3c57a0a75 100644
+--- a/gcc/tree-profile.cc
++++ b/gcc/tree-profile.cc
+@@ -1108,34 +1108,47 @@ public:
+ /* opt_pass methods: */
+ virtual bool gate (function *)
+ {
+- return (flag_csprofile_generate || flag_csprofile_use);
+- }
+- /* The main process of cspgo is in csprofile_transform, execute does not need
+- to do anything. */
+- virtual unsigned int execute (function *)
+- {
+- if (!profile_data_prefix)
+- error ("profile_data_prefix must set when using cspgo.");
++ if (flag_csprofile_generate || flag_csprofile_use)
++ {
++ int ret = true;
++ if (!profile_data_prefix)
++ {
++ error ("pgo profile path must set when using cspgo.");
++ ret = false;
++ }
+
+- if (!csprofile_data_prefix)
+- error ("csprofile_data_prefix must set when using cspgo.");
++ if (!csprofile_data_prefix)
++ {
++ error ("cspgo profile path must set when using cspgo.");
++ ret = false;
++ }
+
+- if (!flag_cfgo_profile_use)
+- error ("cspgo must used with cfgo-pgo.");
++ if (!(flag_cfgo_profile_use || flag_profile_use))
++ {
++ error ("cspgo must used with cfgo-pgo or pgo.");
++ ret = false;
++ }
+
+- /* Just compare canonical pathnames. */
+- char* cfgo_pgo_path = lrealpath (profile_data_prefix);
+- char* cfgo_cspgo_path = lrealpath (csprofile_data_prefix);
+- bool files_differ = filename_cmp (cfgo_pgo_path, cfgo_cspgo_path);
+- if (!files_differ)
+- {
+- error ("pgo and cspgo path must different between %s and %s",
+- cfgo_pgo_path, cfgo_cspgo_path);
++ /* pgo and cspgo path must different. */
++ char* cfgo_pgo_path = lrealpath (profile_data_prefix);
++ char* cfgo_cspgo_path = lrealpath (csprofile_data_prefix);
++ bool files_differ = filename_cmp (cfgo_pgo_path, cfgo_cspgo_path);
++ if (!files_differ)
++ {
++ error ("pgo and cspgo path must different between %s and %s",
++ cfgo_pgo_path, cfgo_cspgo_path);
++ ret = false;
++ }
++ free (cfgo_pgo_path);
++ free (cfgo_cspgo_path);
++
++ return ret;
+ }
+- free (cfgo_pgo_path);
+- free (cfgo_cspgo_path);
+- return 0;
++ return false;
+ }
++ /* The main process of cspgo is in csprofile_transform, execute does not need
++ to do anything. */
++ virtual unsigned int execute (function *) { return 0; }
+
+ }; // class pass_ipa_csprofile
+
+--
+2.25.1
+
diff --git a/0334-Dont-use-local_detect_cpu-when-cross-build.patch b/0334-Dont-use-local_detect_cpu-when-cross-build.patch
new file mode 100644
index 0000000000000000000000000000000000000000..d951bdc27620491508e9d3d9f6c45af361f2e0a2
--- /dev/null
+++ b/0334-Dont-use-local_detect_cpu-when-cross-build.patch
@@ -0,0 +1,27 @@
+From cd708367a6558eca37715f8068f044a55402edab Mon Sep 17 00:00:00 2001
+From: YunQiang Su
+Date: Wed, 18 Dec 2024 14:22:03 +0800
+Subject: [PATCH] Don't use local_detect_cpu when cross build
+
+-march=native makes no sense for cross build.
+---
+ gcc/gcc.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/gcc/gcc.cc b/gcc/gcc.cc
+index 179d507f255..f2387e0fae2 100644
+--- a/gcc/gcc.cc
++++ b/gcc/gcc.cc
+@@ -5800,7 +5800,7 @@ do_self_spec (const char *spec)
+ do_spec_1 (" ", 0, NULL);
+
+ const char* tune_native = NULL;
+-#if defined (__x86_64__) || defined (__aarch64__)
++#if !defined(CROSS_DIRECTORY_STRUCTURE) && (defined (__x86_64__) || defined (__aarch64__))
+ tune_native = eval_spec_function ("local_cpu_detect", "cpu", "");
+ #endif
+ if (tune_native == NULL)
+--
+Gitee
+
+
diff --git a/0335-fix-costs-for-hip09.patch b/0335-fix-costs-for-hip09.patch
new file mode 100644
index 0000000000000000000000000000000000000000..8923faaa74466b9993d648e6355b0a4d7b5d8d38
--- /dev/null
+++ b/0335-fix-costs-for-hip09.patch
@@ -0,0 +1,41 @@
+From 00cd602772e471a18b3b36abfa3bde382d239b1f Mon Sep 17 00:00:00 2001
+From: Mingchuan Wu
+Date: Thu, 26 Dec 2024 11:11:41 +0800
+Subject: [PATCH] [bugfix] fix costs for hip09.
+
+---
+ gcc/config/aarch64/aarch64.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
+index e487ba12bad..65b684ef60f 100644
+--- a/gcc/config/aarch64/aarch64.cc
++++ b/gcc/config/aarch64/aarch64.cc
+@@ -749,8 +749,8 @@ static const struct cpu_regmove_cost hip09_regmove_cost =
+ 1, /* GP2GP */
+ /* Avoid the use of slow int<->fp moves for spilling by setting
+ their cost higher than memmov_cost. */
+- 2, /* GP2FP */
+- 3, /* FP2GP */
++ 5, /* GP2FP */
++ 5, /* FP2GP */
+ 2 /* FP2FP */
+ };
+
+@@ -1923,10 +1923,10 @@ static const struct tune_params hip09_tunings =
+ 4, /* load_pred. */
+ 4 /* store_pred. */
+ }, /* memmov_cost. */
+- 4, /* issue_rate */
++ 2, /* issue_rate */
+ (AARCH64_FUSE_AES_AESMC | AARCH64_FUSE_ALU_BRANCH
+ | AARCH64_FUSE_ALU_CBZ), /* fusible_ops */
+- "16", /* function_align. */
++ "16:12", /* function_align. */
+ "4", /* jump_align. */
+ "8", /* loop_align. */
+ 2, /* int_reassoc_width. */
+--
+Gitee
+
+
diff --git a/gcc.spec b/gcc.spec
index 6f747937487ccb669042f5d5006bb0dd503e37be..24cbb1e42979e87becb3ca18721f24e6f8e188f6 100644
--- a/gcc.spec
+++ b/gcc.spec
@@ -2,7 +2,7 @@
%global gcc_major 12
# Note, gcc_release must be integer, if you want to add suffixes to
# %%{release}, append them after %%{gcc_release} on Release: line.
-%global gcc_release 59
+%global gcc_release 66
%global _unpackaged_files_terminate_build 0
%global _performance_build 1
@@ -428,16 +428,19 @@ Patch319: 0319-CSPGO-fix-bugs-when-using-cspgo.patch
Patch320: 0320-if-split-fix-bugs.patch
Patch321: 0321-Struct-reorg-Avoid-doing-struct-split-and-reorder_fi.patch
Patch322: 0322-Bugfix-Create-POINTER_PLUS_EXPR-for-REFERENCE_TYPE.patch
-Patch323: 0323-fix-function-missing-return-value.patch
-Patch324: 0324-Bugfix-replace-tmp-pattern-split.patch
-Patch325: 0325-bugfix-fix-vector-costs-for-hip09.patch
-Patch326: 0326-gcc-opts-common.cc-Fix-build-with-clang.patch
-Patch327: 0327-BUGFIX-Fix-build-error-on-risv_64.patch
-Patch328: 0328-Bugfix-Adjust-the-same-gate-to-use-struct-option.patch
-Patch329: 0329-Bugfix-if-split-Added-checking-for-ssa_name.patch
-Patch330: 0330-Fixed-work-with-loops-in-process_complex_cond.patch
-Patch331: 0331-bugfix-fix-typo-error.patch
+Patch323: 0323-Bugfix-replace-tmp-pattern-split.patch
+Patch324: 0324-bugfix-fix-vector-costs-for-hip09.patch
+Patch325: 0325-gcc-opts-common.cc-Fix-build-with-clang.patch
+Patch326: 0326-BUGFIX-Fix-build-error-on-risv_64.patch
+Patch327: 0327-Bugfix-Adjust-the-same-gate-to-use-struct-option.patch
+Patch328: 0328-Bugfix-if-split-Added-checking-for-ssa_name.patch
+Patch329: 0329-Fixed-work-with-loops-in-process_complex_cond.patch
+Patch330: 0330-bugfix-fix-typo-error.patch
+Patch331: 0331-fix-function-missing-return-value.patch
Patch332: 0332-Bugfix-Can-not-find-fdata-file.patch
+Patch333: 0333-CSPGO-Update-the-gate-of-cspgo.patch
+Patch334: 0334-Dont-use-local_detect_cpu-when-cross-build.patch
+Patch335: 0335-fix-costs-for-hip09.patch
# Part 1001-1999
%ifarch sw_64
@@ -1556,6 +1559,9 @@ not stable, so plugins must be rebuilt any time GCC is updated.
%patch -P330 -p1
%patch -P331 -p1
%patch -P332 -p1
+%patch -P333 -p1
+%patch -P334 -p1
+%patch -P335 -p1
%ifarch sw_64
%patch -P1001 -p1
@@ -4179,18 +4185,60 @@ end
%doc rpm.doc/changelogs/libcc1/ChangeLog*
%changelog
-* Mon Dec 30 2024 Zhenyu Zhao - 12.3.1-59
+* Tue Dec 31 2024 liyancheng <412998149@qq.com> - 12.3.1-66
+- Type:Sync
+- ID:NA
+- SUG:NA
+- DESC:Don't use local_detect_cpu when cross build and fix hip09 costs.
+
+* Mon Dec 30 2024 liyancheng <412998149@qq.com> - 12.3.1-65
+- Type:Bugfix
+- ID:NA
+- SUG:NA
+- DESC:Update the gate of cspgo.
+
+* Mon Dec 30 2024 Zhenyu Zhao - 12.3.1-64
- Type:Bugfix
- ID:NA
- SUG:NA
- DESC:Sync patches from openeuler/gcc.
-* Thu Dec 26 2024 rfwang07 - 12.3.1-58
+* Thu Dec 26 2024 rfwang07 - 12.3.1-63
- Type:Bugfix
- ID:NA
- SUG:NA
- DESC:Fix function missing return value.
+* Wed Dec 18 2024 Mingchuan Wu - 12.3.1-62
+- Type:Sync
+- ID:NA
+- SUG:NA
+- DESC: Sync patches from openeuler/gcc.
+
+* Mon Dec 16 2024 huzife <634763349@qq.com> - 12.3.1-61
+- Type:Bugfix
+- ID:NA
+- SUG:NA
+- DESC:Add checking for ssa_name in if-split
+
+* Mon Dec 16 2024 huang-xiaoquan - 12.3.1-60
+- Type:Bugfix
+- ID:NA
+- SUG:NA
+- DESC:Adjust the same gate to use struct option.
+
+* Wed Dec 11 2024 Zhenyu Zhao - 12.3.1-59
+- Type:Sync
+- ID:NA
+- SUG:NA
+- DESC: Sync patches from openeuler/gcc.
+
+* Tue Dec 10 2024 huzife <634763349@qq.com> - 12.3.1-58
+- Type:Bugfix
+- ID:NA
+- SUG:NA
+- DESC: Fix bugs in cmlt, replace tmp pattern split.
+
* Mon Dec 09 2024 liyancheng <412998149@qq.com> - 12.3.1-57
- Type:Bugfix
- ID:NA