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:
David Faust 2025-10-10 10:35:07 -07:00
parent 0e95ebf465
commit 6a77bf08e5
3 changed files with 23 additions and 1 deletions

View File

@ -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))

View File

@ -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" } } */

View File

@ -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" } } */