[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