
In review of bbde6b, I had originally proposed that we support the legacy text format. As review evolved, it bacame clear this had been a bad idea (too much complexity), but in order to let that patch finally move forward, I approved the change with the variant. This change undoes the variant, and updates all the tests to just use the array form.
179 lines
6.0 KiB
YAML
179 lines
6.0 KiB
YAML
# RUN: not --crash llc -run-pass=none -verify-machineinstrs %s -o /dev/null 2>&1 \
|
|
# RUN: | FileCheck %s
|
|
# REQUIRES: powerpc-registered-target
|
|
|
|
# Test for a case we observed after the initial implementation of D129997
|
|
# landed, in which case we observed a crash while building the ppc64le Linux
|
|
# kernel. In that case, we had one block with two exits, both to the same
|
|
# successor. Removing one of the exits corrupted the successor/predecessor
|
|
# lists.
|
|
|
|
# CHECK: *** Bad machine code: INLINEASM_BR indirect target missing from successor list ***
|
|
# CHECK-NEXT: - function: ceph_con_v2_try_read
|
|
# CHECK-NEXT: - basic block: %bb.3 if.else.i.i
|
|
# CHECK-NEXT: - instruction: INLINEASM_BR &"" [sideeffect] [attdialect], $0:[imm], %bb.5
|
|
# CHECK-NEXT: - operand 3: %bb.5
|
|
|
|
# CHECK: *** Bad machine code: INLINEASM_BR indirect target predecessor list missing parent ***
|
|
# CHECK-NEXT: - function: ceph_con_v2_try_read
|
|
# CHECK-NEXT: - basic block: %bb.3 if.else.i.i
|
|
# CHECK-NEXT: - instruction: INLINEASM_BR &"" [sideeffect] [attdialect], $0:[imm], %bb.5
|
|
# CHECK-NEXT: - operand 3: %bb.5
|
|
|
|
--- |
|
|
target datalayout = "e-m:e-i64:64-n32:64-S128-v256:256:256-v512:512:512"
|
|
target triple = "powerpc64le-unknown-linux-gnu"
|
|
|
|
; Function Attrs: argmemonly nocallback nofree nosync nounwind willreturn
|
|
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #0
|
|
|
|
define void @ceph_con_v2_try_read(i32 %__trans_tmp_3.sroa.0.0.copyload, i1 %tobool.not.i.i) {
|
|
entry:
|
|
%skip.i.i = alloca i32, i32 0, align 4
|
|
%cond = icmp eq i32 %__trans_tmp_3.sroa.0.0.copyload, 0
|
|
br label %for.cond
|
|
|
|
for.cond: ; preds = %for.cond, %process_message_header.exit.i, %if.end.i, %entry
|
|
br i1 %cond, label %sw.bb, label %for.cond
|
|
|
|
sw.bb: ; preds = %for.cond
|
|
%call.i.i2 = call i32 null(ptr %skip.i.i)
|
|
br i1 %tobool.not.i.i, label %if.else.i.i, label %process_message_header.exit.i
|
|
|
|
if.else.i.i: ; preds = %sw.bb
|
|
callbr void asm sideeffect "", "!i"()
|
|
to label %if.end.i [label %if.end.i]
|
|
|
|
process_message_header.exit.i: ; preds = %sw.bb
|
|
call void @llvm.lifetime.end.p0(i64 0, ptr %skip.i.i)
|
|
br label %for.cond
|
|
|
|
if.end.i: ; preds = %if.else.i.i, %if.else.i.i
|
|
call void @llvm.lifetime.end.p0(i64 0, ptr %skip.i.i)
|
|
br label %for.cond
|
|
}
|
|
|
|
attributes #0 = { argmemonly nocallback nofree nosync nounwind willreturn }
|
|
|
|
...
|
|
---
|
|
name: ceph_con_v2_try_read
|
|
alignment: 16
|
|
exposesReturnsTwice: false
|
|
legalized: false
|
|
regBankSelected: false
|
|
selected: false
|
|
failedISel: false
|
|
tracksRegLiveness: true
|
|
hasWinCFI: false
|
|
callsEHReturn: false
|
|
callsUnwindInit: false
|
|
hasEHContTarget: false
|
|
hasEHScopes: false
|
|
hasEHFunclets: false
|
|
failsVerification: false
|
|
tracksDebugUserValues: false
|
|
registers:
|
|
- { id: 0, class: crbitrc, preferred-register: '' }
|
|
- { id: 1, class: g8rc, preferred-register: '' }
|
|
- { id: 2, class: g8rc, preferred-register: '' }
|
|
- { id: 3, class: crbitrc, preferred-register: '' }
|
|
- { id: 4, class: gprc, preferred-register: '' }
|
|
- { id: 5, class: crrc, preferred-register: '' }
|
|
- { id: 6, class: g8rc, preferred-register: '' }
|
|
- { id: 7, class: g8rc, preferred-register: '' }
|
|
- { id: 8, class: g8rc, preferred-register: '' }
|
|
- { id: 9, class: g8rc, preferred-register: '' }
|
|
- { id: 10, class: g8rc, preferred-register: '' }
|
|
liveins:
|
|
- { reg: '$x3', virtual-reg: '%1' }
|
|
- { reg: '$x4', virtual-reg: '%2' }
|
|
frameInfo:
|
|
isFrameAddressTaken: false
|
|
isReturnAddressTaken: false
|
|
hasStackMap: false
|
|
hasPatchPoint: false
|
|
stackSize: 0
|
|
offsetAdjustment: 0
|
|
maxAlignment: 4
|
|
adjustsStack: false
|
|
hasCalls: true
|
|
stackProtector: ''
|
|
functionContext: ''
|
|
maxCallFrameSize: 4294967295
|
|
cvBytesOfCalleeSavedRegisters: 0
|
|
hasOpaqueSPAdjustment: false
|
|
hasVAStart: false
|
|
hasMustTailInVarArgFunc: false
|
|
hasTailCall: false
|
|
localFrameSize: 0
|
|
savePoint: []
|
|
restorePoint: []
|
|
fixedStack: []
|
|
stack:
|
|
- { id: 0, name: skip.i.i, type: default, offset: 0, size: 1, alignment: 4,
|
|
stack-id: default, callee-saved-register: '', callee-saved-restored: true,
|
|
debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
|
|
callSites: []
|
|
debugValueSubstitutions: []
|
|
constants: []
|
|
machineFunctionInfo: {}
|
|
body: |
|
|
bb.0.entry:
|
|
successors: %bb.1(0x80000000)
|
|
liveins: $x3, $x4
|
|
|
|
%2:g8rc = COPY $x4
|
|
%1:g8rc = COPY $x3
|
|
%10:g8rc = ANDI8_rec %2, 1, implicit-def $cr0
|
|
%3:crbitrc = COPY $cr0gt
|
|
%4:gprc = COPY %1.sub_32
|
|
%5:crrc = CMPWI killed %4, 0
|
|
%0:crbitrc = COPY %5.sub_eq
|
|
|
|
bb.1.for.cond:
|
|
successors: %bb.2(0x30000000), %bb.1(0x50000000)
|
|
|
|
BCn %0, %bb.1
|
|
B %bb.2
|
|
|
|
bb.2.sw.bb:
|
|
successors: %bb.3(0x40000000), %bb.4(0x40000000)
|
|
|
|
ADJCALLSTACKDOWN 32, 0, implicit-def dead $r1, implicit $r1
|
|
%6:g8rc = COPY $x2
|
|
STD %6, 24, $x1 :: (store (s64) into stack + 24)
|
|
%7:g8rc = ADDI8 %stack.0.skip.i.i, 0
|
|
%8:g8rc = LI8 0
|
|
$x3 = COPY %7
|
|
$x12 = COPY %8
|
|
MTCTR8 %8, implicit-def $ctr8
|
|
BCTRL8_LDinto_toc 24, $x1, csr_ppc64_altivec, implicit-def dead $lr8, implicit-def dead $x2, implicit $ctr8, implicit $rm, implicit $x3, implicit $x12, implicit $x2, implicit-def $r1, implicit-def $x3
|
|
ADJCALLSTACKUP 32, 0, implicit-def dead $r1, implicit $r1
|
|
%9:g8rc = COPY $x3
|
|
BCn %3, %bb.4
|
|
B %bb.3
|
|
|
|
; Oops, should have %bb.5 in the successor list!
|
|
bb.3.if.else.i.i:
|
|
successors: %bb.1(0x80000000)
|
|
|
|
INLINEASM_BR &"", 1 /* sideeffect attdialect */, 13 /* imm */, %bb.5
|
|
LIFETIME_END %stack.0.skip.i.i
|
|
B %bb.1
|
|
|
|
bb.4.process_message_header.exit.i:
|
|
successors: %bb.1(0x80000000)
|
|
|
|
LIFETIME_END %stack.0.skip.i.i
|
|
B %bb.1
|
|
|
|
; Oops, should have %bb.3 in the predecessor list!
|
|
bb.5.if.end.i (machine-block-address-taken, inlineasm-br-indirect-target):
|
|
successors: %bb.1(0x80000000)
|
|
|
|
LIFETIME_END %stack.0.skip.i.i
|
|
B %bb.1
|
|
|
|
...
|