From: Sanjay Patel Date: Fri, 13 Jan 2017 18:39:09 +0000 (+0000) Subject: [InstCombine] use m_APInt to allow shl folds for vectors with splat constants X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=093d956dc6acad0fcf51cc1c31bb9ce42a4bc811;p=llvm [InstCombine] use m_APInt to allow shl folds for vectors with splat constants git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@291934 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/InstCombine/InstCombineShifts.cpp b/lib/Transforms/InstCombine/InstCombineShifts.cpp index 7249ef415d4..a79a630e5ec 100644 --- a/lib/Transforms/InstCombine/InstCombineShifts.cpp +++ b/lib/Transforms/InstCombine/InstCombineShifts.cpp @@ -723,8 +723,9 @@ Instruction *InstCombiner::visitShl(BinaryOperator &I) { if (Instruction *V = commonShiftTransforms(I)) return V; - if (ConstantInt *Op1C = dyn_cast(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 @@ -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; } diff --git a/test/Transforms/InstCombine/shift.ll b/test/Transforms/InstCombine/shift.ll index 884b541f175..5f59ab8ffdc 100644 --- a/test/Transforms/InstCombine/shift.ll +++ b/test/Transforms/InstCombine/shift.ll @@ -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, -; CHECK-NEXT: [[TMP_51:%.*]] = shl <2 x i32> [[TMP_3]], +; CHECK-NEXT: [[TMP_51:%.*]] = shl nuw <2 x i32> [[TMP_3]], ; CHECK-NEXT: [[X2:%.*]] = add <2 x i32> [[TMP_51]], %AA ; CHECK-NEXT: [[TMP_6:%.*]] = and <2 x i32> [[X2]], ; CHECK-NEXT: ret <2 x i32> [[TMP_6]] @@ -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]], +; CHECK-NEXT: [[T3:%.*]] = shl nuw nsw <2 x i32> [[T2]], ; CHECK-NEXT: ret <2 x i32> [[T3]] ; %t2 = zext <2 x i8> %x to <2 x i32> @@ -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, -; CHECK-NEXT: [[EXT:%.*]] = zext <2 x i32> [[AND]] to <2 x i64> -; CHECK-NEXT: [[SHL:%.*]] = shl <2 x i64> [[EXT]], +; CHECK-NEXT: [[TMP1:%.*]] = shl nuw <2 x i32> [[AND]], +; 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,