diff --git a/0393-array-dse-Ignore-debug-stmt-add-testsuites.patch b/0393-array-dse-Ignore-debug-stmt-add-testsuites.patch
new file mode 100644
index 0000000000000000000000000000000000000000..f8f3c4c0ce85c418997572bc30d981767303877e
--- /dev/null
+++ b/0393-array-dse-Ignore-debug-stmt-add-testsuites.patch
@@ -0,0 +1,795 @@
+From 12b5da19994eedaeaec404859444b7704d204114 Mon Sep 17 00:00:00 2001
+From: huzife <634763349@qq.com>
+Date: Thu, 5 Jun 2025 14:59:49 +0800
+Subject: [PATCH] [array-dse] Ignore debug stmt, add testsuites
+
+---
+ gcc/ipa-array-dse.cc | 20 +++++++++--
+ .../alignment-propagation.exp | 35 +++++++++++++++++++
+ .../alignment_less_than_rhs.c | 18 ++++++++++
+ .../non_aligned_offset.c | 18 ++++++++++
+ .../not_address_of_local_var.c | 18 ++++++++++
+ .../rewrite_aligned_bit_and.c | 26 ++++++++++++++
+ gcc/testsuite/gcc.dg/array-dse/array-dse.exp | 35 +++++++++++++++++++
+ .../array-dse_callee_ptr_exceed_range.c | 28 +++++++++++++++
+ .../array-dse/array-dse_fully_redundant.c | 28 +++++++++++++++
+ .../array-dse_no_unique_length_param.c | 33 +++++++++++++++++
+ .../array-dse_non_local_array_in_caller.c | 29 +++++++++++++++
+ .../array-dse_non_unique_written_base.c | 31 ++++++++++++++++
+ .../array-dse/array-dse_partial_redundant.c | 28 +++++++++++++++
+ .../array-dse_read_bound_non_const.c | 27 ++++++++++++++
+ .../gcc.dg/localize-array/bad-dominance.c | 33 +++++++++++++++++
+ .../localize-array/escape-by-taking-address.c | 27 ++++++++++++++
+ .../localize-array-with-multiple-elem.c | 28 +++++++++++++++
+ .../localize-array-with-single-elem.c | 26 ++++++++++++++
+ .../gcc.dg/localize-array/localize-array.exp | 35 +++++++++++++++++++
+ .../localize-array/not-allocated-by-calloc.c | 27 ++++++++++++++
+ .../used-by-multiple-functions.c | 34 ++++++++++++++++++
+ 21 files changed, 581 insertions(+), 3 deletions(-)
+ create mode 100644 gcc/testsuite/gcc.dg/alignment-propagation/alignment-propagation.exp
+ create mode 100644 gcc/testsuite/gcc.dg/alignment-propagation/alignment_less_than_rhs.c
+ create mode 100644 gcc/testsuite/gcc.dg/alignment-propagation/non_aligned_offset.c
+ create mode 100644 gcc/testsuite/gcc.dg/alignment-propagation/not_address_of_local_var.c
+ create mode 100644 gcc/testsuite/gcc.dg/alignment-propagation/rewrite_aligned_bit_and.c
+ create mode 100644 gcc/testsuite/gcc.dg/array-dse/array-dse.exp
+ create mode 100644 gcc/testsuite/gcc.dg/array-dse/array-dse_callee_ptr_exceed_range.c
+ create mode 100644 gcc/testsuite/gcc.dg/array-dse/array-dse_fully_redundant.c
+ create mode 100644 gcc/testsuite/gcc.dg/array-dse/array-dse_no_unique_length_param.c
+ create mode 100644 gcc/testsuite/gcc.dg/array-dse/array-dse_non_local_array_in_caller.c
+ create mode 100644 gcc/testsuite/gcc.dg/array-dse/array-dse_non_unique_written_base.c
+ create mode 100644 gcc/testsuite/gcc.dg/array-dse/array-dse_partial_redundant.c
+ create mode 100644 gcc/testsuite/gcc.dg/array-dse/array-dse_read_bound_non_const.c
+ create mode 100644 gcc/testsuite/gcc.dg/localize-array/bad-dominance.c
+ create mode 100644 gcc/testsuite/gcc.dg/localize-array/escape-by-taking-address.c
+ create mode 100644 gcc/testsuite/gcc.dg/localize-array/localize-array-with-multiple-elem.c
+ create mode 100644 gcc/testsuite/gcc.dg/localize-array/localize-array-with-single-elem.c
+ create mode 100644 gcc/testsuite/gcc.dg/localize-array/localize-array.exp
+ create mode 100644 gcc/testsuite/gcc.dg/localize-array/not-allocated-by-calloc.c
+ create mode 100644 gcc/testsuite/gcc.dg/localize-array/used-by-multiple-functions.c
+
+diff --git a/gcc/ipa-array-dse.cc b/gcc/ipa-array-dse.cc
+index df973e849..7d8bb9f9a 100644
+--- a/gcc/ipa-array-dse.cc
++++ b/gcc/ipa-array-dse.cc
+@@ -907,7 +907,7 @@ array_dse_callee::find_candidate_array ()
+ for (auto gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
+ {
+ gimple *stmt = gsi_stmt (gsi);
+- if (gimple_clobber_p (stmt))
++ if (gimple_clobber_p (stmt) || is_gimple_debug (stmt))
+ continue;
+
+ /* There are 3 kind of stmts may have store ops: GIMPLE_ASSIGN,
+@@ -2138,7 +2138,8 @@ array_dse_edge::collect_array_accesses ()
+ for (auto gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
+ {
+ gimple *stmt = gsi_stmt (gsi);
+- if (gimple_clobber_p (stmt) || call_stmt_p (stmt))
++ if (gimple_clobber_p (stmt) || call_stmt_p (stmt)
++ || is_gimple_debug (stmt))
+ continue;
+
+ for (unsigned i = 0; i < gimple_num_ops (stmt); i++)
+@@ -2495,7 +2496,8 @@ array_dse_edge::calc_read_bound ()
+ continue;
+
+ auto range = calc_ref_range (var);
+- if (!integer_cst_p (range.max ()))
++ if (range.undefined_p() || range.varying_p()
++ || !integer_cst_p (range.max ()))
+ return false;
+
+ auto max = tree_to_shwi (range.max ());
+@@ -3081,6 +3083,12 @@ ipa_array_dse::apply_array_dse (array_dse_edge *ad_edge)
+
+ cfun_saver save (caller);
+
++ if (dump_file)
++ {
++ fprintf (dump_file, "Remove fully redundant call:\n");
++ print_gimple_stmt (dump_file, call_stmt, 0);
++ }
++
+ auto gsi = gsi_for_stmt (call_stmt);
+ basic_block call_bb = gimple_bb (call_stmt);
+ tree fndecl = gimple_call_fndecl (call_stmt);
+@@ -3103,6 +3111,12 @@ ipa_array_dse::apply_array_dse (array_dse_edge *ad_edge)
+ if (!transform_new_callee (callee, new_callee))
+ return false;
+
++ if (dump_file)
++ {
++ fprintf (dump_file, "Rewrite partial redundant call:\n");
++ print_gimple_stmt (dump_file, ad_edge->call_edge->call_stmt, 0);
++ }
++
+ tree bound_addr = ad_edge->get_bound_addr ();
+ rewrite_call_edge (ad_edge->call_edge, new_callee, bound_addr);
+
+diff --git a/gcc/testsuite/gcc.dg/alignment-propagation/alignment-propagation.exp b/gcc/testsuite/gcc.dg/alignment-propagation/alignment-propagation.exp
+new file mode 100644
+index 000000000..941849499
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/alignment-propagation/alignment-propagation.exp
+@@ -0,0 +1,35 @@
++# Copyright (C) 1997-2023 Free Software Foundation, Inc.
++
++# This program 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 of the License, or
++# (at your option) any later version.
++#
++# This program 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
++# .
++
++load_lib gcc-dg.exp
++load_lib torture-options.exp
++
++# Initialize `dg'.
++dg-init
++torture-init
++
++set ALIGNMENT_PROPAGATION_TORTURE_OPTIONS [list \
++ { -O3 } \
++ { -Ofast } ]
++
++set-torture-options $ALIGNMENT_PROPAGATION_TORTURE_OPTIONS {{}}
++
++gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.c]] \
++ "" "-fipa-alignment-propagation -fdump-ipa-alignment-propagation-details"
++
++# All done.
++torture-finish
++dg-finish
+diff --git a/gcc/testsuite/gcc.dg/alignment-propagation/alignment_less_than_rhs.c b/gcc/testsuite/gcc.dg/alignment-propagation/alignment_less_than_rhs.c
+new file mode 100644
+index 000000000..4695968e2
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/alignment-propagation/alignment_less_than_rhs.c
+@@ -0,0 +1,18 @@
++/* { dg-do compile } */
++
++#include
++
++void __attribute__((__noinline__)) and_alignment_128(void *p) {
++ if ((unsigned long)p & 127)
++ abort();
++}
++
++int main() {
++ int num[16];
++ and_alignment_128(num);
++
++ return 0;
++}
++
++/*--------------------------------------------------------------------------*/
++/* { dg-final { scan-ipa-dump "Rewrite" "alignment-propagation" { xfail *-*-* } } } */
+diff --git a/gcc/testsuite/gcc.dg/alignment-propagation/non_aligned_offset.c b/gcc/testsuite/gcc.dg/alignment-propagation/non_aligned_offset.c
+new file mode 100644
+index 000000000..f60f4dc18
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/alignment-propagation/non_aligned_offset.c
+@@ -0,0 +1,18 @@
++/* { dg-do compile } */
++
++#include
++
++void __attribute__((__noinline__)) and_alignment_4(void *p) {
++ if (((unsigned long)p + 3) & 3)
++ abort();
++}
++
++int main() {
++ int num;
++ and_alignment_4(&num);
++
++ return 0;
++}
++
++/*--------------------------------------------------------------------------*/
++/* { dg-final { scan-ipa-dump "Rewrite" "alignment-propagation" { xfail *-*-* } } } */
+diff --git a/gcc/testsuite/gcc.dg/alignment-propagation/not_address_of_local_var.c b/gcc/testsuite/gcc.dg/alignment-propagation/not_address_of_local_var.c
+new file mode 100644
+index 000000000..81d490c92
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/alignment-propagation/not_address_of_local_var.c
+@@ -0,0 +1,18 @@
++/* { dg-do compile } */
++
++#include
++
++void __attribute__((__noinline__)) and_alignment_4(void *p) {
++ if ((unsigned long)p & 3)
++ abort();
++}
++
++int main() {
++ int *p = NULL;
++ and_alignment_4(p);
++
++ return 0;
++}
++
++/*--------------------------------------------------------------------------*/
++/* { dg-final { scan-ipa-dump "Rewrite" "alignment-propagation" { xfail *-*-* } } } */
+diff --git a/gcc/testsuite/gcc.dg/alignment-propagation/rewrite_aligned_bit_and.c b/gcc/testsuite/gcc.dg/alignment-propagation/rewrite_aligned_bit_and.c
+new file mode 100644
+index 000000000..bf3815964
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/alignment-propagation/rewrite_aligned_bit_and.c
+@@ -0,0 +1,26 @@
++/* { dg-do compile } */
++
++#include
++
++void __attribute__((__noinline__)) and_alignment_4(void *p) {
++ if ((unsigned long)p & 3)
++ abort();
++}
++
++void __attribute__((__noinline__)) and_alignment_8(void *p) {
++ if ((unsigned long)p & 7)
++ abort();
++}
++
++int main() {
++ int num = 0;
++ int nums[16] = {0};
++ and_alignment_4(&num);
++ and_alignment_4(nums);
++ and_alignment_8(nums);
++
++ return 0;
++}
++
++/*--------------------------------------------------------------------------*/
++/* { dg-final { scan-ipa-dump-times "Rewrite" 2 "alignment-propagation" } } */
+diff --git a/gcc/testsuite/gcc.dg/array-dse/array-dse.exp b/gcc/testsuite/gcc.dg/array-dse/array-dse.exp
+new file mode 100644
+index 000000000..c04d54f00
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/array-dse/array-dse.exp
+@@ -0,0 +1,35 @@
++# Copyright (C) 1997-2023 Free Software Foundation, Inc.
++
++# This program 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 of the License, or
++# (at your option) any later version.
++#
++# This program 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
++# .
++
++load_lib gcc-dg.exp
++load_lib torture-options.exp
++
++# Initialize `dg'.
++dg-init
++torture-init
++
++set ARRAY_DSE_TORTURE_OPTIONS [list \
++ { -O3 } \
++ { -Ofast } ]
++
++set-torture-options $ARRAY_DSE_TORTURE_OPTIONS {{}}
++
++gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.c]] \
++ "" "-fipa-array-dse -fdump-ipa-array-dse-details"
++
++# All done.
++torture-finish
++dg-finish
+diff --git a/gcc/testsuite/gcc.dg/array-dse/array-dse_callee_ptr_exceed_range.c b/gcc/testsuite/gcc.dg/array-dse/array-dse_callee_ptr_exceed_range.c
+new file mode 100644
+index 000000000..91db9ded7
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/array-dse/array-dse_callee_ptr_exceed_range.c
+@@ -0,0 +1,28 @@
++/* { dg-do compile } */
++
++#include
++#include
++
++void __attribute__((__noinline__)) test(int* a, unsigned long n) {
++ for (int* p = a + n; p >= a; p--) {
++ *p = p - a;
++ }
++}
++
++int main() {
++ int num[16];
++ int n = 0;
++ scanf("%d", &n);
++ if (n)
++ test(num, n);
++
++ for (unsigned i = 0; i < 8; i++) {
++ if (num[i] != i)
++ abort ();
++ }
++
++ return 0;
++}
++
++/*--------------------------------------------------------------------------*/
++/* { dg-final { scan-ipa-dump "Fail finding array dse candidate callees" "array-dse" } } */
+diff --git a/gcc/testsuite/gcc.dg/array-dse/array-dse_fully_redundant.c b/gcc/testsuite/gcc.dg/array-dse/array-dse_fully_redundant.c
+new file mode 100644
+index 000000000..c5d2dce58
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/array-dse/array-dse_fully_redundant.c
+@@ -0,0 +1,28 @@
++/* { dg-do compile } */
++
++#include
++#include
++
++void __attribute__((__noinline__)) test(int* a, unsigned long n) {
++ for (int* p = a + (n - 1); p >= a; p--) {
++ *p = p - a;
++ }
++}
++
++int main() {
++ int num[16];
++ int n = 0;
++ scanf("%d", &n);
++ if (n)
++ test(num + 9, n);
++
++ for (unsigned i = 0; i < 8; i++) {
++ if (num[i] != i)
++ abort ();
++ }
++
++ return 0;
++}
++
++/*--------------------------------------------------------------------------*/
++/* { dg-final { scan-ipa-dump "Remove fully redundant call" "array-dse" } } */
+diff --git a/gcc/testsuite/gcc.dg/array-dse/array-dse_no_unique_length_param.c b/gcc/testsuite/gcc.dg/array-dse/array-dse_no_unique_length_param.c
+new file mode 100644
+index 000000000..cd20d1b52
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/array-dse/array-dse_no_unique_length_param.c
+@@ -0,0 +1,33 @@
++/* { dg-do compile } */
++
++#include
++#include
++
++void __attribute__((__noinline__)) test(int* a, unsigned long n) {
++ for (int* p = a + (n - 1); p >= a; p--) {
++ *p = p - a;
++ }
++
++ int n1;
++ for (int* p = a + (n1 - 1); p >= a; p--) {
++ *p = p - a;
++ }
++}
++
++int main() {
++ int num[16];
++ int n = 0;
++ scanf("%d", &n);
++ if (n)
++ test(num, n);
++
++ for (unsigned i = 0; i < 8; i++) {
++ if (num[i] != i)
++ abort ();
++ }
++
++ return 0;
++}
++
++/*--------------------------------------------------------------------------*/
++/* { dg-final { scan-ipa-dump "Fail finding array dse candidate callees" "array-dse" } } */
+diff --git a/gcc/testsuite/gcc.dg/array-dse/array-dse_non_local_array_in_caller.c b/gcc/testsuite/gcc.dg/array-dse/array-dse_non_local_array_in_caller.c
+new file mode 100644
+index 000000000..99af6299c
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/array-dse/array-dse_non_local_array_in_caller.c
+@@ -0,0 +1,29 @@
++/* { dg-do compile } */
++
++#include
++#include
++
++void __attribute__((__noinline__)) test(int* a, unsigned long n) {
++ for (int* p = a + (n - 1); p >= a; p--) {
++ *p = p - a;
++ }
++}
++
++int num[16];
++
++int main() {
++ int n = 0;
++ scanf("%d", &n);
++ if (n)
++ test(num, n);
++
++ for (unsigned i = 0; i < 8; i++) {
++ if (num[i] != i)
++ abort ();
++ }
++
++ return 0;
++}
++
++/*--------------------------------------------------------------------------*/
++/* { dg-final { scan-ipa-dump "Fail finding array dse candidate edges" "array-dse" } } */
+diff --git a/gcc/testsuite/gcc.dg/array-dse/array-dse_non_unique_written_base.c b/gcc/testsuite/gcc.dg/array-dse/array-dse_non_unique_written_base.c
+new file mode 100644
+index 000000000..8011371d9
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/array-dse/array-dse_non_unique_written_base.c
+@@ -0,0 +1,31 @@
++/* { dg-do compile } */
++
++#include
++#include
++
++void __attribute__((__noinline__)) test(int* a, unsigned long n) {
++ int *a1;
++ *a1 = 0;
++
++ for (int* p = a + (n - 1); p >= a; p--) {
++ *p = p - a;
++ }
++}
++
++int main() {
++ int num[16];
++ int n = 0;
++ scanf("%d", &n);
++ if (n)
++ test(num, n);
++
++ for (unsigned i = 0; i < 8; i++) {
++ if (num[i] != i)
++ abort ();
++ }
++
++ return 0;
++}
++
++/*--------------------------------------------------------------------------*/
++/* { dg-final { scan-ipa-dump "Fail finding array dse candidate callees" "array-dse" } } */
+diff --git a/gcc/testsuite/gcc.dg/array-dse/array-dse_partial_redundant.c b/gcc/testsuite/gcc.dg/array-dse/array-dse_partial_redundant.c
+new file mode 100644
+index 000000000..7eb4af33c
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/array-dse/array-dse_partial_redundant.c
+@@ -0,0 +1,28 @@
++/* { dg-do compile } */
++
++#include
++#include
++
++void __attribute__((__noinline__)) test(int* a, unsigned long n) {
++ for (int* p = a + (n - 1); p >= a; p--) {
++ *p = p - a;
++ }
++}
++
++int main() {
++ int num[16];
++ int n = 0;
++ scanf("%d", &n);
++ if (n)
++ test(num, n);
++
++ for (unsigned i = 0; i < 8; i++) {
++ if (num[i] != i)
++ abort ();
++ }
++
++ return 0;
++}
++
++/*--------------------------------------------------------------------------*/
++/* { dg-final { scan-ipa-dump "Rewrite partial redundant call" "array-dse" } } */
+diff --git a/gcc/testsuite/gcc.dg/array-dse/array-dse_read_bound_non_const.c b/gcc/testsuite/gcc.dg/array-dse/array-dse_read_bound_non_const.c
+new file mode 100644
+index 000000000..79cf118e9
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/array-dse/array-dse_read_bound_non_const.c
+@@ -0,0 +1,27 @@
++/* { dg-do compile } */
++
++#include
++#include
++
++void __attribute__((__noinline__)) test(int* a, unsigned long n) {
++ for (int* p = a + (n - 1); p >= a; p--) {
++ *p = p - a;
++ }
++}
++
++int main() {
++ int num[16];
++ int n = 0;
++ scanf("%d", &n);
++ if (n)
++ test(num, n);
++
++ int n1;
++ if (num[n1])
++ abort();
++
++ return 0;
++}
++
++/*--------------------------------------------------------------------------*/
++/* { dg-final { scan-ipa-dump "Fail finding array dse candidate edges" "array-dse" } } */
+diff --git a/gcc/testsuite/gcc.dg/localize-array/bad-dominance.c b/gcc/testsuite/gcc.dg/localize-array/bad-dominance.c
+new file mode 100644
+index 000000000..7f9ec730b
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/localize-array/bad-dominance.c
+@@ -0,0 +1,33 @@
++/* { dg-do compile } */
++
++#include
++#include
++
++static int* p;
++
++void __attribute__((noinline)) test() {
++ for (unsigned i = 0; i < 10; i++) {
++ p[i] = i;
++ }
++}
++
++/* Set -O0 so that the ssa define by calloc and used by free
++ are not the same one. */
++#pragma GCC push_options
++#pragma GCC optimize("O0")
++int main() {
++ int n;
++ scanf("%d", &n);
++
++ p = calloc(10, sizeof(int));
++ for (unsigned i = 0; i < n; i++) {
++ test();
++ }
++ free(p);
++
++ return 0;
++}
++#pragma GCC pop_options
++
++/*--------------------------------------------------------------------------*/
++/* { dg-final { scan-ipa-dump "Localize global array: p" "localize-array" { xfail *-*-* } } } */
+diff --git a/gcc/testsuite/gcc.dg/localize-array/escape-by-taking-address.c b/gcc/testsuite/gcc.dg/localize-array/escape-by-taking-address.c
+new file mode 100644
+index 000000000..17756c74d
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/localize-array/escape-by-taking-address.c
+@@ -0,0 +1,27 @@
++/* { dg-do compile } */
++
++#include
++#include
++
++static int* p;
++int** a;
++
++void __attribute__((noinline)) test() {
++ a = &p;
++}
++
++/* Set -O0 so that the ssa define by calloc and used by free
++ are not the same one. */
++#pragma GCC push_options
++#pragma GCC optimize("O0")
++int main() {
++ p = calloc(10, sizeof(int));
++ test();
++ int ret = **a;
++ free(p);
++ return ret;
++}
++#pragma GCC pop_options
++
++/*--------------------------------------------------------------------------*/
++/* { dg-final { scan-ipa-dump "Localize global array" "localize-array" { xfail *-*-* } } } */
+diff --git a/gcc/testsuite/gcc.dg/localize-array/localize-array-with-multiple-elem.c b/gcc/testsuite/gcc.dg/localize-array/localize-array-with-multiple-elem.c
+new file mode 100644
+index 000000000..6917fd451
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/localize-array/localize-array-with-multiple-elem.c
+@@ -0,0 +1,28 @@
++/* { dg-do compile } */
++
++#include
++#include
++
++static int* p;
++
++void __attribute__((noinline)) test() {
++ for (unsigned i = 0; i < 10; i++) {
++ p[i] = i;
++ }
++}
++
++/* Set -O0 so that the ssa define by calloc and used by free
++ are not the same one. */
++#pragma GCC push_options
++#pragma GCC optimize("O0")
++int main() {
++ p = calloc(10, sizeof(int));
++ test();
++ free(p);
++ return 0;
++}
++#pragma GCC pop_options
++
++/*--------------------------------------------------------------------------*/
++/* { dg-final { scan-ipa-dump "Localize global array: p" "localize-array" } } */
++/* { dg-final { scan-ipa-dump "Insert calloc statement" "localize-array" } } */
+diff --git a/gcc/testsuite/gcc.dg/localize-array/localize-array-with-single-elem.c b/gcc/testsuite/gcc.dg/localize-array/localize-array-with-single-elem.c
+new file mode 100644
+index 000000000..b79c12d24
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/localize-array/localize-array-with-single-elem.c
+@@ -0,0 +1,26 @@
++/* { dg-do compile } */
++
++#include
++#include
++
++static int* p;
++
++void __attribute__((noinline)) test() {
++ p[0] = 0;
++}
++
++/* Set -O0 so that the ssa define by calloc and used by free
++ are not the same one. */
++#pragma GCC push_options
++#pragma GCC optimize("O0")
++int main() {
++ p = calloc(1, sizeof(int));
++ test();
++ free(p);
++ return 0;
++}
++#pragma GCC pop_options
++
++/*--------------------------------------------------------------------------*/
++/* { dg-final { scan-ipa-dump "Localize global array: p" "localize-array" } } */
++/* { dg-final { scan-ipa-dump "Insert calloc statement" "localize-array" { xfail *-*-* } } } */
+diff --git a/gcc/testsuite/gcc.dg/localize-array/localize-array.exp b/gcc/testsuite/gcc.dg/localize-array/localize-array.exp
+new file mode 100644
+index 000000000..0bf6cc2cd
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/localize-array/localize-array.exp
+@@ -0,0 +1,35 @@
++# Copyright (C) 1997-2023 Free Software Foundation, Inc.
++
++# This program 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 of the License, or
++# (at your option) any later version.
++#
++# This program 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
++# .
++
++load_lib gcc-dg.exp
++load_lib torture-options.exp
++
++# Initialize `dg'.
++dg-init
++torture-init
++
++set ALIGNMENT_PROPAGATION_TORTURE_OPTIONS [list \
++ { -O3 } \
++ { -Ofast } ]
++
++set-torture-options $ALIGNMENT_PROPAGATION_TORTURE_OPTIONS {{}}
++
++gcc-dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.c]] \
++ "" "-fipa-localize-array -fdump-ipa-localize-array-details -fwhole-program"
++
++# All done.
++torture-finish
++dg-finish
+diff --git a/gcc/testsuite/gcc.dg/localize-array/not-allocated-by-calloc.c b/gcc/testsuite/gcc.dg/localize-array/not-allocated-by-calloc.c
+new file mode 100644
+index 000000000..e519a62d8
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/localize-array/not-allocated-by-calloc.c
+@@ -0,0 +1,27 @@
++/* { dg-do compile } */
++
++#include
++#include
++
++static int* p;
++
++void __attribute__((noinline)) test() {
++ for (unsigned i = 0; i < 10; i++) {
++ p[i] = i;
++ }
++}
++
++/* Set -O0 so that the ssa define by calloc and used by free
++ are not the same one. */
++#pragma GCC push_options
++#pragma GCC optimize("O0")
++int main() {
++ p = malloc(10 * sizeof(int));
++ test();
++ free(p);
++ return 0;
++}
++#pragma GCC pop_options
++
++/*--------------------------------------------------------------------------*/
++/* { dg-final { scan-ipa-dump "Localize global array" "localize-array" { xfail *-*-* } } } */
+diff --git a/gcc/testsuite/gcc.dg/localize-array/used-by-multiple-functions.c b/gcc/testsuite/gcc.dg/localize-array/used-by-multiple-functions.c
+new file mode 100644
+index 000000000..1ac7969b6
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/localize-array/used-by-multiple-functions.c
+@@ -0,0 +1,34 @@
++/* { dg-do compile } */
++
++#include
++#include
++
++static int* p;
++
++void __attribute__((noinline)) test() {
++ for (unsigned i = 0; i < 10; i++) {
++ p[i] = i;
++ }
++}
++
++void __attribute__((noinline)) test2() {
++ for (unsigned i = 0; i < 10; i++) {
++ p[i] = i;
++ }
++}
++
++/* Set -O0 so that the ssa define by calloc and used by free
++ are not the same one. */
++#pragma GCC push_options
++#pragma GCC optimize("O0")
++int main() {
++ p = calloc(10, sizeof(int));
++ test();
++ test2();
++ free(p);
++ return 0;
++}
++#pragma GCC pop_options
++
++/*--------------------------------------------------------------------------*/
++/* { dg-final { scan-ipa-dump "Localize global array: p" "localize-array" { xfail *-*-* } } } */
+--
+2.43.0
+
diff --git a/gcc.spec b/gcc.spec
index bbe844a03cbb1023b499a4ea388b69d87f942eb1..90ab7071121dd60a647972ae27fab148f7d06c41 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 93
+%global gcc_release 94
%global _unpackaged_files_terminate_build 0
%global _performance_build 1
@@ -502,6 +502,7 @@ Patch389: 0389-deja-Correct-pass-number-in-options.patch
Patch390: 0390-struct-reorg-Check-ADDR_EXPR-in-pointer-plus-assign.patch
Patch391: 0391-oeAware-Fix-.GCC4OE_oeAware-section-dup-in-LTO.patch
Patch392: 0392-Modify-cores-definition-for-hip-cores.patch
+Patch393: 0393-array-dse-Ignore-debug-stmt-add-testsuites.patch
# Part 1001-1999
%ifarch sw_64
@@ -1680,6 +1681,7 @@ not stable, so plugins must be rebuilt any time GCC is updated.
%patch -P390 -p1
%patch -P391 -p1
%patch -P392 -p1
+%patch -P393 -p1
%ifarch sw_64
%patch -P1001 -p1
@@ -4307,6 +4309,10 @@ end
%doc rpm.doc/changelogs/libcc1/ChangeLog*
%changelog
+* Tue Jun 17 2025 huzife <634763349@qq.com> - 12.3.1-94
+- Type: Sync
+- DESC: Sync patches from openeuler/gcc.
+
* Thu Jun 12 2025 liyunfei - 12.3.1-93
- Type: Sync
- DESC: Modify cores definition for hip cores