[PATCH] Fix PR77697

2016-09-23 Thread Richard Biener

As noted in the PR defcodefor_name was quite broken - the following
rectifies it.

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

Richard.

2016-09-23  Richard Biener  

PR tree-optimization/77697
* tree-ssa-forwprop.c (defcodefor_name): Remove bogus code,
signal error if we have sth ternary or unhandled.

Index: gcc/tree-ssa-forwprop.c
===
--- gcc/tree-ssa-forwprop.c (revision 240388)
+++ gcc/tree-ssa-forwprop.c (working copy)
@@ -1458,6 +1458,7 @@ defcodefor_name (tree name, enum tree_co
   code1 = TREE_CODE (name);
   arg11 = name;
   arg21 = NULL_TREE;
+  arg31 = NULL_TREE;
   grhs_class = get_gimple_rhs_class (code1);
 
   if (code1 == SSA_NAME)
@@ -1470,20 +1471,18 @@ defcodefor_name (tree name, enum tree_co
  code1 = gimple_assign_rhs_code (def);
  arg11 = gimple_assign_rhs1 (def);
   arg21 = gimple_assign_rhs2 (def);
-  arg31 = gimple_assign_rhs2 (def);
+  arg31 = gimple_assign_rhs3 (def);
}
 }
-  else if (grhs_class == GIMPLE_TERNARY_RHS
-  || GIMPLE_BINARY_RHS
-  || GIMPLE_UNARY_RHS
-  || GIMPLE_SINGLE_RHS)
-extract_ops_from_tree (name, , , , );
+  else if (grhs_class != GIMPLE_SINGLE_RHS)
+code1 = ERROR_MARK;
 
   *code = code1;
   *arg1 = arg11;
   if (arg2)
 *arg2 = arg21;
-  /* Ignore arg3 currently. */
+  if (arg31)
+*code = ERROR_MARK;
 }
 
 


[PATCH] Fix PR77697

2016-09-22 Thread Richard Biener

This fixes PR77697, an ice-on-invalid for Fortran (varasm later errors).

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

Richard.

2016-09-22  Richard Biener  

PR middle-end/77697
* gimple-fold.c (fold_array_ctor_reference): Turn asserts into
fold fails.

Index: gcc/gimple-fold.c
===
--- gcc/gimple-fold.c   (revision 240342)
+++ gcc/gimple-fold.c   (working copy)
@@ -5647,14 +5638,15 @@ fold_array_ctor_reference (tree type, tr
   if (domain_type && TYPE_MIN_VALUE (domain_type))
 {
   /* Static constructors for variably sized objects makes no sense.  */
-  gcc_assert (TREE_CODE (TYPE_MIN_VALUE (domain_type)) == INTEGER_CST);
+  if (TREE_CODE (TYPE_MIN_VALUE (domain_type)) != INTEGER_CST)
+   return NULL_TREE;
   low_bound = wi::to_offset (TYPE_MIN_VALUE (domain_type));
 }
   else
 low_bound = 0;
   /* Static constructors for variably sized objects makes no sense.  */
-  gcc_assert (TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (ctor
- == INTEGER_CST);
+  if (TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (ctor != INTEGER_CST)
+return NULL_TREE;
   elt_size = wi::to_offset (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (ctor;
 
   /* We can handle only constantly sized accesses that are known to not