The following papers over the C++ FE issue that it doesn't track
lvalueness before folding stuff.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.

Richard.

2015-05-21  Richard Biener  <rguent...@suse.de>

        PR c++/66211
        * match.pd: Guard pattern optimzing (int)(float)int
        conversions to apply only on GIMPLE.

        * g++.dg/conversion/pr66211.C: New testcase.
        * gcc.dg/tree-ssa/forwprop-18.c: Adjust.

Index: gcc/testsuite/g++.dg/conversion/pr66211.C
===================================================================
*** gcc/testsuite/g++.dg/conversion/pr66211.C   (revision 0)
--- gcc/testsuite/g++.dg/conversion/pr66211.C   (working copy)
***************
*** 0 ****
--- 1,11 ----
+ // PR c++/66211
+ // { dg-do compile }
+ 
+ void f(int&){}
+ 
+ int main()
+ {
+   int x = 0;
+   double y = 1;
+   f(1 > 0 ? x : y); // { dg-error "from an rvalue" }
+ }
Index: gcc/match.pd
===================================================================
--- gcc/match.pd        (revision 223348)
+++ gcc/match.pd        (working copy)
@@ -791,7 +791,8 @@ (define_operator_list inverted_tcc_compa
    /* If we are converting an integer to a floating-point that can
       represent it exactly and back to an integer, we can skip the
       floating-point conversion.  */
-   (if (inside_int && inter_float && final_int &&
+   (if (GIMPLE /* PR66211 */
+       && inside_int && inter_float && final_int &&
        (unsigned) significand_size (TYPE_MODE (inter_type))
        >= inside_prec - !inside_unsignedp)
     (convert @0))))))
Index: gcc/testsuite/gcc.dg/tree-ssa/forwprop-18.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/forwprop-18.c (revision 223348)
+++ gcc/testsuite/gcc.dg/tree-ssa/forwprop-18.c (working copy)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O -fdump-tree-forwprop1" } */
+/* { dg-options "-O -fdump-tree-cddce1" } */
 
 signed char f1(signed char n)
 {
@@ -19,6 +19,6 @@ signed char g2(unsigned long long n)
   return (float)n;
 }
 
-/* { dg-final { scan-tree-dump-times "\\\(float\\\)" 2 "forwprop1" } } */
-/* { dg-final { scan-tree-dump-not "\\\(long double\\\)" "forwprop1" } } */
-/* { dg-final { cleanup-tree-dump "forwprop1" } } */
+/* { dg-final { scan-tree-dump-times "\\\(float\\\)" 2 "cddce1" } } */
+/* { dg-final { scan-tree-dump-not "\\\(long double\\\)" "cddce1" } } */
+/* { dg-final { cleanup-tree-dump "cddce1" } } */

Reply via email to