Hi.

As other calls of get_ops is guarded with TREE_CODE (x) == SSA_NAME, I guess the
same should be done for the call that causes the ICE.

Patch can bootstrap on ppc64le-redhat-linux and survives regression tests.

Ready to be installed?
Martin
>From 9dd5cc00eb3c271fad91fede6a9b06df356e001f Mon Sep 17 00:00:00 2001
From: marxin <mli...@suse.cz>
Date: Mon, 25 Jul 2016 09:19:54 +0200
Subject: [PATCH] Call get_ops just for SSA_NAMEs (PR tree-optimization/71987)

gcc/ChangeLog:

2016-07-25  Martin Liska  <mli...@suse.cz>

	PR tree-optimization/71987
	* tree-ssa-reassoc.c (maybe_optimize_range_tests): Call get_ops
	just for SSA_NAMEs.

gcc/testsuite/ChangeLog:

2016-07-25  Martin Liska  <mli...@suse.cz>

	* gcc.dg/torture/pr71987.c: New test.
---
 gcc/testsuite/gcc.dg/torture/pr71987.c | 21 +++++++++++++++++++++
 gcc/tree-ssa-reassoc.c                 | 10 ++++++----
 2 files changed, 27 insertions(+), 4 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/torture/pr71987.c

diff --git a/gcc/testsuite/gcc.dg/torture/pr71987.c b/gcc/testsuite/gcc.dg/torture/pr71987.c
new file mode 100644
index 0000000..87d5938
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr71987.c
@@ -0,0 +1,21 @@
+/* PR tree-optimization/71987 */
+
+int a, b, *c, *d;
+
+short fn1 (int p1)
+{
+  return a ? p1 : a;
+}
+
+void fn2 ()
+{
+  int e, *f = &e;
+  b = fn1 (d != &e);
+  c = f;
+}
+
+int main ()
+{
+  fn2 ();
+  return 0;
+}
diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c
index ece2d08..dfaf7d8 100644
--- a/gcc/tree-ssa-reassoc.c
+++ b/gcc/tree-ssa-reassoc.c
@@ -3519,7 +3519,8 @@ maybe_optimize_range_tests (gimple *stmt)
 	     (or &, corresponding to 1/0 in the phi arguments,
 	     push into ops the individual range test arguments
 	     of the bitwise or resp. and, recursively.  */
-	  if (!get_ops (rhs, code, &ops,
+	  if (TREE_CODE (rhs) == SSA_NAME
+	      && !get_ops (rhs, code, &ops,
 			loop_containing_stmt (stmt))
 	      && (TREE_CODE_CLASS (gimple_assign_rhs_code (stmt))
 		  != tcc_comparison)
@@ -3537,11 +3538,12 @@ maybe_optimize_range_tests (gimple *stmt)
 	      bb_ent.last_idx++;
 	      bb_ent.op = rhs;
 	    }
-	  else if (is_gimple_assign (stmt)
+	  else if (TREE_CODE (lhs) == SSA_NAME
+		   && is_gimple_assign (stmt)
 		   && (TREE_CODE_CLASS (gimple_assign_rhs_code (stmt))
 		       == tcc_comparison)
-		   &&!get_ops (lhs, code, &ops,
-			       loop_containing_stmt (stmt))
+		   && !get_ops (lhs, code, &ops,
+				loop_containing_stmt (stmt))
 		   && has_single_use (lhs))
 	    {
 	      operand_entry *oe = operand_entry_pool.allocate ();
-- 
2.9.0

Reply via email to