diff --git a/llvm/lib/Target/CSKY/CSKYISelLowering.h b/llvm/lib/Target/CSKY/CSKYISelLowering.h --- a/llvm/lib/Target/CSKY/CSKYISelLowering.h +++ b/llvm/lib/Target/CSKY/CSKYISelLowering.h @@ -176,6 +176,8 @@ bool decomposeMulByConstant(LLVMContext &Context, EVT VT, SDValue C) const override; + bool isCheapToSpeculateCttz(Type *Ty) const override; + bool isCheapToSpeculateCtlz(Type *Ty) const override; }; } // namespace llvm diff --git a/llvm/lib/Target/CSKY/CSKYISelLowering.cpp b/llvm/lib/Target/CSKY/CSKYISelLowering.cpp --- a/llvm/lib/Target/CSKY/CSKYISelLowering.cpp +++ b/llvm/lib/Target/CSKY/CSKYISelLowering.cpp @@ -1401,3 +1401,11 @@ return false; } + +bool CSKYTargetLowering::isCheapToSpeculateCttz(Type *Ty) const { + return Subtarget.has2E3(); +} + +bool CSKYTargetLowering::isCheapToSpeculateCtlz(Type *Ty) const { + return Subtarget.hasE2(); +} diff --git a/llvm/test/CodeGen/CSKY/intrinsic.ll b/llvm/test/CodeGen/CSKY/intrinsic.ll --- a/llvm/test/CodeGen/CSKY/intrinsic.ll +++ b/llvm/test/CodeGen/CSKY/intrinsic.ll @@ -4,13 +4,8 @@ define i32 @ctlz_0(i32 %x) { ; CHECK-LABEL: ctlz_0: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: bez32 a0, .LBB0_2 -; CHECK-NEXT: # %bb.1: # %cond.false ; CHECK-NEXT: ff1.32 a0, a0 ; CHECK-NEXT: rts16 -; CHECK-NEXT: .LBB0_2: -; CHECK-NEXT: movi16 a0, 32 -; CHECK-NEXT: rts16 entry: %nlz = call i32 @llvm.ctlz.i32(i32 %x, i1 0) ret i32 %nlz @@ -29,14 +24,9 @@ define i32 @cttz_0(i32 %x) { ; CHECK-LABEL: cttz_0: ; CHECK: # %bb.0: # %entry -; CHECK-NEXT: bez32 a0, .LBB2_2 -; CHECK-NEXT: # %bb.1: # %cond.false ; CHECK-NEXT: brev32 a0, a0 ; CHECK-NEXT: ff1.32 a0, a0 ; CHECK-NEXT: rts16 -; CHECK-NEXT: .LBB2_2: -; CHECK-NEXT: movi16 a0, 32 -; CHECK-NEXT: rts16 entry: %ntz = call i32 @llvm.cttz.i32(i32 %x, i1 0) ret i32 %ntz