[adding cc gcc-patches ]
On 12/04/16 09:25, Tom de Vries wrote:
Hi,
when compiling the test-case in the patch, we run into an ICE in
sese_build_liveouts_use when evaluating 'TREE_CODE (use)' because use is
NULL_TREE:
...
static void
sese_build_liveouts_use (sese_info_p region, bitmap liveouts,
basic_block bb, tree use)
{
gcc_assert (!bb_in_sese_p (bb, region->region));
if (TREE_CODE (use) != SSA_NAME)
return;
...
I've tracked down the origin of the NULL_TREE use to copy_cond_phi_args,
to this snippet:
...
if (postpone)
{
/* If the phi-arg is scev-analyzeable but only in the first
stage. */
if (is_gimple_reg (old_name)
&& scev_analyzable_p (old_name, region->region))
{
gimple_seq stmts;
tree new_expr = get_rename_from_scev (old_name, &stmts,
loop, new_bb,
old_bb, iv_map);
if (codegen_error_p ())
return false;
gcc_assert (new_expr);
if (dump_file)
{
fprintf (dump_file,
"[codegen] scev analyzeable, new_expr: ");
print_generic_expr (dump_file, new_expr, 0);
fprintf (dump_file, "\n");
}
gsi_insert_earliest (stmts);
new_phi_args[i] = new_name;
continue;
}
/* Postpone code gen for later for back-edges. */
region->incomplete_phis.safe_push (std::make_pair (phi,
new_phi));
...
My observations are:
- new_name is guaranteed to be NULL_TREE at this point.
- the 'new_phi_args[i] = new_name' assignment should set to something
non-NULL, given that we're not postponing code generation for later
- the whole point of the snippet seems to be to set up an expression
new_expr, so probably that's the expression we want to assign to
new_phi_args[i].
Bootstrapped and reg-tested on x86_64.
Ok for stage4 trunk?
Thanks,
- Tom
0001-Fix-typo-in-copy_cond_phi_args.patch
Fix typo in copy_cond_phi_args
2016-04-12 Tom de Vries <t...@codesourcery.com>
PR tree-optimization/68756
* graphite-isl-ast-to-gimple.c (copy_cond_phi_args): Use new_expr
instead of new_name.
* gcc.dg/graphite/pr68756.c: New test.
---
gcc/graphite-isl-ast-to-gimple.c | 2 +-
gcc/testsuite/gcc.dg/graphite/pr68756.c | 26 ++++++++++++++++++++++++++
2 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/gcc/graphite-isl-ast-to-gimple.c b/gcc/graphite-isl-ast-to-gimple.c
index 8dd5dc8..88609c0 100644
--- a/gcc/graphite-isl-ast-to-gimple.c
+++ b/gcc/graphite-isl-ast-to-gimple.c
@@ -2439,7 +2439,7 @@ copy_cond_phi_args (gphi *phi, gphi *new_phi, vec<tree>
iv_map, bool postpone)
fprintf (dump_file, "\n");
}
gsi_insert_earliest (stmts);
- new_phi_args [i] = new_name;
+ new_phi_args[i] = new_expr;
continue;
}
diff --git a/gcc/testsuite/gcc.dg/graphite/pr68756.c
b/gcc/testsuite/gcc.dg/graphite/pr68756.c
new file mode 100644
index 0000000..ddb9789
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/graphite/pr68756.c
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -floop-nest-optimize" } */
+
+unsigned int z4, pz;
+int nn[2];
+
+static unsigned int
+xq (unsigned int dj)
+{
+ return dj > 1 ? z4 : z4 + dj;
+}
+
+void
+la (void)
+{
+ int hd, dl;
+ unsigned int hn = 0;
+
+ for (hd = 0; hd < 2; ++hd)
+ {
+ for (dl = 0; dl < 2; ++dl)
+ nn[dl] = 0;
+ --hn;
+ pz = xq (hn);
+ }
+}