aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2014-04-17 08:13:53 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2014-04-17 08:13:53 +0000
commit83ad208e2cd0f0d14e1f138598556a0a5a34764d (patch)
tree68de519b6f715ed1c48ce0e8e44214180f6db8f2 /gcc
parent730e78b04506e157c2b0f309f8250d2d9d46a77d (diff)
downloadgcc-83ad208e2cd0f0d14e1f138598556a0a5a34764d.zip
gcc-83ad208e2cd0f0d14e1f138598556a0a5a34764d.tar.gz
gcc-83ad208e2cd0f0d14e1f138598556a0a5a34764d.tar.bz2
re PR tree-optimization/60849 (bogus comparison result type)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/opt/pr60849.C13
-rw-r--r--gcc/tree-ssa-propagate.c8
4 files changed, 31 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index abfe318..99ef2dc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
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
* tree-vect-loop.c (vect_create_epilog_for_reduction): Force
initial PHI args to be gimple values.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f180aef..67f8eef 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
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
* g++.dg/vect/pr60836.cc: New testcase.
diff --git a/gcc/testsuite/g++.dg/opt/pr60849.C b/gcc/testsuite/g++.dg/opt/pr60849.C
new file mode 100644
index 0000000..52d8826
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/pr60849.C
@@ -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++;
+}
diff --git a/gcc/tree-ssa-propagate.c b/gcc/tree-ssa-propagate.c
index 840d7e7..47fd154 100644
--- a/gcc/tree-ssa-propagate.c
+++ b/gcc/tree-ssa-propagate.c
@@ -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;