[llvm-commits] [llvm] r147391 - in /llvm/trunk: lib/Transforms/InstCombine/InstCombineShifts.cpp test/Transforms/InstCombine/shift.ll
Duncan Sands
baldrick at free.fr
Sun Jan 1 06:24:26 PST 2012
Hi Nick,
> @@ -603,9 +602,16 @@
> // (X>>? C1)<< C2 --> X>>? (C1-C2)& (-1<< C2)
> if (I.getOpcode() == Instruction::Shl&&
> ShiftOp->getOpcode() != Instruction::Shl) {
> - Value *Shift = Builder->CreateBinOp(ShiftOp->getOpcode(), X,
> - ConstantInt::get(Ty, ShiftDiff));
> -
> + ConstantInt *ShiftDiffCst = ConstantInt::get(Ty, ShiftDiff);
> + if (ShiftOp->isExact()) {
> + // (X>>?exact C1)<< C2 --> X>>?exact (C1-C2)
what happens if C2 is bigger than C1?
Ciao, Duncan.
> + BinaryOperator *NewShr = BinaryOperator::Create(ShiftOp->getOpcode(),
> + X, ShiftDiffCst);
> + NewShr->setIsExact(true);
> + return NewShr;
> + }
> + Value *Shift = Builder->CreateBinOp(ShiftOp->getOpcode(),
> + X, ShiftDiffCst);
> APInt Mask(APInt::getHighBitsSet(TypeBits, TypeBits - ShiftAmt2));
> return BinaryOperator::CreateAnd(Shift,
> ConstantInt::get(I.getContext(),Mask));
>
> Modified: llvm/trunk/test/Transforms/InstCombine/shift.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/shift.ll?rev=147391&r1=147390&r2=147391&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/InstCombine/shift.ll (original)
> +++ llvm/trunk/test/Transforms/InstCombine/shift.ll Sat Dec 31 15:30:22 2011
> @@ -542,3 +542,21 @@
> ; CHECK-NEXT: %y = lshr i32 %a, 5
> ; CHECK-NEXT: ret i32 %y
> }
> +
> +define i32 @test46(i32 %a) {
> + %y = ashr exact i32 %a, 3
> + %z = shl i32 %y, 1
> + ret i32 %z
> +; CHECK: @test46
> +; CHECK-NEXT: %z = ashr exact i32 %a, 2
> +; CHECK-NEXT: ret i32 %z
> +}
> +
> +define i32 @test47(i32 %a) {
> + %y = lshr exact i32 %a, 3
> + %z = shl i32 %y, 1
> + ret i32 %z
> +; CHECK: @test47
> +; CHECK-NEXT: %z = lshr exact i32 %a, 2
> +; CHECK-NEXT: ret i32 %z
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list