[llvm] r318323 - [InstCombine] trunc (binop X, C) --> binop (trunc X, C')

Chandler Carruth via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 8 02:24:44 PST 2017


I think this is still enough of a test case to revert while we sort it out.

On Fri, Dec 8, 2017 at 4:38 AM David Blaikie <dblaikie at gmail.com> wrote:

> Haven't looked too far yet, but here's my current repro:
>
> typedef struct {
>   int a;
>   char b[]
> } c;
> d;
> e(c *f) {
>   int g, h = g = f;
>   d = 0;
>   for (; d < h; d++)
>     f->b[d + 1] = f->b[d] + g;
> }
>
> clang -cc1 -emit-obj -triple x86_64-linux-gnu -target-feature +sse4.2 -O2
> -w -fsanitize=memory -vectorize-loops -o /dev/null foo.ii -x c
>
> Appears to run forever/a long time.
>
> Interestingly, a nearby test case seems to fail with or without the patch:
>
> typedef struct {
>   int a;
>   char b[]
> } c;
> d;
> e(c *f) {
>   int g = f;
>   for (; d; d++)
>     f->b[d + 1] = f->b[d] + g;
> }
>
> So I guess this might be one of those unfortunate cases of an optimization
> causing further exposure to an existing bug, but still..
>
> On Thu, Dec 7, 2017 at 1:56 PM Sanjay Patel <spatel at rotateright.com>
> wrote:
>
>> Thanks for letting me know.
>>
>> This might be a good time to check out (though I haven't gotten to it
>> yet):
>> https://github.com/rutgers-apl/alive-loops
>>
>> This was mentioned on llvm-dev:
>> http://lists.llvm.org/pipermail/llvm-dev/2017-September/117466.html
>>
>> On Thu, Dec 7, 2017 at 12:48 PM, Chandler Carruth <chandlerc at gmail.com>
>> wrote:
>>
>>> FYI, we've root caused an compile timeout to this revision. It seems
>>> quite likely this is fighting another instcombine.
>>>
>>> We're still working on a test case, but wanted to go ahead and give a
>>> heads-up in case you can spot the place where we reverse this transform.
>>>
>>>
>>> On Wed, Nov 15, 2017 at 8:12 PM Sanjay Patel via llvm-commits <
>>> llvm-commits at lists.llvm.org> wrote:
>>>
>>>> Author: spatel
>>>> Date: Wed Nov 15 11:12:01 2017
>>>> New Revision: 318323
>>>>
>>>> URL: http://llvm.org/viewvc/llvm-project?rev=318323&view=rev
>>>> Log:
>>>> [InstCombine] trunc (binop X, C) --> binop (trunc X, C')
>>>>
>>>> Note that one-use and shouldChangeType() are checked ahead of the
>>>> switch.
>>>>
>>>> Without the narrowing folds, we can produce inferior vector code as
>>>> shown in PR35299:
>>>> https://bugs.llvm.org/show_bug.cgi?id=35299
>>>>
>>>>
>>>> Modified:
>>>>     llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp
>>>>     llvm/trunk/test/Transforms/InstCombine/pr33765.ll
>>>>     llvm/trunk/test/Transforms/InstCombine/trunc-binop-ext.ll
>>>>
>>>> Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp?rev=318323&r1=318322&r2=318323&view=diff
>>>>
>>>> ==============================================================================
>>>> --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp
>>>> (original)
>>>> +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp Wed Nov
>>>> 15 11:12:01 2017
>>>> @@ -545,6 +545,8 @@ Instruction *InstCombiner::narrowBinOp(T
>>>>    if (!match(Trunc.getOperand(0), m_OneUse(m_BinOp(BinOp))))
>>>>      return nullptr;
>>>>
>>>> +  Value *BinOp0 = BinOp->getOperand(0);
>>>> +  Value *BinOp1 = BinOp->getOperand(1);
>>>>    switch (BinOp->getOpcode()) {
>>>>    case Instruction::And:
>>>>    case Instruction::Or:
>>>> @@ -552,20 +554,31 @@ Instruction *InstCombiner::narrowBinOp(T
>>>>    case Instruction::Add:
>>>>    case Instruction::Mul: {
>>>>      Constant *C;
>>>> -    if (match(BinOp->getOperand(1), m_Constant(C))) {
>>>> +    if (match(BinOp1, m_Constant(C))) {
>>>>        // trunc (binop X, C) --> binop (trunc X, C')
>>>>        Constant *NarrowC = ConstantExpr::getTrunc(C, DestTy);
>>>> -      Value *TruncX = Builder.CreateTrunc(BinOp->getOperand(0),
>>>> DestTy);
>>>> +      Value *TruncX = Builder.CreateTrunc(BinOp0, DestTy);
>>>>        return BinaryOperator::Create(BinOp->getOpcode(), TruncX,
>>>> NarrowC);
>>>>      }
>>>> +    Value *X;
>>>> +    if (match(BinOp0, m_ZExtOrSExt(m_Value(X))) && X->getType() ==
>>>> DestTy) {
>>>> +      // trunc (binop (ext X), Y) --> binop X, (trunc Y)
>>>> +      Value *NarrowOp1 = Builder.CreateTrunc(BinOp1, DestTy);
>>>> +      return BinaryOperator::Create(BinOp->getOpcode(), X, NarrowOp1);
>>>> +    }
>>>> +    if (match(BinOp1, m_ZExtOrSExt(m_Value(X))) && X->getType() ==
>>>> DestTy) {
>>>> +      // trunc (binop Y, (ext X)) --> binop (trunc Y), X
>>>> +      Value *NarrowOp0 = Builder.CreateTrunc(BinOp0, DestTy);
>>>> +      return BinaryOperator::Create(BinOp->getOpcode(), NarrowOp0, X);
>>>> +    }
>>>>      break;
>>>>    }
>>>>    case Instruction::Sub: {
>>>>      Constant *C;
>>>> -    if (match(BinOp->getOperand(0), m_Constant(C))) {
>>>> +    if (match(BinOp0, m_Constant(C))) {
>>>>        // trunc (binop C, X) --> binop (trunc C', X)
>>>>        Constant *NarrowC = ConstantExpr::getTrunc(C, DestTy);
>>>> -      Value *TruncX = Builder.CreateTrunc(BinOp->getOperand(1),
>>>> DestTy);
>>>> +      Value *TruncX = Builder.CreateTrunc(BinOp1, DestTy);
>>>>        return BinaryOperator::Create(BinOp->getOpcode(), NarrowC,
>>>> TruncX);
>>>>      }
>>>>      break;
>>>>
>>>> Modified: llvm/trunk/test/Transforms/InstCombine/pr33765.ll
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/pr33765.ll?rev=318323&r1=318322&r2=318323&view=diff
>>>>
>>>> ==============================================================================
>>>> --- llvm/trunk/test/Transforms/InstCombine/pr33765.ll (original)
>>>> +++ llvm/trunk/test/Transforms/InstCombine/pr33765.ll Wed Nov 15
>>>> 11:12:01 2017
>>>> @@ -10,9 +10,8 @@ define void @patatino(i8 %beth) {
>>>>  ; CHECK:       if.then9:
>>>>  ; CHECK-NEXT:    [[MUL:%.*]] = mul nuw nsw i32 [[CONV]], [[CONV]]
>>>>  ; CHECK-NEXT:    [[TINKY:%.*]] = load i16, i16* @glob, align 2
>>>> -; CHECK-NEXT:    [[CONV131:%.*]] = zext i16 [[TINKY]] to i32
>>>> -; CHECK-NEXT:    [[AND:%.*]] = and i32 [[MUL]], [[CONV131]]
>>>> -; CHECK-NEXT:    [[CONV14:%.*]] = trunc i32 [[AND]] to i16
>>>> +; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 [[MUL]] to i16
>>>> +; CHECK-NEXT:    [[CONV14:%.*]] = and i16 [[TINKY]], [[TMP1]]
>>>>  ; CHECK-NEXT:    store i16 [[CONV14]], i16* @glob, align 2
>>>>  ; CHECK-NEXT:    ret void
>>>>  ;
>>>>
>>>> Modified: llvm/trunk/test/Transforms/InstCombine/trunc-binop-ext.ll
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/trunc-binop-ext.ll?rev=318323&r1=318322&r2=318323&view=diff
>>>>
>>>> ==============================================================================
>>>> --- llvm/trunk/test/Transforms/InstCombine/trunc-binop-ext.ll (original)
>>>> +++ llvm/trunk/test/Transforms/InstCombine/trunc-binop-ext.ll Wed Nov
>>>> 15 11:12:01 2017
>>>> @@ -2,9 +2,8 @@
>>>>
>>>>  define i16 @narrow_sext_and(i16 %x16, i32 %y32) {
>>>>  ; CHECK-LABEL: @narrow_sext_and(
>>>> -; CHECK-NEXT:    [[X321:%.*]] = zext i16 %x16 to i32
>>>> -; CHECK-NEXT:    [[B:%.*]] = and i32 [[X321]], %y32
>>>> -; CHECK-NEXT:    [[R:%.*]] = trunc i32 [[B]] to i16
>>>> +; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 %y32 to i16
>>>> +; CHECK-NEXT:    [[R:%.*]] = and i16 [[TMP1]], %x16
>>>>  ; CHECK-NEXT:    ret i16 [[R]]
>>>>  ;
>>>>    %x32 = sext i16 %x16 to i32
>>>> @@ -15,9 +14,8 @@ define i16 @narrow_sext_and(i16 %x16, i3
>>>>
>>>>  define i16 @narrow_zext_and(i16 %x16, i32 %y32) {
>>>>  ; CHECK-LABEL: @narrow_zext_and(
>>>> -; CHECK-NEXT:    [[X32:%.*]] = zext i16 %x16 to i32
>>>> -; CHECK-NEXT:    [[B:%.*]] = and i32 [[X32]], %y32
>>>> -; CHECK-NEXT:    [[R:%.*]] = trunc i32 [[B]] to i16
>>>> +; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 %y32 to i16
>>>> +; CHECK-NEXT:    [[R:%.*]] = and i16 [[TMP1]], %x16
>>>>  ; CHECK-NEXT:    ret i16 [[R]]
>>>>  ;
>>>>    %x32 = zext i16 %x16 to i32
>>>> @@ -28,9 +26,8 @@ define i16 @narrow_zext_and(i16 %x16, i3
>>>>
>>>>  define i16 @narrow_sext_or(i16 %x16, i32 %y32) {
>>>>  ; CHECK-LABEL: @narrow_sext_or(
>>>> -; CHECK-NEXT:    [[X321:%.*]] = zext i16 %x16 to i32
>>>> -; CHECK-NEXT:    [[B:%.*]] = or i32 [[X321]], %y32
>>>> -; CHECK-NEXT:    [[R:%.*]] = trunc i32 [[B]] to i16
>>>> +; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 %y32 to i16
>>>> +; CHECK-NEXT:    [[R:%.*]] = or i16 [[TMP1]], %x16
>>>>  ; CHECK-NEXT:    ret i16 [[R]]
>>>>  ;
>>>>    %x32 = sext i16 %x16 to i32
>>>> @@ -41,9 +38,8 @@ define i16 @narrow_sext_or(i16 %x16, i32
>>>>
>>>>  define i16 @narrow_zext_or(i16 %x16, i32 %y32) {
>>>>  ; CHECK-LABEL: @narrow_zext_or(
>>>> -; CHECK-NEXT:    [[X32:%.*]] = zext i16 %x16 to i32
>>>> -; CHECK-NEXT:    [[B:%.*]] = or i32 [[X32]], %y32
>>>> -; CHECK-NEXT:    [[R:%.*]] = trunc i32 [[B]] to i16
>>>> +; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 %y32 to i16
>>>> +; CHECK-NEXT:    [[R:%.*]] = or i16 [[TMP1]], %x16
>>>>  ; CHECK-NEXT:    ret i16 [[R]]
>>>>  ;
>>>>    %x32 = zext i16 %x16 to i32
>>>> @@ -54,9 +50,8 @@ define i16 @narrow_zext_or(i16 %x16, i32
>>>>
>>>>  define i16 @narrow_sext_xor(i16 %x16, i32 %y32) {
>>>>  ; CHECK-LABEL: @narrow_sext_xor(
>>>> -; CHECK-NEXT:    [[X321:%.*]] = zext i16 %x16 to i32
>>>> -; CHECK-NEXT:    [[B:%.*]] = xor i32 [[X321]], %y32
>>>> -; CHECK-NEXT:    [[R:%.*]] = trunc i32 [[B]] to i16
>>>> +; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 %y32 to i16
>>>> +; CHECK-NEXT:    [[R:%.*]] = xor i16 [[TMP1]], %x16
>>>>  ; CHECK-NEXT:    ret i16 [[R]]
>>>>  ;
>>>>    %x32 = sext i16 %x16 to i32
>>>> @@ -67,9 +62,8 @@ define i16 @narrow_sext_xor(i16 %x16, i3
>>>>
>>>>  define i16 @narrow_zext_xor(i16 %x16, i32 %y32) {
>>>>  ; CHECK-LABEL: @narrow_zext_xor(
>>>> -; CHECK-NEXT:    [[X32:%.*]] = zext i16 %x16 to i32
>>>> -; CHECK-NEXT:    [[B:%.*]] = xor i32 [[X32]], %y32
>>>> -; CHECK-NEXT:    [[R:%.*]] = trunc i32 [[B]] to i16
>>>> +; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 %y32 to i16
>>>> +; CHECK-NEXT:    [[R:%.*]] = xor i16 [[TMP1]], %x16
>>>>  ; CHECK-NEXT:    ret i16 [[R]]
>>>>  ;
>>>>    %x32 = zext i16 %x16 to i32
>>>> @@ -80,9 +74,8 @@ define i16 @narrow_zext_xor(i16 %x16, i3
>>>>
>>>>  define i16 @narrow_sext_add(i16 %x16, i32 %y32) {
>>>>  ; CHECK-LABEL: @narrow_sext_add(
>>>> -; CHECK-NEXT:    [[X321:%.*]] = zext i16 %x16 to i32
>>>> -; CHECK-NEXT:    [[B:%.*]] = add i32 [[X321]], %y32
>>>> -; CHECK-NEXT:    [[R:%.*]] = trunc i32 [[B]] to i16
>>>> +; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 %y32 to i16
>>>> +; CHECK-NEXT:    [[R:%.*]] = add i16 [[TMP1]], %x16
>>>>  ; CHECK-NEXT:    ret i16 [[R]]
>>>>  ;
>>>>    %x32 = sext i16 %x16 to i32
>>>> @@ -93,9 +86,8 @@ define i16 @narrow_sext_add(i16 %x16, i3
>>>>
>>>>  define i16 @narrow_zext_add(i16 %x16, i32 %y32) {
>>>>  ; CHECK-LABEL: @narrow_zext_add(
>>>> -; CHECK-NEXT:    [[X32:%.*]] = zext i16 %x16 to i32
>>>> -; CHECK-NEXT:    [[B:%.*]] = add i32 [[X32]], %y32
>>>> -; CHECK-NEXT:    [[R:%.*]] = trunc i32 [[B]] to i16
>>>> +; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 %y32 to i16
>>>> +; CHECK-NEXT:    [[R:%.*]] = add i16 [[TMP1]], %x16
>>>>  ; CHECK-NEXT:    ret i16 [[R]]
>>>>  ;
>>>>    %x32 = zext i16 %x16 to i32
>>>> @@ -106,9 +98,8 @@ define i16 @narrow_zext_add(i16 %x16, i3
>>>>
>>>>  define i16 @narrow_sext_mul(i16 %x16, i32 %y32) {
>>>>  ; CHECK-LABEL: @narrow_sext_mul(
>>>> -; CHECK-NEXT:    [[X32:%.*]] = sext i16 %x16 to i32
>>>> -; CHECK-NEXT:    [[B:%.*]] = mul i32 [[X32]], %y32
>>>> -; CHECK-NEXT:    [[R:%.*]] = trunc i32 [[B]] to i16
>>>> +; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 %y32 to i16
>>>> +; CHECK-NEXT:    [[R:%.*]] = mul i16 [[TMP1]], %x16
>>>>  ; CHECK-NEXT:    ret i16 [[R]]
>>>>  ;
>>>>    %x32 = sext i16 %x16 to i32
>>>> @@ -119,9 +110,8 @@ define i16 @narrow_sext_mul(i16 %x16, i3
>>>>
>>>>  define i16 @narrow_zext_mul(i16 %x16, i32 %y32) {
>>>>  ; CHECK-LABEL: @narrow_zext_mul(
>>>> -; CHECK-NEXT:    [[X32:%.*]] = zext i16 %x16 to i32
>>>> -; CHECK-NEXT:    [[B:%.*]] = mul i32 [[X32]], %y32
>>>> -; CHECK-NEXT:    [[R:%.*]] = trunc i32 [[B]] to i16
>>>> +; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 %y32 to i16
>>>> +; CHECK-NEXT:    [[R:%.*]] = mul i16 [[TMP1]], %x16
>>>>  ; CHECK-NEXT:    ret i16 [[R]]
>>>>  ;
>>>>    %x32 = zext i16 %x16 to i32
>>>> @@ -130,15 +120,14 @@ define i16 @narrow_zext_mul(i16 %x16, i3
>>>>    ret i16 %r
>>>>  }
>>>>
>>>> -; Verify that the commuted patterns work. The div is to ensure that
>>>> complexity-based
>>>> +; Verify that the commuted patterns work. The div is to ensure that
>>>> complexity-based
>>>>  ; canonicalization doesn't swap the binop operands. Use vector types
>>>> to show those work too.
>>>>
>>>>  define <2 x i16> @narrow_sext_and_commute(<2 x i16> %x16, <2 x i32>
>>>> %y32) {
>>>>  ; CHECK-LABEL: @narrow_sext_and_commute(
>>>>  ; CHECK-NEXT:    [[Y32OP0:%.*]] = sdiv <2 x i32> %y32, <i32 7, i32 -17>
>>>> -; CHECK-NEXT:    [[X321:%.*]] = zext <2 x i16> %x16 to <2 x i32>
>>>> -; CHECK-NEXT:    [[B:%.*]] = and <2 x i32> [[Y32OP0]], [[X321]]
>>>> -; CHECK-NEXT:    [[R:%.*]] = trunc <2 x i32> [[B]] to <2 x i16>
>>>> +; CHECK-NEXT:    [[TMP1:%.*]] = trunc <2 x i32> [[Y32OP0]] to <2 x i16>
>>>> +; CHECK-NEXT:    [[R:%.*]] = and <2 x i16> [[TMP1]], %x16
>>>>  ; CHECK-NEXT:    ret <2 x i16> [[R]]
>>>>  ;
>>>>    %y32op0 = sdiv <2 x i32> %y32, <i32 7, i32 -17>
>>>> @@ -151,9 +140,8 @@ define <2 x i16> @narrow_sext_and_commut
>>>>  define <2 x i16> @narrow_zext_and_commute(<2 x i16> %x16, <2 x i32>
>>>> %y32) {
>>>>  ; CHECK-LABEL: @narrow_zext_and_commute(
>>>>  ; CHECK-NEXT:    [[Y32OP0:%.*]] = sdiv <2 x i32> %y32, <i32 7, i32 -17>
>>>> -; CHECK-NEXT:    [[X32:%.*]] = zext <2 x i16> %x16 to <2 x i32>
>>>> -; CHECK-NEXT:    [[B:%.*]] = and <2 x i32> [[Y32OP0]], [[X32]]
>>>> -; CHECK-NEXT:    [[R:%.*]] = trunc <2 x i32> [[B]] to <2 x i16>
>>>> +; CHECK-NEXT:    [[TMP1:%.*]] = trunc <2 x i32> [[Y32OP0]] to <2 x i16>
>>>> +; CHECK-NEXT:    [[R:%.*]] = and <2 x i16> [[TMP1]], %x16
>>>>  ; CHECK-NEXT:    ret <2 x i16> [[R]]
>>>>  ;
>>>>    %y32op0 = sdiv <2 x i32> %y32, <i32 7, i32 -17>
>>>> @@ -166,9 +154,8 @@ define <2 x i16> @narrow_zext_and_commut
>>>>  define <2 x i16> @narrow_sext_or_commute(<2 x i16> %x16, <2 x i32>
>>>> %y32) {
>>>>  ; CHECK-LABEL: @narrow_sext_or_commute(
>>>>  ; CHECK-NEXT:    [[Y32OP0:%.*]] = sdiv <2 x i32> %y32, <i32 7, i32 -17>
>>>> -; CHECK-NEXT:    [[X321:%.*]] = zext <2 x i16> %x16 to <2 x i32>
>>>> -; CHECK-NEXT:    [[B:%.*]] = or <2 x i32> [[Y32OP0]], [[X321]]
>>>> -; CHECK-NEXT:    [[R:%.*]] = trunc <2 x i32> [[B]] to <2 x i16>
>>>> +; CHECK-NEXT:    [[TMP1:%.*]] = trunc <2 x i32> [[Y32OP0]] to <2 x i16>
>>>> +; CHECK-NEXT:    [[R:%.*]] = or <2 x i16> [[TMP1]], %x16
>>>>  ; CHECK-NEXT:    ret <2 x i16> [[R]]
>>>>  ;
>>>>    %y32op0 = sdiv <2 x i32> %y32, <i32 7, i32 -17>
>>>> @@ -181,9 +168,8 @@ define <2 x i16> @narrow_sext_or_commute
>>>>  define <2 x i16> @narrow_zext_or_commute(<2 x i16> %x16, <2 x i32>
>>>> %y32) {
>>>>  ; CHECK-LABEL: @narrow_zext_or_commute(
>>>>  ; CHECK-NEXT:    [[Y32OP0:%.*]] = sdiv <2 x i32> %y32, <i32 7, i32 -17>
>>>> -; CHECK-NEXT:    [[X32:%.*]] = zext <2 x i16> %x16 to <2 x i32>
>>>> -; CHECK-NEXT:    [[B:%.*]] = or <2 x i32> [[Y32OP0]], [[X32]]
>>>> -; CHECK-NEXT:    [[R:%.*]] = trunc <2 x i32> [[B]] to <2 x i16>
>>>> +; CHECK-NEXT:    [[TMP1:%.*]] = trunc <2 x i32> [[Y32OP0]] to <2 x i16>
>>>> +; CHECK-NEXT:    [[R:%.*]] = or <2 x i16> [[TMP1]], %x16
>>>>  ; CHECK-NEXT:    ret <2 x i16> [[R]]
>>>>  ;
>>>>    %y32op0 = sdiv <2 x i32> %y32, <i32 7, i32 -17>
>>>> @@ -196,9 +182,8 @@ define <2 x i16> @narrow_zext_or_commute
>>>>  define <2 x i16> @narrow_sext_xor_commute(<2 x i16> %x16, <2 x i32>
>>>> %y32) {
>>>>  ; CHECK-LABEL: @narrow_sext_xor_commute(
>>>>  ; CHECK-NEXT:    [[Y32OP0:%.*]] = sdiv <2 x i32> %y32, <i32 7, i32 -17>
>>>> -; CHECK-NEXT:    [[X321:%.*]] = zext <2 x i16> %x16 to <2 x i32>
>>>> -; CHECK-NEXT:    [[B:%.*]] = xor <2 x i32> [[Y32OP0]], [[X321]]
>>>> -; CHECK-NEXT:    [[R:%.*]] = trunc <2 x i32> [[B]] to <2 x i16>
>>>> +; CHECK-NEXT:    [[TMP1:%.*]] = trunc <2 x i32> [[Y32OP0]] to <2 x i16>
>>>> +; CHECK-NEXT:    [[R:%.*]] = xor <2 x i16> [[TMP1]], %x16
>>>>  ; CHECK-NEXT:    ret <2 x i16> [[R]]
>>>>  ;
>>>>    %y32op0 = sdiv <2 x i32> %y32, <i32 7, i32 -17>
>>>> @@ -211,9 +196,8 @@ define <2 x i16> @narrow_sext_xor_commut
>>>>  define <2 x i16> @narrow_zext_xor_commute(<2 x i16> %x16, <2 x i32>
>>>> %y32) {
>>>>  ; CHECK-LABEL: @narrow_zext_xor_commute(
>>>>  ; CHECK-NEXT:    [[Y32OP0:%.*]] = sdiv <2 x i32> %y32, <i32 7, i32 -17>
>>>> -; CHECK-NEXT:    [[X32:%.*]] = zext <2 x i16> %x16 to <2 x i32>
>>>> -; CHECK-NEXT:    [[B:%.*]] = xor <2 x i32> [[Y32OP0]], [[X32]]
>>>> -; CHECK-NEXT:    [[R:%.*]] = trunc <2 x i32> [[B]] to <2 x i16>
>>>> +; CHECK-NEXT:    [[TMP1:%.*]] = trunc <2 x i32> [[Y32OP0]] to <2 x i16>
>>>> +; CHECK-NEXT:    [[R:%.*]] = xor <2 x i16> [[TMP1]], %x16
>>>>  ; CHECK-NEXT:    ret <2 x i16> [[R]]
>>>>  ;
>>>>    %y32op0 = sdiv <2 x i32> %y32, <i32 7, i32 -17>
>>>> @@ -226,9 +210,8 @@ define <2 x i16> @narrow_zext_xor_commut
>>>>  define <2 x i16> @narrow_sext_add_commute(<2 x i16> %x16, <2 x i32>
>>>> %y32) {
>>>>  ; CHECK-LABEL: @narrow_sext_add_commute(
>>>>  ; CHECK-NEXT:    [[Y32OP0:%.*]] = sdiv <2 x i32> %y32, <i32 7, i32 -17>
>>>> -; CHECK-NEXT:    [[X321:%.*]] = zext <2 x i16> %x16 to <2 x i32>
>>>> -; CHECK-NEXT:    [[B:%.*]] = add <2 x i32> [[Y32OP0]], [[X321]]
>>>> -; CHECK-NEXT:    [[R:%.*]] = trunc <2 x i32> [[B]] to <2 x i16>
>>>> +; CHECK-NEXT:    [[TMP1:%.*]] = trunc <2 x i32> [[Y32OP0]] to <2 x i16>
>>>> +; CHECK-NEXT:    [[R:%.*]] = add <2 x i16> [[TMP1]], %x16
>>>>  ; CHECK-NEXT:    ret <2 x i16> [[R]]
>>>>  ;
>>>>    %y32op0 = sdiv <2 x i32> %y32, <i32 7, i32 -17>
>>>> @@ -241,9 +224,8 @@ define <2 x i16> @narrow_sext_add_commut
>>>>  define <2 x i16> @narrow_zext_add_commute(<2 x i16> %x16, <2 x i32>
>>>> %y32) {
>>>>  ; CHECK-LABEL: @narrow_zext_add_commute(
>>>>  ; CHECK-NEXT:    [[Y32OP0:%.*]] = sdiv <2 x i32> %y32, <i32 7, i32 -17>
>>>> -; CHECK-NEXT:    [[X32:%.*]] = zext <2 x i16> %x16 to <2 x i32>
>>>> -; CHECK-NEXT:    [[B:%.*]] = add <2 x i32> [[Y32OP0]], [[X32]]
>>>> -; CHECK-NEXT:    [[R:%.*]] = trunc <2 x i32> [[B]] to <2 x i16>
>>>> +; CHECK-NEXT:    [[TMP1:%.*]] = trunc <2 x i32> [[Y32OP0]] to <2 x i16>
>>>> +; CHECK-NEXT:    [[R:%.*]] = add <2 x i16> [[TMP1]], %x16
>>>>  ; CHECK-NEXT:    ret <2 x i16> [[R]]
>>>>  ;
>>>>    %y32op0 = sdiv <2 x i32> %y32, <i32 7, i32 -17>
>>>> @@ -256,9 +238,8 @@ define <2 x i16> @narrow_zext_add_commut
>>>>  define <2 x i16> @narrow_sext_mul_commute(<2 x i16> %x16, <2 x i32>
>>>> %y32) {
>>>>  ; CHECK-LABEL: @narrow_sext_mul_commute(
>>>>  ; CHECK-NEXT:    [[Y32OP0:%.*]] = sdiv <2 x i32> %y32, <i32 7, i32 -17>
>>>> -; CHECK-NEXT:    [[X32:%.*]] = sext <2 x i16> %x16 to <2 x i32>
>>>> -; CHECK-NEXT:    [[B:%.*]] = mul <2 x i32> [[Y32OP0]], [[X32]]
>>>> -; CHECK-NEXT:    [[R:%.*]] = trunc <2 x i32> [[B]] to <2 x i16>
>>>> +; CHECK-NEXT:    [[TMP1:%.*]] = trunc <2 x i32> [[Y32OP0]] to <2 x i16>
>>>> +; CHECK-NEXT:    [[R:%.*]] = mul <2 x i16> [[TMP1]], %x16
>>>>  ; CHECK-NEXT:    ret <2 x i16> [[R]]
>>>>  ;
>>>>    %y32op0 = sdiv <2 x i32> %y32, <i32 7, i32 -17>
>>>> @@ -271,9 +252,8 @@ define <2 x i16> @narrow_sext_mul_commut
>>>>  define <2 x i16> @narrow_zext_mul_commute(<2 x i16> %x16, <2 x i32>
>>>> %y32) {
>>>>  ; CHECK-LABEL: @narrow_zext_mul_commute(
>>>>  ; CHECK-NEXT:    [[Y32OP0:%.*]] = sdiv <2 x i32> %y32, <i32 7, i32 -17>
>>>> -; CHECK-NEXT:    [[X32:%.*]] = zext <2 x i16> %x16 to <2 x i32>
>>>> -; CHECK-NEXT:    [[B:%.*]] = mul <2 x i32> [[Y32OP0]], [[X32]]
>>>> -; CHECK-NEXT:    [[R:%.*]] = trunc <2 x i32> [[B]] to <2 x i16>
>>>> +; CHECK-NEXT:    [[TMP1:%.*]] = trunc <2 x i32> [[Y32OP0]] to <2 x i16>
>>>> +; CHECK-NEXT:    [[R:%.*]] = mul <2 x i16> [[TMP1]], %x16
>>>>  ; CHECK-NEXT:    ret <2 x i16> [[R]]
>>>>  ;
>>>>    %y32op0 = sdiv <2 x i32> %y32, <i32 7, i32 -17>
>>>>
>>>>
>>>> _______________________________________________
>>>> llvm-commits mailing list
>>>> llvm-commits at lists.llvm.org
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>>
>>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171208/0e5b8fab/attachment.html>


More information about the llvm-commits mailing list