The usual path for lowering immediates in AArch64 is to generate a MOVi32imm or MOVi64imm pseudo instruction, that can be moved / rematerialized around as required, being expanded into one or multiple instructions after register allocation. The code for the MachineCombiner was generating MOVN/ORR/MOVZ directly. This converts them to use the pseudos, allowing the generated immediates to be materialized if required. The code is hopefully simpler as a result, and the Sub and Add patterns have been combined to reduce duplication.
148 lines
5.0 KiB
YAML
148 lines
5.0 KiB
YAML
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
|
|
# RUN: llc -mtriple=aarch64-none-linux-gnu -run-pass machine-combiner -verify-machineinstrs -o - %s | FileCheck %s
|
|
|
|
---
|
|
name: madd_addwi
|
|
alignment: 4
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0.entry:
|
|
liveins: $w0, $w1
|
|
|
|
; CHECK-LABEL: name: madd_addwi
|
|
; CHECK: liveins: $w0, $w1
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32 = COPY $w0
|
|
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
|
|
; CHECK-NEXT: [[MOVi32imm:%[0-9]+]]:gpr32 = nsw MOVi32imm 79
|
|
; CHECK-NEXT: [[MADDWrrr:%[0-9]+]]:gpr32common = nsw MADDWrrr [[COPY1]], [[COPY]], [[MOVi32imm]]
|
|
; CHECK-NEXT: $w0 = COPY [[MADDWrrr]]
|
|
; CHECK-NEXT: RET_ReallyLR implicit $w0
|
|
%0:gpr32 = COPY $w0
|
|
%1:gpr32 = COPY $w1
|
|
%2:gpr32common = nsw MADDWrrr %1:gpr32, %0:gpr32, $wzr
|
|
%3:gpr32sp = nsw ADDWri killed %2:gpr32common, 79, 0
|
|
$w0 = COPY %3:gpr32sp
|
|
RET_ReallyLR implicit $w0
|
|
...
|
|
---
|
|
name: madd_addxi
|
|
alignment: 4
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0.entry:
|
|
liveins: $x0, $x1
|
|
|
|
; CHECK-LABEL: name: madd_addxi
|
|
; CHECK: liveins: $x0, $x1
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
|
|
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
|
|
; CHECK-NEXT: [[MOVi64imm:%[0-9]+]]:gpr64 = nsw MOVi64imm 79
|
|
; CHECK-NEXT: [[MADDXrrr:%[0-9]+]]:gpr64common = nsw MADDXrrr [[COPY1]], [[COPY]], [[MOVi64imm]]
|
|
; CHECK-NEXT: $x0 = COPY [[MADDXrrr]]
|
|
; CHECK-NEXT: RET_ReallyLR implicit $x0
|
|
%0:gpr64 = COPY $x0
|
|
%1:gpr64 = COPY $x1
|
|
%2:gpr64common = nsw MADDXrrr %1:gpr64, %0:gpr64, $xzr
|
|
%3:gpr64sp = nsw ADDXri killed %2:gpr64common, 79, 0
|
|
$x0 = COPY %3:gpr64sp
|
|
RET_ReallyLR implicit $x0
|
|
...
|
|
---
|
|
name: madd_subwi
|
|
alignment: 4
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0.entry:
|
|
liveins: $w0, $w1
|
|
|
|
; CHECK-LABEL: name: madd_subwi
|
|
; CHECK: liveins: $w0, $w1
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32 = COPY $w0
|
|
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
|
|
; CHECK-NEXT: [[MOVi32imm:%[0-9]+]]:gpr32 = nsw MOVi32imm -1
|
|
; CHECK-NEXT: [[MADDWrrr:%[0-9]+]]:gpr32 = nsw MADDWrrr [[COPY1]], [[COPY]], [[MOVi32imm]]
|
|
; CHECK-NEXT: $w0 = COPY [[MADDWrrr]]
|
|
; CHECK-NEXT: RET_ReallyLR implicit $w0
|
|
%0:gpr32 = COPY $w0
|
|
%1:gpr32 = COPY $w1
|
|
%2:gpr32common = nsw MADDWrrr %1:gpr32, %0:gpr32, $wzr
|
|
%3:gpr32 = nsw SUBSWri killed %2:gpr32common, 1, 0, implicit-def dead $nzcv
|
|
$w0 = COPY %3:gpr32
|
|
RET_ReallyLR implicit $w0
|
|
...
|
|
---
|
|
name: madd_subxi
|
|
alignment: 4
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0.entry:
|
|
liveins: $x0, $x1
|
|
|
|
; CHECK-LABEL: name: madd_subxi
|
|
; CHECK: liveins: $x0, $x1
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
|
|
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
|
|
; CHECK-NEXT: [[MOVi64imm:%[0-9]+]]:gpr64 = nsw MOVi64imm -1
|
|
; CHECK-NEXT: [[MADDXrrr:%[0-9]+]]:gpr64 = nsw MADDXrrr [[COPY1]], [[COPY]], [[MOVi64imm]]
|
|
; CHECK-NEXT: $x0 = COPY [[MADDXrrr]]
|
|
; CHECK-NEXT: RET_ReallyLR implicit $x0
|
|
%0:gpr64 = COPY $x0
|
|
%1:gpr64 = COPY $x1
|
|
%2:gpr64common = nsw MADDXrrr %1:gpr64, %0:gpr64, $xzr
|
|
%3:gpr64 = nsw SUBSXri killed %2:gpr64common, 1, 0, implicit-def dead $nzcv
|
|
$x0 = COPY %3:gpr64
|
|
RET_ReallyLR implicit $x0
|
|
...
|
|
---
|
|
name: madd_addorwi
|
|
alignment: 4
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0.entry:
|
|
liveins: $w0, $w1
|
|
|
|
; CHECK-LABEL: name: madd_addorwi
|
|
; CHECK: liveins: $w0, $w1
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr32 = COPY $w0
|
|
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
|
|
; CHECK-NEXT: [[MOVi32imm:%[0-9]+]]:gpr32 = nsw MOVi32imm 16773120
|
|
; CHECK-NEXT: [[MADDWrrr:%[0-9]+]]:gpr32common = nsw MADDWrrr [[COPY1]], [[COPY]], [[MOVi32imm]]
|
|
; CHECK-NEXT: $w0 = COPY [[MADDWrrr]]
|
|
; CHECK-NEXT: RET_ReallyLR implicit $w0
|
|
%0:gpr32 = COPY $w0
|
|
%1:gpr32 = COPY $w1
|
|
%2:gpr32common = nsw MADDWrrr %1:gpr32, %0:gpr32, $wzr
|
|
%3:gpr32sp = nsw ADDWri killed %2:gpr32common, 4095, 12
|
|
$w0 = COPY %3:gpr32sp
|
|
RET_ReallyLR implicit $w0
|
|
...
|
|
---
|
|
name: madd_addorxi
|
|
alignment: 4
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0.entry:
|
|
liveins: $x0, $x1
|
|
|
|
; CHECK-LABEL: name: madd_addorxi
|
|
; CHECK: liveins: $x0, $x1
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
|
|
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
|
|
; CHECK-NEXT: [[MOVi64imm:%[0-9]+]]:gpr64 = nsw MOVi64imm 16773120
|
|
; CHECK-NEXT: [[MADDXrrr:%[0-9]+]]:gpr64common = nsw MADDXrrr [[COPY1]], [[COPY]], [[MOVi64imm]]
|
|
; CHECK-NEXT: $x0 = COPY [[MADDXrrr]]
|
|
; CHECK-NEXT: RET_ReallyLR implicit $x0
|
|
%0:gpr64 = COPY $x0
|
|
%1:gpr64 = COPY $x1
|
|
%2:gpr64common = nsw MADDXrrr %1:gpr64, %0:gpr64, $xzr
|
|
%3:gpr64sp = nsw ADDXri killed %2:gpr64common, 4095, 12
|
|
$x0 = COPY %3:gpr64sp
|
|
RET_ReallyLR implicit $x0
|
|
...
|