This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] ira: Don't substitute into TRAP_IF insns (PR78610)
- From: Segher Boessenkool <segher at kernel dot crashing dot org>
- To: gcc-patches at gcc dot gnu dot org
- Cc: vmakarov at redhat dot com, Segher Boessenkool <segher at kernel dot crashing dot org>
- Date: Wed, 30 Nov 2016 12:46:32 +0000
- Subject: [PATCH] ira: Don't substitute into TRAP_IF insns (PR78610)
- Authentication-results: sourceware.org; auth=none
In the testcase, IRA propagates a constant into a TRAP_IF insn, which
then becomes an unconditional trap. Unconditional traps are control
flow insns so doing this requires surgery on the cfg. We cannot do
that here, so instead refuse to do the substitution.
Bootstrapping + regression testing on powerpc64-linux {-m64,-m32}
(the bug happened here with -m32); okay for trunk if this succeeds?
Segher
2016-11-30 Segher Boessenkool <segher@kernel.crashing.org>
PR rtl-optimization/78610
* ira.c (combine_and_move_insns): Don't substitute into TRAP_IF
instructions.
gcc/testsuite/
PR rtl-optimization/78610
* gcc.c-torture/compile/pr78610.c: New testcase.
---
gcc/ira.c | 5 +++++
gcc/testsuite/gcc.c-torture/compile/pr78610.c | 14 ++++++++++++++
2 files changed, 19 insertions(+)
create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr78610.c
diff --git a/gcc/ira.c b/gcc/ira.c
index d20ec99..ccd4980 100644
--- a/gcc/ira.c
+++ b/gcc/ira.c
@@ -3669,6 +3669,11 @@ combine_and_move_insns (void)
if (JUMP_P (use_insn))
continue;
+ /* Also don't substitute into a conditional trap insn -- it can become
+ an unconditional trap, and that is a flow control insn. */
+ if (GET_CODE (PATTERN (use_insn)) == TRAP_IF)
+ continue;
+
df_ref def = DF_REG_DEF_CHAIN (regno);
gcc_assert (DF_REG_DEF_COUNT (regno) == 1 && DF_REF_INSN_INFO (def));
rtx_insn *def_insn = DF_REF_INSN (def);
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr78610.c b/gcc/testsuite/gcc.c-torture/compile/pr78610.c
new file mode 100644
index 0000000..0415ae6
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr78610.c
@@ -0,0 +1,14 @@
+/* PR rtl-optimization/78610 */
+
+unsigned int ao, gl;
+
+void
+ri (void)
+{
+ for (;;)
+ {
+ if (ao != 1)
+ ao /= 0;
+ gl = 0;
+ }
+}
--
1.9.3