Use getRegForValue() to materialize the address of ARM globals.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Sat, 7 Jan 2012 04:07:22 +0000 (04:07 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Sat, 7 Jan 2012 04:07:22 +0000 (04:07 +0000)
This enables basic local CSE, giving us 20% smaller code for
consumer-typeset in -O0 builds.

<rdar://problem/10658692>

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@147720 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMFastISel.cpp
test/CodeGen/ARM/fast-isel-intrinsic.ll
test/CodeGen/ARM/fast-isel.ll

index 56e3d4953043a6ced9c161db604e4a92061d8f5c..9b056d703c7159476a7a95263aa87dc207b7dd25 100644 (file)
@@ -865,16 +865,6 @@ bool ARMFastISel::ARMComputeAddress(const Value *Obj, Address &Addr) {
     }
   }
 
-  // Materialize the global variable's address into a reg which can
-  // then be used later to load the variable.
-  if (const GlobalValue *GV = dyn_cast<GlobalValue>(Obj)) {
-    unsigned Tmp = ARMMaterializeGV(GV, TLI.getValueType(Obj->getType()));
-    if (Tmp == 0) return false;
-
-    Addr.Base.Reg = Tmp;
-    return true;
-  }
-
   // Try to get this in a register if nothing else has worked.
   if (Addr.Base.Reg == 0) Addr.Base.Reg = getRegForValue(Obj);
   return Addr.Base.Reg != 0;
index 5bc35eea1e889c2b4b406c2e5fd25d54ac5b3f64..e6bdfa78d49b7addf1a46371cf303b3799bf07f2 100644 (file)
@@ -86,27 +86,21 @@ define void @t4() nounwind ssp {
 ; ARM: movw r0, :lower16:L_temp$non_lazy_ptr
 ; ARM: movt r0, :upper16:L_temp$non_lazy_ptr
 ; ARM: ldr r0, [r0]
-; ARM: movw r1, :lower16:L_temp$non_lazy_ptr
-; ARM: movt r1, :upper16:L_temp$non_lazy_ptr
-; ARM: ldr r1, [r1]
-; ARM: ldr r2, [r1, #16]
-; ARM: str r2, [r0, #4]
-; ARM: ldr r2, [r1, #20]
-; ARM: str r2, [r0, #8]
-; ARM: ldrh r1, [r1, #24]
+; ARM: ldr r1, [r0, #16]
+; ARM: str r1, [r0, #4]
+; ARM: ldr r1, [r0, #20]
+; ARM: str r1, [r0, #8]
+; ARM: ldrh r1, [r0, #24]
 ; ARM: strh r1, [r0, #12]
 ; ARM: bx lr
 ; THUMB: movw r0, :lower16:L_temp$non_lazy_ptr
 ; THUMB: movt r0, :upper16:L_temp$non_lazy_ptr
 ; THUMB: ldr r0, [r0]
-; THUMB: movw r1, :lower16:L_temp$non_lazy_ptr
-; THUMB: movt r1, :upper16:L_temp$non_lazy_ptr
-; THUMB: ldr r1, [r1]
-; THUMB: ldr r2, [r1, #16]
-; THUMB: str r2, [r0, #4]
-; THUMB: ldr r2, [r1, #20]
-; THUMB: str r2, [r0, #8]
-; THUMB: ldrh r1, [r1, #24]
+; THUMB: ldr r1, [r0, #16]
+; THUMB: str r1, [r0, #4]
+; THUMB: ldr r1, [r0, #20]
+; THUMB: str r1, [r0, #8]
+; THUMB: ldrh r1, [r0, #24]
 ; THUMB: strh r1, [r0, #12]
 ; THUMB: bx lr
   call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 4), i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 16), i32 10, i32 1, i1 false)
index c8e0211c60c853cfb28a80bbdd421f001558975e..905543a54cf5ecc71e40134749012cd06e6a8826 100644 (file)
@@ -145,22 +145,16 @@ define void @test4() {
 ; THUMB: movw r0, :lower16:L_test4g$non_lazy_ptr
 ; THUMB: movt r0, :upper16:L_test4g$non_lazy_ptr
 ; THUMB: ldr r0, [r0]
-; THUMB: ldr r0, [r0]
-; THUMB: adds r0, #1
-; THUMB: movw r1, :lower16:L_test4g$non_lazy_ptr
-; THUMB: movt r1, :upper16:L_test4g$non_lazy_ptr
-; THUMB: ldr r1, [r1]
-; THUMB: str r0, [r1]
+; THUMB: ldr r1, [r0]
+; THUMB: adds r1, #1
+; THUMB: str r1, [r0]
 
 ; ARM: movw r0, :lower16:L_test4g$non_lazy_ptr
 ; ARM: movt r0, :upper16:L_test4g$non_lazy_ptr
 ; ARM: ldr r0, [r0]
-; ARM: ldr r0, [r0]
-; ARM: add r0, r0, #1
-; ARM: movw r1, :lower16:L_test4g$non_lazy_ptr
-; ARM: movt r1, :upper16:L_test4g$non_lazy_ptr
-; ARM: ldr r1, [r1]
-; ARM: str r0, [r1]
+; ARM: ldr r1, [r0]
+; ARM: add r1, r1, #1
+; ARM: str r1, [r0]
 }
 
 ; Check unaligned stores