mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	ARMLoadStoreOptimizer: Create LDRD/STRD on thumb2
Re-apply r241926 with an additional check that r13 and r15 are not used for LDRD/STRD. See http://llvm.org/PR24190. This also already includes the fix from r241951. Differential Revision: http://reviews.llvm.org/D10623 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242742 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		@@ -25,8 +25,7 @@ entry:
 | 
			
		||||
  ;CHECK: push {r7, lr}
 | 
			
		||||
  ;CHECK: sub sp, #4
 | 
			
		||||
  ;CHECK: add r0, sp, #12
 | 
			
		||||
  ;CHECK: str r2, [sp, #16]
 | 
			
		||||
  ;CHECK: str r1, [sp, #12]
 | 
			
		||||
  ;CHECK: strd r1, r2, [sp, #12]
 | 
			
		||||
  ;CHECK: bl  fooUseStruct
 | 
			
		||||
  call void @fooUseStruct(%st_t* %p1)
 | 
			
		||||
  ret void
 | 
			
		||||
 
 | 
			
		||||
@@ -28,8 +28,7 @@ define i32 @test_align8(i8*, [4 x i32]* byval align 8 %b) {
 | 
			
		||||
; CHECK: push {r4, r7, lr}
 | 
			
		||||
; CHECK: add r7, sp, #4
 | 
			
		||||
 | 
			
		||||
; CHECK-DAG: str r2, [r7, #8]
 | 
			
		||||
; CHECK-DAG: str r3, [r7, #12]
 | 
			
		||||
; CHECK: strd r2, r3, [r7, #8]
 | 
			
		||||
 | 
			
		||||
; CHECK: ldr r0, [r7, #8]
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,6 +3,7 @@
 | 
			
		||||
; rdar://6949835
 | 
			
		||||
; RUN: llc < %s -mtriple=thumbv7-apple-ios -mcpu=cortex-a8 -regalloc=basic | FileCheck %s -check-prefix=BASIC -check-prefix=CHECK
 | 
			
		||||
; RUN: llc < %s -mtriple=thumbv7-apple-ios -mcpu=cortex-a8 -regalloc=greedy | FileCheck %s -check-prefix=GREEDY -check-prefix=CHECK
 | 
			
		||||
; RUN: llc < %s -mtriple=thumbv7-apple-ios -mcpu=swift | FileCheck %s -check-prefix=SWIFT -check-prefix=CHECK
 | 
			
		||||
 | 
			
		||||
; Magic ARM pair hints works best with linearscan / fast.
 | 
			
		||||
 | 
			
		||||
@@ -110,5 +111,25 @@ entry:
 | 
			
		||||
  ret void
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
; CHECK-LABEL: strd_spill_ldrd_reload:
 | 
			
		||||
; A8: strd r1, r0, [sp]
 | 
			
		||||
; M3: strd r1, r0, [sp]
 | 
			
		||||
; BASIC: strd r1, r0, [sp]
 | 
			
		||||
; GREEDY: strd r0, r1, [sp]
 | 
			
		||||
; CHECK: @ InlineAsm Start
 | 
			
		||||
; CHECK: @ InlineAsm End
 | 
			
		||||
; A8: ldrd r2, r1, [sp]
 | 
			
		||||
; M3: ldrd r2, r1, [sp]
 | 
			
		||||
; BASIC: ldrd r2, r1, [sp]
 | 
			
		||||
; GREEDY: ldrd r1, r2, [sp]
 | 
			
		||||
; CHECK: bl{{x?}} _extfunc
 | 
			
		||||
define void @strd_spill_ldrd_reload(i32 %v0, i32 %v1) {
 | 
			
		||||
  ; force %v0 and %v1 to be spilled
 | 
			
		||||
  call void asm sideeffect "", "~{r0},~{r1},~{r2},~{r3},~{r4},~{r5},~{r6},~{r7},~{r8},~{r9},~{r10},~{r11},~{r12},~{lr}"()
 | 
			
		||||
  ; force the reloaded %v0, %v1 into different registers
 | 
			
		||||
  call void @extfunc(i32 0, i32 %v0, i32 %v1, i32 7)
 | 
			
		||||
  ret void
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind
 | 
			
		||||
declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind
 | 
			
		||||
 
 | 
			
		||||
@@ -4,8 +4,7 @@ define void @t1(i8* nocapture %c) nounwind optsize {
 | 
			
		||||
entry:
 | 
			
		||||
; CHECK-LABEL: t1:
 | 
			
		||||
; CHECK: movs r1, #0
 | 
			
		||||
; CHECK: str r1, [r0]
 | 
			
		||||
; CHECK: str r1, [r0, #4]
 | 
			
		||||
; CHECK: strd r1, r1, [r0]
 | 
			
		||||
; CHECK: str r1, [r0, #8]
 | 
			
		||||
  call void @llvm.memset.p0i8.i64(i8* %c, i8 0, i64 12, i32 8, i1 false)
 | 
			
		||||
  ret void
 | 
			
		||||
 
 | 
			
		||||
@@ -5,16 +5,20 @@ target triple = "thumbv7--linux-gnueabi"
 | 
			
		||||
 | 
			
		||||
declare i8* @llvm.returnaddress(i32)
 | 
			
		||||
 | 
			
		||||
define i32* @wrong-t2stmia-size-reduction(i32* %addr, i32 %val0) minsize {
 | 
			
		||||
define i32* @wrong-t2stmia-size-reduction(i32* %addr, i32 %val0, i32 %val1) minsize {
 | 
			
		||||
  store i32 %val0, i32* %addr
 | 
			
		||||
  %addr1 = getelementptr i32, i32* %addr, i32 1
 | 
			
		||||
  %addr2 = getelementptr i32, i32* %addr, i32 2
 | 
			
		||||
  %lr = call i8* @llvm.returnaddress(i32 0)
 | 
			
		||||
  %lr32 = ptrtoint i8* %lr to i32
 | 
			
		||||
  store i32 %lr32, i32* %addr1
 | 
			
		||||
  %addr2 = getelementptr i32, i32* %addr1, i32 1
 | 
			
		||||
  ret i32* %addr2
 | 
			
		||||
  store i32 %val1, i32* %addr1
 | 
			
		||||
  store i32 %lr32, i32* %addr2
 | 
			
		||||
 | 
			
		||||
  %addr3 = getelementptr i32, i32* %addr, i32 3
 | 
			
		||||
  ret i32* %addr3
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
; Check that stm writes two registers.  The bug caused one of registers (LR,
 | 
			
		||||
; Check that stm writes three registers.  The bug caused one of registers (LR,
 | 
			
		||||
; which invalid for Thumb1 form of STMIA instruction) to be dropped.
 | 
			
		||||
; CHECK: stm{{[^,]*}}, {{{.*,.*}}}
 | 
			
		||||
; CHECK-LABEL: wrong-t2stmia-size-reduction:
 | 
			
		||||
; CHECK: stm{{[^,]*}}, {{{.*,.*,.*}}}
 | 
			
		||||
 
 | 
			
		||||
@@ -33,8 +33,7 @@ define float @float_on_stack(double %a, double %b, double %c, double %d, double
 | 
			
		||||
 | 
			
		||||
define double @double_on_stack(double %a, double %b, double %c, double %d, double %e, double %f, double %g, double %h, double %i) {
 | 
			
		||||
; CHECK-LABEL: double_on_stack:
 | 
			
		||||
; SOFT: ldr r0, [sp, #48]
 | 
			
		||||
; SOFT: ldr r1, [sp, #52]
 | 
			
		||||
; SOFT: ldrd r0, r1, [sp, #48]
 | 
			
		||||
; HARD: vldr d0, [sp]
 | 
			
		||||
; CHECK-NEXT: bx lr
 | 
			
		||||
  ret double %i
 | 
			
		||||
@@ -42,8 +41,7 @@ define double @double_on_stack(double %a, double %b, double %c, double %d, doubl
 | 
			
		||||
 | 
			
		||||
define double @double_not_split(double %a, double %b, double %c, double %d, double %e, double %f, double %g, float %h, double %i) {
 | 
			
		||||
; CHECK-LABEL: double_not_split:
 | 
			
		||||
; SOFT: ldr r0, [sp, #48]
 | 
			
		||||
; SOFT: ldr r1, [sp, #52]
 | 
			
		||||
; SOFT: ldrd r0, r1, [sp, #48]
 | 
			
		||||
; HARD: vldr d0, [sp]
 | 
			
		||||
; CHECK-NEXT: bx lr
 | 
			
		||||
  ret double %i
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user