Skip to content

Commit

Permalink
[InstCombine] use m_APInt to allow shl folds for vectors with splat c…
Browse files Browse the repository at this point in the history
…onstants

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@291934 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
rotateright committed Jan 13, 2017
1 parent 6def8b4 commit 093d956
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 7 deletions.
8 changes: 5 additions & 3 deletions lib/Transforms/InstCombine/InstCombineShifts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -723,8 +723,9 @@ Instruction *InstCombiner::visitShl(BinaryOperator &I) {
if (Instruction *V = commonShiftTransforms(I))
return V;

if (ConstantInt *Op1C = dyn_cast<ConstantInt>(Op1)) {
unsigned ShAmt = Op1C->getZExtValue();
const APInt *ShAmtAPInt;
if (match(Op1, m_APInt(ShAmtAPInt))) {
unsigned ShAmt = ShAmtAPInt->getZExtValue();

// Turn:
// %zext = zext i32 %V to i64
Expand All @@ -748,7 +749,8 @@ Instruction *InstCombiner::visitShl(BinaryOperator &I) {
// If the shifted-out value is known-zero, then this is a NUW shift.
if (!I.hasNoUnsignedWrap() &&
MaskedValueIsZero(
Op0, APInt::getHighBitsSet(Op1C->getBitWidth(), ShAmt), 0, &I)) {
Op0, APInt::getHighBitsSet(ShAmtAPInt->getBitWidth(), ShAmt), 0,
&I)) {
I.setHasNoUnsignedWrap();
return &I;
}
Expand Down
8 changes: 4 additions & 4 deletions test/Transforms/InstCombine/shift.ll
Original file line number Diff line number Diff line change
Expand Up @@ -455,7 +455,7 @@ define i32 @test25(i32 %tmp.2, i32 %AA) {
define <2 x i32> @test25_vector(<2 x i32> %tmp.2, <2 x i32> %AA) {
; CHECK-LABEL: @test25_vector(
; CHECK-NEXT: [[TMP_3:%.*]] = lshr <2 x i32> %tmp.2, <i32 17, i32 17>
; CHECK-NEXT: [[TMP_51:%.*]] = shl <2 x i32> [[TMP_3]], <i32 17, i32 17>
; CHECK-NEXT: [[TMP_51:%.*]] = shl nuw <2 x i32> [[TMP_3]], <i32 17, i32 17>
; CHECK-NEXT: [[X2:%.*]] = add <2 x i32> [[TMP_51]], %AA
; CHECK-NEXT: [[TMP_6:%.*]] = and <2 x i32> [[X2]], <i32 -131072, i32 -131072>
; CHECK-NEXT: ret <2 x i32> [[TMP_6]]
Expand Down Expand Up @@ -671,7 +671,7 @@ define i64 @test37(i128 %A, i32 %B) {
define <2 x i32> @shl_nuw_nsw_splat_vec(<2 x i8> %x) {
; CHECK-LABEL: @shl_nuw_nsw_splat_vec(
; CHECK-NEXT: [[T2:%.*]] = zext <2 x i8> %x to <2 x i32>
; CHECK-NEXT: [[T3:%.*]] = shl <2 x i32> [[T2]], <i32 17, i32 17>
; CHECK-NEXT: [[T3:%.*]] = shl nuw nsw <2 x i32> [[T2]], <i32 17, i32 17>
; CHECK-NEXT: ret <2 x i32> [[T3]]
;
%t2 = zext <2 x i8> %x to <2 x i32>
Expand Down Expand Up @@ -1070,8 +1070,8 @@ define i64 @test_64(i32 %t) {
define <2 x i64> @test_64_splat_vec(<2 x i32> %t) {
; CHECK-LABEL: @test_64_splat_vec(
; CHECK-NEXT: [[AND:%.*]] = and <2 x i32> %t, <i32 16777215, i32 16777215>
; CHECK-NEXT: [[EXT:%.*]] = zext <2 x i32> [[AND]] to <2 x i64>
; CHECK-NEXT: [[SHL:%.*]] = shl <2 x i64> [[EXT]], <i64 8, i64 8>
; CHECK-NEXT: [[TMP1:%.*]] = shl nuw <2 x i32> [[AND]], <i32 8, i32 8>
; CHECK-NEXT: [[SHL:%.*]] = zext <2 x i32> [[TMP1]] to <2 x i64>
; CHECK-NEXT: ret <2 x i64> [[SHL]]
;
%and = and <2 x i32> %t, <i32 16777215, i32 16777215>
Expand Down

0 comments on commit 093d956

Please sign in to comment.