diff mbox

[PR,69920] Prevent SRA from leaving a removed SSA_NAME in IL

Message ID 20160226161543.GM3094@virgil.suse.cz
State New
Headers show

Commit Message

Martin Jambor Feb. 26, 2016, 4:15 p.m. UTC
Hi,

my fix for PR 69666 has caused quite a few regressions accross the
borad where SRA removed a SSA_NAME which however still was in the IL
(and usually stumbled upon it itself straight away).

The removal path should not be executed when there is an SSA_NAME on
the LHS, the code clearly is not ready for it.  Before my patch, we
got always lucky because the statement was simply modified elsewhere
when the LHS was an SSA_NAME.  However, even that was not 10%
guaranteed because of the !access_has_replacements_p (racc) part of
the changed condition.

The patch below fixes the ICEs simply by guarding the removal code to
only work when the LHS is not an SSA_NAME.  This means that the safe
path below it is going to execute.

I have bootstrapped and tested the patch on x86_64-linux.  I'd like to
commit it to trunk as soon as it gets approved and then I'd like to
commit it to gcc-5 branch together with the PR 69666 fix a few days
afterwards.  OK?

Thanks,

Martin


2016-02-26  Martin Jambor  <mjambor@suse.cz>

	PR middle-end/69920
	* tree-sra.c (sra_modify_assign): Do not remove loads of
	uninitialized aggregates to SSA_NAMEs.

testsuite/
	* gcc.dg/torture/pr69932.c: New test.
	* gcc.dg/torture/pr69936.c: Likewise.
---
 gcc/testsuite/gcc.dg/torture/pr69932.c | 10 ++++++++++
 gcc/testsuite/gcc.dg/torture/pr69936.c | 24 ++++++++++++++++++++++++
 gcc/tree-sra.c                         |  3 ++-
 3 files changed, 36 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.dg/torture/pr69932.c
 create mode 100644 gcc/testsuite/gcc.dg/torture/pr69936.c

Comments

Richard Biener Feb. 26, 2016, 5:47 p.m. UTC | #1
On February 26, 2016 5:15:43 PM GMT+01:00, Martin Jambor <mjambor@suse.cz> wrote:
>Hi,
>
>my fix for PR 69666 has caused quite a few regressions accross the
>borad where SRA removed a SSA_NAME which however still was in the IL
>(and usually stumbled upon it itself straight away).
>
>The removal path should not be executed when there is an SSA_NAME on
>the LHS, the code clearly is not ready for it.  Before my patch, we
>got always lucky because the statement was simply modified elsewhere
>when the LHS was an SSA_NAME.  However, even that was not 10%
>guaranteed because of the !access_has_replacements_p (racc) part of
>the changed condition.
>
>The patch below fixes the ICEs simply by guarding the removal code to
>only work when the LHS is not an SSA_NAME.  This means that the safe
>path below it is going to execute.
>
>I have bootstrapped and tested the patch on x86_64-linux.  I'd like to
>commit it to trunk as soon as it gets approved and then I'd like to
>commit it to gcc-5 branch together with the PR 69666 fix a few days
>afterwards.  OK?

OK.

Richard.

>Thanks,
>
>Martin
>
>
>2016-02-26  Martin Jambor  <mjambor@suse.cz>
>
>	PR middle-end/69920
>	* tree-sra.c (sra_modify_assign): Do not remove loads of
>	uninitialized aggregates to SSA_NAMEs.
>
>testsuite/
>	* gcc.dg/torture/pr69932.c: New test.
>	* gcc.dg/torture/pr69936.c: Likewise.
>---
> gcc/testsuite/gcc.dg/torture/pr69932.c | 10 ++++++++++
> gcc/testsuite/gcc.dg/torture/pr69936.c | 24 ++++++++++++++++++++++++
> gcc/tree-sra.c                         |  3 ++-
> 3 files changed, 36 insertions(+), 1 deletion(-)
> create mode 100644 gcc/testsuite/gcc.dg/torture/pr69932.c
> create mode 100644 gcc/testsuite/gcc.dg/torture/pr69936.c
>
>diff --git a/gcc/testsuite/gcc.dg/torture/pr69932.c
>b/gcc/testsuite/gcc.dg/torture/pr69932.c
>new file mode 100644
>index 0000000..4b82130
>--- /dev/null
>+++ b/gcc/testsuite/gcc.dg/torture/pr69932.c
>@@ -0,0 +1,10 @@
>+/* { dg-do compile } */
>+
>+int a;
>+void fn1() {
>+  int b = 4;
>+  short c[4];
>+  c[b] = c[a];
>+  if (c[2]) {}
>+
>+}
>diff --git a/gcc/testsuite/gcc.dg/torture/pr69936.c
>b/gcc/testsuite/gcc.dg/torture/pr69936.c
>new file mode 100644
>index 0000000..3023bbb
>--- /dev/null
>+++ b/gcc/testsuite/gcc.dg/torture/pr69936.c
>@@ -0,0 +1,24 @@
>+/* { dg-do compile } */
>+
>+int a;
>+char b;
>+void fn1(int p1) {}
>+
>+int fn2() { return 5; }
>+
>+void fn3() {
>+  if (fn2())
>+    ;
>+  else {
>+    char c[5];
>+    c[0] = 5;
>+  lbl_608:
>+    fn1(c[9]);
>+    int d = c[9];
>+    c[2] | a;
>+    d = c[b];
>+  }
>+  goto lbl_608;
>+}
>+
>+int main() { return 0; }
>diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
>index 663ded2..366f413 100644
>--- a/gcc/tree-sra.c
>+++ b/gcc/tree-sra.c
>@@ -3504,7 +3504,8 @@ sra_modify_assign (gimple *stmt,
>gimple_stmt_iterator *gsi)
>       else
> 	{
> 	  if (access_has_children_p (racc)
>-	      && !racc->grp_unscalarized_data)
>+	      && !racc->grp_unscalarized_data
>+	      && TREE_CODE (lhs) != SSA_NAME)
> 	    {
> 	      if (dump_file)
> 		{
diff mbox

Patch

diff --git a/gcc/testsuite/gcc.dg/torture/pr69932.c b/gcc/testsuite/gcc.dg/torture/pr69932.c
new file mode 100644
index 0000000..4b82130
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr69932.c
@@ -0,0 +1,10 @@ 
+/* { dg-do compile } */
+
+int a;
+void fn1() {
+  int b = 4;
+  short c[4];
+  c[b] = c[a];
+  if (c[2]) {}
+
+}
diff --git a/gcc/testsuite/gcc.dg/torture/pr69936.c b/gcc/testsuite/gcc.dg/torture/pr69936.c
new file mode 100644
index 0000000..3023bbb
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr69936.c
@@ -0,0 +1,24 @@ 
+/* { dg-do compile } */
+
+int a;
+char b;
+void fn1(int p1) {}
+
+int fn2() { return 5; }
+
+void fn3() {
+  if (fn2())
+    ;
+  else {
+    char c[5];
+    c[0] = 5;
+  lbl_608:
+    fn1(c[9]);
+    int d = c[9];
+    c[2] | a;
+    d = c[b];
+  }
+  goto lbl_608;
+}
+
+int main() { return 0; }
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 663ded2..366f413 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -3504,7 +3504,8 @@  sra_modify_assign (gimple *stmt, gimple_stmt_iterator *gsi)
       else
 	{
 	  if (access_has_children_p (racc)
-	      && !racc->grp_unscalarized_data)
+	      && !racc->grp_unscalarized_data
+	      && TREE_CODE (lhs) != SSA_NAME)
 	    {
 	      if (dump_file)
 		{