<div dir="ltr"><div><div>This is excellent, thank you for providing the test case. I see now what the omission is in the original patch. There was an implicit assumption that a sign-extend from a 32-bit value would be to a 64-bit value, but that of course need not be the case. Would you be able to try your original test with the attached patch to make sure the problem goes away before I re-commit the patch?<br><br></div>Thank you so much for providing a reduced test case.<br><br></div>Nemanja<br></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Aug 23, 2018 at 4:12 PM Ali Tamur <<a href="mailto:tamur@google.com">tamur@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">Hi,<div>Here is a small ir that causes seg fault only when the llc is compiled with the "[PowerPC] Generate Power9 extswsli extend sign and shift immediate instruction" change.</div><div><div><br></div><div>To reproduce:</div><div>$  llvm-as test_case.ll -o test_case.bc</div><div>$  opt test_case.bc -ee-instrument -tbaa -scoped-noalias -simplifycfg -sroa -early-cse -lower-expect -forceattrs -tbaa -scoped-noalias -inferattrs -ipsccp -called-value-propagation -globalopt -mem2reg -deadargelim -instcombine -simplifycfg -globals-aa -prune-eh -inline -functionattrs -sroa -early-cse-memssa -speculative-execution -jump-threading -correlated-propagation -simplifycfg -instcombine -libcalls-shrinkwrap -pgo-memop-opt -tailcallelim -simplifycfg -reassociate -loop-rotate -licm -loop-unswitch -simplifycfg -instcombine -indvars -loop-idiom -loop-deletion -loop-unroll -mldst-motion -gvn -memcpyopt -sccp -bdce -instcombine -jump-threading -correlated-propagation -dse -licm -adce -simplifycfg -instcombine -barrier -elim-avail-extern -rpo-functionattrs -globalopt -globaldce -globals-aa -float2int -loop-rotate -loop-distribute -loop-vectorize -loop-load-elim -instcombine -simplifycfg -instcombine -loop-unroll -instcombine -licm -alignment-from-assumptions -strip-dead-prototypes -globaldce -constmerge -loop-sink -instsimplify -div-rem-pairs -simplifycfg</div></div><div><br></div><div>>>></div><div><div>; ModuleID = 'bugpoint-reduced-simplified.bc'</div><div>source_filename = "experimental/users/tamur/llvm/example.cc"</div><div>target datalayout = "e-m:e-i64:64-n32:64"</div><div>target triple = "powerpc64le-grtev4-linux-gnu"</div><div><br></div><div>; Function Attrs: nounwind</div><div>define void @_Test(i32 signext) local_unnamed_addr #0 align 2 {</div><div>  %2 = ashr i32 %0, 31</div><div>  %3 = sext i32 %2 to i64</div><div>  %4 = zext i64 %3 to i128</div><div>  %5 = shl nuw i128 %4, 64</div><div>  %6 = or i128 %5, 0</div><div>  %7 = or i128 undef, 0</div><div>  %8 = mul i128 %7, %6</div><div>  %9 = lshr i128 %8, 64</div><div>  %10 = trunc i128 %9 to i64</div><div>  %11 = load i64, i64* undef, align 8</div><div>  %12 = and i64 %11, %10</div><div>  %13 = call i64 @llvm.bswap.i64(i64 %12) #2</div><div>  store i64 %13, i64* undef, align 8</div><div>  br i1 undef, label %15, label %14</div><div><br></div><div>; <label>:14:                                     ; preds = %1</div><div>  br label %15</div><div><br></div><div>; <label>:15:                                     ; preds = %14, %1</div><div>  ret void</div><div>}</div><div><br></div><div>; Function Attrs: nounwind readnone speculatable</div><div>declare i64 @llvm.bswap.i64(i64) #1</div><div><br></div><div>attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "strict-float-cast-overflow"="false" "target-cpu"="pwr9" "target-features"="+altivec,+bpermd,+crypto,+direct-move,+extdiv,+htm,+power8-vector,+power9-vector,+vsx,-qpx" "unsafe-fp-math"="false" "use-soft-float"="false" }</div><div>attributes #1 = { nounwind readnone speculatable }</div><div>attributes #2 = { nounwind }</div></div><div>>>></div><div><br></div><div>Please let me know if there is anything else I need to do.</div><div>Thanks,</div><div>Ali</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Wed, Aug 22, 2018 at 9:33 AM Eric Christopher <<a href="mailto:echristo@gmail.com" target="_blank">echristo@gmail.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">Ali is working on it and we'll see if we can get it to you today.<div><br></div><div>-eric<br><br><div class="gmail_quote"><div dir="ltr">On Wed, Aug 22, 2018 at 5:28 AM Nemanja Ivanovic <<a href="mailto:nemanja.i.ibm@gmail.com" target="_blank">nemanja.i.ibm@gmail.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><div>Thanks for reverting Eric,<br><br></div>I look forward to a test case so we can get this sorted out.<br></div></div><div dir="ltr">Nemanja<br></div><br><div class="gmail_quote"><div dir="ltr">On Tue, Aug 21, 2018 at 7:03 PM Eric Christopher <<a href="mailto:echristo@gmail.com" target="_blank">echristo@gmail.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">I went ahead and reverted this here:<div><br></div><div><div>Author: Eric Christopher <<a href="mailto:echristo@gmail.com" target="_blank">echristo@gmail.com</a>></div><div>Date:   Tue Aug 21 18:35:08 2018 +0000</div><div><br></div><div>    Temporarily Revert "[PowerPC] Generate Power9 extswsli extend sign and shift immediate instruction" due to it causing a compiler crash on valid.</div><div><br></div><div>    This reverts commit r340016, testcase forthcoming.</div><div><br></div><div>    git-svn-id: <a href="https://llvm.org/svn/llvm-project/llvm/trunk@340315" target="_blank">https://llvm.org/svn/llvm-project/llvm/trunk@340315</a> 91177308-0d34-0410-b5e6-96231b3b80d8</div></div><div><br></div><div>after talking with Nemanja.</div><div><br></div><div>-eric</div></div><br><div class="gmail_quote"><div dir="ltr">On Tue, Aug 21, 2018 at 11:11 AM Eric Christopher <<a href="mailto:echristo@gmail.com" target="_blank">echristo@gmail.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">Hi Nemanja,<div><br></div><div>We're seeing a compiler crash on valid with this patch - while we're working up a testcase would you mind reverting?</div></div><div dir="ltr"><div><br></div><div>-eric</div></div><br><div class="gmail_quote"><div dir="ltr">On Fri, Aug 17, 2018 at 5:36 AM Nemanja Ivanovic 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: nemanjai<br>
Date: Fri Aug 17 05:35:44 2018<br>
New Revision: 340016<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=340016&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=340016&view=rev</a><br>
Log:<br>
[PowerPC] Generate Power9 extswsli extend sign and shift immediate instruction<br>
<br>
Add a DAG combine for the PowerPC code generator to generate the Power9 extswsli<br>
extend sign and shift immediate instruction.<br>
<br>
Patch by RolandF.<br>
<br>
Differential revision: <a href="https://reviews.llvm.org/D49879" rel="noreferrer" target="_blank">https://reviews.llvm.org/D49879</a><br>
<br>
Added:<br>
    llvm/trunk/llvm/<br>
    llvm/trunk/llvm/test/<br>
    llvm/trunk/llvm/test/CodeGen/<br>
    llvm/trunk/llvm/test/CodeGen/PowerPC/<br>
    llvm/trunk/llvm/test/CodeGen/PowerPC/extswsli.ll<br>
    llvm/trunk/test/CodeGen/PowerPC/extswsli.ll<br>
