[PATCH] D83384: [GlobalISel][InlineAsm] Fix buildCopy for matching input constraints
Petar Avramovic via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 8 04:40:19 PDT 2020
Petar.Avramovic created this revision.
Petar.Avramovic added reviewers: paquette, arsenm.
Herald added subscribers: llvm-commits, hiraditya, rovka, wdng.
Herald added a project: LLVM.
Check that input size matches size of destination reg class.
Attempt to extend input size when needed.
https://reviews.llvm.org/D83384
Files:
llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp
llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-inline-asm.ll
Index: llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-inline-asm.ll
===================================================================
--- llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-inline-asm.ll
+++ llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-inline-asm.ll
@@ -211,3 +211,16 @@
%1 = tail call i32 asm "ldr $0, $1", "=r,*m"(i32* %a)
ret i32 %1
}
+
+define void @test_anyext_input_matching_constraint() {
+ ; CHECK-LABEL: name: test_anyext_input_matching_constraint
+ ; CHECK: bb.1 (%ir-block.0):
+ ; CHECK: [[DEF:%[0-9]+]]:_(s16) = G_IMPLICIT_DEF
+ ; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[DEF]](s16)
+ ; CHECK: [[COPY:%[0-9]+]]:gpr32common = COPY [[ANYEXT]](s32)
+ ; CHECK: INLINEASM &"", 1 /* sideeffect attdialect */, 655370 /* regdef:GPR32common */, def %0, 2147483657 /* reguse tiedto:$0 */, [[COPY]](tied-def 3)
+ ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY %0
+ ; CHECK: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY1]](s32)
+ %1 = call i16 asm sideeffect "", "=r,0"(i16 undef)
+ unreachable
+}
Index: llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp
===================================================================
--- llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp
+++ llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp
@@ -427,7 +427,23 @@
ArrayRef<Register> SrcRegs = GetOrCreateVRegs(*OpInfo.CallOperandVal);
assert(SrcRegs.size() == 1 && "Single register is expected here");
Register Tmp = MRI->createVirtualRegister(RC);
- MIRBuilder.buildCopy(Tmp, SrcRegs[0]);
+ Register Src = SrcRegs[0];
+ unsigned SrcSize = TRI->getRegSizeInBits(Src, *MRI);
+ unsigned TmpSize = TRI->getRegSizeInBits(Tmp, *MRI);
+ if (TmpSize < SrcSize) {
+ LLVM_DEBUG(dbgs() << "Input can't fit in destination reg class\n");
+ return false;
+ }
+ // Attempt to anyext small scalar sources.
+ if (TmpSize > SrcSize) {
+ if (!MRI->getType(Src).isValid() || !MRI->getType(Src).isScalar()) {
+ LLVM_DEBUG(dbgs() << "Can't extend input to size of destination"
+ " reg class\n");
+ return false;
+ }
+ Src = MIRBuilder.buildAnyExt(LLT::scalar(TmpSize), Src).getReg(0);
+ }
+ MIRBuilder.buildCopy(Tmp, Src);
// Add Flag and input register operand (Tmp) to Inst. Tie Tmp to Def.
unsigned UseFlag = InlineAsm::getFlagWord(InlineAsm::Kind_RegUse, 1);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D83384.276374.patch
Type: text/x-patch
Size: 2496 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200708/e4897d32/attachment.bin>
More information about the llvm-commits
mailing list