[PR103028] test ifcvt trap_if seq more strictly after reload
commitdaca416fc2816a5e481b26c8d2010127101d77ce
authorAlexandre Oliva <oliva@adacore.com>
Sat, 4 Dec 2021 03:17:16 +0000 (4 00:17 -0300)
committerAlexandre Oliva <oliva@gnu.org>
Sat, 4 Dec 2021 03:17:16 +0000 (4 00:17 -0300)
treef3376d7df14462031bdd78581b06bf29b82a3f88
parente096e2cfe9f587ac189fd7db7390585333900d2e
[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.
gcc/ifcvt.c
gcc/testsuite/gcc.dg/pr103028.c [new file with mode: 0644]