211 lines
6.5 KiB
Text
211 lines
6.5 KiB
Text
|
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 2
|
||
|
# RUN: llc -mtriple=x86_64 -verify-machineinstrs --run-pass=machine-cse -o - %s | FileCheck %s
|
||
|
--- |
|
||
|
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||
|
|
||
|
define float @max(float noundef %a, float noundef %b) #0 {
|
||
|
entry:
|
||
|
%U = fcmp uno float %a, %b
|
||
|
br i1 %U, label %UL, label %NU
|
||
|
|
||
|
NU: ; preds = %entry
|
||
|
%GT = fcmp ogt float %a, %b
|
||
|
br i1 %GT, label %EXIT, label %NGT
|
||
|
|
||
|
NGT: ; preds = %NU
|
||
|
%LT = fcmp one float %a, %b
|
||
|
br i1 %LT, label %EXIT, label %EQ
|
||
|
|
||
|
EQ: ; preds = %NGT
|
||
|
%bc = bitcast float %a to i32
|
||
|
%cmp = icmp slt i32 %bc, 0
|
||
|
%eq = select i1 %cmp, float %a, float %b
|
||
|
br label %EXIT
|
||
|
|
||
|
UL: ; preds = %entry
|
||
|
%AU = fcmp uno float %a, %a
|
||
|
br i1 %AU, label %EXIT, label %ULB
|
||
|
|
||
|
ULB: ; preds = %UL
|
||
|
br label %EXIT
|
||
|
|
||
|
EXIT: ; preds = %ULB, %UL, %EQ, %NGT, %NU
|
||
|
%res = phi float [ %a, %NU ], [ %b, %NGT ], [ %a, %UL ], [ %eq, %EQ ], [ %b, %ULB ]
|
||
|
ret float %res
|
||
|
}
|
||
|
|
||
|
attributes #0 = { "target-cpu"="skylake" }
|
||
|
|
||
|
...
|
||
|
---
|
||
|
name: max
|
||
|
alignment: 16
|
||
|
exposesReturnsTwice: false
|
||
|
legalized: false
|
||
|
regBankSelected: false
|
||
|
selected: false
|
||
|
failedISel: false
|
||
|
tracksRegLiveness: true
|
||
|
hasWinCFI: false
|
||
|
callsEHReturn: false
|
||
|
callsUnwindInit: false
|
||
|
hasEHCatchret: false
|
||
|
hasEHScopes: false
|
||
|
hasEHFunclets: false
|
||
|
isOutlined: false
|
||
|
debugInstrRef: true
|
||
|
failsVerification: false
|
||
|
tracksDebugUserValues: false
|
||
|
registers:
|
||
|
- { id: 0, class: fr32, preferred-register: '' }
|
||
|
- { id: 1, class: fr32, preferred-register: '' }
|
||
|
- { id: 2, class: fr32, preferred-register: '' }
|
||
|
- { id: 3, class: fr32, preferred-register: '' }
|
||
|
- { id: 4, class: gr32, preferred-register: '' }
|
||
|
liveins:
|
||
|
- { reg: '$xmm0', virtual-reg: '%2' }
|
||
|
- { reg: '$xmm1', virtual-reg: '%3' }
|
||
|
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
|
||
|
localFrameSize: 0
|
||
|
savePoint: ''
|
||
|
restorePoint: ''
|
||
|
fixedStack: []
|
||
|
stack: []
|
||
|
callSites: []
|
||
|
debugValueSubstitutions: []
|
||
|
constants: []
|
||
|
machineFunctionInfo: {}
|
||
|
body: |
|
||
|
; CHECK-LABEL: name: max
|
||
|
; CHECK: bb.0.entry:
|
||
|
; CHECK-NEXT: successors: %bb.6(0x00000800), %bb.1(0x7ffff800)
|
||
|
; CHECK-NEXT: liveins: $xmm0, $xmm1
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: [[COPY:%[0-9]+]]:fr32 = COPY $xmm1
|
||
|
; CHECK-NEXT: [[COPY1:%[0-9]+]]:fr32 = COPY $xmm0
|
||
|
; CHECK-NEXT: nofpexcept VUCOMISSrr [[COPY1]], [[COPY]], implicit-def $eflags, implicit $mxcsr
|
||
|
; CHECK-NEXT: JCC_1 %bb.6, 10, implicit $eflags
|
||
|
; CHECK-NEXT: JMP_1 %bb.1
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: bb.1.NU:
|
||
|
; CHECK-NEXT: successors: %bb.8(0x40000000), %bb.2(0x40000000)
|
||
|
; CHECK-NEXT: liveins: $eflags
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: JCC_1 %bb.8, 7, implicit $eflags
|
||
|
; CHECK-NEXT: JMP_1 %bb.2
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: bb.2.NGT:
|
||
|
; CHECK-NEXT: successors: %bb.8(0x50000000), %bb.3(0x30000000)
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: nofpexcept VUCOMISSrr [[COPY1]], [[COPY]], implicit-def $eflags, implicit $mxcsr
|
||
|
; CHECK-NEXT: JCC_1 %bb.8, 5, implicit $eflags
|
||
|
; CHECK-NEXT: JMP_1 %bb.3
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: bb.3.EQ:
|
||
|
; CHECK-NEXT: successors: %bb.4(0x40000000), %bb.5(0x40000000)
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: [[VMOVSS2DIrr:%[0-9]+]]:gr32 = VMOVSS2DIrr [[COPY1]]
|
||
|
; CHECK-NEXT: TEST32rr [[VMOVSS2DIrr]], [[VMOVSS2DIrr]], implicit-def $eflags
|
||
|
; CHECK-NEXT: JCC_1 %bb.5, 8, implicit $eflags
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: bb.4.EQ:
|
||
|
; CHECK-NEXT: successors: %bb.5(0x80000000)
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: bb.5.EQ:
|
||
|
; CHECK-NEXT: successors: %bb.8(0x80000000)
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: [[PHI:%[0-9]+]]:fr32 = PHI [[COPY]], %bb.4, [[COPY1]], %bb.3
|
||
|
; CHECK-NEXT: JMP_1 %bb.8
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: bb.6.UL:
|
||
|
; CHECK-NEXT: successors: %bb.8(0x00000800), %bb.7(0x7ffff800)
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: nofpexcept VUCOMISSrr [[COPY1]], [[COPY1]], implicit-def $eflags, implicit $mxcsr
|
||
|
; CHECK-NEXT: JCC_1 %bb.8, 10, implicit $eflags
|
||
|
; CHECK-NEXT: JMP_1 %bb.7
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: bb.7.ULB:
|
||
|
; CHECK-NEXT: successors: %bb.8(0x80000000)
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: {{ $}}
|
||
|
; CHECK-NEXT: bb.8.EXIT:
|
||
|
; CHECK-NEXT: [[PHI1:%[0-9]+]]:fr32 = PHI [[COPY1]], %bb.1, [[COPY]], %bb.2, [[PHI]], %bb.5, [[COPY1]], %bb.6, [[COPY]], %bb.7
|
||
|
; CHECK-NEXT: $xmm0 = COPY [[PHI1]]
|
||
|
; CHECK-NEXT: RET 0, $xmm0
|
||
|
bb.0.entry:
|
||
|
successors: %bb.4(0x00000800), %bb.1(0x7ffff800)
|
||
|
liveins: $xmm0, $xmm1
|
||
|
|
||
|
%3:fr32 = COPY $xmm1
|
||
|
%2:fr32 = COPY $xmm0
|
||
|
nofpexcept VUCOMISSrr %2, %3, implicit-def $eflags, implicit $mxcsr
|
||
|
JCC_1 %bb.4, 10, implicit $eflags
|
||
|
JMP_1 %bb.1
|
||
|
|
||
|
bb.1.NU:
|
||
|
successors: %bb.6(0x40000000), %bb.2(0x40000000)
|
||
|
|
||
|
nofpexcept VUCOMISSrr %2, %3, implicit-def $eflags, implicit $mxcsr
|
||
|
JCC_1 %bb.6, 7, implicit $eflags
|
||
|
JMP_1 %bb.2
|
||
|
|
||
|
bb.2.NGT:
|
||
|
successors: %bb.6(0x50000000), %bb.3(0x30000000)
|
||
|
|
||
|
nofpexcept VUCOMISSrr %2, %3, implicit-def $eflags, implicit $mxcsr
|
||
|
JCC_1 %bb.6, 5, implicit $eflags
|
||
|
JMP_1 %bb.3
|
||
|
|
||
|
bb.3.EQ:
|
||
|
successors: %bb.7(0x40000000), %bb.8(0x40000000)
|
||
|
|
||
|
%4:gr32 = VMOVSS2DIrr %2
|
||
|
TEST32rr %4, %4, implicit-def $eflags
|
||
|
JCC_1 %bb.8, 8, implicit $eflags
|
||
|
|
||
|
bb.7.EQ:
|
||
|
successors: %bb.8(0x80000000)
|
||
|
|
||
|
|
||
|
bb.8.EQ:
|
||
|
successors: %bb.6(0x80000000)
|
||
|
|
||
|
%0:fr32 = PHI %3, %bb.7, %2, %bb.3
|
||
|
JMP_1 %bb.6
|
||
|
|
||
|
bb.4.UL:
|
||
|
successors: %bb.6(0x00000800), %bb.5(0x7ffff800)
|
||
|
|
||
|
nofpexcept VUCOMISSrr %2, %2, implicit-def $eflags, implicit $mxcsr
|
||
|
JCC_1 %bb.6, 10, implicit $eflags
|
||
|
JMP_1 %bb.5
|
||
|
|
||
|
bb.5.ULB:
|
||
|
successors: %bb.6(0x80000000)
|
||
|
|
||
|
|
||
|
bb.6.EXIT:
|
||
|
%1:fr32 = PHI %2, %bb.1, %3, %bb.2, %0, %bb.8, %2, %bb.4, %3, %bb.5
|
||
|
$xmm0 = COPY %1
|
||
|
RET 0, $xmm0
|
||
|
|
||
|
...
|