When we split:

(insn 18 17 76 2 (set (reg:SF 88 [ _19 ])
        (float:SF (mem/c:SI (symbol_ref:DI ("d") [flags 0x2]  <var_decl 
0x7fd6d8290c60 d>) [1 d+0 S4 A32]))) "x.ii":4:20 170 {*floatsisf2}
     (expr_list:REG_EH_REGION (const_int 2 [0x2])
        (nil)))

to

(insn 94 17 18 2 (set (reg:V4SF 115)
        (vec_merge:V4SF (vec_duplicate:V4SF (float:SF (mem/c:SI (symbol_ref:DI 
("d") [flags 0x2]  <var_decl 0x7f346837ac60 d>) [1 d+0 S4 A32])))
            (reg:V4SF 114)
            (const_int 1 [0x1]))) "x.ii":4:20 -1
     (nil))
(insn 18 94 76 2 (set (reg:SF 88 [ _19 ])
        (subreg:SF (reg:V4SF 115) 0)) "x.ii":4:20 112 {*movsf_internal}
     (expr_list:REG_EH_REGION (const_int 2 [0x2])
        (nil)))

we must copy the REG_EH_REGION note to the first insn.  The REG_EH_REGION
on the second insn will be removed later since it no longer traps.

OK for trunk?


H.J.
---
gcc/

        PR target/89650
        * config/i386/i386.c (remove_partial_avx_dependency): Handle
        REG_EH_REGION note.

gcc/testsuite/

        PR target/89650
        * g++.target/i386/pr89650.C: New test.
---
 gcc/config/i386/i386.c                  |  6 ++++++
 gcc/testsuite/g++.target/i386/pr89650.C | 19 +++++++++++++++++++
 2 files changed, 25 insertions(+)
 create mode 100644 gcc/testsuite/g++.target/i386/pr89650.C

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 896c6f33d40..b702703074c 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -2873,6 +2873,12 @@ remove_partial_avx_dependency (void)
          /* Generate an XMM vector SET.  */
          set = gen_rtx_SET (vec, src);
          set_insn = emit_insn_before (set, insn);
+
+         /* Handle REG_EH_REGION note.  */
+         rtx note = find_reg_note (insn, REG_EH_REGION, NULL_RTX);
+         if (note)
+           add_reg_note (insn, REG_EH_REGION, XEXP (note, 0));
+
          df_insn_rescan (set_insn);
 
          src = gen_rtx_SUBREG (dest_mode, vec, 0);
diff --git a/gcc/testsuite/g++.target/i386/pr89650.C 
b/gcc/testsuite/g++.target/i386/pr89650.C
new file mode 100644
index 00000000000..4b253cbf467
--- /dev/null
+++ b/gcc/testsuite/g++.target/i386/pr89650.C
@@ -0,0 +1,19 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-O2 -flive-range-shrinkage -fno-tree-dce -fno-dce 
-fnon-call-exceptions -mavx" }
+
+int d, e;
+struct g {
+  float f;
+  g(float h) : f(h + d) {}
+  ~g() {}
+};
+struct i {
+  int a;
+  int b : 4;
+  int &c;
+  i(int h) : a(), b(), c(h) {}
+};
+int main() {
+  i j(e);
+  g k[]{1, 2};
+}
-- 
2.20.1

Reply via email to