Modified:<br>
    llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp<br>
    llvm/trunk/lib/Target/PowerPC/PPCISelLowering.h<br>
    llvm/trunk/lib/Target/PowerPC/PPCInstr64Bit.td<br>
    llvm/trunk/lib/Target/PowerPC/PPCInstrInfo.td<br>
<br>
Modified: llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp?rev=340016&r1=340015&r2=340016&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp?rev=340016&r1=340015&r2=340016&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp (original)<br>
+++ llvm/trunk/lib/Target/PowerPC/PPCISelLowering.cpp Fri Aug 17 05:35:44 2018<br>
@@ -1351,6 +1351,7 @@ const char *PPCTargetLowering::getTarget<br>
   case PPCISD::QBFLT:           return "PPCISD::QBFLT";<br>
   case PPCISD::QVLFSb:          return "PPCISD::QVLFSb";<br>
   case PPCISD::BUILD_FP128:     return "PPCISD::BUILD_FP128";<br>
+  case PPCISD::EXTSWSLI:        return "PPCISD::EXTSWSLI";<br>
   }<br>
   return nullptr;<br>
 }<br>
@@ -14102,7 +14103,30 @@ SDValue PPCTargetLowering::combineSHL(SD<br>
   if (auto Value = stripModuloOnShift(*this, N, DCI.DAG))<br>
     return Value;<br>
<br>
-  return SDValue();<br>
+  SDValue N0 = N->getOperand(0);<br>
+  ConstantSDNode *CN1 = dyn_cast<ConstantSDNode>(N->getOperand(1));<br>
+  if (!Subtarget.isISA3_0() ||<br>
+      N0.getOpcode() != ISD::SIGN_EXTEND ||<br>
+      N0.getOperand(0).getValueType() != MVT::i32 ||<br>
+      CN1 == nullptr)<br>
+    return SDValue();<br>
+<br>
+  // We can't save an operation here if the value is already extended, and<br>
+  // the existing shift is easier to combine.<br>
+  SDValue ExtsSrc = N0.getOperand(0);<br>
+  if (ExtsSrc.getOpcode() == ISD::TRUNCATE &&<br>
+      ExtsSrc.getOperand(0).getOpcode() == ISD::AssertSext)<br>
+    return SDValue();<br>
+<br>
+  SDLoc DL(N0);<br>
+  SDValue ShiftBy = SDValue(CN1, 0);<br>
+  // We want the shift amount to be i32 on the extswli, but the shift could<br>
+  // have an i64.<br>
+  if (ShiftBy.getValueType() == MVT::i64)<br>
+    ShiftBy = DCI.DAG.getConstant(CN1->getZExtValue(), DL, MVT::i32);<br>
+<br>
+  return DCI.DAG.getNode(PPCISD::EXTSWSLI, DL, MVT::i64, N0->getOperand(0),<br>
+                         ShiftBy);<br>
 }<br>
