diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -2043,6 +2043,8 @@ switch (I->getOpcode()) { case Instruction::ZExt: return isKnownToBeAPowerOfTwo(I->getOperand(0), OrZero, Depth, Q); + case Instruction::Trunc: + return OrZero && isKnownToBeAPowerOfTwo(I->getOperand(0), OrZero, Depth, Q); case Instruction::Shl: if (OrZero || Q.IIQ.hasNoUnsignedWrap(I) || Q.IIQ.hasNoSignedWrap(I)) return isKnownToBeAPowerOfTwo(I->getOperand(0), OrZero, Depth, Q); diff --git a/llvm/test/Analysis/ValueTracking/known-power-of-two.ll b/llvm/test/Analysis/ValueTracking/known-power-of-two.ll --- a/llvm/test/Analysis/ValueTracking/known-power-of-two.ll +++ b/llvm/test/Analysis/ValueTracking/known-power-of-two.ll @@ -36,7 +36,8 @@ ; CHECK-SAME: (i16 [[X:%.*]], i8 [[Y:%.*]]) { ; CHECK-NEXT: [[XP2:%.*]] = shl i16 4, [[X]] ; CHECK-NEXT: [[XX:%.*]] = trunc i16 [[XP2]] to i8 -; CHECK-NEXT: [[R:%.*]] = urem i8 [[Y]], [[XX]] +; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[XX]], -1 +; CHECK-NEXT: [[R:%.*]] = and i8 [[TMP1]], [[Y]] ; CHECK-NEXT: ret i8 [[R]] ; %xp2 = shl i16 4, %x