From 12cdba25648be7dc71fd983c47ca76b44ba264f7 Mon Sep 17 00:00:00 2001 From: huzife <634763349@qq.com> Date: Tue, 17 Jun 2025 00:13:38 +0800 Subject: [PATCH] [Sync] Sync patches from openeuler/gcc (cherry picked from commit 2a3e308497ccb8294d222386700bbcd79d737955) --- ...dse-Ignore-debug-stmt-add-testsuites.patch | 795 ++++++++++++++++++ gcc.spec | 8 +- 2 files changed, 802 insertions(+), 1 deletion(-) create mode 100644 0393-array-dse-Ignore-debug-stmt-add-testsuites.patch 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 0000000..f8f3c4c --- /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 bbe844a..90ab707 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 -- Gitee