From becba8a79fb0a29aea9a8e10a6c298a124336b92 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 22 Jan 2019 10:12:31 +0100 Subject: [PATCH] re PR rtl-optimization/88904 (Basic block incorrectly skipped in jump threading.) PR rtl-optimization/88904 * cfgcleanup.c (thread_jump): Verify cond2 doesn't mention any nonequal registers before processing BB_END (b). * gcc.c-torture/execute/pr88904.c: New test. From-SVN: r268140 --- gcc/ChangeLog | 4 ++ gcc/cfgcleanup.c | 12 +++--- gcc/testsuite/ChangeLog | 3 ++ gcc/testsuite/gcc.c-torture/execute/pr88904.c | 38 +++++++++++++++++++ 4 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr88904.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0b0402aa7ef..64f920ece33 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2019-01-22 Jakub Jelinek + PR rtl-optimization/88904 + * cfgcleanup.c (thread_jump): Verify cond2 doesn't mention + any nonequal registers before processing BB_END (b). + PR target/88905 * optabs.c (add_equal_note): Add op0_mode argument, use it instead of GET_MODE (op0). diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c index b5c828fe3e5..fd27fd6d212 100644 --- a/gcc/cfgcleanup.c +++ b/gcc/cfgcleanup.c @@ -338,6 +338,13 @@ thread_jump (edge e, basic_block b) insn != NEXT_INSN (BB_END (b)) && !failed; insn = NEXT_INSN (insn)) { + /* cond2 must not mention any register that is not equal to the + former block. Check this before processing that instruction, + as BB_END (b) could contain also clobbers. */ + if (insn == BB_END (b) + && mentions_nonequal_regs (cond2, nonequal)) + goto failed_exit; + if (INSN_P (insn)) { rtx pat = PATTERN (insn); @@ -362,11 +369,6 @@ thread_jump (edge e, basic_block b) goto failed_exit; } - /* cond2 must not mention any register that is not equal to the - former block. */ - if (mentions_nonequal_regs (cond2, nonequal)) - goto failed_exit; - EXECUTE_IF_SET_IN_REG_SET (nonequal, 0, i, rsi) goto failed_exit; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 807c7188ff2..5dce351975d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2019-01-22 Jakub Jelinek + PR rtl-optimization/88904 + * gcc.c-torture/execute/pr88904.c: New test. + PR target/88905 * gcc.dg/pr88905.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/execute/pr88904.c b/gcc/testsuite/gcc.c-torture/execute/pr88904.c new file mode 100644 index 00000000000..8c285671321 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr88904.c @@ -0,0 +1,38 @@ +/* PR rtl-optimization/88904 */ + +volatile int v; + +__attribute__((noipa)) void +bar (const char *x, const char *y, int z) +{ + if (!v) + __builtin_abort (); + asm volatile ("" : "+g" (x)); + asm volatile ("" : "+g" (y)); + asm volatile ("" : "+g" (z)); +} + +#define my_assert(e) ((e) ? (void) 0 : bar (#e, __FILE__, __LINE__)) + +typedef struct { + unsigned M1; + unsigned M2 : 1; + int : 0; + unsigned M3 : 1; +} S; + +S +foo () +{ + S result = {0, 0, 1}; + return result; +} + +int +main () +{ + S ret = foo (); + my_assert (ret.M2 == 0); + my_assert (ret.M3 == 1); + return 0; +} -- 2.30.2