We fold stmts from non-SSA so when we simplify a single stmt
into multiple ones (like strcat (x, "foo") -> memcpy (x + strlen ("foo"), 
....)) then gimple_build fails because it unconditionally builds
SSA names.

Fixed.

Richard.

2014-08-06  Richard Biener  <rguent...@suse.de>

        * gimple-fold.c (gimple_build): Allow to be called from
        non-SSA context.

Index: gcc/gimple-fold.c
===================================================================
--- gcc/gimple-fold.c   (revision 213651)
+++ gcc/gimple-fold.c   (working copy)
@@ -3733,7 +3733,10 @@ gimple_build (gimple_seq *seq, location_
   tree res = gimple_simplify (code, type, op0, seq, valueize);
   if (!res)
     {
-      res = make_ssa_name (type, NULL);
+      if (gimple_in_ssa_p (cfun))
+       res = make_ssa_name (type, NULL);
+      else
+       res = create_tmp_reg (type, NULL);
       gimple stmt;
       if (code == REALPART_EXPR
          || code == IMAGPART_EXPR
@@ -3763,7 +3766,10 @@ gimple_build (gimple_seq *seq, location_
   tree res = gimple_simplify (code, type, op0, op1, seq, valueize);
   if (!res)
     {
-      res = make_ssa_name (type, NULL);
+      if (gimple_in_ssa_p (cfun))
+       res = make_ssa_name (type, NULL);
+      else
+       res = create_tmp_reg (type, NULL);
       gimple stmt = gimple_build_assign_with_ops (code, res, op0, op1);
       gimple_set_location (stmt, loc);
       gimple_seq_add_stmt_without_update (seq, stmt);
@@ -3787,7 +3793,10 @@ gimple_build (gimple_seq *seq, location_
                              seq, valueize);
   if (!res)
     {
-      res = make_ssa_name (type, NULL);
+      if (gimple_in_ssa_p (cfun))
+       res = make_ssa_name (type, NULL);
+      else
+       res = create_tmp_reg (type, NULL);
       gimple stmt;
       if (code == BIT_FIELD_REF)
        stmt = gimple_build_assign_with_ops (code, res,
@@ -3816,7 +3825,10 @@ gimple_build (gimple_seq *seq, location_
   tree res = gimple_simplify (fn, type, arg0, seq, valueize);
   if (!res)
     {
-      res = make_ssa_name (type, NULL);
+      if (gimple_in_ssa_p (cfun))
+       res = make_ssa_name (type, NULL);
+      else
+       res = create_tmp_reg (type, NULL);
       tree decl = builtin_decl_implicit (fn);
       gimple stmt = gimple_build_call (decl, 1, arg0);
       gimple_call_set_lhs (stmt, res);

Reply via email to