Hi,

in PR 69666, SRA attempts to turn a load from an aggregate that is
uninitialized into a load from a default definition SSA name (which
something it does to generate an appropriate warning later) but
unfortunately it does so using an access structure which is
representable with __int128 when the load in question is smaller.  It
then attempts to fix it up only to create an invalid V_C_E.  In this
case, the correct thing to do is not to attempt the transformation,
when there are smaller accesses, which can be figured out by looking
at the unscalarizable_region flag of the access.

Bootstrapped and tested on x86_64, OK for trunk and later for the 5
branch?

Thanks,

Martin


2016-02-19  Martin Jambor  <mjam...@suse.cz>

        PR tree-optimization/69666
        * tree-sra.c (sra_modify_assign): Do not attempt to create
        defaut_def replacements for unscalarizable regions.

testsuite/
        * gcc.dg/tree-ssa/pr69666.c: New test.
---
 gcc/testsuite/gcc.dg/tree-ssa/pr69666.c | 16 ++++++++++++++++
 gcc/tree-sra.c                          |  1 +
 2 files changed, 17 insertions(+)
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr69666.c

diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr69666.c 
b/gcc/testsuite/gcc.dg/tree-ssa/pr69666.c
new file mode 100644
index 0000000..9be77ea
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr69666.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -w" } */
+
+int a, c, d;
+float b;
+void *memcpy();
+int fun1(int p1, unsigned char *p2) {
+  p2[p1] = b;
+  return a;
+}
+void fun2() {
+  unsigned char e[16];
+  fun1(16, e);
+  d = e[d];
+  memcpy(&c, e, sizeof(e));
+}
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 72157ed..663ded2 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -3339,6 +3339,7 @@ sra_modify_assign (gimple *stmt, gimple_stmt_iterator 
*gsi)
     }
   else if (racc
           && !racc->grp_unscalarized_data
+          && !racc->grp_unscalarizable_region
           && TREE_CODE (lhs) == SSA_NAME
           && !access_has_replacements_p (racc))
     {
-- 
2.7.0

Reply via email to