[PATCH]Fix PR66556. Don't drop side-effect in
authorrenlin <renlin@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 13 Jul 2015 08:29:46 +0000 (08:29 +0000)
committerrenlin <renlin@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 13 Jul 2015 08:29:46 +0000 (08:29 +0000)
simplify_const_relational_operation function.

gcc/

2015-07-13  Renlin Li  <renlin.li@arm.com>

PR rtl/66556
* simplify-rtx.c (simplify_const_relational_operation): Add
side_effects_p checks.

gcc/testsuite/

2015-07-13  Renlin Li  <renlin.li@arm.com>

PR rtl/66556
* gcc.c-torture/execute/pr66556.c: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@225729 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/simplify-rtx.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr66556.c [new file with mode: 0644]

index 5f466b3..ccde3b7 100644 (file)
@@ -1,3 +1,9 @@
+2015-07-13  Renlin Li  <renlin.li@arm.com>
+
+       PR rtl/66556
+       * simplify-rtx.c (simplify_const_relational_operation): Add
+       side_effects_p checks.
+
 2015-07-12  Aldy Hernandez  <aldyh@redhat.com>
 
        * bitmap.h: Fix double word typos.
index c243080..91e4b9c 100644 (file)
@@ -4925,7 +4925,8 @@ simplify_const_relational_operation (enum rtx_code code,
 
   /* Optimize comparisons with upper and lower bounds.  */
   if (HWI_COMPUTABLE_MODE_P (mode)
-      && CONST_INT_P (trueop1))
+      && CONST_INT_P (trueop1)
+      && !side_effects_p (trueop0))
     {
       int sign;
       unsigned HOST_WIDE_INT nonzero = nonzero_bits (trueop0, mode);
@@ -5038,7 +5039,7 @@ simplify_const_relational_operation (enum rtx_code code,
     }
 
   /* Optimize integer comparisons with zero.  */
-  if (trueop1 == const0_rtx)
+  if (trueop1 == const0_rtx && !side_effects_p (trueop0))
     {
       /* Some addresses are known to be nonzero.  We don't know
         their sign, but equality comparisons are known.  */
@@ -5089,7 +5090,7 @@ simplify_const_relational_operation (enum rtx_code code,
     }
 
   /* Optimize comparison of ABS with zero.  */
-  if (trueop1 == CONST0_RTX (mode)
+  if (trueop1 == CONST0_RTX (mode) && !side_effects_p (trueop0)
       && (GET_CODE (trueop0) == ABS
          || (GET_CODE (trueop0) == FLOAT_EXTEND
              && GET_CODE (XEXP (trueop0, 0)) == ABS)))
index baf3c91..1e6a071 100644 (file)
@@ -1,3 +1,8 @@
+2015-07-13  Renlin Li  <renlin.li@arm.com>
+
+       PR rtl/66556
+       * gcc.c-torture/execute/pr66556.c: New.
+
 2015-07-12  Aldy Hernandez  <aldyh@redhat.com>
 
        * gcc.dg/20020219-1.c: Fix double word typos.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr66556.c b/gcc/testsuite/gcc.c-torture/execute/pr66556.c
new file mode 100644 (file)
index 0000000..f7acf1c
--- /dev/null
@@ -0,0 +1,52 @@
+/* { dg-do run } */
+
+extern void abort (void);
+
+struct {
+  unsigned f2;
+  unsigned f3 : 15;
+  unsigned f5 : 3;
+  short f6;
+} b = {0x7f8000, 6, 5, 0}, g = {8, 0, 5, 0};
+
+short d, l;
+int a, c, h = 8;
+volatile char e[237] = {4};
+short *f = &d;
+short i[5] = {3};
+char j;
+int *k = &c;
+
+int
+fn1 (unsigned p1) { return -p1; }
+
+void
+fn2 (char p1)
+{
+  a = p1;
+  e[0];
+}
+
+short
+fn3 ()
+{
+  *k = 4;
+  return *f;
+}
+
+int
+main ()
+{
+
+  unsigned m;
+  short *n = &i[4];
+
+  m = fn1 ((h && j) <= b.f5);
+  l = m > g.f3;
+  *n = 3;
+  fn2 (b.f2 >> 15);
+  if ((a & 0xff) != 0xff)
+    abort ();
+
+  return 0;
+}