<div dir="ltr">Thank you!<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, May 24, 2017 at 2:24 AM, Daniel Sanders <span dir="ltr"><<a href="mailto:daniel_l_sanders@apple.com" target="_blank">daniel_l_sanders@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word;line-break:after-white-space">The clean build did the trick.<div><div class="h5"><br><div><br><blockquote type="cite"><div>On 24 May 2017, at 08:59, Daniel Sanders <<a href="mailto:daniel_l_sanders@apple.com" target="_blank">daniel_l_sanders@apple.com</a>> wrote:</div><br class="m_-6720034345380153840Apple-interchange-newline"><div><div style="word-wrap:break-word;line-break:after-white-space">Unfortunately that didn't fix it. I notice that the test is passing on the other builder that is running on that buildslave (<a href="http://lab.llvm.org:8011/builders/llvm-clang-lld-x86_64-scei-ps4-windows10pro-fast/builds/9844" target="_blank">http://lab.llvm.org:8011/<wbr>builders/llvm-clang-lld-x86_<wbr>64-scei-ps4-windows10pro-fast/<wbr>builds/9844</a>) so it's unlikely to be something to do with the machine.<div><br></div><div>I don't see any mention of generating X86GenGlobalISel.inc in <a href="http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/2552" target="_blank">http://lab.llvm.org:8011/<wbr>builders/llvm-clang-x86_64-<wbr>expensive-checks-win/builds/<wbr>2552</a> so I've started a clean build.<br><div><br><div><blockquote type="cite"><div>On 24 May 2017, at 07:13, Daniel Sanders via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:</div><br class="m_-6720034345380153840Apple-interchange-newline"><div><div style="word-wrap:break-word;line-break:after-white-space">Hi Galina,<div><br></div><div>That test is new in this commit and it seems that optsize isn't having the desired effect on this machine. I'd hazard a guess that this buildbot has +slow-incdec set via the default processor and this is telling the instruction selector not to use inc/dec even when optimizing for size. I've tweaked the test to disable this feature using -mattr.</div><div><br></div><div>Sorry for leaving this broken overnight. I was keeping an eye on <a href="http://lab.llvm.org:8011/console" target="_blank">lab.llvm.org:8011/console</a> but that didn't report this builder.</div><div><br><div><blockquote type="cite"><div>On 24 May 2017, at 00:11, Galina Kistanova <<a href="mailto:gkistanova@gmail.com" target="_blank">gkistanova@gmail.com</a>> wrote:</div><br class="m_-6720034345380153840Apple-interchange-newline"><div><div dir="ltr">Hello Daniel,<br><br>This commit broke tests on one of our builders:<br><br>Failing Tests (1):<br> LLVM :: CodeGen/X86/GlobalISel/select-<wbr>leaf-constant.mir<br><br><a href="http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win" target="_blank">http://lab.llvm.org:8011/<wbr>builders/llvm-clang-x86_64-<wbr>expensive-checks-win</a><br><br>Please have a look at this?<br><br>Thanks<br><br>Galina<br><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, May 23, 2017 at 12:33 PM, Daniel Sanders via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: dsanders<br>
Date: Tue May 23 14:33:16 2017<br>
New Revision: 303678<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=303678&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject?rev=303678&view=rev</a><br>
Log:<br>
[globalisel][tablegen] Add support for (set $dst, 1) and test X86's OptForSize predicate.<br>
<br>
Summary:<br>
It's rare but a small number of patterns use IntInit's at the root of the match.<br>
On X86, one such rule is enabled by the OptForSize predicate and causes the<br>
compiler to use the smaller:<br>
%0 = MOV32r1<br>
instead of the usual:<br>
%0 = MOV32ri 1<br>
<br>
This patch adds support for matching IntInit's at the root and uses this as a<br>
test case for the optsize attribute that was implemented in r301750<br>
<br>
Reviewers: qcolombet, ab, t.p.northover, rovka, kristof.beyls, aditya_nandakumar<br>
<br>
Reviewed By: qcolombet<br>
<br>
Subscribers: igorb, llvm-commits<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D32791" rel="noreferrer" target="_blank">https://reviews.llvm.org/D3279<wbr>1</a><br>
<br>
Added:<br>
llvm/trunk/test/CodeGen/X86/Gl<wbr>obalISel/select-leaf-constant.<wbr>mir<br>
Modified:<br>
llvm/trunk/test/TableGen/Globa<wbr>lISelEmitter.td<br>
llvm/trunk/utils/TableGen/Glob<wbr>alISelEmitter.cpp<br>
<br>
Added: llvm/trunk/test/CodeGen/X86/Gl<wbr>obalISel/select-leaf-constant.<wbr>mir<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/GlobalISel/select-leaf-constant.mir?rev=303678&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/test/CodeGen/<wbr>X86/GlobalISel/select-leaf-<wbr>constant.mir?rev=303678&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/X86/Gl<wbr>obalISel/select-leaf-constant.<wbr>mir (added)<br>
+++ llvm/trunk/test/CodeGen/X86/Gl<wbr>obalISel/select-leaf-constant.<wbr>mir Tue May 23 14:33:16 2017<br>
@@ -0,0 +1,96 @@<br>
+# RUN: llc -mtriple=i586-linux-gnu -global-isel -run-pass=instruction-select %s -o - | FileCheck %s --check-prefix=CHECK<br>
+#<br>
+# This is necessary to test that attribute-based rule predicates work and that<br>
+# they properly reset between functions.<br>
+<br>
+--- |<br>
+ define i32 @const_i32_1() {<br>
+ ret i32 1<br>
+ }<br>
+<br>
+ define i32 @const_i32_1_optsize() #0 {<br>
+ ret i32 1<br>
+ }<br>
+<br>
+ define i32 @const_i32_1b() {<br>
+ ret i32 1<br>
+ }<br>
+<br>
+ define i32 @const_i32_1_optsizeb() #0 {<br>
+ ret i32 1<br>
+ }<br>
+<br>
+ attributes #0 = { optsize }<br>
+...<br>
+---<br>
+name: const_i32_1<br>
+legalized: true<br>
+regBankSelected: true<br>
+selected: false<br>
+# CHECK-LABEL: name: const_i32_1<br>
+# CHECK: registers:<br>
+# CHECK-NEXT: - { id: 0, class: gr32 }<br>
+registers:<br>
+ - { id: 0, class: gpr }<br>
+# CHECK: body:<br>
+# CHECK: %0 = MOV32ri 1<br>
+body: |<br>
+ bb.1 (%ir-block.0):<br>
+ %0(s32) = G_CONSTANT i32 1<br>
+ %eax = COPY %0(s32)<br>
+ RET 0, implicit %eax<br>
+...<br>
+---<br>
+name: const_i32_1_optsize<br>
+legalized: true<br>
+regBankSelected: true<br>
+selected: false<br>
+# CHECK-LABEL: name: const_i32_1_optsize<br>
+# CHECK: registers:<br>
+# CHECK-NEXT: - { id: 0, class: gr32 }<br>
+registers:<br>
+ - { id: 0, class: gpr }<br>
+# CHECK: body:<br>
+# CHECK: %0 = MOV32r1<br>
+body: |<br>
+ bb.1 (%ir-block.0):<br>
+ %0(s32) = G_CONSTANT i32 1<br>
+ %eax = COPY %0(s32)<br>
+ RET 0, implicit %eax<br>
+...<br>
+---<br>
+name: const_i32_1b<br>
+legalized: true<br>
+regBankSelected: true<br>
+selected: false<br>
+# CHECK-LABEL: name: const_i32_1b<br>
+# CHECK: registers:<br>
+# CHECK-NEXT: - { id: 0, class: gr32 }<br>
+registers:<br>
+ - { id: 0, class: gpr }<br>
+# CHECK: body:<br>
+# CHECK: %0 = MOV32ri 1<br>
+body: |<br>
+ bb.1 (%ir-block.0):<br>
+ %0(s32) = G_CONSTANT i32 1<br>
+ %eax = COPY %0(s32)<br>
+ RET 0, implicit %eax<br>
+...<br>
+---<br>
+name: const_i32_1_optsizeb<br>
+legalized: true<br>
+regBankSelected: true<br>
+selected: false<br>
+# CHECK-LABEL: name: const_i32_1_optsizeb<br>
+# CHECK: registers:<br>
+# CHECK-NEXT: - { id: 0, class: gr32 }<br>
+registers:<br>
+ - { id: 0, class: gpr }<br>
+# CHECK: body:<br>
+# CHECK: %0 = MOV32r1<br>
+body: |<br>
+ bb.1 (%ir-block.0):<br>
+ %0(s32) = G_CONSTANT i32 1<br>
+ %eax = COPY %0(s32)<br>
+ RET 0, implicit %eax<br>
+...<br>
<br>
Modified: llvm/trunk/test/TableGen/Globa<wbr>lISelEmitter.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/TableGen/GlobalISelEmitter.td?rev=303678&r1=303677&r2=303678&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/test/TableGen<wbr>/GlobalISelEmitter.td?rev=<wbr>303678&r1=303677&r2=303678&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/TableGen/Globa<wbr>lISelEmitter.td (original)<br>
+++ llvm/trunk/test/TableGen/Globa<wbr>lISelEmitter.td Tue May 23 14:33:16 2017<br>
@@ -462,6 +462,32 @@ def XORManyDefaults : I<(outs GPR32:$dst<br>
def ORN : I<(outs GPR32:$dst), (ins GPR32:$src1, GPR32:$src2), []>;<br>
def : Pat<(not GPR32:$Wm), (ORN R0, GPR32:$Wm)>;<br>
<br>
+//===- Test a simple pattern with just a leaf immediate. ------------------===//<br>
+<br>
+// CHECK-LABEL: if ([&]() {<br>
+// CHECK-NEXT: MachineInstr &MI0 = I;<br>
+// CHECK-NEXT: if (MI0.getNumOperands() < 2)<br>
+// CHECK-NEXT: return false;<br>
+// CHECK-NEXT: if ((MI0.getOpcode() == TargetOpcode::G_CONSTANT) &&<br>
+// CHECK-NEXT: ((/* dst */ (MRI.getType(MI0.getOperand(0)<wbr>.getReg()) == (LLT::scalar(32))) &&<br>
+// CHECK-NEXT: ((&RBI.<wbr>getRegBankFromRegClass(MyTarge<wbr>t::GPR32RegClass) == RBI.getRegBank(MI0.getOperand(<wbr>0).getReg(), MRI, TRI))))) &&<br>
+// CHECK-NEXT: ((/* Operand 1 */ (MI0.getOperand(1).isCImm() && MI0.getOperand(1).getCImm()->e<wbr>qualsInt(1))))) {<br>
+// CHECK-NEXT: // 1:i32 => (MOV1:i32)<br>
+// CHECK-NEXT: MachineInstrBuilder MIB = BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(MyTarget::MOV1));<br>
+// CHECK-NEXT: MIB.add(MI0.getOperand(0)/*dst<wbr>*/);<br>
+// CHECK-NEXT: for (const auto *FromMI : {&MI0, })<br>
+// CHECK-NEXT: for (const auto &MMO : FromMI->memoperands())<br>
+// CHECK-NEXT: MIB.addMemOperand(MMO);<br>
+// CHECK-NEXT: I.eraseFromParent();<br>
+// CHECK-NEXT: MachineInstr &NewI = *MIB;<br>
+// CHECK-NEXT: constrainSelectedInstRegOperan<wbr>ds(NewI, TII, TRI, RBI);<br>
+// CHECK-NEXT: return true;<br>
+// CHECK-NEXT: }<br>
+// CHECK-NEXT: return false;<br>
+// CHECK-NEXT: }()) { return true; }<br>
+<br>
+def MOV1 : I<(outs GPR32:$dst), (ins), [(set GPR32:$dst, 1)]>;<br>
+<br>
//===- Test a pattern with an MBB operand. ------------------------------<wbr>--===//<br>
<br>
// CHECK-LABEL: if ([&]() {<br>
<br>
Modified: llvm/trunk/utils/TableGen/Glob<wbr>alISelEmitter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/GlobalISelEmitter.cpp?rev=303678&r1=303677&r2=303678&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/utils/TableGe<wbr>n/GlobalISelEmitter.cpp?rev=<wbr>303678&r1=303677&r2=303678&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/utils/TableGen/Glob<wbr>alISelEmitter.cpp (original)<br>
+++ llvm/trunk/utils/TableGen/Glob<wbr>alISelEmitter.cpp Tue May 23 14:33:16 2017<br>
@@ -135,6 +135,9 @@ static Error isTrivialOperatorNode(const<br>
std::string Explanation = "";<br>
std::string Separator = "";<br>
if (N->isLeaf()) {<br>
+ if (IntInit *Int = dyn_cast<IntInit>(N->getLeafVa<wbr>lue()))<br>
+ return Error::success();<br>
+<br>
Explanation = "Is a leaf";<br>
Separator = ", ";<br>
}<br>
@@ -272,6 +275,7 @@ public:<br>
OPM_ComplexPattern,<br>
OPM_Instruction,<br>
OPM_Int,<br>
+ OPM_LiteralInt,<br>
OPM_LLT,<br>
OPM_RegBank,<br>
OPM_MBB,<br>
@@ -406,13 +410,14 @@ public:<br>
}<br>
};<br>
<br>
-/// Generates code to check that an operand is a particular int.<br>
-class IntOperandMatcher : public OperandPredicateMatcher {<br>
+/// Generates code to check that an operand is a G_CONSTANT with a particular<br>
+/// int.<br>
+class ConstantIntOperandMatcher : public OperandPredicateMatcher {<br>
protected:<br>
int64_t Value;<br>
<br>
public:<br>
- IntOperandMatcher(int64_t Value)<br>
+ ConstantIntOperandMatcher(int6<wbr>4_t Value)<br>
: OperandPredicateMatcher(OPM_In<wbr>t), Value(Value) {}<br>
<br>
static bool classof(const OperandPredicateMatcher *P) {<br>
@@ -425,6 +430,27 @@ public:<br>
}<br>
};<br>
<br>
+/// Generates code to check that an operand is a raw int (where MO.isImm() or<br>
+/// MO.isCImm() is true).<br>
+class LiteralIntOperandMatcher : public OperandPredicateMatcher {<br>
+protected:<br>
+ int64_t Value;<br>
+<br>
+public:<br>
+ LiteralIntOperandMatcher(int64<wbr>_t Value)<br>
+ : OperandPredicateMatcher(OPM_Li<wbr>teralInt), Value(Value) {}<br>
+<br>
+ static bool classof(const OperandPredicateMatcher *P) {<br>
+ return P->getKind() == OPM_LiteralInt;<br>
+ }<br>
+<br>
+ void emitCxxPredicateExpr(raw_ostre<wbr>am &OS, RuleMatcher &Rule,<br>
+ StringRef OperandExpr) const override {<br>
+ OS << OperandExpr << ".isCImm() && " << OperandExpr<br>
+ << ".getCImm()->equalsInt(" << Value << ")";<br>
+ }<br>
+};<br>
+<br>
/// Generates code to check that a set of predicates match for a particular<br>
/// operand.<br>
class OperandMatcher : public PredicateListMatcher<OperandPr<wbr>edicateMatcher> {<br>
@@ -1236,7 +1262,7 @@ private:<br>
createAndImportSelDAGMatcher(<wbr>InstructionMatcher &InsnMatcher,<br>
const TreePatternNode *Src) const;<br>
Error importChildMatcher(Instruction<wbr>Matcher &InsnMatcher,<br>
- TreePatternNode *SrcChild, unsigned OpIdx,<br>
+ const TreePatternNode *SrcChild, unsigned OpIdx,<br>
unsigned &TempOpIdx) const;<br>
Expected<BuildMIAction &> createAndImportInstructionRend<wbr>erer(<br>
RuleMatcher &M, const TreePatternNode *Dst,<br>
@@ -1299,14 +1325,23 @@ Expected<InstructionMatcher &> GlobalISe<br>
if (Src->getExtTypes().size() > 1)<br>
return failedImport("Src pattern has multiple results");<br>
<br>
- auto SrcGIOrNull = findNodeEquiv(Src->getOperator<wbr>());<br>
- if (!SrcGIOrNull)<br>
- return failedImport("Pattern operator lacks an equivalent Instruction" +<br>
- explainOperator(Src->getOperat<wbr>or()));<br>
- auto &SrcGI = *SrcGIOrNull;<br>
+ if (Src->isLeaf()) {<br>
+ Init *SrcInit = Src->getLeafValue();<br>
+ if (IntInit *SrcIntInit = dyn_cast<IntInit>(SrcInit)) {<br>
+ InsnMatcher.addPredicate<Instr<wbr>uctionOpcodeMatcher>(<br>
+ &Target.getInstruction(RK.getD<wbr>ef("G_CONSTANT")));<br>
+ } else<br>
+ return failedImport("Unable to deduce gMIR opcode to handle Src (which is a leaf)");<br>
+ } else {<br>
+ auto SrcGIOrNull = findNodeEquiv(Src->getOperator<wbr>());<br>
+ if (!SrcGIOrNull)<br>
+ return failedImport("Pattern operator lacks an equivalent Instruction" +<br>
+ explainOperator(Src->getOperat<wbr>or()));<br>
+ auto &SrcGI = *SrcGIOrNull;<br>
<br>
- // The operators look good: match the opcode and mutate it to the new one.<br>
- InsnMatcher.addPredicate<Instr<wbr>uctionOpcodeMatcher>(&SrcGI);<br>
+ // The operators look good: match the opcode<br>
+ InsnMatcher.addPredicate<Instr<wbr>uctionOpcodeMatcher>(&SrcGI);<br>
+ }<br>
<br>
unsigned OpIdx = 0;<br>
unsigned TempOpIdx = 0;<br>
@@ -1323,18 +1358,27 @@ Expected<InstructionMatcher &> GlobalISe<br>
OM.addPredicate<LLTOperandMat<wbr>cher>(*OpTyOrNone);<br>
}<br>
<br>
- // Match the used operands (i.e. the children of the operator).<br>
- for (unsigned i = 0, e = Src->getNumChildren(); i != e; ++i) {<br>
- if (auto Error = importChildMatcher(InsnMatcher<wbr>, Src->getChild(i), OpIdx++,<br>
- TempOpIdx))<br>
- return std::move(Error);<br>
+ if (Src->isLeaf()) {<br>
+ Init *SrcInit = Src->getLeafValue();<br>
+ if (IntInit *SrcIntInit = dyn_cast<IntInit>(SrcInit)) {<br>
+ OperandMatcher &OM = InsnMatcher.addOperand(OpIdx++<wbr>, "", TempOpIdx);<br>
+ OM.addPredicate<LiteralIntOper<wbr>andMatcher>(SrcIntInit-><wbr>getValue());<br>
+ } else<br>
+ return failedImport("Unable to deduce gMIR opcode to handle Src (which is a leaf)");<br>
+ } else {<br>
+ // Match the used operands (i.e. the children of the operator).<br>
+ for (unsigned i = 0, e = Src->getNumChildren(); i != e; ++i) {<br>
+ if (auto Error = importChildMatcher(InsnMatcher<wbr>, Src->getChild(i),<br>
+ OpIdx++, TempOpIdx))<br>
+ return std::move(Error);<br>
+ }<br>
}<br>
<br>
return InsnMatcher;<br>
}<br>
<br>
Error GlobalISelEmitter::importChild<wbr>Matcher(InstructionMatcher &InsnMatcher,<br>
- TreePatternNode *SrcChild,<br>
+ const TreePatternNode *SrcChild,<br>
unsigned OpIdx,<br>
unsigned &TempOpIdx) const {<br>
OperandMatcher &OM =<br>
@@ -1379,7 +1423,7 @@ Error GlobalISelEmitter::importChild<wbr>Matc<br>
<br>
// Check for constant immediates.<br>
if (auto *ChildInt = dyn_cast<IntInit>(SrcChild->ge<wbr>tLeafValue())) {<br>
- OM.addPredicate<IntOperandMatc<wbr>her>(ChildInt->getValue());<br>
+ OM.addPredicate<ConstantIntOpe<wbr>randMatcher>(ChildInt-><wbr>getValue());<br>
return Error::success();<br>
}<br>
<br>
@@ -1605,6 +1649,9 @@ Expected<RuleMatcher> GlobalISelEmitter:<br>
return failedImport("Src pattern root isn't a trivial operator (" +<br>
toString(std::move(Err)) + ")");<br>
<br>
+ if (Dst->isLeaf())<br>
+ return failedImport("Dst pattern root isn't a known leaf");<br>
+<br>
// Start with the defined operands (i.e., the results of the root operator).<br>
Record *DstOp = Dst->getOperator();<br>
if (!DstOp->isSubClassOf("Instruc<wbr>tion"))<br>
<br>
<br>
______________________________<wbr>_________________<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/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>
</div></blockquote></div><br></div></div>______________________________<wbr>_________________<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" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br></div></blockquote></div><br></div></div></div></div></blockquote></div><br></div></div></div></blockquote></div><br></div>