[libcxx-commits] [clang-tools-extra] [llvm] [lldb] [clang] [openmp] [mlir] [libcxx] [SEH] Fix register liveness verification for EHa (PR #76933)
via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Jan 4 22:04:35 PST 2024
================
@@ -0,0 +1,65 @@
+; RUN: llc --verify-machineinstrs < %s
+source_filename = "test.cpp"
+target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-pc-windows-msvc19.12.0"
+
+$"?test at Test@@Plugin@@Host@@@Z" = comdat any
+
+declare i32 @__CxxFrameHandler3(...)
+
+; Function Attrs: nounwind memory(none)
+declare void @llvm.seh.scope.begin() #1
+
+; Function Attrs: nobuiltin allocsize(0)
+declare ptr @"??2 at Test@Z"(i64) #1
+
+; Function Attrs: nounwind memory(none)
+declare void @llvm.seh.scope.end() #0
+
+; Function Attrs: nobuiltin nounwind
+declare void @"??3 at YAXPEAX@Z"(ptr) #2
+
+; Function Attrs: mustprogress uwtable
+define ptr @"?test at Test@@Plugin@@Host@@@Z"(ptr %this, ptr %host) #3 comdat align 2 personality ptr @__CxxFrameHandler3 {
+entry:
+ %host.addr = alloca ptr, align 8
+ %this.addr = alloca ptr, align 8
+ store ptr %host, ptr %host.addr, align 8
+ store ptr %this, ptr %this.addr, align 8
+ %this1 = load ptr, ptr %this.addr, align 8
+ %call = call noalias ptr @"??2 at Test@Z"(i64 152) #5
----------------
HaohaiWen wrote:
```
// Check that VNI is live-out of all predecessors.
for (const MachineBasicBlock *Pred : MFI->predecessors()) {
SlotIndex PEnd = LiveInts->getMBBEndIdx(Pred);
// Predecessor of landing pad live-out on last call for sync EH.
if (MFI->isEHPad()) {
assert(!IsEHa && "EHa may raise exception on non call");
for (const MachineInstr &MI : llvm::reverse(*Pred)) {
if (MI.isCall()) {
PEnd = Indexes->getInstructionIndex(MI).getBoundaryIndex();
break;
}
}
}
const VNInfo *PVNI = LR.getVNInfoBefore(PEnd);
```
Verifier think exception raised only by call so it trims live range until call. From bellowing log we can see %1 was defined after call but before scope.begin. It's valid.
```
# After Register Coalescer
********** INTERVALS **********
CH [0B,32r:0)[112r,128r:3)[304r,336r:2)[544r,560r:1) 0 at 0B-phi 1 at 544r 2 at 304r 3 at 112r
CL [0B,32r:0)[112r,128r:3)[304r,336r:2)[544r,560r:1) 0 at 0B-phi 1 at 544r 2 at 304r 3 at 112r
DH [0B,16r:0)[320r,336r:1) 0 at 0B-phi 1 at 320r
DL [0B,16r:0)[320r,336r:1) 0 at 0B-phi 1 at 320r
HCX [0B,32r:0)[112r,128r:3)[304r,336r:2)[544r,560r:1) 0 at 0B-phi 1 at 544r 2 at 304r 3 at 112r
HDX [0B,16r:0)[320r,336r:1) 0 at 0B-phi 1 at 320r
%0 [32r,320r:0) 0 at 32r weight:0.000000e+00
%1 [160r,464r:0)[496B,544r:0) 0 at 160r weight:0.000000e+00
%3 [16r,64r:0) 0 at 16r weight:0.000000e+00
RegMasks: 128r 336r 496B 560r
********** MACHINEINSTRS **********
# Machine code for function ?test at Test@@Plugin@@Host@@@Z: NoPHIs, TracksLiveness, TiedOpsRewritten
Frame Objects:
fi#0: size=8, align=8, at location [SP+8]
fi#1: size=8, align=8, at location [SP+8]
Function Live Ins: $rcx in %2, $rdx in %3
0B bb.0.entry:
successors: %bb.1(0x7ffff800), %bb.4(0x00000800); %bb.1(100.00%), %bb.4(0.00%)
liveins: $rcx, $rdx
16B %3:gr64 = COPY $rdx
32B %0:gr64 = COPY $rcx
48B EH_LABEL <mcsymbol .Ltmp2>
64B MOV64mr %stack.0.host.addr, 1, $noreg, 0, $noreg, %3:gr64 :: (store (s64) into %ir.host.addr)
80B MOV64mr %stack.1.this.addr, 1, $noreg, 0, $noreg, %0:gr64 :: (store (s64) into %ir.this.addr)
96B ADJCALLSTACKDOWN64 32, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
112B $rcx = MOV32ri64 152
128B CALL64pcrel32 @"??2 at Test@Z", <regmask $bh $bl $bp $bph $bpl $bx $di $dih $dil $ebp $ebx $edi $esi $hbp $hbx $hdi $hsi $rbp $rbx $rdi $rsi $si $sih $sil $r12 $r13 $r14 $r15 $xmm6 $xmm7 $xmm8 $xmm9 $xmm10 and 25 more...>, implicit $rsp, implicit $ssp, implicit $rcx, implicit-def $rsp, implicit-def $ssp, implicit-def $rax
144B ADJCALLSTACKUP64 32, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
160B %1:gr64 = COPY killed $rax
192B EH_LABEL <mcsymbol .Ltmp3>
208B JMP_1 %bb.1
224B bb.1.invoke.cont:
; predecessors: %bb.0
successors: %bb.2(0x7ffff800), %bb.4(0x00000800); %bb.2(100.00%), %bb.4(0.00%)
240B EH_LABEL <mcsymbol .Ltmp4>
256B EH_LABEL <mcsymbol .Ltmp0>
288B ADJCALLSTACKDOWN64 32, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
304B $rcx = COPY %1:gr64
320B $rdx = COPY %0:gr64
336B CALL64pcrel32 @"??Test@?A0x2749C4FD@@QEAA at Test@Test@@@Z", <regmask $bh $bl $bp $bph $bpl $bx $di $dih $dil $ebp $ebx $edi $esi $hbp $hbx $hdi $hsi $rbp $rbx $rdi $rsi $si $sih $sil $r12 $r13 $r14 $r15 $xmm6 $xmm7 $xmm8 $xmm9 $xmm10 and 25 more...>, implicit $rsp, implicit $ssp, implicit $rcx, implicit $rdx, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax
352B ADJCALLSTACKUP64 32, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
368B EH_LABEL <mcsymbol .Ltmp1>
384B EH_LABEL <mcsymbol .Ltmp5>
400B JMP_1 %bb.2
416B bb.2.invoke.cont2:
; predecessors: %bb.1
successors: %bb.3(0x7ffff800), %bb.4(0x00000800); %bb.3(100.00%), %bb.4(0.00%)
432B JMP_1 %bb.3
448B bb.3.invoke.cont4:
; predecessors: %bb.2
464B $rax = COPY %1:gr64
480B RET 0, killed $rax
496B bb.4.ehcleanup (machine-block-address-taken, landing-pad, ehfunclet-entry):
; predecessors: %bb.0, %bb.1, %bb.2
512B EH_LABEL <mcsymbol .Ltmp6>
528B ADJCALLSTACKDOWN64 32, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
544B $rcx = COPY %1:gr64
560B CALL64pcrel32 @"??3 at YAXPEAX@Z", <regmask $bh $bl $bp $bph $bpl $bx $di $dih $dil $ebp $ebx $edi $esi $hbp $hbx $hdi $hsi $rbp $rbx $rdi $rsi $si $sih $sil $r12 $r13 $r14 $r15 $xmm6 $xmm7 $xmm8 $xmm9 $xmm10 and 25 more...>, implicit $rsp, implicit $ssp, implicit $rcx, implicit-def $rsp, implicit-def $ssp
576B ADJCALLSTACKUP64 32, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
592B EH_LABEL <mcsymbol .Ltmp7>
608B CLEANUPRET
# End machine code for function ?test at Test@@Plugin@@Host@@@Z.
*** Bad machine code: Register not marked live out of predecessor ***
- function: ?test at Test@@Plugin@@Host@@@Z
- basic block: %bb.0 entry (0x363f3c8) [0B;224B)
- liverange: [160r,464r:0)[496B,544r:0) 0 at 160r
- v. register: %1
- ValNo: 0 (def 160r)
live into %bb.4 at 496B, not live before 128d
LLVM ERROR: Found 1 machine code errors.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: llc --verify-machineinstrs
1. Running pass 'Function Pass Manager' on module '<stdin>'.
2. Running pass 'Verify generated machine code' on function '@"?test at Test@@Plugin@@Host@@@Z"'
#0 0x0000000001b00f98 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /export/users2/haohaiwe/compilers/llvm-project/llvm/lib/Support/Unix/Signals.inc:727:3
#1 0x0000000001afea4c llvm::sys::RunSignalHandlers() /export/users2/haohaiwe/compilers/llvm-project/llvm/lib/Support/Signals.cpp:105:20
#2 0x0000000001afed86 SignalHandler(int) /export/users2/haohaiwe/compilers/llvm-project/llvm/lib/Support/Unix/Signals.inc:413:1
#3 0x00007fb166bf4db0 __restore_rt (/lib64/libc.so.6+0x59db0)
#4 0x00007fb166c4142c __pthread_kill_implementation (/lib64/libc.so.6+0xa642c)
#5 0x00007fb166bf4d06 gsignal (/lib64/libc.so.6+0x59d06)
#6 0x00007fb166bc77d3 abort (/lib64/libc.so.6+0x2c7d3)
#7 0x000000000064d9ce llvm::ConvertUTF8toUTF32Impl(unsigned char const**, unsigned char const*, unsigned int**, unsigned int*, llvm::ConversionFlags, unsigned char) (.cold) /export/users2/haohaiwe/compilers/llvm-project/llvm/lib/Support/ConvertUTF.cpp:691:9
#8 0x0000000000ff978b (/export/users2/haohaiwe/compilers/llvm-project/builds/bin/llc+0xff978b)
#9 0x0000000000ff97bb (anonymous namespace)::MachineVerifierPass::runOnMachineFunction(llvm::MachineFunction&) /export/users2/haohaiwe/compilers/llvm-project/llvm/lib/CodeGen/MachineVerifier.cpp:328:5
#10 0x0000000000ef20c7 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (.part.0) /export/users2/haohaiwe/compilers/llvm-project/llvm/lib/CodeGen/MachineFunctionPass.cpp:93:33
#11 0x000000000142ceae llvm::FPPassManager::runOnFunction(llvm::Function&) /export/users2/haohaiwe/compilers/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1453:7
#12 0x000000000142d0d1 llvm::ilist_node_base<true>::getNext() const /export/users2/haohaiwe/compilers/llvm-project/llvm/include/llvm/ADT/ilist_node_base.h:43:45
#13 0x000000000142d0d1 llvm::ilist_node_impl<llvm::ilist_detail::node_options<llvm::Function, true, false, void, false>>::getNext() /export/users2/haohaiwe/compilers/llvm-project/llvm/include/llvm/ADT/ilist_node.h:94:66
#14 0x000000000142d0d1 llvm::ilist_iterator<llvm::ilist_detail::node_options<llvm::Function, true, false, void, false>, false, false>::operator++() /export/users2/haohaiwe/compilers/llvm-project/llvm/include/llvm/ADT/ilist_iterator.h:157:25
#15 0x000000000142d0d1 llvm::FPPassManager::runOnModule(llvm::Module&) /export/users2/haohaiwe/compilers/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1488:22
#16 0x000000000142d91e runOnModule /export/users2/haohaiwe/compilers/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1565:7
#17 0x000000000142d91e llvm::legacy::PassManagerImpl::run(llvm::Module&) /export/users2/haohaiwe/compilers/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:541:55
#18 0x00000000006c946d compileModule(char**, llvm::LLVMContext&) /export/users2/haohaiwe/compilers/llvm-project/llvm/tools/llc/llc.cpp:751:34
#19 0x0000000000652206 main /export/users2/haohaiwe/compilers/llvm-project/llvm/tools/llc/llc.cpp:425:35
#20 0x00007fb166bdfe50 __libc_start_call_main (/lib64/libc.so.6+0x44e50)
#21 0x00007fb166bdfefc __libc_start_main at GLIBC_2.2.5 (/lib64/libc.so.6+0x44efc)
#22 0x00000000006c09a5 _start (/export/users2/haohaiwe/compilers/llvm-project/builds/bin/llc+0x6c09a5)
```
https://github.com/llvm/llvm-project/pull/76933
More information about the libcxx-commits
mailing list