[GlobalISel][InlineAsm] Add early return for memory inputs that need to be indirectified
authorKonstantin Schwarz <konstantin.schwarz@hightec-rt.com>
Thu, 14 May 2020 19:02:37 +0000 (21:02 +0200)
committerKonstantin Schwarz <konstantin.schwarz@hightec-rt.com>
Thu, 14 May 2020 21:42:31 +0000 (23:42 +0200)
Summary:
D78319 introduced basic support for inline asm input operands in GlobalISel.
However, that patch did not handle the case where a memory input operand still needs to
be indirectified. Later code asserts that the memory operand is already indirect.

This patch adds an early return false to trigger the SelectionDAG fallback for now.

Reviewers: arsenm, paquette

Reviewed By: arsenm

Subscribers: wdng, rovka, hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D79955

llvm/lib/CodeGen/GlobalISel/InlineAsmLowering.cpp
llvm/test/CodeGen/AArch64/GlobalISel/arm64-fallback.ll

index e9ceaee..36d0aa3 100644 (file)
@@ -306,6 +306,12 @@ bool InlineAsmLowering::lowerInlineAsm(
     // Compute the constraint code and ConstraintType to use.
     computeConstraintToUse(TLI, OpInfo);
 
+    if (OpInfo.ConstraintType == TargetLowering::C_Memory &&
+        !OpInfo.isIndirect) {
+      LLVM_DEBUG(dbgs() << "Cannot indirectify memory input operands yet\n");
+      return false;
+    }
+
     // The selected constraint type might expose new sideeffects
     ExtraInfo.update(OpInfo);
   }
index 7e701db..17e3a5a 100644 (file)
@@ -210,3 +210,12 @@ define i64 @strict_align_feature(i64* %p) #0 {
 }
 
 attributes #0 = { "target-features"="+strict-align" }
+
+; FALLBACK-WITH-REPORT-ERR: remark: <unknown>:0:0: unable to translate instruction: call
+; FALLBACK-WITH-REPORT-ERR: warning: Instruction selection used fallback path for direct_mem
+; FALLBACK-WITH-REPORT-OUT-LABEL: direct_mem
+define void @direct_mem(i32 %x, i32 %y) {
+entry:
+  tail call void asm sideeffect "", "imr,imr,~{memory}"(i32 %x, i32 %y)
+  ret void
+}