[InstCombine] fixed to propagate 'exact' on lshr

The original shift is bigger, so this may qualify as 'obvious', 
but here's an attempt at an Alive-based proof:

Name: exact
Pre: (C1 u< C2)
%a = shl i8 %x, C1
%b = lshr exact i8 %a, C2 
  =>
%c = lshr exact i8 %x, C2 - C1
%b = and i8 %c, ((1 << width(C1)) - 1) u>> C2

Optimization is correct!

llvm-svn: 293498
This commit is contained in:
Sanjay Patel 2017-01-30 16:53:03 +00:00
parent d8b4f45a76
commit dd64889b0b
2 changed files with 2 additions and 2 deletions

View File

@ -773,7 +773,7 @@ Instruction *InstCombiner::visitLShr(BinaryOperator &I) {
return NewLShr;
}
// (X << C1) >>u C2 --> (X >>u (C2 - C1)) & (-1 >> C2)
Value *NewLShr = Builder->CreateLShr(X, ShiftDiff);
Value *NewLShr = Builder->CreateLShr(X, ShiftDiff, "", I.isExact());
APInt Mask(APInt::getLowBitsSet(BitWidth, BitWidth - ShAmt));
return BinaryOperator::CreateAnd(NewLShr, ConstantInt::get(Ty, Mask));
}

View File

@ -937,7 +937,7 @@ define <2 x i32> @test51_splat_vec(<2 x i32> %x) {
define i32 @test51_no_nuw(i32 %x) {
; CHECK-LABEL: @test51_no_nuw(
; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 %x, 2
; CHECK-NEXT: [[TMP1:%.*]] = lshr exact i32 %x, 2
; CHECK-NEXT: [[B:%.*]] = and i32 [[TMP1]], 536870911
; CHECK-NEXT: ret i32 [[B]]
;