re PR tree-optimization/63551 (wrong code (segfaults) at -Os on x86_64-linux-gnu)
authorMartin Jambor <mjambor@suse.cz>
Mon, 1 Dec 2014 12:05:41 +0000 (13:05 +0100)
committerMartin Jambor <jamborm@gcc.gnu.org>
Mon, 1 Dec 2014 12:05:41 +0000 (13:05 +0100)
2014-12-01  Martin Jambor  <mjambor@suse.cz>

PR ipa/63551
* ipa-inline-analysis.c (evaluate_conditions_for_known_args): Convert
value of the argument to the type of the value in the condition.

testsuite/
* gcc.dg/ipa/pr63551.c: New test.
* gcc.dg/ipa/pr64041.c: Likewise.

From-SVN: r218205

gcc/ChangeLog
gcc/ipa-inline-analysis.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/ipa/pr63551.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/ipa/pr64041.c [new file with mode: 0644]

index a428bf067328ea93d3c472027e817d9fabb84a58..2530e023be4b0d520b0d28d154309c0161395100 100644 (file)
@@ -1,3 +1,9 @@
+2014-12-01  Martin Jambor  <mjambor@suse.cz>
+
+       PR ipa/63551
+       * ipa-inline-analysis.c (evaluate_conditions_for_known_args): Convert
+       value of the argument to the type of the value in the condition.
+
 2014-12-01  Oleg Endo  <olegendo@gcc.gnu.org>
 
        PR target/63986
index 9d62722980999fb4688bf466d76813c99433808b..71b56fda62e81c40d71de67c1eeb4b43135f8208 100644 (file)
@@ -880,7 +880,10 @@ evaluate_conditions_for_known_args (struct cgraph_node *node,
        }
       if (c->code == IS_NOT_CONSTANT || c->code == CHANGED)
        continue;
-      res = fold_binary_to_constant (c->code, boolean_type_node, val, c->val);
+      val = fold_unary (VIEW_CONVERT_EXPR, TREE_TYPE (c->val), val);
+      res = val
+       ? fold_binary_to_constant (c->code, boolean_type_node, val, c->val)
+       : NULL;
       if (res && integer_zerop (res))
        continue;
       clause |= 1 << (i + predicate_first_dynamic_condition);
index 52ac186b7840c298d9f6a38c99bf7c8e672e1618..6fd7162c8175794f33bd905c5af37c8cf84f42af 100644 (file)
@@ -1,3 +1,9 @@
+2014-12-01  Martin Jambor  <mjambor@suse.cz>
+
+       PR ipa/63551
+       * gcc.dg/ipa/pr63551.c: New test.
+       * gcc.dg/ipa/pr64041.c: Likewise.
+
 2014-12-01  Ilya Tocar  <ilya.tocar@intel.com>
 
        * gcc.target/i386/avx512bw-vdbpsadbw-2.c: Move defines from options.
diff --git a/gcc/testsuite/gcc.dg/ipa/pr63551.c b/gcc/testsuite/gcc.dg/ipa/pr63551.c
new file mode 100644 (file)
index 0000000..676c2c2
--- /dev/null
@@ -0,0 +1,33 @@
+/* { dg-do run } */
+/* { dg-options "-Os" } */
+
+union U
+{
+  unsigned int f0;
+  int f1;
+};
+
+int a, d;
+
+void
+fn1 (union U p)
+{
+  if (p.f1 <= 0)
+    if (a)
+      d = 0;
+}
+
+void
+fn2 ()
+{
+  d = 0;
+  union U b = { 4294967286 };
+  fn1 (b);
+}
+
+int
+main ()
+{
+  fn2 ();
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/ipa/pr64041.c b/gcc/testsuite/gcc.dg/ipa/pr64041.c
new file mode 100644 (file)
index 0000000..4877b4b
--- /dev/null
@@ -0,0 +1,64 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+int printf (const char *, ...);
+
+int a, b = 1, d;
+
+union U1
+{
+  unsigned int f0;
+  int f1;
+};
+
+union U2
+{
+  int f2;
+  int f3;
+} c;
+
+int
+fn1 (int p)
+{
+  int t = p && a || p && a && p; 
+  return t ? t : a;
+}
+
+unsigned
+fn2 (union U1 p1, union U2 p2)
+{
+  if (p1.f1 <= 0)
+    {
+      for (; p2.f2;)
+       c.f2 = 0;
+      p2.f2 = fn1 (d);
+    }
+  return p2.f3;
+}
+
+int g = 0;
+
+int
+foo ()
+{
+  if (b)
+    {
+      union U1 f = { 0xFFFFFFFFU }; 
+
+      fn2 (f, c);
+    }
+  g = 1;
+  return 0; 
+}
+
+
+int
+main ()
+{
+  foo ();
+
+  if (g == 0)
+    __builtin_abort ();
+
+  return 0;
+}