aboutsummaryrefslogtreecommitdiff
path: root/gcc/ifcvt.c
diff options
context:
space:
mode:
authorAlexandre Oliva <oliva@adacore.com>2021-12-04 00:17:16 -0300
committerAlexandre Oliva <oliva@gnu.org>2021-12-04 00:17:16 -0300
commitdaca416fc2816a5e481b26c8d2010127101d77ce (patch)
treef3376d7df14462031bdd78581b06bf29b82a3f88 /gcc/ifcvt.c
parente096e2cfe9f587ac189fd7db7390585333900d2e (diff)
downloadgcc-daca416fc2816a5e481b26c8d2010127101d77ce.zip
gcc-daca416fc2816a5e481b26c8d2010127101d77ce.tar.gz
gcc-daca416fc2816a5e481b26c8d2010127101d77ce.tar.bz2
[PR103028] test ifcvt trap_if seq more strictly after reload
When -fif-conversion2 is enabled, we attempt to replace conditional branches around unconditional traps with conditional traps. That canonicalizes compares, which may change an immediate that barely fits into one that doesn't. The compare for the trap is first checked using the predicates of cbranch predicates, and then, compare and conditional trap insns are emitted and recognized. In the failing s390x testcase, i <=u 0xffff_ffff is canonicalized into i <u 0x1_0000_0000, and the latter immediate doesn't fit. The insn predicates (both cbranch and cmpdi_ccu) happily accept it, since the register allocator has no trouble getting them into registers. The problem is that ifcvt2 runs after reload, so we recognize the compare insn successfully, but later on we barf when we find that none of the constraints fit. This patch arranges for the trap_if-issuing bits in ifcvt to validate post-reload insns using a stricter test that also checks that operands fit the constraints. for gcc/ChangeLog PR rtl-optimization/103028 * ifcvt.c (find_cond_trap): Validate new insns more strictly after reload. for gcc/testsuite/ChangeLog PR rtl-optimization/103028 * gcc.dg/pr103028.c: New.
Diffstat (limited to 'gcc/ifcvt.c')
-rw-r--r--gcc/ifcvt.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c
index 017944f..b0052f6 100644
--- a/gcc/ifcvt.c
+++ b/gcc/ifcvt.c
@@ -4726,7 +4726,9 @@ find_cond_trap (basic_block test_bb, edge then_edge, edge else_edge)
/* If that results in an invalid insn, back out. */
for (rtx_insn *x = seq; x; x = NEXT_INSN (x))
- if (recog_memoized (x) < 0)
+ if (reload_completed
+ ? !valid_insn_p (x)
+ : recog_memoized (x) < 0)
return FALSE;
/* Emit the new insns before cond_earliest. */