]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[RFA] Fix pr67830, another type narrowing problem
authorJeff Law <law@redhat.com>
Fri, 23 Oct 2015 19:16:53 +0000 (13:16 -0600)
committerJeff Law <law@gcc.gnu.org>
Fri, 23 Oct 2015 19:16:53 +0000 (13:16 -0600)
PR tree-optimization/67830
* match.pd ((bit_and (plus/minus (convert @0) (convert @1)) mask)):
Explicitly verify the mask has no bits outside the type of
the innermost operands.

PR tree-optimization/67830
* gcc.dg/pr67830.c: New test.

From-SVN: r229267

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr67830.c [new file with mode: 0644]

index 5aef5b72cd16b791022d5b5e277dd8f97d3fb148..29d1ffab0fc370a24c57e276739fa22438f7875a 100644 (file)
@@ -1,3 +1,10 @@
+2015-10-23  Jeff Law  <law@redhat.com>
+
+       PR tree-optimization/67830
+       * match.pd ((bit_and (plus/minus (convert @0) (convert @1)) mask)):
+       Explicitly verify the mask has no bits outside the type of
+       the innermost operands.
+
 2015-10-23  Gregor Richards  <gregor.richards@uwaterloo.ca>
            Szabolcs Nagy  <szabolcs.nagy@arm.com>
 
index d182f68f4a46fa2622f8b01747b7f95bfa8ee34d..d6ab94ecf6f0d73d6448028c12776dc5a650ac5b 100644 (file)
@@ -2719,8 +2719,8 @@ along with GCC; see the file COPYING3.  If not see
        && types_match (@0, @1)
        && (tree_int_cst_min_precision (@4, TYPE_SIGN (TREE_TYPE (@0)))
           <= TYPE_PRECISION (TREE_TYPE (@0)))
-       && (TYPE_OVERFLOW_WRAPS (TREE_TYPE (@0))
-          || tree_int_cst_sgn (@4) >= 0))
+       && (wi::bit_and (@4, wi::mask (TYPE_PRECISION (TREE_TYPE (@0)),
+                       true, TYPE_PRECISION (type))) == 0))
    (if (TYPE_OVERFLOW_WRAPS (TREE_TYPE (@0)))
     (with { tree ntype = TREE_TYPE (@0); }
      (convert (bit_and (op @0 @1) (convert:ntype @4))))
index bedb76a782ab49aeefaa7a47034460f9fcbd000a..fed7d1018d893a0276460c4344f762853690c15c 100644 (file)
@@ -1,3 +1,8 @@
+2015-10-23  Jeff Law  <law@redhat.com>
+
+       PR tree-optimization/67830
+       * gcc.dg/pr67830.c: New test.
+
 2015-10-23  Jan Hubicka  <hubicka@ucw.cz>
 
        * gcc.dg/tree-ssa/operand-equal-2.c: New testcase.
diff --git a/gcc/testsuite/gcc.dg/pr67830.c b/gcc/testsuite/gcc.dg/pr67830.c
new file mode 100644 (file)
index 0000000..9bfb0c0
--- /dev/null
@@ -0,0 +1,22 @@
+/* PR tree-optimization/67830 */
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+int a, b, *g, h;
+unsigned char c, d;
+
+int
+main ()
+{
+  int f, e = -2;
+  b = e;
+  g = &b;
+  h = c = a + 1;
+  f = d - h;
+  *g &= f;
+
+  if (b != -2)
+    __builtin_abort ();
+
+  return 0;
+}