The following fixes the C familiy gimplification langhook to not
introduce tree sharing which isn't valid during gimplification.
For the specific case the tree sharing is introduced by
fold_binary_op_with_cond and is reached via convert () eventually
folding something.  I've kept folding constants here but for the
rest defer folding to GIMPLE (the gimplifier already folds most
generated stmts).

Bootstrapped and tested on x86_64-unknown-linux-gnu, ok for trunk and 
branches?

Thanks,
Richard.

2018-03-15  Richard Biener  <rguent...@suse.de>

        PR c/84873
        * c-gimplify.c (c_gimplify_expr): Do not fold expressions.

        * c-c++-common/pr84873.c: New testcase.

Index: gcc/c-family/c-gimplify.c
===================================================================
--- gcc/c-family/c-gimplify.c   (revision 258552)
+++ gcc/c-family/c-gimplify.c   (working copy)
@@ -245,7 +245,15 @@ c_gimplify_expr (tree *expr_p, gimple_se
                                    unsigned_type_node)
            && !types_compatible_p (TYPE_MAIN_VARIANT (TREE_TYPE (*op1_p)),
                                    integer_type_node))
-         *op1_p = convert (unsigned_type_node, *op1_p);
+         {
+           /* ???  Do not use convert () here or fold arbitrary trees
+              since folding can introduce tree sharing which is not
+              allowed during gimplification.  */
+           if (TREE_CODE (*op1_p) == INTEGER_CST)
+             *op1_p = fold_convert (unsigned_type_node, *op1_p);
+           else
+             *op1_p = build1 (NOP_EXPR, unsigned_type_node, *op1_p);
+         }
        break;
       }
 
Index: gcc/testsuite/c-c++-common/pr84873.c
===================================================================
--- gcc/testsuite/c-c++-common/pr84873.c        (nonexistent)
+++ gcc/testsuite/c-c++-common/pr84873.c        (working copy)
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-frounding-math" } */
+
+int
+i1 (int w3, int n9)
+{
+  return w3 >> ((long int)(1 + 0.1) + -!n9);
+}

Reply via email to