Extend #179838 to include more loads to rematerialize. --------- Co-authored-by: anoopkg6 <anoopkg6@github.com>
123 lines
4.7 KiB
LLVM
123 lines
4.7 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
|
|
; Test avoiding the unnecessary spill by marking loads as rematerializable and
|
|
; just directly loading from where the argument was originally passed on the
|
|
; stack - moving the load down to the remat site.
|
|
|
|
; RUN: llc < %s -verify-machineinstrs -mtriple=s390x-linux-gnu -O1 | FileCheck %s
|
|
|
|
define void @remat_load(
|
|
; CHECK-LABEL: remat_load:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: stmg %r6, %r15, 48(%r15)
|
|
; CHECK-NEXT: aghi %r15, -64
|
|
; CHECK-NEXT: std %f8, 56(%r15) # 8-byte Spill
|
|
; CHECK-NEXT: std %f9, 48(%r15) # 8-byte Spill
|
|
; CHECK-NEXT: std %f10, 40(%r15) # 8-byte Spill
|
|
; CHECK-NEXT: std %f11, 32(%r15) # 8-byte Spill
|
|
; CHECK-NEXT: std %f12, 24(%r15) # 8-byte Spill
|
|
; CHECK-NEXT: std %f13, 16(%r15) # 8-byte Spill
|
|
; CHECK-NEXT: std %f14, 8(%r15) # 8-byte Spill
|
|
; CHECK-NEXT: std %f15, 0(%r15) # 8-byte Spill
|
|
; CHECK-NEXT: ld %f0, 280(%r15)
|
|
; CHECK-NEXT: le %f1, 276(%r15)
|
|
; CHECK-NEXT: le %f2, 268(%r15)
|
|
; CHECK-NEXT: le %f3, 260(%r15)
|
|
; CHECK-NEXT: lg %r14, 288(%r15)
|
|
; CHECK-NEXT: lb %r3, 231(%r15)
|
|
; CHECK-NEXT: lh %r2, 238(%r15)
|
|
; CHECK-NEXT: l %r1, 244(%r15)
|
|
; CHECK-NEXT: lg %r0, 248(%r15)
|
|
; CHECK-NEXT: stc %r3, 0(%r14)
|
|
; CHECK-NEXT: sth %r2, 0(%r14)
|
|
; CHECK-NEXT: st %r1, 0(%r14)
|
|
; CHECK-NEXT: stg %r0, 0(%r14)
|
|
; CHECK-NEXT: ste %f3, 0(%r14)
|
|
; CHECK-NEXT: ste %f2, 0(%r14)
|
|
; CHECK-NEXT: ste %f1, 0(%r14)
|
|
; CHECK-NEXT: std %f0, 0(%r14)
|
|
; CHECK-NEXT: #APP
|
|
; CHECK-NEXT: #NO_APP
|
|
; CHECK-NEXT: lb %r0, 231(%r15)
|
|
; CHECK-NEXT: stc %r0, 0(%r14)
|
|
; CHECK-NEXT: lh %r0, 238(%r15)
|
|
; CHECK-NEXT: sth %r0, 0(%r14)
|
|
; CHECK-NEXT: l %r0, 244(%r15)
|
|
; CHECK-NEXT: st %r0, 0(%r14)
|
|
; CHECK-NEXT: lg %r0, 248(%r15)
|
|
; CHECK-NEXT: stg %r0, 0(%r14)
|
|
; CHECK-NEXT: le %f0, 260(%r15)
|
|
; CHECK-NEXT: ste %f0, 0(%r14)
|
|
; CHECK-NEXT: le %f0, 268(%r15)
|
|
; CHECK-NEXT: ste %f0, 0(%r14)
|
|
; CHECK-NEXT: le %f0, 276(%r15)
|
|
; CHECK-NEXT: ste %f0, 0(%r14)
|
|
; CHECK-NEXT: ld %f0, 280(%r15)
|
|
; CHECK-NEXT: std %f0, 0(%r14)
|
|
; CHECK-NEXT: ld %f8, 56(%r15) # 8-byte Reload
|
|
; CHECK-NEXT: ld %f9, 48(%r15) # 8-byte Reload
|
|
; CHECK-NEXT: ld %f10, 40(%r15) # 8-byte Reload
|
|
; CHECK-NEXT: ld %f11, 32(%r15) # 8-byte Reload
|
|
; CHECK-NEXT: ld %f12, 24(%r15) # 8-byte Reload
|
|
; CHECK-NEXT: ld %f13, 16(%r15) # 8-byte Reload
|
|
; CHECK-NEXT: ld %f14, 8(%r15) # 8-byte Reload
|
|
; CHECK-NEXT: ld %f15, 0(%r15) # 8-byte Reload
|
|
; CHECK-NEXT: lmg %r6, %r15, 112(%r15)
|
|
; CHECK-NEXT: br %r14
|
|
i64 %i0, i64 %i1, i64 %i2, i64 %i3, i64 %i4, ; r2-r6
|
|
double %f0, double %f1, double %f2, double %f3, ; f0, f2, f4, f6
|
|
i8 %stackarg0,
|
|
i16 %stackarg1,
|
|
i32 %stackarg2,
|
|
i64 %stackarg3,
|
|
float %stackarg4,
|
|
float %stackarg5,
|
|
float %stackarg6,
|
|
double %stackarg7,
|
|
ptr %p
|
|
) nounwind {
|
|
entry:
|
|
; Add a use of the stack arguments here so that we will have to load them from
|
|
; the stack before the inline asm. Otherwise we would be exercising the
|
|
; machine scheduler, not rematerialization.
|
|
store volatile i8 %stackarg0, ptr %p
|
|
store volatile i16 %stackarg1, ptr %p
|
|
store volatile i32 %stackarg2, ptr %p
|
|
store volatile i64 %stackarg3, ptr %p
|
|
store volatile float %stackarg4, ptr %p
|
|
store volatile float %stackarg5, ptr %p
|
|
store volatile float %stackarg6, ptr %p
|
|
store volatile double %stackarg7, ptr %p
|
|
; Clobber registers to force re-loads
|
|
tail call void asm sideeffect "", "~{r0},~{r1},~{r2},~{r3},~{r4},~{r5},~{r6},~{r7},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{f0},~{f1},~{f2},~{f3},~{f4},~{f5},~{f6},~{f7},~{f8},~{f9},~{f10},~{f11},~{f12},~{f13},~{f14},~{f15}"()
|
|
; Now use them after spilling everything to force rematerialization
|
|
store volatile i8 %stackarg0, ptr %p
|
|
store volatile i16 %stackarg1, ptr %p
|
|
store volatile i32 %stackarg2, ptr %p
|
|
store volatile i64 %stackarg3, ptr %p
|
|
store volatile float %stackarg4, ptr %p
|
|
store volatile float %stackarg5, ptr %p
|
|
store volatile float %stackarg6, ptr %p
|
|
store volatile double %stackarg7, ptr %p
|
|
ret void
|
|
}
|
|
|
|
@const = external constant i32
|
|
; Remat the load of the constant global.
|
|
define i32 @constglobal_load() nounwind {
|
|
; CHECK-LABEL: constglobal_load:
|
|
; CHECK: # %bb.0: # %entry
|
|
; CHECK-NEXT: stmg %r6, %r15, 48(%r15)
|
|
; CHECK-NEXT: #APP
|
|
; CHECK-NEXT: #NO_APP
|
|
; CHECK-NEXT: lhi %r2, 1
|
|
; CHECK-NEXT: lgrl %r1, const@GOT
|
|
; CHECK-NEXT: a %r2, 0(%r1)
|
|
; CHECK-NEXT: lmg %r6, %r15, 48(%r15)
|
|
; CHECK-NEXT: br %r14
|
|
entry:
|
|
%global = load i32, ptr @const
|
|
tail call void asm sideeffect "", "~{r0},~{r1},~{r2},~{r3},~{r4},~{r5},~{r6},~{r7},~{r8},~{r9},~{r10},~{r11},~{r12},~{r13},~{r14},~{r15}"()
|
|
%a = add i32 %global, 1
|
|
ret i32 %a
|
|
}
|