[match-and-simplify] Fix NON_LVALUE_EXPR leaking

Message ID alpine.LSU.2.11.1408281532150.20733@zhemvz.fhfr.qr
State New
Headers show

Commit Message

Richard Biener Aug. 28, 2014, 1:34 p.m.
This tries to prevent NON_LVALUE_EXPR from leaking in to GIMPLE
(happens on trunk also, but mostly savaged by re-gimplifying
GENERIC folding results which strips them).  We need a better
solution in the end (fix the C++ frontend), but for now the
following should fix things enough.  (fingers crossing)


I plan to push the tree-cfg.c hunk to trunk as well (once it
passed bootstrap/testing there) - expand_debug_expr will
ICE on NON_LVALUE_EXPRs (which is where I noticed the above).


2014-08-28  Richard Biener  <rguenther@suse.de>

	* tree-cfg.c (verify_gimple_assign_unary): Do not allow
	NON_LVALUE_EXPR in gimple.
	* genmatch.c (main): Always define GENERIC and GIMPLE.
	* match-constant-folding.pd (x OP 0): Constrain when we
	generate NON_LVALUE_EXPR further.


Index: gcc/tree-cfg.c
--- gcc/tree-cfg.c	(revision 214677)
+++ gcc/tree-cfg.c	(working copy)
@@ -3572,7 +3572,6 @@  verify_gimple_assign_unary (gimple stmt)
     case ABS_EXPR:
     case BIT_NOT_EXPR:
     case PAREN_EXPR:
-    case NON_LVALUE_EXPR:
     case CONJ_EXPR:
Index: gcc/genmatch.c
--- gcc/genmatch.c	(revision 214677)
+++ gcc/genmatch.c	(working copy)
@@ -2544,6 +2544,7 @@  main(int argc, char **argv)
   if (!cpp_read_main_file (r, input))
     return 1;
   cpp_define (r, gimple ? "GIMPLE=1": "GENERIC=1");
+  cpp_define (r, gimple ? "GENERIC=0": "GIMPLE=0");
   /* Pre-seed operators.  */
   operators = new hash_table<id_base> (1024);
Index: gcc/match-constant-folding.pd
--- gcc/match-constant-folding.pd	(revision 214677)
+++ gcc/match-constant-folding.pd	(working copy)
@@ -20,7 +20,7 @@  along with GCC; see the file COPYING3.
 (for op in plus pointer_plus minus bit_ior bit_xor
     (op @0 integer_zerop)
-    (if (!in_gimple_form)
+    (if (GENERIC && !in_gimple_form)
       /* ???  fold_binary adds non_lvalue here and "fixes" the C++
 	 run of Wsizeof-pointer-memaccess1.c, preserving enough of
 	 sizeof (&a) + 0 because sizeof (&a) is maybe_lvalue_p ()