You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.7 KiB
60 lines
1.7 KiB
5 months ago
|
commit 482551a79a3d3f107f6239679ee74655cfe8707e
|
||
|
Author: Richard Biener <rguenther@suse.de>
|
||
|
Date: Thu Aug 17 13:10:14 2023 +0200
|
||
|
|
||
|
tree-optimization/111039 - abnormals and bit test merging
|
||
|
|
||
|
The following guards the bit test merging code in if-combine against
|
||
|
the appearance of SSA names used in abnormal PHIs.
|
||
|
|
||
|
PR tree-optimization/111039
|
||
|
* tree-ssa-ifcombine.cc (ifcombine_ifandif): Check for
|
||
|
SSA_NAME_OCCURS_IN_ABNORMAL_PHI.
|
||
|
|
||
|
* gcc.dg/pr111039.c: New testcase.
|
||
|
|
||
|
diff --git a/gcc/testsuite/gcc.dg/pr111039.c b/gcc/testsuite/gcc.dg/pr111039.c
|
||
|
new file mode 100644
|
||
|
index 00000000000..bec9983b35f
|
||
|
--- /dev/null
|
||
|
+++ b/gcc/testsuite/gcc.dg/pr111039.c
|
||
|
@@ -0,0 +1,15 @@
|
||
|
+/* { dg-do compile } */
|
||
|
+/* { dg-options "-O" } */
|
||
|
+
|
||
|
+int _setjmp ();
|
||
|
+void abcd ();
|
||
|
+void abcde ();
|
||
|
+void compiler_corruption_function(int flags)
|
||
|
+{
|
||
|
+ int nowait = flags & 1048576, isexpand = flags & 8388608;
|
||
|
+ abcd();
|
||
|
+ _setjmp(flags);
|
||
|
+ if (nowait && isexpand)
|
||
|
+ flags &= 0;
|
||
|
+ abcde();
|
||
|
+}
|
||
|
--- a/gcc/tree-ssa-ifcombine.c
|
||
|
+++ b/gcc/tree-ssa-ifcombine.c
|
||
|
@@ -430,6 +430,9 @@ ifcombine_ifandif (basic_block inner_cond_bb, bool inner_inv,
|
||
|
{
|
||
|
tree t, t2;
|
||
|
|
||
|
+ if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name1))
|
||
|
+ return false;
|
||
|
+
|
||
|
/* Do it. */
|
||
|
gsi = gsi_for_stmt (inner_cond);
|
||
|
t = fold_build2 (LSHIFT_EXPR, TREE_TYPE (name1),
|
||
|
@@ -486,6 +489,10 @@ ifcombine_ifandif (basic_block inner_cond_bb, bool inner_inv,
|
||
|
gimple_stmt_iterator gsi;
|
||
|
tree t;
|
||
|
|
||
|
+ if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name1)
|
||
|
+ || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name2))
|
||
|
+ return false;
|
||
|
+
|
||
|
/* Find the common name which is bit-tested. */
|
||
|
if (name1 == name2)
|
||
|
;
|