aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2014-04-14 08:11:08 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2014-04-14 08:11:08 +0000
commita3c77ce941aeee074370680b38de3704d59983c6 (patch)
treea7ec7184c5a24df3b6de3634e77670edfa9eb0ba /gcc
parent033aa406ca81760098f7a8b9a193d6fd2391ace6 (diff)
downloadgcc-a3c77ce941aeee074370680b38de3704d59983c6.zip
gcc-a3c77ce941aeee074370680b38de3704d59983c6.tar.gz
gcc-a3c77ce941aeee074370680b38de3704d59983c6.tar.bz2
re PR tree-optimization/55022 (air.f90 is miscompliled with -m64 -O2 -fgraphite-identity after revision 190619)
2014-04-14 Richard Biener <rguenther@suse.de> PR middle-end/55022 * fold-const.c (negate_expr_p): Don't negate directional rounding division. (fold_negate_expr): Likewise. * gcc.dg/graphite/pr55022.c: New testcase. From-SVN: r209356
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/fold-const.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/graphite/pr55022.c27
4 files changed, 39 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a80c21f..3991750 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
2014-04-14 Richard Biener <rguenther@suse.de>
+ PR middle-end/55022
+ * fold-const.c (negate_expr_p): Don't negate directional rounding
+ division.
+ (fold_negate_expr): Likewise.
+
+2014-04-14 Richard Biener <rguenther@suse.de>
+
PR tree-optimization/59817
PR tree-optimization/60453
* graphite-scop-detection.c (graphite_can_represent_scev): Complete
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 891c0d5..5c2bf25 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -484,8 +484,6 @@ negate_expr_p (tree t)
case TRUNC_DIV_EXPR:
case ROUND_DIV_EXPR:
- case FLOOR_DIV_EXPR:
- case CEIL_DIV_EXPR:
case EXACT_DIV_EXPR:
/* In general we can't negate A / B, because if A is INT_MIN and
B is 1, we may turn this into INT_MIN / -1 which is undefined
@@ -682,8 +680,6 @@ fold_negate_expr (location_t loc, tree t)
case TRUNC_DIV_EXPR:
case ROUND_DIV_EXPR:
- case FLOOR_DIV_EXPR:
- case CEIL_DIV_EXPR:
case EXACT_DIV_EXPR:
/* In general we can't negate A / B, because if A is INT_MIN and
B is 1, we may turn this into INT_MIN / -1 which is undefined
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e09c499..6992ad6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2014-04-14 Richard Biener <rguenther@suse.de>
+ PR middle-end/55022
+ * gcc.dg/graphite/pr55022.c: New testcase.
+
+2014-04-14 Richard Biener <rguenther@suse.de>
+
PR tree-optimization/59817
PR tree-optimization/60453
* gfortran.dg/graphite/pr59817.f: New testcase.
diff --git a/gcc/testsuite/gcc.dg/graphite/pr55022.c b/gcc/testsuite/gcc.dg/graphite/pr55022.c
new file mode 100644
index 0000000..c631c0e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/graphite/pr55022.c
@@ -0,0 +1,27 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -fgraphite-identity" } */
+
+extern void abort (void);
+
+void __attribute__((noinline,noclone))
+f(int *limit, int minLen, int maxLen)
+{
+ int i;
+
+ for (i = minLen; i <= maxLen; i++) {
+ limit[i] = i;
+ }
+}
+
+int main()
+{
+ int limit[256], i;
+ f (limit, 0, 255);
+ for (i = 0; i < 256; ++i)
+ {
+ if (limit[i] != i)
+ abort ();
+ __asm__ volatile ("" : : : "memory");
+ }
+ return 0;
+}