<br>
 SDValue PPCTargetLowering::combineSRA(SDNode *N, DAGCombinerInfo &DCI) const {<br>
<br>
Modified: llvm/trunk/lib/Target/PowerPC/PPCISelLowering.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCISelLowering.h?rev=340016&r1=340015&r2=340016&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCISelLowering.h?rev=340016&r1=340015&r2=340016&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/PowerPC/PPCISelLowering.h (original)<br>
+++ llvm/trunk/lib/Target/PowerPC/PPCISelLowering.h Fri Aug 17 05:35:44 2018<br>
@@ -149,6 +149,10 @@ namespace llvm {<br>
       /// For vector types, only the last n bits are used. See vsld.<br>
       SRL, SRA, SHL,<br>
<br>
+      /// EXTSWSLI = The PPC extswsli instruction, which does an extend-sign<br>
+      /// word and shift left immediate.<br>
+      EXTSWSLI,<br>
+<br>
       /// The combination of sra[wd]i and addze used to implemented signed<br>
       /// integer division by a power of 2. The first operand is the dividend,<br>
       /// and the second is the constant shift amount (representing the<br>
<br>
Modified: llvm/trunk/lib/Target/PowerPC/PPCInstr64Bit.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCInstr64Bit.td?rev=340016&r1=340015&r2=340016&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCInstr64Bit.td?rev=340016&r1=340015&r2=340016&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/PowerPC/PPCInstr64Bit.td (original)<br>
+++ llvm/trunk/lib/Target/PowerPC/PPCInstr64Bit.td Fri Aug 17 05:35:44 2018<br>
@@ -717,9 +717,10 @@ defm SRADI  : XSForm_1rc<31, 413, (outs<br>
                          "sradi", "$rA, $rS, $SH", IIC_IntRotateDI,<br>
                          [(set i64:$rA, (sra i64:$rS, (i32 imm:$SH)))]>, isPPC64;<br>
<br>
-defm EXTSWSLI : XSForm_1r<31, 445, (outs g8rc:$rA), (ins g8rc:$rS, u6imm:$SH),<br>
+defm EXTSWSLI : XSForm_1r<31, 445, (outs g8rc:$rA), (ins gprc:$rS, u6imm:$SH),<br>
                           "extswsli", "$rA, $rS, $SH", IIC_IntRotateDI,<br>
-                          []>, isPPC64;<br>
+                          [(set i64:$rA, (PPCextswsli i32:$rS, (i32 imm:$SH)))]>,<br>
+                          isPPC64, Requires<[IsISA3_0]>;<br>
<br>
 // For fast-isel:<br>
 let isCodeGenOnly = 1, Defs = [CARRY] in<br>
<br>
Modified: llvm/trunk/lib/Target/PowerPC/PPCInstrInfo.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCInstrInfo.td?rev=340016&r1=340015&r2=340016&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCInstrInfo.td?rev=340016&r1=340015&r2=340016&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/PowerPC/PPCInstrInfo.td (original)<br>
+++ llvm/trunk/lib/Target/PowerPC/PPCInstrInfo.td Fri Aug 17 05:35:44 2018<br>
@@ -114,6 +114,10 @@ def SDT_PPCqvlfsb : SDTypeProfile<1, 1,<br>
   SDTCisVec<0>, SDTCisPtrTy<1><br>
 ]>;<br>
<br>
+def SDT_PPCextswsli : SDTypeProfile<1, 2, [  // extswsli<br>
+  SDTCisInt<0>, SDTCisInt<1>, SDTCisOpSmallerThanOp<1, 0>, SDTCisInt<2><br>
+]>;<br>
+<br>
 //===----------------------------------------------------------------------===//<br>
 // PowerPC specific DAG Nodes.<br>
 //<br>
@@ -218,6 +222,8 @@ def PPCsrl        : SDNode<"PPCISD::SRL"<br>
 def PPCsra        : SDNode<"PPCISD::SRA"       , SDTIntShiftOp>;<br>
 def PPCshl        : SDNode<"PPCISD::SHL"       , SDTIntShiftOp>;<br>
<br>
+def PPCextswsli : SDNode<"PPCISD::EXTSWSLI" , SDT_PPCextswsli>;<br>
+<br>
 // Move 2 i64 values into a VSX register<br>
 def PPCbuild_fp128: SDNode<"PPCISD::BUILD_FP128",<br>
                            SDTypeProfile<1, 2,<br>
<br>
Added: llvm/trunk/llvm/test/CodeGen/PowerPC/extswsli.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/llvm/test/CodeGen/PowerPC/extswsli.ll?rev=340016&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/llvm/test/CodeGen/PowerPC/extswsli.ll?rev=340016&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/llvm/test/CodeGen/PowerPC/extswsli.ll (added)<br>
+++ llvm/trunk/llvm/test/CodeGen/PowerPC/extswsli.ll Fri Aug 17 05:35:44 2018<br>
@@ -0,0 +1,17 @@<br>
+; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \<br>
+; RUN:     -mcpu=pwr9 -ppc-asm-full-reg-names < %s | FileCheck %s<br>
+<br>
+@z = external local_unnamed_addr global i32*, align 8<br>
+<br>
+; Function Attrs: norecurse nounwind readonly<br>
+define signext i32 @_Z2tcii(i32 signext %x, i32 signext %y) local_unnamed_addr #0 {<br>
+entry:<br>
+  %0 = load i32*, i32** @z, align 8<br>
+  %add = add nsw i32 %y, %x<br>
+  %idxprom = sext i32 %add to i64<br>
+  %arrayidx = getelementptr inbounds i32, i32* %0, i64 %idxprom<br>
+  %1 = load i32, i32* %arrayidx, align 4<br>
+  ret i32 %1<br>
+; CHECK-LABEL: @_Z2tcii<br>
+; CHECK: extswsli {{r[0-9]+}}, {{r[0-9]+}}, 2<br>
+}<br>
<br>
Added: llvm/trunk/test/CodeGen/PowerPC/extswsli.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/extswsli.ll?rev=340016&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/extswsli.ll?rev=340016&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/PowerPC/extswsli.ll (added)<br>
+++ llvm/trunk/test/CodeGen/PowerPC/extswsli.ll Fri Aug 17 05:35:44 2018<br>
@@ -0,0 +1,17 @@<br>
+; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \<br>
+; RUN:     -mcpu=pwr9 -ppc-asm-full-reg-names < %s | FileCheck %s<br>
+<br>
+@z = external local_unnamed_addr global i32*, align 8<br>
+<br>
+; Function Attrs: norecurse nounwind readonly<br>
+define signext i32 @_Z2tcii(i32 signext %x, i32 signext %y) local_unnamed_addr #0 {<br>
+entry:<br>
+  %0 = load i32*, i32** @z, align 8<br>
+  %add = add nsw i32 %y, %x<br>
+  %idxprom = sext i32 %add to i64<br>
+  %arrayidx = getelementptr inbounds i32, i32* %0, i64 %idxprom<br>
+  %1 = load i32, i32* %arrayidx, align 4<br>
+  ret i32 %1<br>
+; CHECK-LABEL: @_Z2tcii<br>
+; CHECK: extswsli {{r[0-9]+}}, {{r[0-9]+}}, 2<br>
+}<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></div></div>
</blockquote></div>
</blockquote></div>