<div dir="ltr">That seems to work, also on the non-reduced internal test case. Thanks!</div><br><div class="gmail_quote"><div dir="ltr">On Wed, Nov 28, 2018 at 2:58 PM Sanjay Patel <<a href="mailto:spatel@rotateright.com">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>That's an interesting case. Making optimization better exposed an x86-specific instruction selection hole.</div><div>Hopefully, fixed with:</div><div><a href="https://reviews.llvm.org/rL347818" rel="noreferrer" target="_blank">https://reviews.llvm.org/rL347818</a></div><div><br></div><div>Sorry about the bug. Let me know if you find any other issues. Thanks!<br> </div></div><br><div class="gmail_quote"><div dir="ltr">On Wed, Nov 28, 2018 at 2:26 PM Jordan Rupprecht <<a href="mailto:rupprecht@google.com" target="_blank">rupprecht@google.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">Sure; attached the IR repro.</div><br><div class="gmail_quote"><div dir="ltr">On Wed, Nov 28, 2018 at 1:19 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">Can you post the IR for that example using '-S -emit-llvm'? <br></div><br><div class="gmail_quote"><div dir="ltr">On Wed, Nov 28, 2018 at 1:58 PM Jordan Rupprecht <<a href="mailto:rupprecht@google.com" target="_blank">rupprecht@google.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 dir="ltr"><div dir="ltr">Looks like this is causing llvm to crash with msan + opt. Here's a test case courtesy of creduce:</div><div dir="ltr"><br><div>$ cat repro.cc</div><div>float a, b, c, d, e;</div><div>void f(float *j, float *k) {</div><div>  float g(a ? b * (1.0f - c) : b * (1.0f + c));</div><div>  float h(a ? (1.0f - b) * (1.0f + c) : (1.0f - b) * c);</div><div>  *j = g * 0;</div><div>  *k = h * 0;</div><div>}</div><div>float *i;</div><div>void l() {</div><div>  float m = 0, n = 0;</div><div>  f(&d, &e);</div><div>  m *= d;</div><div>  n *= e;</div><div>  i[0] = i[1] = m;</div><div>  i[2] = i[3] = n;</div><div>}</div><div><br></div><div>$ ~/path/to/clang++ -fsanitize=memory -msse4.2 -O2 -c repro.cc</div><div>fatal error: error in backend: Cannot select: t389: v2i64 = bitcast t388</div><div>  t388: v4i32 = X86ISD::PSHUFD t387, Constant:i8<68></div><div>    t387: v4i32 = bitcast t266</div><div>      t266: v2i64 = scalar_to_vector t216</div><div>        t216: i64,ch = load<(load 4 from `i32* inttoptr (i64 xor (i64 ptrtoint (float* @c to i64), i64 87960930222080) to i32*)`), anyext from i32> t0, t20, undef:i64</div><div>          t20: i64 = xor t317, Constant:i64<87960930222080></div><div>            t317: i64 = X86ISD::Wrapper TargetGlobalAddress:i64<float* @c> 0</div><div>              t316: i64 = TargetGlobalAddress<float* @c> 0</div><div>            t5: i64 = Constant<87960930222080></div><div>          t3: i64 = undef</div><div>    t361: i8 = Constant<68></div><div>In function: _Z1lv</div><div>clang-8: error: clang frontend command failed with exit code 70 (use -v to see invocation)</div><div>clang version 8.0.0 (trunk 347216) (llvm/trunk 347227)</div></div></div></div><br><div class="gmail_quote"><div dir="ltr">On Mon, Nov 19, 2018 at 9:08 AM 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:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: spatel<br>
Date: Mon Nov 19 09:06:05 2018<br>
New Revision: 347227<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=347227&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=347227&view=rev</a><br>
Log:<br>
[SelectionDAG] simplify vector select with undef operand(s)<br>
<br>
Modified:<br>
    llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp<br>
    llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp<br>
    llvm/trunk/test/CodeGen/X86/pr30284.ll<br>
    llvm/trunk/test/CodeGen/X86/pr37499.ll<br>
