[llvm-branch-commits] [llvm] b067f5e - [GlobalISel][InlineAsm] Fix matching input constraint to physreg
Hans Wennborg via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Aug 7 10:51:43 PDT 2020
Author: Petar Avramovic
Date: 2020-08-07T19:48:51+02:00
New Revision: b067f5eb56684476b5dad4ebd8d6bc5291603d4e
URL: https://github.com/llvm/llvm-project/commit/b067f5eb56684476b5dad4ebd8d6bc5291603d4e
DIFF: https://github.com/llvm/llvm-project/commit/b067f5eb56684476b5dad4ebd8d6bc5291603d4e.diff
LOG: [GlobalISel][InlineAsm] Fix matching input constraint to physreg
Add given input and mark it as tied.
Doesn't create additional copy compared to
matching input constraint to virtual register.
Differential Revision: https://reviews.llvm.org/D85122
(cherry picked from commit d893278bba01b0e1209e8b8accbdd5cfa75a0932)
Added:
Modified:
llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp
llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-inline-asm.ll
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp b/llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp
index 2ce1d414e755..1e2a82615da8 100644
--- a/llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp
@@ -455,19 +455,23 @@ bool InlineAsmLowering::lowerInlineAsm(
unsigned DefRegIdx = InstFlagIdx + 1;
Register Def = Inst->getOperand(DefRegIdx).getReg();
- // Copy input to new vreg with same reg class as Def
- const TargetRegisterClass *RC = MRI->getRegClass(Def);
ArrayRef<Register> SrcRegs = GetOrCreateVRegs(*OpInfo.CallOperandVal);
assert(SrcRegs.size() == 1 && "Single register is expected here");
- Register Tmp = MRI->createVirtualRegister(RC);
- if (!buildAnyextOrCopy(Tmp, SrcRegs[0], MIRBuilder))
- return false;
- // Add Flag and input register operand (Tmp) to Inst. Tie Tmp to Def.
+ // When Def is physreg: use given input.
+ Register In = SrcRegs[0];
+ // When Def is vreg: copy input to new vreg with same reg class as Def.
+ if (Def.isVirtual()) {
+ In = MRI->createVirtualRegister(MRI->getRegClass(Def));
+ if (!buildAnyextOrCopy(In, SrcRegs[0], MIRBuilder))
+ return false;
+ }
+
+ // Add Flag and input register operand (In) to Inst. Tie In to Def.
unsigned UseFlag = InlineAsm::getFlagWord(InlineAsm::Kind_RegUse, 1);
unsigned Flag = InlineAsm::getFlagWordForMatchingOp(UseFlag, DefIdx);
Inst.addImm(Flag);
- Inst.addReg(Tmp);
+ Inst.addReg(In);
Inst->tieOperands(DefRegIdx, Inst->getNumOperands() - 1);
break;
}
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-inline-asm.ll b/llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-inline-asm.ll
index f8b23ef84721..bfe96827dfe3 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-inline-asm.ll
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-inline-asm.ll
@@ -243,3 +243,15 @@ define i16 @test_anyext_input_with_matching_constraint() {
%1 = call i16 asm sideeffect "", "=r,0"(i16 1)
ret i16 %1
}
+
+define i64 @test_input_with_matching_constraint_to_physical_register() {
+ ; CHECK-LABEL: name: test_input_with_matching_constraint_to_physical_register
+ ; CHECK: bb.1 (%ir-block.0):
+ ; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
+ ; CHECK: INLINEASM &"", 0 /* attdialect */, 10 /* regdef */, implicit-def $x2, 2147483657 /* reguse tiedto:$0 */, [[C]](tied-def 3)(s64)
+ ; CHECK: [[COPY:%[0-9]+]]:_(s64) = COPY $x2
+ ; CHECK: $x0 = COPY [[COPY]](s64)
+ ; CHECK: RET_ReallyLR implicit $x0
+ %1 = tail call i64 asm "", "={x2},0"(i64 0)
+ ret i64 %1
+}
More information about the llvm-branch-commits
mailing list