[llvm] 50cf413 - [X86, CodeGen] Return the correct condition code for SETZUCC

Shengchen Kan via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 30 23:09:29 PDT 2024


Author: Shengchen Kan
Date: 2024-07-31T14:09:08+08:00
New Revision: 50cf413426805d32c19c71756f601c864dd6fa7a

URL: https://github.com/llvm/llvm-project/commit/50cf413426805d32c19c71756f601c864dd6fa7a
DIFF: https://github.com/llvm/llvm-project/commit/50cf413426805d32c19c71756f601c864dd6fa7a.diff

LOG: [X86,CodeGen] Return the correct condition code for SETZUCC

llvm-issue: https://github.com/llvm/llvm-project/issues/101288

Added: 
    

Modified: 
    llvm/lib/Target/X86/X86InstrInfo.cpp
    llvm/test/CodeGen/X86/apx/setzucc.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/X86/X86InstrInfo.cpp b/llvm/lib/Target/X86/X86InstrInfo.cpp
index 918a6089fe9a4..7fc786b1e570b 100644
--- a/llvm/lib/Target/X86/X86InstrInfo.cpp
+++ b/llvm/lib/Target/X86/X86InstrInfo.cpp
@@ -3121,9 +3121,9 @@ bool X86InstrInfo::hasCommutePreference(MachineInstr &MI, bool &Commute) const {
 
 int X86::getCondSrcNoFromDesc(const MCInstrDesc &MCID) {
   unsigned Opcode = MCID.getOpcode();
-  if (!(X86::isJCC(Opcode) || X86::isSETCC(Opcode) || X86::isCMOVCC(Opcode) ||
-        X86::isCFCMOVCC(Opcode) || X86::isCCMPCC(Opcode) ||
-        X86::isCTESTCC(Opcode)))
+  if (!(X86::isJCC(Opcode) || X86::isSETCC(Opcode) || X86::isSETZUCC(Opcode) ||
+        X86::isCMOVCC(Opcode) || X86::isCFCMOVCC(Opcode) ||
+        X86::isCCMPCC(Opcode) || X86::isCTESTCC(Opcode)))
     return -1;
   // Assume that condition code is always the last use operand.
   unsigned NumUses = MCID.getNumOperands() - MCID.getNumDefs();
@@ -3145,8 +3145,9 @@ X86::CondCode X86::getCondFromBranch(const MachineInstr &MI) {
 }
 
 X86::CondCode X86::getCondFromSETCC(const MachineInstr &MI) {
-  return X86::isSETCC(MI.getOpcode()) ? X86::getCondFromMI(MI)
-                                      : X86::COND_INVALID;
+  return X86::isSETCC(MI.getOpcode()) || X86::isSETZUCC(MI.getOpcode())
+             ? X86::getCondFromMI(MI)
+             : X86::COND_INVALID;
 }
 
 X86::CondCode X86::getCondFromCMov(const MachineInstr &MI) {

diff  --git a/llvm/test/CodeGen/X86/apx/setzucc.ll b/llvm/test/CodeGen/X86/apx/setzucc.ll
index 1436d396bd077..084e54235330c 100644
--- a/llvm/test/CodeGen/X86/apx/setzucc.ll
+++ b/llvm/test/CodeGen/X86/apx/setzucc.ll
@@ -46,3 +46,46 @@ define i64 @i64(i64 %x) nounwind {
   %if = select i1 %t0, i64 1, i64 0
   ret i64 %if
 }
+
+define i32 @flags_copy_lowering() nounwind {
+; CHECK-LABEL: flags_copy_lowering:
+; CHECK:       # %bb.0: # %bb
+; CHECK-NEXT:    xorl %eax, %eax
+; CHECK-NEXT:    xorl %edx, %edx
+; CHECK-NEXT:    xorl %ecx, %ecx
+; CHECK-NEXT:    .p2align 4, 0x90
+; CHECK-NEXT:  .LBB4_1: # %bb1
+; CHECK-NEXT:    # =>This Inner Loop Header: Depth=1
+; CHECK-NEXT:    addl %edx, 0
+; CHECK-NEXT:    setb %sil
+; CHECK-NEXT:    adcl $0, %ecx
+; CHECK-NEXT:    testb %sil, %sil
+; CHECK-NEXT:    setzune %dl
+; CHECK-NEXT:    testb %sil, %sil
+; CHECK-NEXT:    je .LBB4_3
+; CHECK-NEXT:  # %bb.2: # %bb1
+; CHECK-NEXT:    # in Loop: Header=BB4_1 Depth=1
+; CHECK-NEXT:    testb %al, %al
+; CHECK-NEXT:    jne .LBB4_1
+; CHECK-NEXT:  .LBB4_3: # %bb2
+; CHECK-NEXT:    xorl %eax, %eax
+; CHECK-NEXT:    retq
+bb:
+  br label %bb1
+
+bb1:
+  %phi = phi i32 [ 0, %bb ], [ %zext, %bb1 ]
+  %phi2 = phi i32 [ 0, %bb ], [ %add3, %bb1 ]
+  %load = load i32, ptr null, align 4
+  %add = add i32 %load, %phi
+  store i32 %add, ptr null, align 4
+  %icmp = icmp ugt i32 %phi, %add
+  %zext = zext i1 %icmp to i32
+  %add3 = add i32 %phi2, %zext
+  %icmp4 = icmp ult i32 %phi2, 0
+  %and = and i1 %icmp, false
+  br i1 %and, label %bb1, label %bb2
+
+bb2:
+  ret i32 0
+}


        


More information about the llvm-commits mailing list