diff options
author | Richard Biener <rguenther@suse.de> | 2020-05-22 09:03:40 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2020-05-22 13:08:44 +0200 |
commit | 7c592aad23c22b9f888837020cd0a7475d8f3938 (patch) | |
tree | d47c1442833949cabfd9859b60558c08db162065 /gcc | |
parent | 1089a367c4b05b5e3f072adca8913904ed65928c (diff) | |
download | gcc-7c592aad23c22b9f888837020cd0a7475d8f3938.zip gcc-7c592aad23c22b9f888837020cd0a7475d8f3938.tar.gz gcc-7c592aad23c22b9f888837020cd0a7475d8f3938.tar.bz2 |
tree-optimization/95268 - fix commoning of clobbers
This fixes handling of clobbers when commoning stores.
2020-05-22 Richard Biener <rguenther@suse.de>
PR tree-optimization/95268
* tree-ssa-sink.c (sink_common_stores_to_bb): Handle clobbers
properly.
* g++.dg/torture/pr95268.C: New testcase.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr95268.C | 46 | ||||
-rw-r--r-- | gcc/tree-ssa-sink.c | 25 |
4 files changed, 71 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d22e9aa..b0ba14b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2020-05-22 Richard Biener <rguenther@suse.de> + + PR tree-optimization/95268 + * tree-ssa-sink.c (sink_common_stores_to_bb): Handle clobbers + properly. + 2020-05-22 Jan Hubicka <hubicka@ucw.cz> * tree-streamer.c (record_common_node): Fix hash value of pre-streamed diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1e8ad06..5a62826 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2020-05-22 Richard Biener <rguenther@suse.de> + PR tree-optimization/95268 + * g++.dg/torture/pr95268.C: New testcase. + +2020-05-22 Richard Biener <rguenther@suse.de> + PR tree-optimization/95248 * gcc.dg/torture/pr95248.c: New testcase. diff --git a/gcc/testsuite/g++.dg/torture/pr95268.C b/gcc/testsuite/g++.dg/torture/pr95268.C new file mode 100644 index 0000000..8385b86 --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr95268.C @@ -0,0 +1,46 @@ +// { dg-do compile } +// { dg-require-effective-target lp64 } +// { dg-additional-options "-Wno-overflow" } + +#include <algorithm> + +extern short var_0, var_2, var_3, var_9, var_11, var_13, var_14, var_19, var_22, + var_32, var_37, var_44, var_57, var_59, var_63, var_70; +extern unsigned var_5; +extern char var_6, var_12, var_18, var_38, var_39, var_43, var_55, var_64, + arr_35; +extern long var_7, var_8, var_10, var_15, var_25, var_56; +extern int var_21, var_36, var_51, var_65, var_68, arr_7; +extern bool var_46, var_58, var_67; + +void test() { + var_12 = 0 >= 0; + var_13 = arr_7; + var_14 = (unsigned long)var_7 >> -564810131 + 564810189; + var_15 = var_5; + var_18 = -602739307623583391; + var_19 = -~0; + var_21 = var_10 >> var_8 - 17101301574577641170ULL; + var_22 = var_5; + var_25 = var_9; + var_32 = std::max((unsigned)var_2, var_5); + var_36 = 9557; + var_37 = 394545925; + var_38 = 0 >= 0; + var_39 = var_5; + var_43 = 0; + var_44 = arr_35; + var_46 = var_7; + for (short a = 0; a < 9; a = 021) + for (short b = 0; b < 024; b += 4) + var_51 = std::min((long long)(var_2 ?: var_9), (long long)var_9); + var_55 = var_0; + var_56 = 3896150587; + var_57 = var_11; + var_58 = var_59 = var_11; + var_63 = 73; + var_64 = 10393232284806619711ULL; + var_65 = var_3; + var_67 = var_6; + var_68 = var_70 = 0; +} diff --git a/gcc/tree-ssa-sink.c b/gcc/tree-ssa-sink.c index c5b535be..b61ecf1 100644 --- a/gcc/tree-ssa-sink.c +++ b/gcc/tree-ssa-sink.c @@ -534,7 +534,9 @@ sink_common_stores_to_bb (basic_block bb) /* ??? We could handle differing SSA uses in the LHS by inserting PHIs for them. */ else if (! operand_equal_p (gimple_assign_lhs (first_store), - gimple_assign_lhs (def), 0)) + gimple_assign_lhs (def), 0) + || (gimple_clobber_p (first_store) + && !gimple_clobber_p (def))) { first_store = NULL; break; @@ -546,16 +548,17 @@ sink_common_stores_to_bb (basic_block bb) /* Check if we need a PHI node to merge the stored values. */ bool allsame = true; - for (unsigned i = 1; i < vdefs.length (); ++i) - { - gimple *def = SSA_NAME_DEF_STMT (vdefs[i]); - if (! operand_equal_p (gimple_assign_rhs1 (first_store), - gimple_assign_rhs1 (def), 0)) - { - allsame = false; - break; - } - } + if (!gimple_clobber_p (first_store)) + for (unsigned i = 1; i < vdefs.length (); ++i) + { + gimple *def = SSA_NAME_DEF_STMT (vdefs[i]); + if (! operand_equal_p (gimple_assign_rhs1 (first_store), + gimple_assign_rhs1 (def), 0)) + { + allsame = false; + break; + } + } /* We cannot handle aggregate values if we need to merge them. */ tree type = TREE_TYPE (gimple_assign_lhs (first_store)); |