summaryrefslogtreecommitdiff
path: root/test/CodeGen
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2017-11-13 20:45:38 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2017-11-13 20:45:38 +0000
commitfbb029c5bbfbc7627d703014d28dd391cf420806 (patch)
tree6f67a190d918e226de24ad6d4bb0ce29fc41a62c /test/CodeGen
parentc7ea0c36fe0014df17d94b5f6675384de102148f (diff)
[arm] Fix Unnecessary reloads from GOT.
Summary: This fixes PR35221. Use pseudo-instructions to let MachineCSE hoist global address computation. Subscribers: aemerson, javed.absar, kristof.beyls, llvm-commits, hiraditya Differential Revision: https://reviews.llvm.org/D39871 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@318081 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGen')
-rw-r--r--test/CodeGen/ARM/GlobalISel/arm-select-globals-pic.mir4
-rw-r--r--test/CodeGen/ARM/load-global2.ll30
-rw-r--r--test/CodeGen/Thumb2/v8_IT_3.ll6
3 files changed, 37 insertions, 3 deletions
diff --git a/test/CodeGen/ARM/GlobalISel/arm-select-globals-pic.mir b/test/CodeGen/ARM/GlobalISel/arm-select-globals-pic.mir
index 3ef1b61211c..448a7f86e88 100644
--- a/test/CodeGen/ARM/GlobalISel/arm-select-globals-pic.mir
+++ b/test/CodeGen/ARM/GlobalISel/arm-select-globals-pic.mir
@@ -56,7 +56,7 @@ body: |
%0(p0) = G_GLOBAL_VALUE @external_global
; DARWIN-MOVT: [[G:%[0-9]+]]:gpr = MOV_ga_pcrel_ldr {{.*}} @external_global :: (load 4 from got)
; DARWIN-NOMOVT: [[G:%[0-9]+]]:gpr = LDRLIT_ga_pcrel_ldr {{.*}}@external_global :: (load 4 from got)
- ; ELF: [[G:%[0-9]+]]:gpr = LDRLIT_ga_pcrel_ldr @external_global :: (load 4 from got)
+ ; ELF: [[G:%[0-9]+]]:gpr = LDRLIT_ga_pcrel_ldr target-flags(<unknown>) @external_global :: (load 4 from got)
%1(s32) = G_LOAD %0(p0) :: (load 4 from @external_global)
; CHECK: [[V:%[0-9]+]]:gpr = LDRi12 [[G]], 0, 14, _ :: (load 4 from @external_global)
@@ -108,7 +108,7 @@ body: |
%0(p0) = G_GLOBAL_VALUE @external_constant
; DARWIN-MOVT: [[G:%[0-9]+]]:gpr = MOV_ga_pcrel_ldr {{.*}} @external_constant :: (load 4 from got)
; DARWIN-NOMOVT: [[G:%[0-9]+]]:gpr = LDRLIT_ga_pcrel_ldr {{.*}}@external_constant :: (load 4 from got)
- ; ELF: [[G:%[0-9]+]]:gpr = LDRLIT_ga_pcrel_ldr @external_constant :: (load 4 from got)
+ ; ELF: [[G:%[0-9]+]]:gpr = LDRLIT_ga_pcrel_ldr target-flags(<unknown>) @external_constant :: (load 4 from got)
%1(s32) = G_LOAD %0(p0) :: (load 4 from @external_constant)
; CHECK: [[V:%[0-9]+]]:gpr = LDRi12 [[G]], 0, 14, _ :: (load 4 from @external_constant)
diff --git a/test/CodeGen/ARM/load-global2.ll b/test/CodeGen/ARM/load-global2.ll
new file mode 100644
index 00000000000..7ffd65ce7ed
--- /dev/null
+++ b/test/CodeGen/ARM/load-global2.ll
@@ -0,0 +1,30 @@
+; PR35221. Test that external global address is not reloaded from GOT in each BB.
+; RUN: llc < %s -mtriple=armv7-linux-gnueabi -relocation-model=pic | FileCheck %s -check-prefix=LINUX-PIC
+
+@x = external global i8, align 1
+
+define signext i8 @foo() {
+entry:
+; LINUX-PIC: ldr r[[A:.]], .LCPI0_0
+; LINUX-PIC: ldr r[[B:.]], [pc, r[[A]]]
+; LINUX-PIC: ldrb r{{.}}, [r[[B]]]
+ %0 = load i8, i8* @x
+ %tobool = icmp eq i8 %0, 0
+ br i1 %tobool, label %bb1, label %bb2
+
+bb1:
+ call void @bar()
+; No more pc-relative loads! Reuse r[[B]].
+; LINUX-PIC: bl bar
+; LINUX-PIC-NOT: ldr{{.*}}[pc,
+; LINUX-PIC: ldrsb r{{.}}, [r[[B]]]
+ %1 = load i8, i8* @x
+ ret i8 %1
+
+bb2:
+ ret i8 0
+}
+
+declare void @bar()
+
+
diff --git a/test/CodeGen/Thumb2/v8_IT_3.ll b/test/CodeGen/Thumb2/v8_IT_3.ll
index 78b51a03308..dfa379e1f81 100644
--- a/test/CodeGen/Thumb2/v8_IT_3.ll
+++ b/test/CodeGen/Thumb2/v8_IT_3.ll
@@ -55,7 +55,11 @@ bb4:
; CHECK-PIC: cmp
; CHECK-PIC: cmp
; CHECK-PIC: cmp
-; CHECK-PIC-NEXT: bne
+; CHECK-PIC: it eq
+; CHECK-PIC-NEXT: ldreq
+; CHECK-PIC-NEXT: it eq
+; CHECK-PIC-NEXT: cmpeq
+; CHECK-PIC-NEXT: beq
; CHECK-PIC: %bb6
; CHECK-PIC-NEXT: movs
; CHECK-PIC-NEXT: add