Index: llvm/lib/Target/X86/X86ISelLowering.cpp =================================================================== --- llvm/lib/Target/X86/X86ISelLowering.cpp +++ llvm/lib/Target/X86/X86ISelLowering.cpp @@ -47581,7 +47581,7 @@ SDValue Trunc = DAG.getZExtOrTrunc(Clz, dl, MVT::i32); SDValue Scc = DAG.getNode(ISD::SRL, dl, MVT::i32, Trunc, DAG.getConstant(Log2b, dl, MVT::i8)); - return DAG.getZExtOrTrunc(Scc, dl, ExtTy); + return Scc; } // Try to transform: @@ -47645,7 +47645,7 @@ SDValue NewLHS = lowerX86CmpEqZeroToCtlzSrl(LHS, VT, DAG); SDValue Ret, NewRHS; if (NewLHS && (NewRHS = lowerX86CmpEqZeroToCtlzSrl(RHS, VT, DAG))) - Ret = DAG.getNode(ISD::OR, SDLoc(OR), VT, NewLHS, NewRHS); + Ret = DAG.getNode(ISD::OR, SDLoc(OR), MVT::i32, NewLHS, NewRHS); if (!Ret) return SDValue(); @@ -47661,7 +47661,7 @@ NewRHS = lowerX86CmpEqZeroToCtlzSrl(RHS, VT, DAG); if (!NewRHS) return SDValue(); - Ret = DAG.getNode(ISD::OR, SDLoc(OR), VT, Ret, NewRHS); + Ret = DAG.getNode(ISD::OR, SDLoc(OR), MVT::i32, Ret, NewRHS); } if (Ret) Index: llvm/test/CodeGen/X86/lzcnt-zext-cmp.ll =================================================================== --- llvm/test/CodeGen/X86/lzcnt-zext-cmp.ll +++ llvm/test/CodeGen/X86/lzcnt-zext-cmp.ll @@ -154,11 +154,11 @@ define i32 @test_zext_cmp6(i32 %a, i32 %b, i32 %c) { ; FASTLZCNT-LABEL: test_zext_cmp6: ; FASTLZCNT: # %bb.0: # %entry -; FASTLZCNT-NEXT: lzcntl %edi, %eax -; FASTLZCNT-NEXT: lzcntl %esi, %ecx -; FASTLZCNT-NEXT: orl %eax, %ecx +; FASTLZCNT-NEXT: lzcntl %edi, %ecx ; FASTLZCNT-NEXT: lzcntl %edx, %eax +; FASTLZCNT-NEXT: lzcntl %esi, %esi ; FASTLZCNT-NEXT: orl %ecx, %eax +; FASTLZCNT-NEXT: orl %esi, %eax ; FASTLZCNT-NEXT: shrl $5, %eax ; FASTLZCNT-NEXT: retq ; @@ -189,11 +189,11 @@ define i32 @test_zext_cmp7(i32 %a, i32 %b, i32 %c) { ; FASTLZCNT-LABEL: test_zext_cmp7: ; FASTLZCNT: # %bb.0: # %entry -; FASTLZCNT-NEXT: lzcntl %edi, %eax -; FASTLZCNT-NEXT: lzcntl %esi, %ecx -; FASTLZCNT-NEXT: orl %eax, %ecx +; FASTLZCNT-NEXT: lzcntl %edi, %ecx ; FASTLZCNT-NEXT: lzcntl %edx, %eax +; FASTLZCNT-NEXT: lzcntl %esi, %esi ; FASTLZCNT-NEXT: orl %ecx, %eax +; FASTLZCNT-NEXT: orl %esi, %eax ; FASTLZCNT-NEXT: shrl $5, %eax ; FASTLZCNT-NEXT: retq ; @@ -335,3 +335,37 @@ %conv = zext i1 %0 to i32 ret i32 %conv } + +; PR54694 Fix an infinite loop in DAG combiner. +define i32 @test_zext_cmp12(i32 %0, i32 %1) { +; FASTLZCNT-LABEL: test_zext_cmp12: +; FASTLZCNT: # %bb.0: +; FASTLZCNT-NEXT: andl $131072, %edi # imm = 0x20000 +; FASTLZCNT-NEXT: andl $131072, %esi # imm = 0x20000 +; FASTLZCNT-NEXT: lzcntl %edi, %eax +; FASTLZCNT-NEXT: lzcntl %esi, %ecx +; FASTLZCNT-NEXT: orl %eax, %ecx +; FASTLZCNT-NEXT: movl $2, %eax +; FASTLZCNT-NEXT: shrl $5, %ecx +; FASTLZCNT-NEXT: subl %ecx, %eax +; FASTLZCNT-NEXT: retq +; +; NOFASTLZCNT-LABEL: test_zext_cmp12: +; NOFASTLZCNT: # %bb.0: +; NOFASTLZCNT-NEXT: testl $131072, %edi # imm = 0x20000 +; NOFASTLZCNT-NEXT: sete %al +; NOFASTLZCNT-NEXT: testl $131072, %esi # imm = 0x20000 +; NOFASTLZCNT-NEXT: sete %cl +; NOFASTLZCNT-NEXT: orb %al, %cl +; NOFASTLZCNT-NEXT: movl $2, %eax +; NOFASTLZCNT-NEXT: movzbl %cl, %ecx +; NOFASTLZCNT-NEXT: subl %ecx, %eax +; NOFASTLZCNT-NEXT: retq + %3 = and i32 %0, 131072 + %4 = icmp eq i32 %3, 0 + %5 = and i32 %1, 131072 + %6 = icmp eq i32 %5, 0 + %7 = select i1 %4, i1 true, i1 %6 + %8 = select i1 %7, i32 1, i32 2 + ret i32 %8 +}