mirror of git://gcc.gnu.org/git/gcc.git
bpf: fix cbranch miscompilation in CPUv1 [PR122141]
As diagnosed by Andrew in the linked PR, when reversing the branch condition to work around lack of some cbranch instructions, we must use swap_condition rather than reverse_condition. PR target/122141 gcc/ * config/bpf/bpf.cc (bpf_expand_cbranch): Use swap_condition rather than reverse_condition when reversing jump condition to work around missing instructions in very old BPF ISAs. gcc/testsuite/ * gcc.target/bpf/pr122141-1.c: New. * gcc.target/bpf/pr122141-2.c: New. Suggested-by: Andrew Pinski <andrew.pinski@oss.qualcomm.com>
This commit is contained in:
parent
0e95ebf465
commit
6a77bf08e5
|
@ -444,7 +444,7 @@ bpf_expand_cbranch (machine_mode mode, rtx *operands)
|
|||
if ((code == LT || code == LE || code == LTU || code == LEU))
|
||||
{
|
||||
/* Reverse the condition. */
|
||||
PUT_CODE (operands[0], reverse_condition (code));
|
||||
PUT_CODE (operands[0], swap_condition (code));
|
||||
|
||||
/* Swap the operands, and ensure that the first is a register. */
|
||||
if (!register_operand (operands[2], mode))
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
/* PR122141 miscompilation when j(s)l[te] unavailable. */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -mcpu=v1 -masm=normal" } */
|
||||
|
||||
int
|
||||
f(long a, long b)
|
||||
{
|
||||
return a > b ? 2 : 3;
|
||||
}
|
||||
|
||||
/* { dg-final { scan-assembler "jsge\t%r2,%r1" } } */
|
|
@ -0,0 +1,11 @@
|
|||
/* PR122141 miscompilation when j(s)l[te] unavailable. */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -mcpu=v1 -masm=normal" } */
|
||||
|
||||
int
|
||||
g(unsigned long a, unsigned long b)
|
||||
{
|
||||
return a >= b ? 4 : 5;
|
||||
}
|
||||
|
||||
/* { dg-final { scan-assembler "jgt\t%r2,%r1" } } */
|
Loading…
Reference in New Issue