Fixes https://github.com/llvm/llvm-project/issues/170051 The previous implementation allows splitting the successor if it's the loop header, regardless of whether the terminator of `this` is analyzable.
183 lines
5.6 KiB
YAML
183 lines
5.6 KiB
YAML
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
|
|
# RUN: llc -o - %s -passes="require<machine-loops>,require<live-vars>,phi-node-elimination" | FileCheck %s
|
|
|
|
--- |
|
|
target datalayout = "e-p6:32:32-i64:64-i128:128-i256:256-v16:16-v32:32-n16:32:64"
|
|
target triple = "nvptx64-unknown-nvidiacl"
|
|
|
|
define void @func_26(i32 %BS_COND_16.0.BS_COND_16.0.BS_COND_16.0.BS_COND_16.0.) {
|
|
entry:
|
|
br label %for.cond
|
|
|
|
for.cond: ; preds = %BS_LABEL_1, %BS_LABEL_1, %entry
|
|
%p_2218_0.1 = phi i32 [ 0, %entry ], [ %p_2218_0.3, %BS_LABEL_1 ], [ %p_2218_0.3, %BS_LABEL_1 ]
|
|
br label %BS_LABEL_1
|
|
|
|
BS_LABEL_2: ; preds = %BS_LABEL_1
|
|
%sub = or i32 %p_2218_0.3, 1
|
|
br label %for.cond4
|
|
|
|
for.cond4: ; preds = %BS_LABEL_1, %BS_LABEL_2
|
|
%p_2218_0.2 = phi i32 [ %BS_COND_16.0.BS_COND_16.0.BS_COND_16.0.BS_COND_16.0., %BS_LABEL_1 ], [ %sub, %BS_LABEL_2 ]
|
|
br label %BS_LABEL_1
|
|
|
|
BS_LABEL_1: ; preds = %for.cond4, %for.cond
|
|
%p_2218_0.3 = phi i32 [ %p_2218_0.2, %for.cond4 ], [ %p_2218_0.1, %for.cond ]
|
|
switch i32 %BS_COND_16.0.BS_COND_16.0.BS_COND_16.0.BS_COND_16.0., label %unreachable [
|
|
i32 0, label %for.cond4
|
|
i32 4, label %BS_LABEL_2
|
|
i32 1, label %for.cond
|
|
i32 6, label %for.cond
|
|
]
|
|
|
|
unreachable: ; preds = %BS_LABEL_1
|
|
call void asm sideeffect "exit;", ""()
|
|
unreachable
|
|
}
|
|
...
|
|
---
|
|
name: func_26
|
|
alignment: 1
|
|
exposesReturnsTwice: false
|
|
legalized: false
|
|
regBankSelected: false
|
|
selected: false
|
|
failedISel: false
|
|
tracksRegLiveness: true
|
|
hasWinCFI: false
|
|
noPhis: false
|
|
isSSA: true
|
|
noVRegs: false
|
|
hasFakeUses: false
|
|
callsEHReturn: false
|
|
callsUnwindInit: false
|
|
hasEHContTarget: false
|
|
hasEHScopes: false
|
|
hasEHFunclets: false
|
|
isOutlined: false
|
|
debugInstrRef: false
|
|
failsVerification: false
|
|
tracksDebugUserValues: false
|
|
registers:
|
|
- { id: 0, class: b32, preferred-register: '', flags: [ ] }
|
|
- { id: 1, class: b32, preferred-register: '', flags: [ ] }
|
|
- { id: 2, class: b32, preferred-register: '', flags: [ ] }
|
|
- { id: 3, class: b32, preferred-register: '', flags: [ ] }
|
|
- { id: 4, class: b32, preferred-register: '', flags: [ ] }
|
|
- { id: 5, class: b32, preferred-register: '', flags: [ ] }
|
|
- { id: 6, class: b32, preferred-register: '', flags: [ ] }
|
|
- { id: 7, class: b1, preferred-register: '', flags: [ ] }
|
|
- { id: 8, class: b32, preferred-register: '', flags: [ ] }
|
|
- { id: 9, class: b1, preferred-register: '', flags: [ ] }
|
|
- { id: 10, class: b32, preferred-register: '', flags: [ ] }
|
|
- { id: 11, class: b1, preferred-register: '', flags: [ ] }
|
|
liveins: []
|
|
frameInfo:
|
|
isFrameAddressTaken: false
|
|
isReturnAddressTaken: false
|
|
hasStackMap: false
|
|
hasPatchPoint: false
|
|
stackSize: 0
|
|
offsetAdjustment: 0
|
|
maxAlignment: 1
|
|
adjustsStack: false
|
|
hasCalls: false
|
|
stackProtector: ''
|
|
functionContext: ''
|
|
maxCallFrameSize: 4294967295
|
|
cvBytesOfCalleeSavedRegisters: 0
|
|
hasOpaqueSPAdjustment: false
|
|
hasVAStart: false
|
|
hasMustTailInVarArgFunc: false
|
|
hasTailCall: false
|
|
isCalleeSavedInfoValid: false
|
|
localFrameSize: 0
|
|
fixedStack: []
|
|
stack: []
|
|
entry_values: []
|
|
callSites: []
|
|
debugValueSubstitutions: []
|
|
constants: []
|
|
machineFunctionInfo: {}
|
|
jumpTable:
|
|
kind: inline
|
|
entries:
|
|
- id: 0
|
|
blocks: [ '%bb.3', '%bb.1', '%bb.6', '%bb.6', '%bb.2', '%bb.6',
|
|
'%bb.1' ]
|
|
body: |
|
|
; CHECK-LABEL: name: func_26
|
|
; CHECK: bb.0:
|
|
; CHECK-NEXT: successors: %bb.1(0x80000000)
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: dead [[DEF:%[0-9]+]]:b32 = IMPLICIT_DEF
|
|
; CHECK-NEXT: dead [[DEF1:%[0-9]+]]:b1 = IMPLICIT_DEF
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: bb.1:
|
|
; CHECK-NEXT: successors: %bb.4(0x80000000)
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: dead [[DEF2:%[0-9]+]]:b32 = IMPLICIT_DEF
|
|
; CHECK-NEXT: GOTO %bb.4
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: bb.2:
|
|
; CHECK-NEXT: successors: %bb.3(0x80000000)
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: bb.3:
|
|
; CHECK-NEXT: successors: %bb.4(0x80000000)
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: bb.4:
|
|
; CHECK-NEXT: successors: %bb.6(0x00000000), %bb.5(0x80000000)
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: CBranch undef [[DEF1]], %bb.6
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: bb.5:
|
|
; CHECK-NEXT: successors: %bb.3(0x3e000000), %bb.1(0x04000000), %bb.6(0x00000000), %bb.2(0x3e000000)
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: BRX_START 0
|
|
; CHECK-NEXT: BRX_ITEM %bb.3
|
|
; CHECK-NEXT: BRX_ITEM %bb.1
|
|
; CHECK-NEXT: BRX_ITEM %bb.6
|
|
; CHECK-NEXT: BRX_ITEM %bb.6
|
|
; CHECK-NEXT: BRX_ITEM %bb.2
|
|
; CHECK-NEXT: BRX_ITEM %bb.6
|
|
; CHECK-NEXT: BRX_END %bb.1, undef [[DEF]], 0
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: bb.6:
|
|
bb.0:
|
|
successors: %bb.1(0x80000000)
|
|
|
|
%10:b32 = IMPLICIT_DEF
|
|
%11:b1 = IMPLICIT_DEF
|
|
|
|
bb.1:
|
|
successors: %bb.4(0x80000000)
|
|
|
|
%0:b32 = PHI undef %10, %bb.0, undef %0, %bb.5
|
|
GOTO %bb.4
|
|
|
|
bb.2:
|
|
successors: %bb.3(0x80000000)
|
|
|
|
bb.3:
|
|
successors: %bb.4(0x80000000)
|
|
|
|
bb.4:
|
|
successors: %bb.6(0x00000000), %bb.5(0x80000000)
|
|
|
|
CBranch undef %11, %bb.6
|
|
|
|
bb.5:
|
|
successors: %bb.3(0x3e000000), %bb.1(0x04000000), %bb.6(0x00000000), %bb.2(0x3e000000)
|
|
|
|
BRX_START 0
|
|
BRX_ITEM %bb.3
|
|
BRX_ITEM %bb.1
|
|
BRX_ITEM %bb.6
|
|
BRX_ITEM %bb.6
|
|
BRX_ITEM %bb.2
|
|
BRX_ITEM %bb.6
|
|
BRX_END %bb.1, undef %10, 0
|
|
|
|
bb.6:
|
|
...
|