aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fold-const.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/graphite/pr86479.c39
4 files changed, 57 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d8a6586..c36a8a8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2018-07-12 Richard Biener <rguenther@suse.de>
+ PR middle-end/86479
+ * fold-const.c (fold_binary_op_with_conditional_arg): Do not
+ move possibly trapping operations into the conditional.
+
+2018-07-12 Richard Biener <rguenther@suse.de>
+
* tree-ssa-sccvn.c (mprts_hook_cnt): Remove.
(vn_lookup_simplify_result): Remove recursion limit applied
here.
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 97c435f..ac65dcf 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -6587,6 +6587,13 @@ fold_binary_op_with_conditional_arg (location_t loc,
tree rhs = NULL_TREE;
enum tree_code cond_code = COND_EXPR;
+ /* Do not move possibly trapping operations into the conditional as this
+ pessimizes code and causes gimplification issues when applied late. */
+ if (operation_could_trap_p (code, FLOAT_TYPE_P (type),
+ ANY_INTEGRAL_TYPE_P (type)
+ && TYPE_OVERFLOW_TRAPS (type), op1))
+ return NULL_TREE;
+
if (TREE_CODE (cond) == COND_EXPR
|| TREE_CODE (cond) == VEC_COND_EXPR)
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e8df3b6..0958a1a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-07-12 Richard Biener <rguenther@suse.de>
+
+ PR middle-end/86479
+ * gcc.dg/graphite/pr86479.c: New testcase.
+
2018-07-11 Jakub Jelinek <jakub@redhat.com>
* gcc.target/i386/avx512bw-vpcmpb-2.c (CMP): Use SIZE macro instead
diff --git a/gcc/testsuite/gcc.dg/graphite/pr86479.c b/gcc/testsuite/gcc.dg/graphite/pr86479.c
new file mode 100644
index 0000000..7df6354
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/graphite/pr86479.c
@@ -0,0 +1,39 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -floop-nest-optimize -fnon-call-exceptions -fno-guess-branch-probability -fno-tree-loop-im" } */
+
+__INTPTR_TYPE__ uf;
+
+void
+m7 (__INTPTR_TYPE__ *aw, __INTPTR_TYPE__ ws)
+{
+ __INTPTR_TYPE__ *e5 = &ws;
+
+ if (ws < 1)
+ {
+ int cq = 0;
+
+ while (cq < 1)
+ {
+ int *ng;
+ int *ud;
+
+ *e5 *= uf < 0;
+
+ for (*ng = 0; *ng < 2; ++*ng)
+ {
+ }
+
+ ws /= cq;
+ *aw *= ws;
+
+ for (*ud = 0; *ud < 2; ++*ud)
+ {
+ }
+ }
+ }
+
+ if (ws < 2)
+ e5 = &uf;
+
+ *e5 = 0;
+}