187 lines
5.9 KiB
YAML
187 lines
5.9 KiB
YAML
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
|
|
# RUN: llc -mtriple=aarch64-apple-darwin -run-pass=regbankselect -verify-machineinstrs %s -o - | FileCheck %s
|
|
|
|
...
|
|
---
|
|
name: select_f32
|
|
alignment: 4
|
|
legalized: true
|
|
tracksRegLiveness: true
|
|
machineFunctionInfo: {}
|
|
body: |
|
|
bb.0:
|
|
liveins: $s0, $s1, $w0
|
|
|
|
; CHECK-LABEL: name: select_f32
|
|
; CHECK: liveins: $s0, $s1, $w0
|
|
; CHECK: [[COPY:%[0-9]+]]:gpr(s32) = COPY $w0
|
|
; CHECK: [[TRUNC:%[0-9]+]]:gpr(s1) = G_TRUNC [[COPY]](s32)
|
|
; CHECK: [[COPY1:%[0-9]+]]:fpr(s32) = COPY $s0
|
|
; CHECK: [[COPY2:%[0-9]+]]:fpr(s32) = COPY $s1
|
|
; CHECK: [[SELECT:%[0-9]+]]:fpr(s32) = G_SELECT [[TRUNC]](s1), [[COPY1]], [[COPY2]]
|
|
; CHECK: $s0 = COPY [[SELECT]](s32)
|
|
; CHECK: RET_ReallyLR implicit $s0
|
|
%3:_(s32) = COPY $w0
|
|
%0:_(s1) = G_TRUNC %3(s32)
|
|
%1:_(s32) = COPY $s0
|
|
%2:_(s32) = COPY $s1
|
|
%4:_(s32) = G_SELECT %0(s1), %1, %2
|
|
$s0 = COPY %4(s32)
|
|
RET_ReallyLR implicit $s0
|
|
|
|
...
|
|
---
|
|
name: select_f64
|
|
alignment: 4
|
|
legalized: true
|
|
tracksRegLiveness: true
|
|
machineFunctionInfo: {}
|
|
body: |
|
|
bb.0:
|
|
liveins: $d0, $d1, $w0
|
|
|
|
; CHECK-LABEL: name: select_f64
|
|
; CHECK: liveins: $d0, $d1, $w0
|
|
; CHECK: [[COPY:%[0-9]+]]:gpr(s32) = COPY $w0
|
|
; CHECK: [[TRUNC:%[0-9]+]]:gpr(s1) = G_TRUNC [[COPY]](s32)
|
|
; CHECK: [[COPY1:%[0-9]+]]:fpr(s64) = COPY $d0
|
|
; CHECK: [[COPY2:%[0-9]+]]:fpr(s64) = COPY $d1
|
|
; CHECK: [[SELECT:%[0-9]+]]:fpr(s64) = G_SELECT [[TRUNC]](s1), [[COPY1]], [[COPY2]]
|
|
; CHECK: $d0 = COPY [[SELECT]](s64)
|
|
; CHECK: RET_ReallyLR implicit $d0
|
|
%3:_(s32) = COPY $w0
|
|
%0:_(s1) = G_TRUNC %3(s32)
|
|
%1:_(s64) = COPY $d0
|
|
%2:_(s64) = COPY $d1
|
|
%4:_(s64) = G_SELECT %0(s1), %1, %2
|
|
$d0 = COPY %4(s64)
|
|
RET_ReallyLR implicit $d0
|
|
|
|
...
|
|
---
|
|
name: two_fpr_inputs_gpr_output
|
|
alignment: 4
|
|
legalized: true
|
|
tracksRegLiveness: true
|
|
machineFunctionInfo: {}
|
|
body: |
|
|
bb.0:
|
|
liveins: $d0, $d1, $w0
|
|
; CHECK-LABEL: name: two_fpr_inputs_gpr_output
|
|
; CHECK: liveins: $d0, $d1, $w0
|
|
; CHECK: [[COPY:%[0-9]+]]:gpr(s32) = COPY $w0
|
|
; CHECK: [[TRUNC:%[0-9]+]]:gpr(s1) = G_TRUNC [[COPY]](s32)
|
|
; CHECK: [[COPY1:%[0-9]+]]:fpr(s64) = COPY $d0
|
|
; CHECK: [[COPY2:%[0-9]+]]:fpr(s64) = COPY $d1
|
|
; CHECK: [[SELECT:%[0-9]+]]:fpr(s64) = G_SELECT [[TRUNC]](s1), [[COPY1]], [[COPY2]]
|
|
; CHECK: $x0 = COPY [[SELECT]](s64)
|
|
; CHECK: RET_ReallyLR implicit $x0
|
|
|
|
; Verify that the G_SELECT only has FPRs.
|
|
; The only difference between fcsel and csel are the register banks. So,
|
|
; if we have two FPR inputs and a GPR output, we should do a floating point
|
|
; select anyway. This will cost one copy for the output, but that's less
|
|
; than doing two to put the inputs on GPRs.
|
|
|
|
%3:_(s32) = COPY $w0
|
|
%0:_(s1) = G_TRUNC %3(s32)
|
|
%1:_(s64) = COPY $d0
|
|
%2:_(s64) = COPY $d1
|
|
%4:_(s64) = G_SELECT %0(s1), %1, %2
|
|
$x0 = COPY %4(s64)
|
|
RET_ReallyLR implicit $x0
|
|
|
|
...
|
|
---
|
|
name: one_fpr_input_fpr_output
|
|
alignment: 4
|
|
legalized: true
|
|
tracksRegLiveness: true
|
|
machineFunctionInfo: {}
|
|
body: |
|
|
bb.0:
|
|
liveins: $d0, $x1, $w0
|
|
; CHECK-LABEL: name: one_fpr_input_fpr_output
|
|
; CHECK: liveins: $d0, $x1, $w0
|
|
; CHECK: [[COPY:%[0-9]+]]:gpr(s32) = COPY $w0
|
|
; CHECK: [[TRUNC:%[0-9]+]]:gpr(s1) = G_TRUNC [[COPY]](s32)
|
|
; CHECK: [[COPY1:%[0-9]+]]:fpr(s64) = COPY $d0
|
|
; CHECK: [[COPY2:%[0-9]+]]:gpr(s64) = COPY $x1
|
|
; CHECK: [[COPY3:%[0-9]+]]:fpr(s64) = COPY [[COPY2]](s64)
|
|
; CHECK: [[SELECT:%[0-9]+]]:fpr(s64) = G_SELECT [[TRUNC]](s1), [[COPY1]], [[COPY3]]
|
|
; CHECK: $d0 = COPY [[SELECT]](s64)
|
|
; CHECK: RET_ReallyLR implicit $d0
|
|
|
|
; Same idea as the above test. If the output is an FPR, and one of the
|
|
; inputs is an FPR, then it's fewer copies to just do a FCSEL.
|
|
|
|
%3:_(s32) = COPY $w0
|
|
%0:_(s1) = G_TRUNC %3(s32)
|
|
%1:_(s64) = COPY $d0
|
|
%2:_(s64) = COPY $x1
|
|
%4:_(s64) = G_SELECT %0(s1), %1, %2
|
|
$d0 = COPY %4(s64)
|
|
RET_ReallyLR implicit $d0
|
|
|
|
...
|
|
---
|
|
name: one_fpr_input_gpr_output
|
|
alignment: 4
|
|
legalized: true
|
|
tracksRegLiveness: true
|
|
machineFunctionInfo: {}
|
|
body: |
|
|
bb.0:
|
|
liveins: $d0, $x1, $w0
|
|
; CHECK-LABEL: name: one_fpr_input_gpr_output
|
|
; CHECK: liveins: $d0, $x1, $w0
|
|
; CHECK: [[COPY:%[0-9]+]]:gpr(s32) = COPY $w0
|
|
; CHECK: [[TRUNC:%[0-9]+]]:gpr(s1) = G_TRUNC [[COPY]](s32)
|
|
; CHECK: [[COPY1:%[0-9]+]]:fpr(s64) = COPY $d0
|
|
; CHECK: [[COPY2:%[0-9]+]]:gpr(s64) = COPY $x1
|
|
; CHECK: [[COPY3:%[0-9]+]]:gpr(s64) = COPY [[COPY1]](s64)
|
|
; CHECK: [[SELECT:%[0-9]+]]:gpr(s64) = G_SELECT [[TRUNC]](s1), [[COPY3]], [[COPY2]]
|
|
; CHECK: $x0 = COPY [[SELECT]](s64)
|
|
; CHECK: RET_ReallyLR implicit $x0
|
|
|
|
; Now we have more GPR registers on the G_SELECT. It's cheaper here to put
|
|
; everything on GPR.
|
|
|
|
%3:_(s32) = COPY $w0
|
|
%0:_(s1) = G_TRUNC %3(s32)
|
|
%1:_(s64) = COPY $d0
|
|
%2:_(s64) = COPY $x1
|
|
%4:_(s64) = G_SELECT %0(s1), %1, %2
|
|
$x0 = COPY %4(s64)
|
|
RET_ReallyLR implicit $x0
|
|
|
|
...
|
|
---
|
|
name: two_gpr_input_fpr_output
|
|
alignment: 4
|
|
legalized: true
|
|
tracksRegLiveness: true
|
|
machineFunctionInfo: {}
|
|
body: |
|
|
bb.0:
|
|
liveins: $x0, $x1, $w0
|
|
; CHECK-LABEL: name: two_gpr_input_fpr_output
|
|
; CHECK: liveins: $x0, $x1, $w0
|
|
; CHECK: [[COPY:%[0-9]+]]:gpr(s32) = COPY $w0
|
|
; CHECK: [[TRUNC:%[0-9]+]]:gpr(s1) = G_TRUNC [[COPY]](s32)
|
|
; CHECK: [[COPY1:%[0-9]+]]:gpr(s64) = COPY $x0
|
|
; CHECK: [[COPY2:%[0-9]+]]:gpr(s64) = COPY $x1
|
|
; CHECK: [[SELECT:%[0-9]+]]:gpr(s64) = G_SELECT [[TRUNC]](s1), [[COPY1]], [[COPY2]]
|
|
; CHECK: $d0 = COPY [[SELECT]](s64)
|
|
; CHECK: RET_ReallyLR implicit $d0
|
|
|
|
; Same as above. The G_SELECT should get all GPRS.
|
|
|
|
%3:_(s32) = COPY $w0
|
|
%0:_(s1) = G_TRUNC %3(s32)
|
|
%1:_(s64) = COPY $x0
|
|
%2:_(s64) = COPY $x1
|
|
%4:_(s64) = G_SELECT %0(s1), %1, %2
|
|
$d0 = COPY %4(s64)
|
|
RET_ReallyLR implicit $d0
|