aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2017-08-02 15:58:08 +0200
committerUros Bizjak <uros@gcc.gnu.org>2017-08-02 15:58:08 +0200
commitf46294817200cf2f07112eb8b53b814b1ed936b7 (patch)
tree7acd3b25423919e4feb69cff2187582500f15b99
parent5e9fab92d115add42280d51dc9c674aa7a5569a0 (diff)
downloadgcc-f46294817200cf2f07112eb8b53b814b1ed936b7.zip
gcc-f46294817200cf2f07112eb8b53b814b1ed936b7.tar.gz
gcc-f46294817200cf2f07112eb8b53b814b1ed936b7.tar.bz2
re PR target/81644 (ICE in rtl_verify_bb_insn, BBRO pass duplicates BB that ends with flow control insn)
PR target/81644 * config/i386/i386.md (unspecv): Add UNSPECV_UD2. (ud2): New insn pattern. * config/i386/i386.c (ix86_expand_epilogue): Generate ud2 instead of trap insn. testsuite/ChangeLog: PR target/81644 * gcc.target/i386/pr81644.c: New test. From-SVN: r250830
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/i386/i386.c2
-rw-r--r--gcc/config/i386/i386.md13
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr81644.c15
5 files changed, 42 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e6a4649..025d8fa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2017-08-02 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/81644
+ * config/i386/i386.md (unspecv): Add UNSPECV_UD2.
+ (ud2): New insn pattern.
+ * config/i386/i386.c (ix86_expand_epilogue):
+ Generate ud2 instead of trap insn.
+
2017-08-02 Marek Polacek <polacek@redhat.com>
PR other/81667
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index cd20b1b..a598465 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -15199,7 +15199,7 @@ ix86_expand_epilogue (int style)
if (ix86_function_naked (current_function_decl))
{
/* The program should not reach this point. */
- emit_insn (gen_trap ());
+ emit_insn (gen_ud2 ());
return;
}
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 5eff4e4..3465312 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -201,6 +201,7 @@
])
(define_c_enum "unspecv" [
+ UNSPECV_UD2
UNSPECV_BLOCKAGE
UNSPECV_STACK_PROBE
UNSPECV_PROBE_STACK_RANGE
@@ -18606,6 +18607,18 @@
}
[(set_attr "length" "2")])
+(define_insn "ud2"
+ [(unspec_volatile [(const_int 0)] UNSPECV_UD2)]
+ ""
+{
+#ifdef HAVE_AS_IX86_UD2
+ return "ud2";
+#else
+ return ASM_SHORT "0x0b0f";
+#endif
+}
+ [(set_attr "length" "2")])
+
(define_expand "prefetch"
[(prefetch (match_operand 0 "address_operand")
(match_operand:SI 1 "const_int_operand")
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c28019b..9fd6be4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-08-02 Uros Bizjak <ubizjak@gmail.com>
+
+ PR target/81644
+ * gcc.target/i386/pr81644.c: New test.
+
2017-08-02 Tom de Vries <tom@codesourcery.com>
* gcc.dg/Walloca-14.c: Use relative line number.
diff --git a/gcc/testsuite/gcc.target/i386/pr81644.c b/gcc/testsuite/gcc.target/i386/pr81644.c
new file mode 100644
index 0000000..61f94a4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr81644.c
@@ -0,0 +1,15 @@
+/* PR target/81644 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-additional-options "-mregparm=1" { target ia32 } } */
+
+void b (void);
+
+void
+__attribute__ ((naked))
+a (int z)
+{
+ if (z)
+ return;
+ b ();
+}