diff options
author | Chris Lattner <sabre@nondot.org> | 2007-10-13 06:58:48 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-10-13 06:58:48 +0000 |
commit | e33544ce55ca18e6e9c90ab7a4de85c90f907258 (patch) | |
tree | 50fbe0d49ef52c7caa4feeeb2b52b545c1329d53 /lib/Support/MemoryBuffer.cpp | |
parent | f8f7cf398768dc6be39cb6ca2ec7f8c125c8882f (diff) |
Enhance the truncstore optimization code to handle shifted
values and propagate demanded bits through them in simple cases.
This allows this code:
void foo(char *P) {
strcpy(P, "abc");
}
to compile to:
_foo:
ldrb r3, [r1]
ldrb r2, [r1, #+1]
ldrb r12, [r1, #+2]!
ldrb r1, [r1, #+1]
strb r1, [r0, #+3]
strb r2, [r0, #+1]
strb r12, [r0, #+2]
strb r3, [r0]
bx lr
instead of:
_foo:
ldrb r3, [r1, #+3]
ldrb r2, [r1, #+2]
orr r3, r2, r3, lsl #8
ldrb r2, [r1, #+1]
ldrb r1, [r1]
orr r2, r1, r2, lsl #8
orr r3, r2, r3, lsl #16
strb r3, [r0]
mov r2, r3, lsr #24
strb r2, [r0, #+3]
mov r2, r3, lsr #16
strb r2, [r0, #+2]
mov r3, r3, lsr #8
strb r3, [r0, #+1]
bx lr
testcase here: test/CodeGen/ARM/truncstore-dag-combine.ll
This also helps occasionally for X86 and other cases not involving
unaligned load/stores.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@42954 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support/MemoryBuffer.cpp')
0 files changed, 0 insertions, 0 deletions