From: wanglei Date: Thu, 17 Nov 2022 01:12:27 +0000 (+0800) Subject: [LoongArch] Transfer MI flags when expand PseudoCALL X-Git-Tag: upstream/17.0.6~27417 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7da2d69da6a8aa5f1d55284910efe27bf64106b2;p=platform%2Fupstream%2Fllvm.git [LoongArch] Transfer MI flags when expand PseudoCALL When expanding a PseudoCALL, the corresponding flags (e.g. nomerge) need to be passed to the new instruction. This patch also adds test for the nomerge attribute. The `nomerge` attribute was added during `LowerCall`, but was lost during expand PseudoCALL. Now add it back. Reviewed By: SixWeining Differential Revision: https://reviews.llvm.org/D137888 --- diff --git a/llvm/lib/Target/LoongArch/LoongArchExpandPseudoInsts.cpp b/llvm/lib/Target/LoongArch/LoongArchExpandPseudoInsts.cpp index 2aa2140b..d99b775 100644 --- a/llvm/lib/Target/LoongArch/LoongArchExpandPseudoInsts.cpp +++ b/llvm/lib/Target/LoongArch/LoongArchExpandPseudoInsts.cpp @@ -285,6 +285,9 @@ bool LoongArchPreRAExpandPseudo::expandFunctionCALL( // Transfer implicit operands. CALL.copyImplicitOps(MI); + // Transfer MI flags. + CALL.setMIFlags(MI.getFlags()); + MI.eraseFromParent(); return true; } diff --git a/llvm/test/CodeGen/LoongArch/nomerge.ll b/llvm/test/CodeGen/LoongArch/nomerge.ll new file mode 100644 index 0000000..6c69f0d --- /dev/null +++ b/llvm/test/CodeGen/LoongArch/nomerge.ll @@ -0,0 +1,35 @@ +; RUN: llc --mtriple=loongarch64 < %s | FileCheck %s + +define void @foo(i32 %i) { +entry: + switch i32 %i, label %if.end3 [ + i32 5, label %if.then + i32 7, label %if.then2 + ] + +if.then: + tail call void @bar() #0 + br label %if.end3 + +if.then2: + tail call void @bar() #0 + br label %if.end3 + +if.end3: + tail call void @bar() #0 + ret void +} + +declare void @bar() + +attributes #0 = { nomerge } + +; CHECK-LABEL: foo: +; CHECK: # %bb.0: # %entry +; CHECK: # %bb.1: # %entry +; CHECK: # %bb.2: # %if.then +; CHECK-NEXT: bl %plt(bar) +; CHECK: .LBB0_3: # %if.then2 +; CHECK-NEXT: bl %plt(bar) +; CHECK: .LBB0_4: # %if.end3 +; CHECK: bl %plt(bar)