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