re PR tree-optimization/83170 (ICE: Segmentation fault - during GIMPLE pass: store...
authorJakub Jelinek <jakub@redhat.com>
Sat, 2 Dec 2017 07:58:57 +0000 (08:58 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 2 Dec 2017 07:58:57 +0000 (08:58 +0100)
PR tree-optimization/83170
PR tree-optimization/83241
* gimple-ssa-store-merging.c
(imm_store_chain_info::try_coalesce_bswap): Update vuse field from
gimple_vuse (ins_stmt) in case it has changed.
(imm_store_chain_info::output_merged_store): Likewise.

* gcc.dg/store_merging_17.c: New test.

From-SVN: r255356

gcc/ChangeLog
gcc/gimple-ssa-store-merging.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/store_merging_17.c [new file with mode: 0644]

index 40ef3d03f44aafaa55aa5d6d868f9660896fc772..cdf211fd850f0fc0d64c9546a7afff45aa5b7def 100644 (file)
@@ -1,5 +1,12 @@
 2017-12-02  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/83170
+       PR tree-optimization/83241
+       * gimple-ssa-store-merging.c
+       (imm_store_chain_info::try_coalesce_bswap): Update vuse field from
+       gimple_vuse (ins_stmt) in case it has changed.
+       (imm_store_chain_info::output_merged_store): Likewise.
+
        * tree-chkp.c (chkp_compute_bounds_for_assignment): Handle
        POINTER_DIFF_EXPR.
 
index 61aca1743fc95be0560136f0447f68aa43f0c151..90d8c811d56fe363ba4dbabdfdcc652ff9c123c7 100644 (file)
@@ -2384,6 +2384,9 @@ imm_store_chain_info::try_coalesce_bswap (merged_store_group *merged_store,
       this_n.type = type;
       if (!this_n.base_addr)
        this_n.range = try_size / BITS_PER_UNIT;
+      else
+       /* Update vuse in case it has changed by output_merged_stores.  */
+       this_n.vuse = gimple_vuse (info->ins_stmt);
       unsigned int bitpos = info->bitpos - infof->bitpos;
       if (!do_shift_rotate (LSHIFT_EXPR, &this_n,
                            BYTES_BIG_ENDIAN
@@ -3341,10 +3344,16 @@ imm_store_chain_info::output_merged_store (merged_store_group *group)
         we've checked the aliasing already in try_coalesce_bswap and
         we want to sink the need load into seq.  So need to use new_vuse
         on the load.  */
-      if (n->base_addr && n->vuse == NULL)
+      if (n->base_addr)
        {
-         n->vuse = new_vuse;
-         ins_stmt = NULL;
+         if (n->vuse == NULL)
+           {
+             n->vuse = new_vuse;
+             ins_stmt = NULL;
+           }
+         else
+           /* Update vuse in case it has changed by output_merged_stores.  */
+           n->vuse = gimple_vuse (ins_stmt);
        }
       bswap_res = bswap_replace (gsi_start (seq), ins_stmt, fndecl,
                                 bswap_type, load_type, n, bswap);
index c66f31483e51222df7d344e929298eb2f9691adb..57ffc72cdcbc959179e4e782029661841b4b3870 100644 (file)
@@ -1,5 +1,9 @@
 2017-12-02  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/83170
+       PR tree-optimization/83241
+       * gcc.dg/store_merging_17.c: New test.
+
        * gcc.target/i386/mpx/pointer-diff-1.c: New test.
 
        PR c++/81212
diff --git a/gcc/testsuite/gcc.dg/store_merging_17.c b/gcc/testsuite/gcc.dg/store_merging_17.c
new file mode 100644 (file)
index 0000000..76e6b63
--- /dev/null
@@ -0,0 +1,17 @@
+/* PR tree-optimization/83241 */
+/* { dg-do compile { target store_merge } } */
+/* { dg-options "-O2" } */
+
+struct S { int a; short b[32]; } e;
+struct T { volatile int c; int d; } f;
+
+void
+foo ()
+{
+  struct T g = f;
+  e.b[0] = 6;
+  e.b[1] = 6;
+  e.b[4] = g.d;
+  e.b[5] = g.d >> 16;
+  e.a = 1;
+}