[llvm] [M68k] Fix reverse BTST condition causing opposite failure/success logic (PR #153086)
Dan Salvato via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 19 22:25:19 PDT 2025
https://github.com/dansalvato updated https://github.com/llvm/llvm-project/pull/153086
>From 6e5bffbe4ff35a6aa367e441274667ca2049d82d Mon Sep 17 00:00:00 2001
From: Dan Salvato <dan at teamsalvato.com>
Date: Sun, 10 Aug 2025 21:24:59 -0600
Subject: [PATCH 1/2] [M68k] Fix backwards BTST condition
---
llvm/lib/Target/M68k/M68kISelLowering.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Target/M68k/M68kISelLowering.cpp b/llvm/lib/Target/M68k/M68kISelLowering.cpp
index 594ea9f48c201..cf666862b775d 100644
--- a/llvm/lib/Target/M68k/M68kISelLowering.cpp
+++ b/llvm/lib/Target/M68k/M68kISelLowering.cpp
@@ -1667,8 +1667,8 @@ static SDValue getBitTestCondition(SDValue Src, SDValue BitNo, ISD::CondCode CC,
SDValue BTST = DAG.getNode(M68kISD::BTST, DL, MVT::i32, Src, BitNo);
- // NOTE BTST sets CCR.Z flag
- M68k::CondCode Cond = CC == ISD::SETEQ ? M68k::COND_NE : M68k::COND_EQ;
+ // NOTE BTST sets CCR.Z flag if bit is 0, same as AND with bitmask
+ M68k::CondCode Cond = CC == ISD::SETEQ ? M68k::COND_EQ : M68k::COND_NE;
return DAG.getNode(M68kISD::SETCC, DL, MVT::i8,
DAG.getConstant(Cond, DL, MVT::i8), BTST);
}
>From 38b12ec40b5f611475b543a53fe49e2b695ab96a Mon Sep 17 00:00:00 2001
From: Dan Salvato <dan at teamsalvato.com>
Date: Tue, 19 Aug 2025 23:20:58 -0600
Subject: [PATCH 2/2] fixup! [M68k] Fix backwards BTST condition
Add a CodeGen test case for a switch statement that emits BTST
---
llvm/test/CodeGen/M68k/Bits/btst.ll | 37 +++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
create mode 100644 llvm/test/CodeGen/M68k/Bits/btst.ll
diff --git a/llvm/test/CodeGen/M68k/Bits/btst.ll b/llvm/test/CodeGen/M68k/Bits/btst.ll
new file mode 100644
index 0000000000000..0fe43b49b031f
--- /dev/null
+++ b/llvm/test/CodeGen/M68k/Bits/btst.ll
@@ -0,0 +1,37 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=m68k-freestanding -verify-machineinstrs | FileCheck %s
+
+define fastcc i16 @test1(i16 %a) nounwind {
+; CHECK-LABEL: test1:
+; CHECK: ; %bb.0: ; %entry
+; CHECK-NEXT: move.l %d0, %d1
+; CHECK-NEXT: and.l #65535, %d1
+; CHECK-NEXT: sub.l #11, %d1
+; CHECK-NEXT: bhi .LBB0_3
+; CHECK-NEXT: ; %bb.1: ; %entry
+; CHECK-NEXT: and.l #65535, %d0
+; CHECK-NEXT: move.l #3612, %d1
+; CHECK-NEXT: btst %d0, %d1
+; CHECK-NEXT: beq .LBB0_3
+; CHECK-NEXT: ; %bb.2: ; %match
+; CHECK-NEXT: moveq #1, %d0
+; CHECK-NEXT: rts
+; CHECK-NEXT: .LBB0_3: ; %no_match
+; CHECK-NEXT: moveq #0, %d0
+; CHECK-NEXT: rts
+ entry:
+ switch i16 %a, label %no_match [
+ i16 11, label %match
+ i16 10, label %match
+ i16 9, label %match
+ i16 4, label %match
+ i16 3, label %match
+ i16 2, label %match
+ ]
+
+ match:
+ ret i16 1
+
+ no_match:
+ ret i16 0
+}
More information about the llvm-commits
mailing list