[ARM] Promote small global constants to constant pools
authorJames Molloy <james.molloy@arm.com>
Tue, 13 Sep 2016 10:28:11 +0000 (10:28 +0000)
committerJames Molloy <james.molloy@arm.com>
Tue, 13 Sep 2016 10:28:11 +0000 (10:28 +0000)
commit3e4bc661345ff7c904bc4f895a2b0f312fd851f5
tree5837694e91a45cc630acccb785f127fc28428ceb
parent0d0bbfd63e4887b9848f0b2b6cbd6bf588ff869e
[ARM] Promote small global constants to constant pools

If a constant is unamed_addr and is only used within one function, we can save
on the code size and runtime cost of an indirection by changing the global's storage
to inside the constant pool. For example, instead of:

      ldr r0, .CPI0
      bl printf
      bx lr
    .CPI0: &format_string
    format_string: .asciz "hello, world!\n"

We can emit:

      adr r0, .CPI0
      bl printf
      bx lr
    .CPI0: .asciz "hello, world!\n"

This can cause significant code size savings when many small strings are used in one
function (4 bytes per string).

llvm-svn: 281314
llvm/lib/Target/ARM/ARMAsmPrinter.cpp
llvm/lib/Target/ARM/ARMAsmPrinter.h
llvm/lib/Target/ARM/ARMISelLowering.cpp
llvm/lib/Target/ARM/ARMMachineFunctionInfo.h
llvm/test/CodeGen/ARM/constantpool-promote.ll [new file with mode: 0644]