mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
8eb83e55cc
We sometimes get poor code size because constants of types < 32b are legalized as 32 bit G_CONSTANTs with a truncate to fit. This works but means that the localizer can no longer sink them (although it's possible to extend it to do so). On AArch64 however s8 and s16 constants can be selected in the same way as s32 constants, with a mov pseudo into a W register. If we make s8 and s16 constants legal then we can avoid unnecessary truncates, they can be CSE'd, and the localizer can sink them as normal. There is a caveat: if the user of a smaller constant has to widen the sources, we end up with an anyext of the smaller typed G_CONSTANT. This can cause regressions because of the additional extend and missed pattern matching. To remedy this, there's a new artifact combiner to generate the wider G_CONSTANT if it's legal for the target. Differential Revision: https://reviews.llvm.org/D63587 llvm-svn: 364075
103 lines
2.7 KiB
YAML
103 lines
2.7 KiB
YAML
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
|
|
# RUN: llc -O0 -run-pass=legalizer %s -o - | FileCheck %s
|
|
|
|
--- |
|
|
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
|
|
target triple = "aarch64--"
|
|
define void @test_constant() {
|
|
entry:
|
|
ret void
|
|
}
|
|
define void @test_fconstant() {
|
|
entry:
|
|
ret void
|
|
}
|
|
@var = global i8 0
|
|
define i8* @test_global() { ret i8* undef }
|
|
...
|
|
|
|
---
|
|
name: test_constant
|
|
registers:
|
|
- { id: 0, class: _ }
|
|
- { id: 1, class: _ }
|
|
- { id: 2, class: _ }
|
|
- { id: 3, class: _ }
|
|
- { id: 4, class: _ }
|
|
- { id: 5, class: _ }
|
|
body: |
|
|
bb.0.entry:
|
|
|
|
; CHECK-LABEL: name: test_constant
|
|
; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 0
|
|
; CHECK: $w0 = COPY [[C]](s32)
|
|
; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 42
|
|
; CHECK: $w0 = COPY [[C1]](s32)
|
|
; CHECK: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 -1
|
|
; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY [[C2]](s32)
|
|
; CHECK: $w0 = COPY [[COPY]](s32)
|
|
; CHECK: $w0 = COPY [[C2]](s32)
|
|
; CHECK: [[C3:%[0-9]+]]:_(s64) = G_CONSTANT i64 1
|
|
; CHECK: $x0 = COPY [[C3]](s64)
|
|
; CHECK: [[C4:%[0-9]+]]:_(s64) = G_CONSTANT i64 0
|
|
; CHECK: $x0 = COPY [[C4]](s64)
|
|
%0(s1) = G_CONSTANT i1 0
|
|
%6:_(s32) = G_ANYEXT %0
|
|
$w0 = COPY %6
|
|
%1(s8) = G_CONSTANT i8 42
|
|
%7:_(s32) = G_ANYEXT %1
|
|
$w0 = COPY %7
|
|
%2(s16) = G_CONSTANT i16 65535
|
|
%8:_(s32) = G_ANYEXT %2
|
|
$w0 = COPY %8
|
|
%3(s32) = G_CONSTANT i32 -1
|
|
$w0 = COPY %3
|
|
%4(s64) = G_CONSTANT i64 1
|
|
$x0 = COPY %4
|
|
%5(s64) = G_CONSTANT i64 0
|
|
$x0 = COPY %5
|
|
...
|
|
|
|
---
|
|
name: test_fconstant
|
|
registers:
|
|
- { id: 0, class: _ }
|
|
- { id: 1, class: _ }
|
|
- { id: 2, class: _ }
|
|
body: |
|
|
bb.0.entry:
|
|
|
|
; CHECK-LABEL: name: test_fconstant
|
|
; CHECK: [[C:%[0-9]+]]:_(s32) = G_FCONSTANT float 1.000000e+00
|
|
; CHECK: $w0 = COPY [[C]](s32)
|
|
; CHECK: [[C1:%[0-9]+]]:_(s64) = G_FCONSTANT double 2.000000e+00
|
|
; CHECK: $x0 = COPY [[C1]](s64)
|
|
; CHECK: [[C2:%[0-9]+]]:_(s32) = G_FCONSTANT float 0.000000e+00
|
|
; CHECK: [[FPTRUNC:%[0-9]+]]:_(s16) = G_FPTRUNC [[C2]](s32)
|
|
; CHECK: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[FPTRUNC]](s16)
|
|
; CHECK: $w0 = COPY [[ANYEXT]](s32)
|
|
%0(s32) = G_FCONSTANT float 1.0
|
|
$w0 = COPY %0
|
|
%1(s64) = G_FCONSTANT double 2.0
|
|
$x0 = COPY %1
|
|
%2(s16) = G_FCONSTANT half 0.0
|
|
%3:_(s32) = G_ANYEXT %2
|
|
$w0 = COPY %3
|
|
...
|
|
|
|
---
|
|
name: test_global
|
|
registers:
|
|
- { id: 0, class: _ }
|
|
body: |
|
|
bb.0:
|
|
|
|
; CHECK-LABEL: name: test_global
|
|
; CHECK: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @var
|
|
; CHECK: [[PTRTOINT:%[0-9]+]]:_(s64) = G_PTRTOINT [[GV]](p0)
|
|
; CHECK: $x0 = COPY [[PTRTOINT]](s64)
|
|
%0(p0) = G_GLOBAL_VALUE @var
|
|
%1:_(s64) = G_PTRTOINT %0
|
|
$x0 = COPY %1
|
|
...
|