]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/60849 (bogus comparison result type)
authorRichard Biener <rguenther@suse.de>
Thu, 17 Apr 2014 08:13:53 +0000 (08:13 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 17 Apr 2014 08:13:53 +0000 (08:13 +0000)
2014-04-17  Richard Biener  <rguenther@suse.de>

PR middle-end/60849
* tree-ssa-propagate.c (valid_gimple_rhs_p): Only allow effective
boolean results for comparisons.

* g++.dg/opt/pr60849.C: New testcase.

From-SVN: r209469

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/pr60849.C [new file with mode: 0644]
gcc/tree-ssa-propagate.c

index abfe3186d2e4d7bcf678c8b819c31686e3fdbd05..99ef2dc2ab86f5a5f3ff230d2f3f4ab88fa596bf 100644 (file)
@@ -1,3 +1,9 @@
+2014-04-17  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/60849
+       * tree-ssa-propagate.c (valid_gimple_rhs_p): Only allow effective
+       boolean results for comparisons.
+
 2014-04-17  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/60836
index f180aef57a1e158ea6d759745529255945cbc0ab..67f8eef9c81df219cd2139098a17c05878cbd79a 100644 (file)
@@ -1,3 +1,8 @@
+2014-04-17  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/60849
+       * g++.dg/opt/pr60849.C: New testcase.
+
 2014-04-17  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/60836
diff --git a/gcc/testsuite/g++.dg/opt/pr60849.C b/gcc/testsuite/g++.dg/opt/pr60849.C
new file mode 100644 (file)
index 0000000..52d8826
--- /dev/null
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+
+int g;
+
+extern "C" int isnan ();
+
+void foo(float a) {
+  int (*xx)(...);
+  xx = isnan;
+  if (xx(a))
+    g++;
+}
index 840d7e76272a4d41cde16ebc17d092e781e869c2..47fd15455b258c72f39ae6bc7dfc42cc87fb6196 100644 (file)
@@ -571,8 +571,14 @@ valid_gimple_rhs_p (tree expr)
       /* All constants are ok.  */
       break;
 
-    case tcc_binary:
     case tcc_comparison:
+      if (!INTEGRAL_TYPE_P (TREE_TYPE (expr))
+         || (TREE_CODE (TREE_TYPE (expr)) != BOOLEAN_TYPE
+             && TYPE_PRECISION (TREE_TYPE (expr)) != 1))
+       return false;
+
+      /* Fallthru.  */
+    case tcc_binary:
       if (!is_gimple_val (TREE_OPERAND (expr, 0))
          || !is_gimple_val (TREE_OPERAND (expr, 1)))
        return false;