aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-11-07 12:25:09 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-11-07 12:25:09 +0000
commit32894793ff96f4c56b90e0f0e1d961e526a6edc7 (patch)
treec262e115f9ce800d3846ad1e27f9cf648149d1b1 /gcc
parente27bfda2fc621864fd0ffd2ba3a2cee38b3c7965 (diff)
downloadgcc-32894793ff96f4c56b90e0f0e1d961e526a6edc7.zip
gcc-32894793ff96f4c56b90e0f0e1d961e526a6edc7.tar.gz
gcc-32894793ff96f4c56b90e0f0e1d961e526a6edc7.tar.bz2
re PR middle-end/78228 (fstrict-overflow breaks code without overflow?)
2016-11-07 Richard Biener <rguenther@suse.de> PR tree-optimization/78228 * tree-ssa-phiopt.c (abs_replacement): Avoid introducing undefined behavior. * gcc.dg/tree-ssa/phi-opt-15.c: New testcase. From-SVN: r241899
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/phi-opt-15.c12
-rw-r--r--gcc/tree-ssa-phiopt.c8
4 files changed, 31 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1bc2934..262f006 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-11-07 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/78228
+ * tree-ssa-phiopt.c (abs_replacement): Avoid introducing
+ undefined behavior.
+
2016-11-07 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR target/77822
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7094c88..0dff659 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-11-07 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/78228
+ * gcc.dg/tree-ssa/phi-opt-15.c: New testcase.
+
2016-11-07 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR target/77822
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-15.c b/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-15.c
new file mode 100644
index 0000000..ac3018e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/phi-opt-15.c
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+int
+foo (int i)
+{
+ if (i > 0)
+ i = -i;
+ return i;
+}
+
+/* { dg-final { scan-tree-dump-not "ABS" "optimized" } } */
diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c
index 3f3b88c..63738d0 100644
--- a/gcc/tree-ssa-phiopt.c
+++ b/gcc/tree-ssa-phiopt.c
@@ -1474,6 +1474,14 @@ abs_replacement (basic_block cond_bb, basic_block middle_bb,
else
negate = false;
+ /* If the code negates only iff positive then make sure to not
+ introduce undefined behavior when negating or computing the absolute.
+ ??? We could use range info if present to check for arg1 == INT_MIN. */
+ if (negate
+ && (ANY_INTEGRAL_TYPE_P (TREE_TYPE (arg1))
+ && ! TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg1))))
+ return false;
+
result = duplicate_ssa_name (result, NULL);
if (negate)