diff --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp --- a/llvm/lib/CodeGen/CodeGenPrepare.cpp +++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp @@ -2056,7 +2056,7 @@ return false; // Bail if the value is never zero. - Value *Op = CountZeros->getOperand(0); + Use &Op = CountZeros->getOperandUse(0); if (isKnownNonZero(Op, *DL)) return false; @@ -2078,7 +2078,7 @@ // Replace the unconditional branch that was created by the first split with // a compare against zero and a conditional branch. Value *Zero = Constant::getNullValue(Ty); - // Avoid introducing branch on poison. + // Avoid introducing branch on poison. This also replaces the ctz operand. if (!isGuaranteedNotToBeUndefOrPoison(Op)) Op = Builder.CreateFreeze(Op, Op->getName() + ".fr"); Value *Cmp = Builder.CreateICmpEQ(Op, Zero, "cmpz"); diff --git a/llvm/test/CodeGen/RISCV/rv64zbb.ll b/llvm/test/CodeGen/RISCV/rv64zbb.ll --- a/llvm/test/CodeGen/RISCV/rv64zbb.ll +++ b/llvm/test/CodeGen/RISCV/rv64zbb.ll @@ -11,7 +11,8 @@ ; RV64I: # %bb.0: ; RV64I-NEXT: addi sp, sp, -16 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill -; RV64I-NEXT: beqz a0, .LBB0_2 +; RV64I-NEXT: sext.w a1, a0 +; RV64I-NEXT: beqz a1, .LBB0_2 ; RV64I-NEXT: # %bb.1: # %cond.false ; RV64I-NEXT: srliw a1, a0, 1 ; RV64I-NEXT: or a0, a0, a1 @@ -65,7 +66,8 @@ ; RV64I: # %bb.0: ; RV64I-NEXT: addi sp, sp, -16 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill -; RV64I-NEXT: beqz a0, .LBB1_2 +; RV64I-NEXT: sext.w a1, a0 +; RV64I-NEXT: beqz a1, .LBB1_2 ; RV64I-NEXT: # %bb.1: # %cond.false ; RV64I-NEXT: srliw a1, a0, 1 ; RV64I-NEXT: or a0, a0, a1 @@ -257,16 +259,15 @@ ; RV64I-NEXT: srliw a0, a0, 1 ; RV64I-NEXT: beqz a0, .LBB4_2 ; RV64I-NEXT: # %bb.1: # %cond.false -; RV64I-NEXT: srli a1, a0, 1 +; RV64I-NEXT: srliw a1, a0, 1 ; RV64I-NEXT: or a0, a0, a1 -; RV64I-NEXT: srli a1, a0, 2 +; RV64I-NEXT: srliw a1, a0, 2 ; RV64I-NEXT: or a0, a0, a1 -; RV64I-NEXT: srli a1, a0, 4 +; RV64I-NEXT: srliw a1, a0, 4 ; RV64I-NEXT: or a0, a0, a1 -; RV64I-NEXT: srli a1, a0, 8 +; RV64I-NEXT: srliw a1, a0, 8 ; RV64I-NEXT: or a0, a0, a1 -; RV64I-NEXT: slli a1, a0, 33 -; RV64I-NEXT: srli a1, a1, 49 +; RV64I-NEXT: srliw a1, a0, 16 ; RV64I-NEXT: or a0, a0, a1 ; RV64I-NEXT: not a0, a0 ; RV64I-NEXT: srli a1, a0, 1 @@ -372,7 +373,8 @@ ; RV64I: # %bb.0: ; RV64I-NEXT: addi sp, sp, -16 ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill -; RV64I-NEXT: beqz a0, .LBB6_2 +; RV64I-NEXT: sext.w a1, a0 +; RV64I-NEXT: beqz a1, .LBB6_2 ; RV64I-NEXT: # %bb.1: # %cond.false ; RV64I-NEXT: addiw a1, a0, -1 ; RV64I-NEXT: not a0, a0 diff --git a/llvm/test/Transforms/CodeGenPrepare/X86/cttz-ctlz.ll b/llvm/test/Transforms/CodeGenPrepare/X86/cttz-ctlz.ll --- a/llvm/test/Transforms/CodeGenPrepare/X86/cttz-ctlz.ll +++ b/llvm/test/Transforms/CodeGenPrepare/X86/cttz-ctlz.ll @@ -17,7 +17,7 @@ ; SLOW-NEXT: [[CMPZ:%.*]] = icmp eq i64 [[A_FR]], 0 ; SLOW-NEXT: br i1 [[CMPZ]], label [[COND_END:%.*]], label [[COND_FALSE:%.*]] ; SLOW: cond.false: -; SLOW-NEXT: [[Z:%.*]] = call i64 @llvm.cttz.i64(i64 [[A]], i1 true) +; SLOW-NEXT: [[Z:%.*]] = call i64 @llvm.cttz.i64(i64 [[A_FR]], i1 true) ; SLOW-NEXT: br label [[COND_END]] ; SLOW: cond.end: ; SLOW-NEXT: [[CTZ:%.*]] = phi i64 [ 64, [[ENTRY:%.*]] ], [ [[Z]], [[COND_FALSE]] ] @@ -34,7 +34,7 @@ ; FAST_LZ-NEXT: [[CMPZ:%.*]] = icmp eq i64 [[A_FR]], 0 ; FAST_LZ-NEXT: br i1 [[CMPZ]], label [[COND_END:%.*]], label [[COND_FALSE:%.*]] ; FAST_LZ: cond.false: -; FAST_LZ-NEXT: [[Z:%.*]] = call i64 @llvm.cttz.i64(i64 [[A]], i1 true) +; FAST_LZ-NEXT: [[Z:%.*]] = call i64 @llvm.cttz.i64(i64 [[A_FR]], i1 true) ; FAST_LZ-NEXT: br label [[COND_END]] ; FAST_LZ: cond.end: ; FAST_LZ-NEXT: [[CTZ:%.*]] = phi i64 [ 64, [[ENTRY:%.*]] ], [ [[Z]], [[COND_FALSE]] ] @@ -52,7 +52,7 @@ ; SLOW-NEXT: [[CMPZ:%.*]] = icmp eq i64 [[A_FR]], 0 ; SLOW-NEXT: br i1 [[CMPZ]], label [[COND_END:%.*]], label [[COND_FALSE:%.*]] ; SLOW: cond.false: -; SLOW-NEXT: [[Z:%.*]] = call i64 @llvm.ctlz.i64(i64 [[A]], i1 true) +; SLOW-NEXT: [[Z:%.*]] = call i64 @llvm.ctlz.i64(i64 [[A_FR]], i1 true) ; SLOW-NEXT: br label [[COND_END]] ; SLOW: cond.end: ; SLOW-NEXT: [[CTZ:%.*]] = phi i64 [ 64, [[ENTRY:%.*]] ], [ [[Z]], [[COND_FALSE]] ] @@ -64,7 +64,7 @@ ; FAST_TZ-NEXT: [[CMPZ:%.*]] = icmp eq i64 [[A_FR]], 0 ; FAST_TZ-NEXT: br i1 [[CMPZ]], label [[COND_END:%.*]], label [[COND_FALSE:%.*]] ; FAST_TZ: cond.false: -; FAST_TZ-NEXT: [[Z:%.*]] = call i64 @llvm.ctlz.i64(i64 [[A]], i1 true) +; FAST_TZ-NEXT: [[Z:%.*]] = call i64 @llvm.ctlz.i64(i64 [[A_FR]], i1 true) ; FAST_TZ-NEXT: br label [[COND_END]] ; FAST_TZ: cond.end: ; FAST_TZ-NEXT: [[CTZ:%.*]] = phi i64 [ 64, [[ENTRY:%.*]] ], [ [[Z]], [[COND_FALSE]] ]