Skip to content
Snippets Groups Projects
Commit a32986e8 authored by Dan Gohman's avatar Dan Gohman
Browse files

Really check that the bits that will become zero are actually already zero

before eliminating the operation that zeros them. This fixes rdar://8739316.

llvm-svn: 121353
parent d62c9be4
No related branches found
No related tags found
No related merge requests found
......@@ -168,9 +168,8 @@ static bool CanEvaluateShifted(Value *V, unsigned NumBits, bool isLeftShift,
// We can always turn lshr(c1)+shl(c2) -> lshr(c3)+and(c4), but it isn't
// profitable unless we know the and'd out bits are already zero.
if (CI->getZExtValue() > NumBits) {
unsigned LowBits = CI->getZExtValue() - NumBits;
if (MaskedValueIsZero(I->getOperand(0),
APInt::getLowBitsSet(TypeWidth, LowBits) << NumBits))
APInt::getLowBitsSet(TypeWidth, NumBits)))
return true;
}
......
; RUN: opt -instcombine -S < %s | FileCheck %s
; <rdar://problem/8606771>
; <rdar://problem/8606771>
; CHECK: @main
define i32 @main(i32 %argc) nounwind ssp {
entry:
%tmp3151 = trunc i32 %argc to i8
......@@ -18,3 +19,26 @@ entry:
; CHECK: ret i32
ret i32 %tmp4086
}
; rdar://8739316
; CHECK: @foo
define i8 @foo(i8 %arg, i8 %arg1) nounwind {
bb:
%tmp = shl i8 %arg, 7
%tmp2 = and i8 %arg1, 84
%tmp3 = and i8 %arg1, -118
%tmp4 = and i8 %arg1, 33
%tmp5 = sub i8 -88, %tmp2
%tmp6 = and i8 %tmp5, 84
%tmp7 = or i8 %tmp4, %tmp6
%tmp8 = xor i8 %tmp, %tmp3
%tmp9 = or i8 %tmp7, %tmp8
%tmp10 = lshr i8 %tmp8, 7
%tmp11 = shl i8 %tmp10, 5
; CHECK: %0 = lshr i8 %tmp8, 2
; CHECK: %tmp11 = and i8 %0, 32
%tmp12 = xor i8 %tmp11, %tmp9
ret i8 %tmp12
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment