[llvm] [FinalizelSel] Re-scan the MachineFunction if we insert a new MBB by custom insertion (PR #96046)
Jianjian Guan via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 21 23:17:12 PDT 2024
https://github.com/jacquesguan updated https://github.com/llvm/llvm-project/pull/96046
>From 14ea4e77f0048c03a2b51d8bfc1bc5bcae10c4cf Mon Sep 17 00:00:00 2001
From: Jianjian GUAN <jacquesguan at me.com>
Date: Wed, 19 Jun 2024 17:06:05 +0800
Subject: [PATCH] [FinalizelSel] Don't skip current MBB if we insert a new MBB
by custom insertion
Current logic may skip some MI and has wrong adjustsStack flag.
---
llvm/lib/CodeGen/FinalizeISel.cpp | 6 +--
llvm/test/CodeGen/RISCV/frame.ll | 84 +++++++++++++++++++++++++++++++
2 files changed, 86 insertions(+), 4 deletions(-)
diff --git a/llvm/lib/CodeGen/FinalizeISel.cpp b/llvm/lib/CodeGen/FinalizeISel.cpp
index 477512dc6b032..d6cd899d2d3b7 100644
--- a/llvm/lib/CodeGen/FinalizeISel.cpp
+++ b/llvm/lib/CodeGen/FinalizeISel.cpp
@@ -62,14 +62,12 @@ static std::pair<bool, bool> runImpl(MachineFunction &MF) {
// If MI is a pseudo, expand it.
if (MI.usesCustomInsertionHook()) {
Changed = true;
+ auto Prev = std::prev(MI.getIterator());
MachineBasicBlock *NewMBB = TLI->EmitInstrWithCustomInserter(MI, MBB);
// The expansion may involve new basic blocks.
if (NewMBB != MBB) {
PreserveCFG = false;
- MBB = NewMBB;
- I = NewMBB->getIterator();
- MBBI = NewMBB->begin();
- MBBE = NewMBB->end();
+ MBBI = std::next(Prev);
}
}
}
diff --git a/llvm/test/CodeGen/RISCV/frame.ll b/llvm/test/CodeGen/RISCV/frame.ll
index d50f1e55417a7..98deaa130ebf0 100644
--- a/llvm/test/CodeGen/RISCV/frame.ll
+++ b/llvm/test/CodeGen/RISCV/frame.ll
@@ -48,6 +48,90 @@ define i32 @test() nounwind {
ret i32 0
}
+define void @select_memset(i32 %arg.0, i64 %arg.1, ptr %arg.2) {
+; RV32I-FPELIM-LABEL: select_memset:
+; RV32I-FPELIM: # %bb.0: # %entry
+; RV32I-FPELIM-NEXT: addi sp, sp, -16
+; RV32I-FPELIM-NEXT: .cfi_def_cfa_offset 16
+; RV32I-FPELIM-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
+; RV32I-FPELIM-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
+; RV32I-FPELIM-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
+; RV32I-FPELIM-NEXT: .cfi_offset ra, -4
+; RV32I-FPELIM-NEXT: .cfi_offset s0, -8
+; RV32I-FPELIM-NEXT: .cfi_offset s1, -12
+; RV32I-FPELIM-NEXT: mv s0, a1
+; RV32I-FPELIM-NEXT: mv s1, a0
+; RV32I-FPELIM-NEXT: li a2, 13
+; RV32I-FPELIM-NEXT: mv a0, a3
+; RV32I-FPELIM-NEXT: li a1, 0
+; RV32I-FPELIM-NEXT: call memset
+; RV32I-FPELIM-NEXT: beqz s1, .LBB1_2
+; RV32I-FPELIM-NEXT: # %bb.1: # %entry
+; RV32I-FPELIM-NEXT: li s0, 1
+; RV32I-FPELIM-NEXT: li s1, 1
+; RV32I-FPELIM-NEXT: .LBB1_2: # %entry
+; RV32I-FPELIM-NEXT: beqz s1, .LBB1_4
+; RV32I-FPELIM-NEXT: # %bb.3: # %if.then
+; RV32I-FPELIM-NEXT: sb s0, 0(zero)
+; RV32I-FPELIM-NEXT: .LBB1_4: # %if.end
+; RV32I-FPELIM-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
+; RV32I-FPELIM-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
+; RV32I-FPELIM-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
+; RV32I-FPELIM-NEXT: addi sp, sp, 16
+; RV32I-FPELIM-NEXT: ret
+;
+; RV32I-WITHFP-LABEL: select_memset:
+; RV32I-WITHFP: # %bb.0: # %entry
+; RV32I-WITHFP-NEXT: addi sp, sp, -16
+; RV32I-WITHFP-NEXT: .cfi_def_cfa_offset 16
+; RV32I-WITHFP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
+; RV32I-WITHFP-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
+; RV32I-WITHFP-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
+; RV32I-WITHFP-NEXT: sw s2, 0(sp) # 4-byte Folded Spill
+; RV32I-WITHFP-NEXT: .cfi_offset ra, -4
+; RV32I-WITHFP-NEXT: .cfi_offset s0, -8
+; RV32I-WITHFP-NEXT: .cfi_offset s1, -12
+; RV32I-WITHFP-NEXT: .cfi_offset s2, -16
+; RV32I-WITHFP-NEXT: addi s0, sp, 16
+; RV32I-WITHFP-NEXT: .cfi_def_cfa s0, 0
+; RV32I-WITHFP-NEXT: mv s1, a1
+; RV32I-WITHFP-NEXT: mv s2, a0
+; RV32I-WITHFP-NEXT: li a2, 13
+; RV32I-WITHFP-NEXT: mv a0, a3
+; RV32I-WITHFP-NEXT: li a1, 0
+; RV32I-WITHFP-NEXT: call memset
+; RV32I-WITHFP-NEXT: beqz s2, .LBB1_2
+; RV32I-WITHFP-NEXT: # %bb.1: # %entry
+; RV32I-WITHFP-NEXT: li s1, 1
+; RV32I-WITHFP-NEXT: li s2, 1
+; RV32I-WITHFP-NEXT: .LBB1_2: # %entry
+; RV32I-WITHFP-NEXT: beqz s2, .LBB1_4
+; RV32I-WITHFP-NEXT: # %bb.3: # %if.then
+; RV32I-WITHFP-NEXT: sb s1, 0(zero)
+; RV32I-WITHFP-NEXT: .LBB1_4: # %if.end
+; RV32I-WITHFP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
+; RV32I-WITHFP-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
+; RV32I-WITHFP-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
+; RV32I-WITHFP-NEXT: lw s2, 0(sp) # 4-byte Folded Reload
+; RV32I-WITHFP-NEXT: addi sp, sp, 16
+; RV32I-WITHFP-NEXT: ret
+entry:
+ %icmp.0 = icmp eq i32 %arg.0, 0
+ %sele.0 = select i1 %icmp.0, i64 %arg.1, i64 1
+ %trun.0 = trunc i64 %sele.0 to i8
+ call void @llvm.memset.p0.i64(ptr %arg.2, i8 0, i64 13, i1 false)
+ %sele.1 = select i1 %icmp.0, i32 %arg.0, i32 1
+ %icmp.1 = icmp eq i32 %sele.1, 0
+ br i1 %icmp.1, label %if.end, label %if.then
+
+if.then:
+ store i8 %trun.0, ptr null, align 1
+ br label %if.end
+
+if.end:
+ ret void
+}
+
declare void @llvm.memset.p0.i64(ptr nocapture, i8, i64, i1)
declare void @test1(ptr)
More information about the llvm-commits
mailing list