llvm-project/llvm/test/CodeGen/RISCV/make-compressible.mir
Lewis Revill 29a5a7c6d4 [RISCV] Add pre-emit pass to make more instructions compressible
When optimizing for size, this pass searches for instructions that are
prevented from being compressed by one of the following:

1. The use of a single uncompressed register.
2. A base register + offset where the offset is too large to be
   compressed and the base register may or may not already be compressed.

In the first case, if there is a compressed register available, then the
uncompressed register is copied to the compressed register and its uses
replaced. This is only done if there are enough uses that code size
would be improved.

In the second case, if a compressed register is available, then the
original base register is copied and adjusted such that:

new_base_register = base_register + adjustment
base_register + large_offset = new_base_register + small_offset

and the uses of the base register are replaced with the new base
register. Again this is only done if there are enough uses for code size
to be improved.

This pass was authored by Lewis Revill, with large offset optimization
added by Craig Blackmore.

Differential Revision: https://reviews.llvm.org/D92105
2022-05-25 09:25:02 +01:00

1134 lines
47 KiB
YAML

# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
# RUN: llc -o - %s -mtriple=riscv32 -mattr=+c,+f,+d -simplify-mir \
# RUN: -run-pass=riscv-make-compressible | FileCheck --check-prefix=RV32 %s
# RUN: llc -o - %s -mtriple=riscv64 -mattr=+c,+f,+d -simplify-mir \
# RUN: -run-pass=riscv-make-compressible | FileCheck --check-prefix=RV64 %s
--- |
define void @store_common_value(i32* %a, i32* %b, i32* %c) #0 {
entry:
store i32 0, i32* %a, align 4
store i32 0, i32* %b, align 4
store i32 0, i32* %c, align 4
ret void
}
define void @store_common_value_float(float* %a, float* %b, float* %c, float %d, float %e, float %f, float %g, float %h, float %i, float %j) #0 {
entry:
store float %j, float* %a, align 4
store float %j, float* %b, align 4
store float %j, float* %c, align 4
ret void
}
define void @store_common_value_double(double* %a, double* %b, double* %c, double %d, double %e, double %f, double %g, double %h, double %i, double %j) #0 {
entry:
store double %j, double* %a, align 8
store double %j, double* %b, align 8
store double %j, double* %c, align 8
ret void
}
define void @store_common_ptr(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32* %p) #0 {
entry:
store volatile i32 1, i32* %p, align 4
store volatile i32 3, i32* %p, align 4
store volatile i32 5, i32* %p, align 4
ret void
}
define void @store_common_ptr_self(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32* %p) #0 {
entry:
%q = bitcast i32* %p to i32**
store volatile i32 1, i32* %p, align 4
store volatile i32 3, i32* %p, align 4
store volatile i32* %p, i32** %q, align 4
ret void
}
define void @store_common_ptr_float(float %a, float %b, float %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, float* %p) #0 {
entry:
store volatile float %a, float* %p, align 4
store volatile float %b, float* %p, align 4
store volatile float %c, float* %p, align 4
ret void
}
define void @store_common_ptr_double(double %a, double %b, double %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h, i32 %i, double* %p) #0 {
entry:
store volatile double %a, double* %p, align 8
store volatile double %b, double* %p, align 8
store volatile double %c, double* %p, align 8
ret void
}
define void @load_common_ptr(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32* %p) #0 {
entry:
%g = load volatile i32, i32* %p, align 4
%h = load volatile i32, i32* %p, align 4
%i = load volatile i32, i32* %p, align 4
ret void
}
define void @load_common_ptr_float(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, float* %g) #0 {
entry:
%0 = load float, float* %g, align 4
%arrayidx1 = getelementptr inbounds float, float* %g, i32 1
%1 = load float, float* %arrayidx1, align 4
%arrayidx2 = getelementptr inbounds float, float* %g, i32 2
%2 = load float, float* %arrayidx2, align 4
tail call void @load_common_ptr_float_1(float %0, float %1, float %2)
ret void
}
declare void @load_common_ptr_float_1(float, float, float) #0
define void @load_common_ptr_double(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, double* %g) #0 {
entry:
%0 = load double, double* %g, align 8
%arrayidx1 = getelementptr inbounds double, double* %g, i32 1
%1 = load double, double* %arrayidx1, align 8
%arrayidx2 = getelementptr inbounds double, double* %g, i32 2
%2 = load double, double* %arrayidx2, align 8
tail call void @load_common_ptr_double_1(double %0, double %1, double %2)
ret void
}
declare void @load_common_ptr_double_1(double, double, double) #0
define void @store_large_offset(i32* %p) #0 {
entry:
%0 = getelementptr inbounds i32, i32* %p, i32 100
store volatile i32 1, i32* %0, align 4
%1 = getelementptr inbounds i32, i32* %p, i32 101
store volatile i32 3, i32* %1, align 4
%2 = getelementptr inbounds i32, i32* %p, i32 102
store volatile i32 5, i32* %2, align 4
%3 = getelementptr inbounds i32, i32* %p, i32 103
store volatile i32 7, i32* %3, align 4
ret void
}
define void @store_large_offset_float(float* %p, float %a, float %b, float %c, float %d) #0 {
entry:
%0 = getelementptr inbounds float, float* %p, i32 100
store volatile float %a, float* %0, align 4
%1 = getelementptr inbounds float, float* %p, i32 101
store volatile float %b, float* %1, align 4
%2 = getelementptr inbounds float, float* %p, i32 102
store volatile float %c, float* %2, align 4
%3 = getelementptr inbounds float, float* %p, i32 103
store volatile float %d, float* %3, align 4
ret void
}
define void @store_large_offset_double(double* %p, double %a, double %b, double %c, double %d) #0 {
entry:
%0 = getelementptr inbounds double, double* %p, i32 100
store volatile double %a, double* %0, align 8
%1 = getelementptr inbounds double, double* %p, i32 101
store volatile double %b, double* %1, align 8
%2 = getelementptr inbounds double, double* %p, i32 102
store volatile double %c, double* %2, align 8
%3 = getelementptr inbounds double, double* %p, i32 103
store volatile double %d, double* %3, align 8
ret void
}
define void @load_large_offset(i32* %p) #0 {
entry:
%0 = getelementptr inbounds i32, i32* %p, i32 100
%a = load volatile i32, i32* %0, align 4
%1 = getelementptr inbounds i32, i32* %p, i32 101
%b = load volatile i32, i32* %1, align 4
%2 = getelementptr inbounds i32, i32* %p, i32 102
%c = load volatile i32, i32* %2, align 4
%3 = getelementptr inbounds i32, i32* %p, i32 103
%d = load volatile i32, i32* %3, align 4
ret void
}
define void @load_large_offset_float(float* %p) #0 {
entry:
%arrayidx = getelementptr inbounds float, float* %p, i32 100
%0 = load float, float* %arrayidx, align 4
%arrayidx1 = getelementptr inbounds float, float* %p, i32 101
%1 = load float, float* %arrayidx1, align 4
%arrayidx2 = getelementptr inbounds float, float* %p, i32 102
%2 = load float, float* %arrayidx2, align 4
tail call void @load_large_offset_float_1(float %0, float %1, float %2)
ret void
}
declare void @load_large_offset_float_1(float, float, float) #0
define void @load_large_offset_double(double* %p) #0 {
entry:
%arrayidx = getelementptr inbounds double, double* %p, i32 100
%0 = load double, double* %arrayidx, align 8
%arrayidx1 = getelementptr inbounds double, double* %p, i32 101
%1 = load double, double* %arrayidx1, align 8
%arrayidx2 = getelementptr inbounds double, double* %p, i32 102
%2 = load double, double* %arrayidx2, align 8
tail call void @load_large_offset_double_1(double %0, double %1, double %2)
ret void
}
declare void @load_large_offset_double_1(double, double, double) #0
define void @store_common_value_no_opt(i32* %a) #0 {
entry:
store i32 0, i32* %a, align 4
ret void
}
define void @store_common_value_float_no_opt(float* %a, float %b, float %c, float %d, float %e, float %f, float %g, float %h) #0 {
entry:
store float %h, float* %a, align 4
ret void
}
define void @store_common_value_double_no_opt(double* %a, double %b, double %c, double %d, double %e, double %f, double %g, double %h) #0 {
entry:
store double %h, double* %a, align 8
ret void
}
define void @store_common_ptr_no_opt(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32* %p) #0 {
entry:
store volatile i32 1, i32* %p, align 4
ret void
}
define void @store_common_ptr_float_no_opt(float %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, float* %p) #0 {
entry:
store volatile float %a, float* %p, align 4
ret void
}
define void @store_common_ptr_double_no_opt(double %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, double* %p) #0 {
entry:
store volatile double %a, double* %p, align 8
ret void
}
define void @load_common_ptr_no_opt(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32* %p) #0 {
entry:
%g = load volatile i32, i32* %p, align 4
ret void
}
define float @load_common_ptr_float_no_opt(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, float* %g) #0 {
entry:
%0 = load float, float* %g, align 4
ret float %0
}
define double @load_common_ptr_double_no_opt(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, double* %g) #0 {
entry:
%0 = load double, double* %g, align 8
ret double %0
}
define void @store_large_offset_no_opt(i32* %p) #0 {
entry:
%0 = getelementptr inbounds i32, i32* %p, i32 100
store volatile i32 1, i32* %0, align 4
%1 = getelementptr inbounds i32, i32* %p, i32 101
store volatile i32 3, i32* %1, align 4
ret void
}
define void @store_large_offset_float_no_opt(float* %p, float %a, float %b) #0 {
entry:
%0 = getelementptr inbounds float, float* %p, i32 100
store volatile float %a, float* %0, align 4
%1 = getelementptr inbounds float, float* %p, i32 101
store volatile float %b, float* %1, align 4
ret void
}
define void @store_large_offset_double_no_opt(double* %p, double %a, double %b) #0 {
entry:
%0 = getelementptr inbounds double, double* %p, i32 100
store volatile double %a, double* %0, align 8
%1 = getelementptr inbounds double, double* %p, i32 101
store volatile double %b, double* %1, align 8
ret void
}
define void @load_large_offset_no_opt(i32* %p) #0 {
entry:
%0 = getelementptr inbounds i32, i32* %p, i32 100
%a = load volatile i32, i32* %0, align 4
%1 = getelementptr inbounds i32, i32* %p, i32 101
%b = load volatile i32, i32* %1, align 4
ret void
}
define { float, float } @load_large_offset_float_no_opt(float* %p) #0 {
entry:
%arrayidx = getelementptr inbounds float, float* %p, i32 100
%0 = load float, float* %arrayidx, align 4
%arrayidx1 = getelementptr inbounds float, float* %p, i32 101
%1 = load float, float* %arrayidx1, align 4
%2 = insertvalue { float, float } undef, float %0, 0
%3 = insertvalue { float, float } %2, float %1, 1
ret { float, float } %3
}
define { double, double } @load_large_offset_double_no_opt(double* %p) #0 {
entry:
%arrayidx = getelementptr inbounds double, double* %p, i32 100
%0 = load double, double* %arrayidx, align 8
%arrayidx1 = getelementptr inbounds double, double* %p, i32 101
%1 = load double, double* %arrayidx1, align 8
%2 = insertvalue { double, double } undef, double %0, 0
%3 = insertvalue { double, double } %2, double %1, 1
ret { double, double } %3
}
attributes #0 = { minsize "target-features"="+c,+f,+d" }
...
---
name: store_common_value
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x10, $x11, $x12
; RV32-LABEL: name: store_common_value
; RV32: liveins: $x10, $x11, $x12
; RV32-NEXT: {{ $}}
; RV32-NEXT: $x13 = ADDI $x0, 0
; RV32-NEXT: SW $x13, killed renamable $x10, 0 :: (store (s32) into %ir.a)
; RV32-NEXT: SW $x13, killed renamable $x11, 0 :: (store (s32) into %ir.b)
; RV32-NEXT: SW $x13, killed renamable $x12, 0 :: (store (s32) into %ir.c)
; RV32-NEXT: PseudoRET
; RV64-LABEL: name: store_common_value
; RV64: liveins: $x10, $x11, $x12
; RV64-NEXT: {{ $}}
; RV64-NEXT: $x13 = ADDI $x0, 0
; RV64-NEXT: SW $x13, killed renamable $x10, 0 :: (store (s32) into %ir.a)
; RV64-NEXT: SW $x13, killed renamable $x11, 0 :: (store (s32) into %ir.b)
; RV64-NEXT: SW $x13, killed renamable $x12, 0 :: (store (s32) into %ir.c)
; RV64-NEXT: PseudoRET
SW $x0, killed renamable $x10, 0 :: (store (s32) into %ir.a)
SW $x0, killed renamable $x11, 0 :: (store (s32) into %ir.b)
SW $x0, killed renamable $x12, 0 :: (store (s32) into %ir.c)
PseudoRET
...
---
name: store_common_value_float
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x10, $x11, $x12, $f16_f
; RV32-LABEL: name: store_common_value_float
; RV32: liveins: $x10, $x11, $x12, $f16_f
; RV32-NEXT: {{ $}}
; RV32-NEXT: $f10_f = FSGNJ_S $f16_f, $f16_f
; RV32-NEXT: FSW $f10_f, killed renamable $x10, 0 :: (store (s32) into %ir.a)
; RV32-NEXT: FSW $f10_f, killed renamable $x11, 0 :: (store (s32) into %ir.b)
; RV32-NEXT: FSW killed $f10_f, killed renamable $x12, 0 :: (store (s32) into %ir.c)
; RV32-NEXT: PseudoRET
; RV64-LABEL: name: store_common_value_float
; RV64: liveins: $x10, $x11, $x12, $f16_f
; RV64-NEXT: {{ $}}
; RV64-NEXT: FSW renamable $f16_f, killed renamable $x10, 0 :: (store (s32) into %ir.a)
; RV64-NEXT: FSW renamable $f16_f, killed renamable $x11, 0 :: (store (s32) into %ir.b)
; RV64-NEXT: FSW killed renamable $f16_f, killed renamable $x12, 0 :: (store (s32) into %ir.c)
; RV64-NEXT: PseudoRET
FSW renamable $f16_f, killed renamable $x10, 0 :: (store (s32) into %ir.a)
FSW renamable $f16_f, killed renamable $x11, 0 :: (store (s32) into %ir.b)
FSW killed renamable $f16_f, killed renamable $x12, 0 :: (store (s32) into %ir.c)
PseudoRET
...
---
name: store_common_value_double
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x10, $x11, $x12, $f16_d
; RV32-LABEL: name: store_common_value_double
; RV32: liveins: $x10, $x11, $x12, $f16_d
; RV32-NEXT: {{ $}}
; RV32-NEXT: $f10_d = FSGNJ_D $f16_d, $f16_d
; RV32-NEXT: FSD $f10_d, killed renamable $x10, 0 :: (store (s64) into %ir.a)
; RV32-NEXT: FSD $f10_d, killed renamable $x11, 0 :: (store (s64) into %ir.b)
; RV32-NEXT: FSD killed $f10_d, killed renamable $x12, 0 :: (store (s64) into %ir.c)
; RV32-NEXT: PseudoRET
; RV64-LABEL: name: store_common_value_double
; RV64: liveins: $x10, $x11, $x12, $f16_d
; RV64-NEXT: {{ $}}
; RV64-NEXT: $f10_d = FSGNJ_D $f16_d, $f16_d
; RV64-NEXT: FSD $f10_d, killed renamable $x10, 0 :: (store (s64) into %ir.a)
; RV64-NEXT: FSD $f10_d, killed renamable $x11, 0 :: (store (s64) into %ir.b)
; RV64-NEXT: FSD killed $f10_d, killed renamable $x12, 0 :: (store (s64) into %ir.c)
; RV64-NEXT: PseudoRET
FSD renamable $f16_d, killed renamable $x10, 0 :: (store (s64) into %ir.a)
FSD renamable $f16_d, killed renamable $x11, 0 :: (store (s64) into %ir.b)
FSD killed renamable $f16_d, killed renamable $x12, 0 :: (store (s64) into %ir.c)
PseudoRET
...
---
name: store_common_ptr
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x16
; RV32-LABEL: name: store_common_ptr
; RV32: liveins: $x16
; RV32-NEXT: {{ $}}
; RV32-NEXT: renamable $x10 = ADDI $x0, 1
; RV32-NEXT: $x11 = ADDI $x16, 0
; RV32-NEXT: SW killed renamable $x10, $x11, 0 :: (volatile store (s32) into %ir.p)
; RV32-NEXT: renamable $x10 = ADDI $x0, 3
; RV32-NEXT: SW killed renamable $x10, $x11, 0 :: (volatile store (s32) into %ir.p)
; RV32-NEXT: renamable $x10 = ADDI $x0, 5
; RV32-NEXT: SW killed renamable $x10, killed $x11, 0 :: (volatile store (s32) into %ir.p)
; RV32-NEXT: PseudoRET
; RV64-LABEL: name: store_common_ptr
; RV64: liveins: $x16
; RV64-NEXT: {{ $}}
; RV64-NEXT: renamable $x10 = ADDI $x0, 1
; RV64-NEXT: $x11 = ADDI $x16, 0
; RV64-NEXT: SW killed renamable $x10, $x11, 0 :: (volatile store (s32) into %ir.p)
; RV64-NEXT: renamable $x10 = ADDI $x0, 3
; RV64-NEXT: SW killed renamable $x10, $x11, 0 :: (volatile store (s32) into %ir.p)
; RV64-NEXT: renamable $x10 = ADDI $x0, 5
; RV64-NEXT: SW killed renamable $x10, killed $x11, 0 :: (volatile store (s32) into %ir.p)
; RV64-NEXT: PseudoRET
renamable $x10 = ADDI $x0, 1
SW killed renamable $x10, renamable $x16, 0 :: (volatile store (s32) into %ir.p)
renamable $x10 = ADDI $x0, 3
SW killed renamable $x10, renamable $x16, 0 :: (volatile store (s32) into %ir.p)
renamable $x10 = ADDI $x0, 5
SW killed renamable $x10, killed renamable $x16, 0 :: (volatile store (s32) into %ir.p)
PseudoRET
...
---
name: store_common_ptr_self
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x16
; RV32-LABEL: name: store_common_ptr_self
; RV32: liveins: $x16
; RV32-NEXT: {{ $}}
; RV32-NEXT: renamable $x10 = ADDI $x0, 1
; RV32-NEXT: $x11 = ADDI $x16, 0
; RV32-NEXT: SW killed renamable $x10, $x11, 0 :: (volatile store (s32) into %ir.p)
; RV32-NEXT: renamable $x10 = ADDI $x0, 3
; RV32-NEXT: SW killed renamable $x10, $x11, 0 :: (volatile store (s32) into %ir.p)
; RV32-NEXT: SW killed $x11, $x11, 0 :: (volatile store (s32) into %ir.q)
; RV32-NEXT: PseudoRET
; RV64-LABEL: name: store_common_ptr_self
; RV64: liveins: $x16
; RV64-NEXT: {{ $}}
; RV64-NEXT: renamable $x10 = ADDI $x0, 1
; RV64-NEXT: $x11 = ADDI $x16, 0
; RV64-NEXT: SW killed renamable $x10, $x11, 0 :: (volatile store (s32) into %ir.p)
; RV64-NEXT: renamable $x10 = ADDI $x0, 3
; RV64-NEXT: SW killed renamable $x10, $x11, 0 :: (volatile store (s32) into %ir.p)
; RV64-NEXT: SW killed $x11, $x11, 0 :: (volatile store (s32) into %ir.q)
; RV64-NEXT: PseudoRET
renamable $x10 = ADDI $x0, 1
SW killed renamable $x10, renamable $x16, 0 :: (volatile store (s32) into %ir.p)
renamable $x10 = ADDI $x0, 3
SW killed renamable $x10, renamable $x16, 0 :: (volatile store (s32) into %ir.p)
SW killed renamable $x16, renamable $x16, 0 :: (volatile store (s32) into %ir.q)
PseudoRET
...
---
name: store_common_ptr_float
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x16, $f10_f, $f11_f, $f12_f
; RV32-LABEL: name: store_common_ptr_float
; RV32: liveins: $x16, $f10_f, $f11_f, $f12_f
; RV32-NEXT: {{ $}}
; RV32-NEXT: $x10 = ADDI $x16, 0
; RV32-NEXT: FSW killed renamable $f10_f, $x10, 0 :: (volatile store (s32) into %ir.p)
; RV32-NEXT: FSW killed renamable $f11_f, $x10, 0 :: (volatile store (s32) into %ir.p)
; RV32-NEXT: FSW killed renamable $f12_f, killed $x10, 0 :: (volatile store (s32) into %ir.p)
; RV32-NEXT: PseudoRET
; RV64-LABEL: name: store_common_ptr_float
; RV64: liveins: $x16, $f10_f, $f11_f, $f12_f
; RV64-NEXT: {{ $}}
; RV64-NEXT: FSW killed renamable $f10_f, renamable $x16, 0 :: (volatile store (s32) into %ir.p)
; RV64-NEXT: FSW killed renamable $f11_f, renamable $x16, 0 :: (volatile store (s32) into %ir.p)
; RV64-NEXT: FSW killed renamable $f12_f, killed renamable $x16, 0 :: (volatile store (s32) into %ir.p)
; RV64-NEXT: PseudoRET
FSW killed renamable $f10_f, renamable $x16, 0 :: (volatile store (s32) into %ir.p)
FSW killed renamable $f11_f, renamable $x16, 0 :: (volatile store (s32) into %ir.p)
FSW killed renamable $f12_f, killed renamable $x16, 0 :: (volatile store (s32) into %ir.p)
PseudoRET
...
---
name: store_common_ptr_double
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x16, $f10_d, $f11_d, $f12_d
; RV32-LABEL: name: store_common_ptr_double
; RV32: liveins: $x16, $f10_d, $f11_d, $f12_d
; RV32-NEXT: {{ $}}
; RV32-NEXT: $x10 = ADDI $x16, 0
; RV32-NEXT: FSD killed renamable $f10_d, $x10, 0 :: (volatile store (s64) into %ir.p)
; RV32-NEXT: FSD killed renamable $f11_d, $x10, 0 :: (volatile store (s64) into %ir.p)
; RV32-NEXT: FSD killed renamable $f12_d, killed $x10, 0 :: (volatile store (s64) into %ir.p)
; RV32-NEXT: PseudoRET
; RV64-LABEL: name: store_common_ptr_double
; RV64: liveins: $x16, $f10_d, $f11_d, $f12_d
; RV64-NEXT: {{ $}}
; RV64-NEXT: $x10 = ADDI $x16, 0
; RV64-NEXT: FSD killed renamable $f10_d, $x10, 0 :: (volatile store (s64) into %ir.p)
; RV64-NEXT: FSD killed renamable $f11_d, $x10, 0 :: (volatile store (s64) into %ir.p)
; RV64-NEXT: FSD killed renamable $f12_d, killed $x10, 0 :: (volatile store (s64) into %ir.p)
; RV64-NEXT: PseudoRET
FSD killed renamable $f10_d, renamable $x16, 0 :: (volatile store (s64) into %ir.p)
FSD killed renamable $f11_d, renamable $x16, 0 :: (volatile store (s64) into %ir.p)
FSD killed renamable $f12_d, killed renamable $x16, 0 :: (volatile store (s64) into %ir.p)
PseudoRET
...
---
name: load_common_ptr
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x16
; RV32-LABEL: name: load_common_ptr
; RV32: liveins: $x16
; RV32-NEXT: {{ $}}
; RV32-NEXT: $x11 = ADDI $x16, 0
; RV32-NEXT: dead renamable $x10 = LW $x11, 0 :: (volatile load (s32) from %ir.p)
; RV32-NEXT: dead renamable $x10 = LW $x11, 0 :: (volatile load (s32) from %ir.p)
; RV32-NEXT: dead renamable $x10 = LW killed $x11, 0 :: (volatile load (s32) from %ir.p)
; RV32-NEXT: PseudoRET
; RV64-LABEL: name: load_common_ptr
; RV64: liveins: $x16
; RV64-NEXT: {{ $}}
; RV64-NEXT: $x11 = ADDI $x16, 0
; RV64-NEXT: dead renamable $x10 = LW $x11, 0 :: (volatile load (s32) from %ir.p)
; RV64-NEXT: dead renamable $x10 = LW $x11, 0 :: (volatile load (s32) from %ir.p)
; RV64-NEXT: dead renamable $x10 = LW killed $x11, 0 :: (volatile load (s32) from %ir.p)
; RV64-NEXT: PseudoRET
dead renamable $x10 = LW renamable $x16, 0 :: (volatile load (s32) from %ir.p)
dead renamable $x10 = LW renamable $x16, 0 :: (volatile load (s32) from %ir.p)
dead renamable $x10 = LW killed renamable $x16, 0 :: (volatile load (s32) from %ir.p)
PseudoRET
...
---
name: load_common_ptr_float
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x16
; RV32-LABEL: name: load_common_ptr_float
; RV32: liveins: $x16
; RV32-NEXT: {{ $}}
; RV32-NEXT: $x10 = ADDI $x16, 0
; RV32-NEXT: renamable $f10_f = FLW $x10, 0 :: (load (s32) from %ir.g)
; RV32-NEXT: renamable $f11_f = FLW $x10, 4 :: (load (s32) from %ir.arrayidx1)
; RV32-NEXT: renamable $f12_f = FLW killed $x10, 8 :: (load (s32) from %ir.arrayidx2)
; RV32-NEXT: PseudoTAIL target-flags(riscv-plt) @load_common_ptr_float_1, implicit $x2, implicit $f10_f, implicit $f11_f, implicit $f12_f
; RV64-LABEL: name: load_common_ptr_float
; RV64: liveins: $x16
; RV64-NEXT: {{ $}}
; RV64-NEXT: renamable $f10_f = FLW renamable $x16, 0 :: (load (s32) from %ir.g)
; RV64-NEXT: renamable $f11_f = FLW renamable $x16, 4 :: (load (s32) from %ir.arrayidx1)
; RV64-NEXT: renamable $f12_f = FLW killed renamable $x16, 8 :: (load (s32) from %ir.arrayidx2)
; RV64-NEXT: PseudoTAIL target-flags(riscv-plt) @load_common_ptr_float_1, implicit $x2, implicit $f10_f, implicit $f11_f, implicit $f12_f
renamable $f10_f = FLW renamable $x16, 0 :: (load (s32) from %ir.g)
renamable $f11_f = FLW renamable $x16, 4 :: (load (s32) from %ir.arrayidx1)
renamable $f12_f = FLW killed renamable $x16, 8 :: (load (s32) from %ir.arrayidx2)
PseudoTAIL target-flags(riscv-plt) @load_common_ptr_float_1, implicit $x2, implicit $f10_f, implicit $f11_f, implicit $f12_f
...
---
name: load_common_ptr_double
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x16
; RV32-LABEL: name: load_common_ptr_double
; RV32: liveins: $x16
; RV32-NEXT: {{ $}}
; RV32-NEXT: $x10 = ADDI $x16, 0
; RV32-NEXT: renamable $f10_d = FLD $x10, 0 :: (load (s64) from %ir.g)
; RV32-NEXT: renamable $f11_d = FLD $x10, 8 :: (load (s64) from %ir.arrayidx1)
; RV32-NEXT: renamable $f12_d = FLD killed $x10, 16 :: (load (s64) from %ir.arrayidx2)
; RV32-NEXT: PseudoTAIL target-flags(riscv-plt) @load_common_ptr_double_1, implicit $x2, implicit $f10_d, implicit $f11_d, implicit $f12_d
; RV64-LABEL: name: load_common_ptr_double
; RV64: liveins: $x16
; RV64-NEXT: {{ $}}
; RV64-NEXT: $x10 = ADDI $x16, 0
; RV64-NEXT: renamable $f10_d = FLD $x10, 0 :: (load (s64) from %ir.g)
; RV64-NEXT: renamable $f11_d = FLD $x10, 8 :: (load (s64) from %ir.arrayidx1)
; RV64-NEXT: renamable $f12_d = FLD killed $x10, 16 :: (load (s64) from %ir.arrayidx2)
; RV64-NEXT: PseudoTAIL target-flags(riscv-plt) @load_common_ptr_double_1, implicit $x2, implicit $f10_d, implicit $f11_d, implicit $f12_d
renamable $f10_d = FLD renamable $x16, 0 :: (load (s64) from %ir.g)
renamable $f11_d = FLD renamable $x16, 8 :: (load (s64) from %ir.arrayidx1)
renamable $f12_d = FLD killed renamable $x16, 16 :: (load (s64) from %ir.arrayidx2)
PseudoTAIL target-flags(riscv-plt) @load_common_ptr_double_1, implicit $x2, implicit $f10_d, implicit $f11_d, implicit $f12_d
...
---
name: store_large_offset
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x10
; RV32-LABEL: name: store_large_offset
; RV32: liveins: $x10
; RV32-NEXT: {{ $}}
; RV32-NEXT: renamable $x11 = ADDI $x0, 1
; RV32-NEXT: $x12 = ADDI $x10, 384
; RV32-NEXT: SW killed renamable $x11, $x12, 16 :: (volatile store (s32) into %ir.0)
; RV32-NEXT: renamable $x11 = ADDI $x0, 3
; RV32-NEXT: SW killed renamable $x11, $x12, 20 :: (volatile store (s32) into %ir.1)
; RV32-NEXT: renamable $x11 = ADDI $x0, 5
; RV32-NEXT: SW killed renamable $x11, $x12, 24 :: (volatile store (s32) into %ir.2)
; RV32-NEXT: renamable $x11 = ADDI $x0, 7
; RV32-NEXT: SW killed renamable $x11, killed $x12, 28 :: (volatile store (s32) into %ir.3)
; RV32-NEXT: PseudoRET
; RV64-LABEL: name: store_large_offset
; RV64: liveins: $x10
; RV64-NEXT: {{ $}}
; RV64-NEXT: renamable $x11 = ADDI $x0, 1
; RV64-NEXT: $x12 = ADDI $x10, 384
; RV64-NEXT: SW killed renamable $x11, $x12, 16 :: (volatile store (s32) into %ir.0)
; RV64-NEXT: renamable $x11 = ADDI $x0, 3
; RV64-NEXT: SW killed renamable $x11, $x12, 20 :: (volatile store (s32) into %ir.1)
; RV64-NEXT: renamable $x11 = ADDI $x0, 5
; RV64-NEXT: SW killed renamable $x11, $x12, 24 :: (volatile store (s32) into %ir.2)
; RV64-NEXT: renamable $x11 = ADDI $x0, 7
; RV64-NEXT: SW killed renamable $x11, killed $x12, 28 :: (volatile store (s32) into %ir.3)
; RV64-NEXT: PseudoRET
renamable $x11 = ADDI $x0, 1
SW killed renamable $x11, renamable $x10, 400 :: (volatile store (s32) into %ir.0)
renamable $x11 = ADDI $x0, 3
SW killed renamable $x11, renamable $x10, 404 :: (volatile store (s32) into %ir.1)
renamable $x11 = ADDI $x0, 5
SW killed renamable $x11, renamable $x10, 408 :: (volatile store (s32) into %ir.2)
renamable $x11 = ADDI $x0, 7
SW killed renamable $x11, killed renamable $x10, 412 :: (volatile store (s32) into %ir.3)
PseudoRET
...
---
name: store_large_offset_float
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x10, $f10_f, $f11_f, $f12_f, $f13_f
; RV32-LABEL: name: store_large_offset_float
; RV32: liveins: $x10, $f10_f, $f11_f, $f12_f, $f13_f
; RV32-NEXT: {{ $}}
; RV32-NEXT: $x11 = ADDI $x10, 384
; RV32-NEXT: FSW killed renamable $f10_f, $x11, 16 :: (volatile store (s32) into %ir.0)
; RV32-NEXT: FSW killed renamable $f11_f, $x11, 20 :: (volatile store (s32) into %ir.1)
; RV32-NEXT: FSW killed renamable $f12_f, $x11, 24 :: (volatile store (s32) into %ir.2)
; RV32-NEXT: FSW killed renamable $f13_f, killed $x11, 28 :: (volatile store (s32) into %ir.3)
; RV32-NEXT: PseudoRET
; RV64-LABEL: name: store_large_offset_float
; RV64: liveins: $x10, $f10_f, $f11_f, $f12_f, $f13_f
; RV64-NEXT: {{ $}}
; RV64-NEXT: FSW killed renamable $f10_f, renamable $x10, 400 :: (volatile store (s32) into %ir.0)
; RV64-NEXT: FSW killed renamable $f11_f, renamable $x10, 404 :: (volatile store (s32) into %ir.1)
; RV64-NEXT: FSW killed renamable $f12_f, renamable $x10, 408 :: (volatile store (s32) into %ir.2)
; RV64-NEXT: FSW killed renamable $f13_f, killed renamable $x10, 412 :: (volatile store (s32) into %ir.3)
; RV64-NEXT: PseudoRET
FSW killed renamable $f10_f, renamable $x10, 400 :: (volatile store (s32) into %ir.0)
FSW killed renamable $f11_f, renamable $x10, 404 :: (volatile store (s32) into %ir.1)
FSW killed renamable $f12_f, renamable $x10, 408 :: (volatile store (s32) into %ir.2)
FSW killed renamable $f13_f, killed renamable $x10, 412 :: (volatile store (s32) into %ir.3)
PseudoRET
...
---
name: store_large_offset_double
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x10, $f10_d, $f11_d, $f12_d, $f13_d
; RV32-LABEL: name: store_large_offset_double
; RV32: liveins: $x10, $f10_d, $f11_d, $f12_d, $f13_d
; RV32-NEXT: {{ $}}
; RV32-NEXT: $x11 = ADDI $x10, 768
; RV32-NEXT: FSD killed renamable $f10_d, $x11, 32 :: (volatile store (s64) into %ir.0)
; RV32-NEXT: FSD killed renamable $f11_d, $x11, 40 :: (volatile store (s64) into %ir.1)
; RV32-NEXT: FSD killed renamable $f12_d, $x11, 48 :: (volatile store (s64) into %ir.2)
; RV32-NEXT: FSD killed renamable $f13_d, killed $x11, 56 :: (volatile store (s64) into %ir.3)
; RV32-NEXT: PseudoRET
; RV64-LABEL: name: store_large_offset_double
; RV64: liveins: $x10, $f10_d, $f11_d, $f12_d, $f13_d
; RV64-NEXT: {{ $}}
; RV64-NEXT: $x11 = ADDI $x10, 768
; RV64-NEXT: FSD killed renamable $f10_d, $x11, 32 :: (volatile store (s64) into %ir.0)
; RV64-NEXT: FSD killed renamable $f11_d, $x11, 40 :: (volatile store (s64) into %ir.1)
; RV64-NEXT: FSD killed renamable $f12_d, $x11, 48 :: (volatile store (s64) into %ir.2)
; RV64-NEXT: FSD killed renamable $f13_d, killed $x11, 56 :: (volatile store (s64) into %ir.3)
; RV64-NEXT: PseudoRET
FSD killed renamable $f10_d, renamable $x10, 800 :: (volatile store (s64) into %ir.0)
FSD killed renamable $f11_d, renamable $x10, 808 :: (volatile store (s64) into %ir.1)
FSD killed renamable $f12_d, renamable $x10, 816 :: (volatile store (s64) into %ir.2)
FSD killed renamable $f13_d, killed renamable $x10, 824 :: (volatile store (s64) into %ir.3)
PseudoRET
...
---
name: load_large_offset
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x10
; RV32-LABEL: name: load_large_offset
; RV32: liveins: $x10
; RV32-NEXT: {{ $}}
; RV32-NEXT: $x12 = ADDI $x10, 384
; RV32-NEXT: dead renamable $x11 = LW $x12, 16 :: (volatile load (s32) from %ir.0)
; RV32-NEXT: dead renamable $x11 = LW $x12, 20 :: (volatile load (s32) from %ir.1)
; RV32-NEXT: dead renamable $x11 = LW $x12, 24 :: (volatile load (s32) from %ir.2)
; RV32-NEXT: dead renamable $x10 = LW killed $x12, 28 :: (volatile load (s32) from %ir.3)
; RV32-NEXT: PseudoRET
; RV64-LABEL: name: load_large_offset
; RV64: liveins: $x10
; RV64-NEXT: {{ $}}
; RV64-NEXT: $x12 = ADDI $x10, 384
; RV64-NEXT: dead renamable $x11 = LW $x12, 16 :: (volatile load (s32) from %ir.0)
; RV64-NEXT: dead renamable $x11 = LW $x12, 20 :: (volatile load (s32) from %ir.1)
; RV64-NEXT: dead renamable $x11 = LW $x12, 24 :: (volatile load (s32) from %ir.2)
; RV64-NEXT: dead renamable $x10 = LW killed $x12, 28 :: (volatile load (s32) from %ir.3)
; RV64-NEXT: PseudoRET
dead renamable $x11 = LW renamable $x10, 400 :: (volatile load (s32) from %ir.0)
dead renamable $x11 = LW renamable $x10, 404 :: (volatile load (s32) from %ir.1)
dead renamable $x11 = LW renamable $x10, 408 :: (volatile load (s32) from %ir.2)
dead renamable $x10 = LW killed renamable $x10, 412 :: (volatile load (s32) from %ir.3)
PseudoRET
...
---
name: load_large_offset_float
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x10
; RV32-LABEL: name: load_large_offset_float
; RV32: liveins: $x10
; RV32-NEXT: {{ $}}
; RV32-NEXT: $x11 = ADDI $x10, 384
; RV32-NEXT: renamable $f10_f = FLW $x11, 16 :: (load (s32) from %ir.arrayidx)
; RV32-NEXT: renamable $f11_f = FLW $x11, 20 :: (load (s32) from %ir.arrayidx1)
; RV32-NEXT: renamable $f12_f = FLW killed $x11, 24 :: (load (s32) from %ir.arrayidx2)
; RV32-NEXT: PseudoTAIL target-flags(riscv-plt) @load_large_offset_float_1, implicit $x2, implicit $f10_f, implicit $f11_f, implicit $f12_f
; RV64-LABEL: name: load_large_offset_float
; RV64: liveins: $x10
; RV64-NEXT: {{ $}}
; RV64-NEXT: renamable $f10_f = FLW renamable $x10, 400 :: (load (s32) from %ir.arrayidx)
; RV64-NEXT: renamable $f11_f = FLW renamable $x10, 404 :: (load (s32) from %ir.arrayidx1)
; RV64-NEXT: renamable $f12_f = FLW killed renamable $x10, 408 :: (load (s32) from %ir.arrayidx2)
; RV64-NEXT: PseudoTAIL target-flags(riscv-plt) @load_large_offset_float_1, implicit $x2, implicit $f10_f, implicit $f11_f, implicit $f12_f
renamable $f10_f = FLW renamable $x10, 400 :: (load (s32) from %ir.arrayidx)
renamable $f11_f = FLW renamable $x10, 404 :: (load (s32) from %ir.arrayidx1)
renamable $f12_f = FLW killed renamable $x10, 408 :: (load (s32) from %ir.arrayidx2)
PseudoTAIL target-flags(riscv-plt) @load_large_offset_float_1, implicit $x2, implicit $f10_f, implicit $f11_f, implicit $f12_f
...
---
name: load_large_offset_double
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x10
; RV32-LABEL: name: load_large_offset_double
; RV32: liveins: $x10
; RV32-NEXT: {{ $}}
; RV32-NEXT: $x11 = ADDI $x10, 768
; RV32-NEXT: renamable $f10_d = FLD $x11, 32 :: (load (s64) from %ir.arrayidx)
; RV32-NEXT: renamable $f11_d = FLD $x11, 40 :: (load (s64) from %ir.arrayidx1)
; RV32-NEXT: renamable $f12_d = FLD killed $x11, 48 :: (load (s64) from %ir.arrayidx2)
; RV32-NEXT: PseudoTAIL target-flags(riscv-plt) @load_large_offset_double_1, implicit $x2, implicit $f10_d, implicit $f11_d, implicit $f12_d
; RV64-LABEL: name: load_large_offset_double
; RV64: liveins: $x10
; RV64-NEXT: {{ $}}
; RV64-NEXT: $x11 = ADDI $x10, 768
; RV64-NEXT: renamable $f10_d = FLD $x11, 32 :: (load (s64) from %ir.arrayidx)
; RV64-NEXT: renamable $f11_d = FLD $x11, 40 :: (load (s64) from %ir.arrayidx1)
; RV64-NEXT: renamable $f12_d = FLD killed $x11, 48 :: (load (s64) from %ir.arrayidx2)
; RV64-NEXT: PseudoTAIL target-flags(riscv-plt) @load_large_offset_double_1, implicit $x2, implicit $f10_d, implicit $f11_d, implicit $f12_d
renamable $f10_d = FLD renamable $x10, 800 :: (load (s64) from %ir.arrayidx)
renamable $f11_d = FLD renamable $x10, 808 :: (load (s64) from %ir.arrayidx1)
renamable $f12_d = FLD killed renamable $x10, 816 :: (load (s64) from %ir.arrayidx2)
PseudoTAIL target-flags(riscv-plt) @load_large_offset_double_1, implicit $x2, implicit $f10_d, implicit $f11_d, implicit $f12_d
...
---
name: store_common_value_no_opt
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x10
; RV32-LABEL: name: store_common_value_no_opt
; RV32: liveins: $x10
; RV32-NEXT: {{ $}}
; RV32-NEXT: SW $x0, killed renamable $x10, 0 :: (store (s32) into %ir.a)
; RV32-NEXT: PseudoRET
; RV64-LABEL: name: store_common_value_no_opt
; RV64: liveins: $x10
; RV64-NEXT: {{ $}}
; RV64-NEXT: SW $x0, killed renamable $x10, 0 :: (store (s32) into %ir.a)
; RV64-NEXT: PseudoRET
SW $x0, killed renamable $x10, 0 :: (store (s32) into %ir.a)
PseudoRET
...
---
name: store_common_value_float_no_opt
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x10, $f16_f
; RV32-LABEL: name: store_common_value_float_no_opt
; RV32: liveins: $x10, $f16_f
; RV32-NEXT: {{ $}}
; RV32-NEXT: FSW killed renamable $f16_f, killed renamable $x10, 0 :: (store (s32) into %ir.a)
; RV32-NEXT: PseudoRET
; RV64-LABEL: name: store_common_value_float_no_opt
; RV64: liveins: $x10, $f16_f
; RV64-NEXT: {{ $}}
; RV64-NEXT: FSW killed renamable $f16_f, killed renamable $x10, 0 :: (store (s32) into %ir.a)
; RV64-NEXT: PseudoRET
FSW killed renamable $f16_f, killed renamable $x10, 0 :: (store (s32) into %ir.a)
PseudoRET
...
---
name: store_common_value_double_no_opt
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x10, $f16_d
; RV32-LABEL: name: store_common_value_double_no_opt
; RV32: liveins: $x10, $f16_d
; RV32-NEXT: {{ $}}
; RV32-NEXT: FSD killed renamable $f16_d, killed renamable $x10, 0 :: (store (s64) into %ir.a)
; RV32-NEXT: PseudoRET
; RV64-LABEL: name: store_common_value_double_no_opt
; RV64: liveins: $x10, $f16_d
; RV64-NEXT: {{ $}}
; RV64-NEXT: FSD killed renamable $f16_d, killed renamable $x10, 0 :: (store (s64) into %ir.a)
; RV64-NEXT: PseudoRET
FSD killed renamable $f16_d, killed renamable $x10, 0 :: (store (s64) into %ir.a)
PseudoRET
...
---
name: store_common_ptr_no_opt
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x16
; RV32-LABEL: name: store_common_ptr_no_opt
; RV32: liveins: $x16
; RV32-NEXT: {{ $}}
; RV32-NEXT: renamable $x10 = ADDI $x0, 1
; RV32-NEXT: SW killed renamable $x10, killed renamable $x16, 0 :: (volatile store (s32) into %ir.p)
; RV32-NEXT: PseudoRET
; RV64-LABEL: name: store_common_ptr_no_opt
; RV64: liveins: $x16
; RV64-NEXT: {{ $}}
; RV64-NEXT: renamable $x10 = ADDI $x0, 1
; RV64-NEXT: SW killed renamable $x10, killed renamable $x16, 0 :: (volatile store (s32) into %ir.p)
; RV64-NEXT: PseudoRET
renamable $x10 = ADDI $x0, 1
SW killed renamable $x10, killed renamable $x16, 0 :: (volatile store (s32) into %ir.p)
PseudoRET
...
---
name: store_common_ptr_float_no_opt
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x16, $f10_f
; RV32-LABEL: name: store_common_ptr_float_no_opt
; RV32: liveins: $x16, $f10_f
; RV32-NEXT: {{ $}}
; RV32-NEXT: FSW killed renamable $f10_f, killed renamable $x16, 0 :: (volatile store (s32) into %ir.p)
; RV32-NEXT: PseudoRET
; RV64-LABEL: name: store_common_ptr_float_no_opt
; RV64: liveins: $x16, $f10_f
; RV64-NEXT: {{ $}}
; RV64-NEXT: FSW killed renamable $f10_f, killed renamable $x16, 0 :: (volatile store (s32) into %ir.p)
; RV64-NEXT: PseudoRET
FSW killed renamable $f10_f, killed renamable $x16, 0 :: (volatile store (s32) into %ir.p)
PseudoRET
...
---
name: store_common_ptr_double_no_opt
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x16, $f10_d
; RV32-LABEL: name: store_common_ptr_double_no_opt
; RV32: liveins: $x16, $f10_d
; RV32-NEXT: {{ $}}
; RV32-NEXT: FSD killed renamable $f10_d, killed renamable $x16, 0 :: (volatile store (s64) into %ir.p)
; RV32-NEXT: PseudoRET
; RV64-LABEL: name: store_common_ptr_double_no_opt
; RV64: liveins: $x16, $f10_d
; RV64-NEXT: {{ $}}
; RV64-NEXT: FSD killed renamable $f10_d, killed renamable $x16, 0 :: (volatile store (s64) into %ir.p)
; RV64-NEXT: PseudoRET
FSD killed renamable $f10_d, killed renamable $x16, 0 :: (volatile store (s64) into %ir.p)
PseudoRET
...
---
name: load_common_ptr_no_opt
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x16
; RV32-LABEL: name: load_common_ptr_no_opt
; RV32: liveins: $x16
; RV32-NEXT: {{ $}}
; RV32-NEXT: dead renamable $x10 = LW killed renamable $x16, 0 :: (volatile load (s32) from %ir.p)
; RV32-NEXT: PseudoRET
; RV64-LABEL: name: load_common_ptr_no_opt
; RV64: liveins: $x16
; RV64-NEXT: {{ $}}
; RV64-NEXT: dead renamable $x10 = LW killed renamable $x16, 0 :: (volatile load (s32) from %ir.p)
; RV64-NEXT: PseudoRET
dead renamable $x10 = LW killed renamable $x16, 0 :: (volatile load (s32) from %ir.p)
PseudoRET
...
---
name: load_common_ptr_float_no_opt
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x16
; RV32-LABEL: name: load_common_ptr_float_no_opt
; RV32: liveins: $x16
; RV32-NEXT: {{ $}}
; RV32-NEXT: renamable $f10_f = FLW killed renamable $x16, 0 :: (load (s32) from %ir.g)
; RV32-NEXT: PseudoRET implicit $f10_f
; RV64-LABEL: name: load_common_ptr_float_no_opt
; RV64: liveins: $x16
; RV64-NEXT: {{ $}}
; RV64-NEXT: renamable $f10_f = FLW killed renamable $x16, 0 :: (load (s32) from %ir.g)
; RV64-NEXT: PseudoRET implicit $f10_f
renamable $f10_f = FLW killed renamable $x16, 0 :: (load (s32) from %ir.g)
PseudoRET implicit $f10_f
...
---
name: load_common_ptr_double_no_opt
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x16
; RV32-LABEL: name: load_common_ptr_double_no_opt
; RV32: liveins: $x16
; RV32-NEXT: {{ $}}
; RV32-NEXT: renamable $f10_d = FLD killed renamable $x16, 0 :: (load (s64) from %ir.g)
; RV32-NEXT: PseudoRET implicit $f10_d
; RV64-LABEL: name: load_common_ptr_double_no_opt
; RV64: liveins: $x16
; RV64-NEXT: {{ $}}
; RV64-NEXT: renamable $f10_d = FLD killed renamable $x16, 0 :: (load (s64) from %ir.g)
; RV64-NEXT: PseudoRET implicit $f10_d
renamable $f10_d = FLD killed renamable $x16, 0 :: (load (s64) from %ir.g)
PseudoRET implicit $f10_d
...
---
name: store_large_offset_no_opt
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x10
; RV32-LABEL: name: store_large_offset_no_opt
; RV32: liveins: $x10
; RV32-NEXT: {{ $}}
; RV32-NEXT: renamable $x11 = ADDI $x0, 1
; RV32-NEXT: SW killed renamable $x11, renamable $x10, 400 :: (volatile store (s32) into %ir.0)
; RV32-NEXT: renamable $x11 = ADDI $x0, 3
; RV32-NEXT: SW killed renamable $x11, killed renamable $x10, 404 :: (volatile store (s32) into %ir.1)
; RV32-NEXT: PseudoRET
; RV64-LABEL: name: store_large_offset_no_opt
; RV64: liveins: $x10
; RV64-NEXT: {{ $}}
; RV64-NEXT: renamable $x11 = ADDI $x0, 1
; RV64-NEXT: SW killed renamable $x11, renamable $x10, 400 :: (volatile store (s32) into %ir.0)
; RV64-NEXT: renamable $x11 = ADDI $x0, 3
; RV64-NEXT: SW killed renamable $x11, killed renamable $x10, 404 :: (volatile store (s32) into %ir.1)
; RV64-NEXT: PseudoRET
renamable $x11 = ADDI $x0, 1
SW killed renamable $x11, renamable $x10, 400 :: (volatile store (s32) into %ir.0)
renamable $x11 = ADDI $x0, 3
SW killed renamable $x11, killed renamable $x10, 404 :: (volatile store (s32) into %ir.1)
PseudoRET
...
---
name: store_large_offset_float_no_opt
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x10, $f10_f, $f11_f
; RV32-LABEL: name: store_large_offset_float_no_opt
; RV32: liveins: $x10, $f10_f, $f11_f
; RV32-NEXT: {{ $}}
; RV32-NEXT: FSW killed renamable $f10_f, renamable $x10, 400 :: (volatile store (s32) into %ir.0)
; RV32-NEXT: FSW killed renamable $f11_f, killed renamable $x10, 404 :: (volatile store (s32) into %ir.1)
; RV32-NEXT: PseudoRET
; RV64-LABEL: name: store_large_offset_float_no_opt
; RV64: liveins: $x10, $f10_f, $f11_f
; RV64-NEXT: {{ $}}
; RV64-NEXT: FSW killed renamable $f10_f, renamable $x10, 400 :: (volatile store (s32) into %ir.0)
; RV64-NEXT: FSW killed renamable $f11_f, killed renamable $x10, 404 :: (volatile store (s32) into %ir.1)
; RV64-NEXT: PseudoRET
FSW killed renamable $f10_f, renamable $x10, 400 :: (volatile store (s32) into %ir.0)
FSW killed renamable $f11_f, killed renamable $x10, 404 :: (volatile store (s32) into %ir.1)
PseudoRET
...
---
name: store_large_offset_double_no_opt
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x10, $f10_d, $f11_d
; RV32-LABEL: name: store_large_offset_double_no_opt
; RV32: liveins: $x10, $f10_d, $f11_d
; RV32-NEXT: {{ $}}
; RV32-NEXT: FSD killed renamable $f10_d, renamable $x10, 800 :: (volatile store (s64) into %ir.0)
; RV32-NEXT: FSD killed renamable $f11_d, killed renamable $x10, 808 :: (volatile store (s64) into %ir.1)
; RV32-NEXT: PseudoRET
; RV64-LABEL: name: store_large_offset_double_no_opt
; RV64: liveins: $x10, $f10_d, $f11_d
; RV64-NEXT: {{ $}}
; RV64-NEXT: FSD killed renamable $f10_d, renamable $x10, 800 :: (volatile store (s64) into %ir.0)
; RV64-NEXT: FSD killed renamable $f11_d, killed renamable $x10, 808 :: (volatile store (s64) into %ir.1)
; RV64-NEXT: PseudoRET
FSD killed renamable $f10_d, renamable $x10, 800 :: (volatile store (s64) into %ir.0)
FSD killed renamable $f11_d, killed renamable $x10, 808 :: (volatile store (s64) into %ir.1)
PseudoRET
...
---
name: load_large_offset_no_opt
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x10
; RV32-LABEL: name: load_large_offset_no_opt
; RV32: liveins: $x10
; RV32-NEXT: {{ $}}
; RV32-NEXT: dead renamable $x11 = LW renamable $x10, 400 :: (volatile load (s32) from %ir.0)
; RV32-NEXT: dead renamable $x10 = LW killed renamable $x10, 404 :: (volatile load (s32) from %ir.1)
; RV32-NEXT: PseudoRET
; RV64-LABEL: name: load_large_offset_no_opt
; RV64: liveins: $x10
; RV64-NEXT: {{ $}}
; RV64-NEXT: dead renamable $x11 = LW renamable $x10, 400 :: (volatile load (s32) from %ir.0)
; RV64-NEXT: dead renamable $x10 = LW killed renamable $x10, 404 :: (volatile load (s32) from %ir.1)
; RV64-NEXT: PseudoRET
dead renamable $x11 = LW renamable $x10, 400 :: (volatile load (s32) from %ir.0)
dead renamable $x10 = LW killed renamable $x10, 404 :: (volatile load (s32) from %ir.1)
PseudoRET
...
---
name: load_large_offset_float_no_opt
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x10
; RV32-LABEL: name: load_large_offset_float_no_opt
; RV32: liveins: $x10
; RV32-NEXT: {{ $}}
; RV32-NEXT: renamable $f10_f = FLW renamable $x10, 400 :: (load (s32) from %ir.arrayidx)
; RV32-NEXT: renamable $f11_f = FLW killed renamable $x10, 404 :: (load (s32) from %ir.arrayidx1)
; RV32-NEXT: PseudoRET implicit $f10_f, implicit $f11_f
; RV64-LABEL: name: load_large_offset_float_no_opt
; RV64: liveins: $x10
; RV64-NEXT: {{ $}}
; RV64-NEXT: renamable $f10_f = FLW renamable $x10, 400 :: (load (s32) from %ir.arrayidx)
; RV64-NEXT: renamable $f11_f = FLW killed renamable $x10, 404 :: (load (s32) from %ir.arrayidx1)
; RV64-NEXT: PseudoRET implicit $f10_f, implicit $f11_f
renamable $f10_f = FLW renamable $x10, 400 :: (load (s32) from %ir.arrayidx)
renamable $f11_f = FLW killed renamable $x10, 404 :: (load (s32) from %ir.arrayidx1)
PseudoRET implicit $f10_f, implicit $f11_f
...
---
name: load_large_offset_double_no_opt
tracksRegLiveness: true
body: |
bb.0.entry:
liveins: $x10
; RV32-LABEL: name: load_large_offset_double_no_opt
; RV32: liveins: $x10
; RV32-NEXT: {{ $}}
; RV32-NEXT: renamable $f10_d = FLD renamable $x10, 800 :: (load (s64) from %ir.arrayidx)
; RV32-NEXT: renamable $f11_d = FLD killed renamable $x10, 808 :: (load (s64) from %ir.arrayidx1)
; RV32-NEXT: PseudoRET implicit $f10_d, implicit $f11_d
; RV64-LABEL: name: load_large_offset_double_no_opt
; RV64: liveins: $x10
; RV64-NEXT: {{ $}}
; RV64-NEXT: renamable $f10_d = FLD renamable $x10, 800 :: (load (s64) from %ir.arrayidx)
; RV64-NEXT: renamable $f11_d = FLD killed renamable $x10, 808 :: (load (s64) from %ir.arrayidx1)
; RV64-NEXT: PseudoRET implicit $f10_d, implicit $f11_d
renamable $f10_d = FLD renamable $x10, 800 :: (load (s64) from %ir.arrayidx)
renamable $f11_d = FLD killed renamable $x10, 808 :: (load (s64) from %ir.arrayidx1)
PseudoRET implicit $f10_d, implicit $f11_d
...