[ARM] Promote small global constants to constant pools
authorJames Molloy <james.molloy@arm.com>
Wed, 14 Sep 2016 14:47:27 +0000 (14:47 +0000)
committerJames Molloy <james.molloy@arm.com>
Wed, 14 Sep 2016 14:47:27 +0000 (14:47 +0000)
commit13065b00ba3411d36e7bfbedd4858dc7f6db6e3a
treefc3bdfc1f842fd5f1345027e197b9166e4a1f08c
parentd3b2321f78974063f2ca01e91725496f29a36918
[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: 281484
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]