tree-ssa-threadbackward.c (profitable_jump_thread_path): Do not allow __builtin_const...
authorIlya Leoshkevich <iii@linux.ibm.com>
Wed, 3 Jun 2020 18:55:20 +0000 (20:55 +0200)
committerIlya Leoshkevich <iii@linux.ibm.com>
Thu, 3 Dec 2020 00:21:10 +0000 (01:21 +0100)
commit70a62009181f66d1d1c90d3c74de38e153c96eb0
tree36d39627f52e3b33fa3c3833ae7f6025219a66be
parent11860cf440198a9023135a93d781f45bc8cccc4d
tree-ssa-threadbackward.c (profitable_jump_thread_path): Do not allow __builtin_constant_p.

Linux Kernel (specifically, drivers/leds/trigger/ledtrig-cpu.c) build
with GCC 10 fails on s390 with "impossible constraint".

Explanation by Jeff Law:

```
So what we have is a b_c_p at the start of an if-else chain.  Subsequent
tests on the "true" arm of the the b_c_p test may throw us off the
constant path (because the constants are out of range).  Once all the
tests are passed (it's constant and the constant is in range) the true
arm's terminal block has a special asm that requires a constant
argument.   In the case where we get to the terminal block on the true
arm, the argument to the b_c_p is used as the constant argument to the
special asm.

At first glace jump threading seems to be doing the right thing.  Except
that we end up with two paths to that terminal block with the special
asm, one for each of the two constant arguments to the b_c_p call.
Naturally since that same value is used in the asm, we have to introduce
a PHI to select between them at the head of the terminal block.   Now
the argument in the asm is no longer constant and boom we fail.
```

Fix by disallowing __builtin_constant_p on threading paths.

gcc/ChangeLog:

2020-06-03  Ilya Leoshkevich  <iii@linux.ibm.com>

* tree-ssa-threadbackward.c (thread_jumps::profitable_jump_thread_path):
Do not allow __builtin_constant_p on a threading path.

gcc/testsuite/ChangeLog:

2020-06-03  Ilya Leoshkevich  <iii@linux.ibm.com>

* gcc.target/s390/builtin-constant-p-threading.c: New test.
gcc/testsuite/gcc.target/s390/builtin-constant-p-threading.c [new file with mode: 0644]
gcc/tree-ssa-threadbackward.c