From 6973125cb746e185fc5e7823ec6422fc0670e15d Mon Sep 17 00:00:00 2001 From: Amanieu d'Antras Date: Sat, 13 Jun 2020 08:16:58 +0100 Subject: [PATCH] Fix FastISel dropping srcloc metadata from InlineAsm Summary: Bugzilla: https://bugs.llvm.org/show_bug.cgi?id=46060 I've also added the Extra_IsConvergent flag which was missing from FastISel. Reviewers: echristo Reviewed By: echristo Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D80759 --- llvm/lib/CodeGen/SelectionDAG/FastISel.cpp | 15 +++++++++++---- llvm/test/CodeGen/AArch64/asm-srcloc.ll | 21 +++++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 llvm/test/CodeGen/AArch64/asm-srcloc.ll diff --git a/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp b/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp index d1f2f4f..fc6c3a1 100644 --- a/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/FastISel.cpp @@ -1324,12 +1324,19 @@ bool FastISel::selectCall(const User *I) { ExtraInfo |= InlineAsm::Extra_HasSideEffects; if (IA->isAlignStack()) ExtraInfo |= InlineAsm::Extra_IsAlignStack; + if (Call->isConvergent()) + ExtraInfo |= InlineAsm::Extra_IsConvergent; ExtraInfo |= IA->getDialect() * InlineAsm::Extra_AsmDialect; - BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, - TII.get(TargetOpcode::INLINEASM)) - .addExternalSymbol(IA->getAsmString().c_str()) - .addImm(ExtraInfo); + MachineInstrBuilder MIB = BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DbgLoc, + TII.get(TargetOpcode::INLINEASM)); + MIB.addExternalSymbol(IA->getAsmString().c_str()); + MIB.addImm(ExtraInfo); + + const MDNode *SrcLoc = Call->getMetadata("srcloc"); + if (SrcLoc) + MIB.addMetadata(SrcLoc); + return true; } diff --git a/llvm/test/CodeGen/AArch64/asm-srcloc.ll b/llvm/test/CodeGen/AArch64/asm-srcloc.ll new file mode 100644 index 0000000..8c7b3dc --- /dev/null +++ b/llvm/test/CodeGen/AArch64/asm-srcloc.ll @@ -0,0 +1,21 @@ +; RUN: llc -O0 -stop-after=finalize-isel -o - %s | FileCheck %s + +target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" +target triple = "aarch64" + +; CHECK-LABEL: name: foo +; CHECK: INLINEASM {{.*}}, !0 +define void @foo() { + call void asm sideeffect "nowayisthisavalidinstruction", "r"(i32 0), !srcloc !0 + ret void +} + +; CHECK-LABEL: name: bar +; CHECK: INLINEASM {{.*}}, !1 +define void @bar() { + call void asm sideeffect "nowayisthisavalidinstruction", ""(), !srcloc !1 + ret void +} + +!0 = !{i32 23} +!1 = !{i32 91} -- 2.7.4