<br>
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=347227&r1=347226&r2=347227&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=347227&r1=347226&r2=347227&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Mon Nov 19 09:06:05 2018<br>
@@ -7816,9 +7816,8 @@ SDValue DAGCombiner::visitVSELECT(SDNode<br>
   SDValue N2 = N->getOperand(2);<br>
   SDLoc DL(N);<br>
<br>
-  // fold (vselect C, X, X) -> X<br>
-  if (N1 == N2)<br>
-    return N1;<br>
+  if (SDValue V = DAG.simplifySelect(N0, N1, N2))<br>
+    return V;<br>
<br>
   // Canonicalize integer abs.<br>
   // vselect (setg[te] X,  0),  X, -X -><br>
<br>
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=347227&r1=347226&r2=347227&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=347227&r1=347226&r2=347227&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Mon Nov 19 09:06:05 2018<br>
@@ -5078,6 +5078,7 @@ SDValue SelectionDAG::getNode(unsigned O<br>
     break;<br>
   }<br>
   case ISD::SELECT:<br>
+  case ISD::VSELECT:<br>
     if (SDValue V = simplifySelect(N1, N2, N3))<br>
       return V;<br>
     break;<br>
@@ -6790,11 +6791,18 @@ SDValue SelectionDAG::simplifySelect(SDV<br>
   if (F.isUndef())<br>
     return T;<br>
<br>
-  // fold (select true, T, F) -> T<br>
-  // fold (select false, T, F) -> F<br>
+  // select true, T, F --> T<br>
+  // select false, T, F --> F<br>
   if (auto *CondC = dyn_cast<ConstantSDNode>(Cond))<br>
     return CondC->isNullValue() ? F : T;<br>
<br>
+  // TODO: This should simplify VSELECT with constant condition using something<br>
+  // like this (but check boolean contents to be complete?):<br>
+  //  if (ISD::isBuildVectorAllOnes(Cond.getNode()))<br>
+  //    return T;<br>
+  //  if (ISD::isBuildVectorAllZeros(Cond.getNode()))<br>
+  //    return F;<br>
+<br>
   // select ?, T, T --> T<br>
   if (T == F)<br>
     return T;<br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/pr30284.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/pr30284.ll?rev=347227&r1=347226&r2=347227&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/pr30284.ll?rev=347227&r1=347226&r2=347227&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/pr30284.ll (original)<br>
+++ llvm/trunk/test/CodeGen/X86/pr30284.ll Mon Nov 19 09:06:05 2018<br>
@@ -4,14 +4,6 @@<br>
 define void @undef_cond() {<br>
 ; CHECK-LABEL: undef_cond:<br>
 ; CHECK:       # %bb.0:<br>
-; CHECK-NEXT:    vmovapd 0, %zmm0<br>
-; CHECK-NEXT:    vmovapd 64, %zmm1<br>
-; CHECK-NEXT:    vmovapd {{.*#+}} zmm2 = [0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16]<br>
-; CHECK-NEXT:    vorpd %zmm2, %zmm0, %zmm0 {%k1}<br>
-; CHECK-NEXT:    vorpd %zmm2, %zmm1, %zmm1 {%k1}<br>
-; CHECK-NEXT:    vmovapd %zmm1, 64<br>
-; CHECK-NEXT:    vmovapd %zmm0, 0<br>
-; CHECK-NEXT:    vzeroupper<br>
 ; CHECK-NEXT:    retl<br>
   %a_load22 = load <16 x i64>, <16 x i64>* null, align 1<br>
   %bitop = or <16 x i64> %a_load22, <i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736, i64 68719476736><br>
<br>
Modified: llvm/trunk/test/CodeGen/X86/pr37499.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/pr37499.ll?rev=347227&r1=347226&r2=347227&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/pr37499.ll?rev=347227&r1=347226&r2=347227&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/pr37499.ll (original)<br>
+++ llvm/trunk/test/CodeGen/X86/pr37499.ll Mon Nov 19 09:06:05 2018<br>
@@ -4,14 +4,7 @@<br>
 define <2 x i64> @undef_tval() {<br>
 ; CHECK-LABEL: undef_tval:<br>
 ; CHECK:       # %bb.0:<br>
-; CHECK-NEXT:    vmovdqa {{.*#+}} xmm0 = [1,1,1,1,1,1,1,1]<br>
-; CHECK-NEXT:    movb $1, %al<br>
-; CHECK-NEXT:    kmovw %eax, %k1<br>
-; CHECK-NEXT:    vpcmpeqd %ymm1, %ymm1, %ymm1<br>
-; CHECK-NEXT:    vmovdqa32 %ymm1, %ymm1 {%k1} {z}<br>
-; CHECK-NEXT:    vpmovdw %ymm1, %xmm1<br>
-; CHECK-NEXT:    vpblendvb %xmm1, %xmm0, %xmm0, %xmm0<br>
-; CHECK-NEXT:    vzeroupper<br>
+; CHECK-NEXT:    vmovaps {{.*#+}} xmm0 = [1,1,1,1,1,1,1,1]<br>
 ; CHECK-NEXT:    retq<br>
   %1 = tail call <8 x i16> @llvm.x86.avx512.mask.pmov.qw.512(<8 x i64> undef, <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>, i8 1) #3<br>
   %2 = bitcast <8 x i16> %1 to <2 x i64><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>
</blockquote></div>
</blockquote></div>
</blockquote></div>
</blockquote></div>