diff options
| author | David Green <david.green@arm.com> | 2019-01-29 10:40:31 +0000 |
|---|---|---|
| committer | David Green <david.green@arm.com> | 2019-01-29 10:40:31 +0000 |
| commit | 54b011554715919de3f277e8dc1bf500f5b2b32c (patch) | |
| tree | 2a6532946f6ca531a2ea80f449646a96dc408bab /llvm/test/CodeGen/ARM/load.ll | |
| parent | 0b7fce6d72f54c5c45aa98e1cee938b6c2b64303 (diff) | |
| download | bcm5719-llvm-54b011554715919de3f277e8dc1bf500f5b2b32c.tar.gz bcm5719-llvm-54b011554715919de3f277e8dc1bf500f5b2b32c.zip | |
[ARM] Use sub for negative offset load/store in thumb1
This attempts to optimise negative values used in load/store operands
a little. We currently try to selct them as rr, materialising the
negative constant using a MOV/MVN pair. This instead selects ri with
an immediate of 0, forcing the add node to become a simpler sub.
Differential Revision: https://reviews.llvm.org/D57121
llvm-svn: 352475
Diffstat (limited to 'llvm/test/CodeGen/ARM/load.ll')
| -rw-r--r-- | llvm/test/CodeGen/ARM/load.ll | 60 |
1 files changed, 24 insertions, 36 deletions
diff --git a/llvm/test/CodeGen/ARM/load.ll b/llvm/test/CodeGen/ARM/load.ll index d44bdac97a0..f33294267f5 100644 --- a/llvm/test/CodeGen/ARM/load.ll +++ b/llvm/test/CodeGen/ARM/load.ll @@ -608,9 +608,8 @@ entry: define i32 @ldrb_ri_negative(i8* %p) { ; CHECK-T1-LABEL: ldrb_ri_negative: ; CHECK-T1: @ %bb.0: @ %entry -; CHECK-T1-NEXT: movs r1, #0 -; CHECK-T1-NEXT: mvns r1, r1 -; CHECK-T1-NEXT: ldrb r0, [r0, r1] +; CHECK-T1-NEXT: subs r0, r0, #1 +; CHECK-T1-NEXT: ldrb r0, [r0] ; CHECK-T1-NEXT: bx lr ; ; CHECK-T2-LABEL: ldrb_ri_negative: @@ -627,9 +626,8 @@ entry: define i32 @ldrh_ri_negative(i8* %p) { ; CHECK-T1-LABEL: ldrh_ri_negative: ; CHECK-T1: @ %bb.0: @ %entry -; CHECK-T1-NEXT: movs r1, #0 -; CHECK-T1-NEXT: mvns r1, r1 -; CHECK-T1-NEXT: ldrh r0, [r0, r1] +; CHECK-T1-NEXT: subs r0, r0, #1 +; CHECK-T1-NEXT: ldrh r0, [r0] ; CHECK-T1-NEXT: bx lr ; ; CHECK-T2-LABEL: ldrh_ri_negative: @@ -647,9 +645,8 @@ entry: define i32 @ldr_ri_negative(i8* %p) { ; CHECK-T1-LABEL: ldr_ri_negative: ; CHECK-T1: @ %bb.0: @ %entry -; CHECK-T1-NEXT: movs r1, #0 -; CHECK-T1-NEXT: mvns r1, r1 -; CHECK-T1-NEXT: ldr r0, [r0, r1] +; CHECK-T1-NEXT: subs r0, r0, #1 +; CHECK-T1-NEXT: ldr r0, [r0] ; CHECK-T1-NEXT: bx lr ; ; CHECK-T2-LABEL: ldr_ri_negative: @@ -666,9 +663,8 @@ entry: define void @strb_ri_negative(i8* %p, i32 %x) { ; CHECK-T1-LABEL: strb_ri_negative: ; CHECK-T1: @ %bb.0: @ %entry -; CHECK-T1-NEXT: movs r2, #0 -; CHECK-T1-NEXT: mvns r2, r2 -; CHECK-T1-NEXT: strb r1, [r0, r2] +; CHECK-T1-NEXT: subs r0, r0, #1 +; CHECK-T1-NEXT: strb r1, [r0] ; CHECK-T1-NEXT: bx lr ; ; CHECK-T2-LABEL: strb_ri_negative: @@ -685,9 +681,8 @@ entry: define void @strh_ri_negative(i8* %p, i32 %x) { ; CHECK-T1-LABEL: strh_ri_negative: ; CHECK-T1: @ %bb.0: @ %entry -; CHECK-T1-NEXT: movs r2, #0 -; CHECK-T1-NEXT: mvns r2, r2 -; CHECK-T1-NEXT: strh r1, [r0, r2] +; CHECK-T1-NEXT: subs r0, r0, #1 +; CHECK-T1-NEXT: strh r1, [r0] ; CHECK-T1-NEXT: bx lr ; ; CHECK-T2-LABEL: strh_ri_negative: @@ -705,9 +700,8 @@ entry: define void @str_ri_negative(i8* %p, i32 %x) { ; CHECK-T1-LABEL: str_ri_negative: ; CHECK-T1: @ %bb.0: @ %entry -; CHECK-T1-NEXT: movs r2, #0 -; CHECK-T1-NEXT: mvns r2, r2 -; CHECK-T1-NEXT: str r1, [r0, r2] +; CHECK-T1-NEXT: subs r0, r0, #1 +; CHECK-T1-NEXT: str r1, [r0] ; CHECK-T1-NEXT: bx lr ; ; CHECK-T2-LABEL: str_ri_negative: @@ -766,9 +760,8 @@ entry: define i32 @ldrb_ri_negative255(i8* %p) { ; CHECK-T1-LABEL: ldrb_ri_negative255: ; CHECK-T1: @ %bb.0: @ %entry -; CHECK-T1-NEXT: movs r1, #254 -; CHECK-T1-NEXT: mvns r1, r1 -; CHECK-T1-NEXT: ldrb r0, [r0, r1] +; CHECK-T1-NEXT: subs r0, #255 +; CHECK-T1-NEXT: ldrb r0, [r0] ; CHECK-T1-NEXT: bx lr ; ; CHECK-T2-LABEL: ldrb_ri_negative255: @@ -785,9 +778,8 @@ entry: define i32 @ldrh_ri_negative255(i8* %p) { ; CHECK-T1-LABEL: ldrh_ri_negative255: ; CHECK-T1: @ %bb.0: @ %entry -; CHECK-T1-NEXT: movs r1, #254 -; CHECK-T1-NEXT: mvns r1, r1 -; CHECK-T1-NEXT: ldrh r0, [r0, r1] +; CHECK-T1-NEXT: subs r0, #255 +; CHECK-T1-NEXT: ldrh r0, [r0] ; CHECK-T1-NEXT: bx lr ; ; CHECK-T2-LABEL: ldrh_ri_negative255: @@ -805,9 +797,8 @@ entry: define i32 @ldr_ri_negative255(i8* %p) { ; CHECK-T1-LABEL: ldr_ri_negative255: ; CHECK-T1: @ %bb.0: @ %entry -; CHECK-T1-NEXT: movs r1, #254 -; CHECK-T1-NEXT: mvns r1, r1 -; CHECK-T1-NEXT: ldr r0, [r0, r1] +; CHECK-T1-NEXT: subs r0, #255 +; CHECK-T1-NEXT: ldr r0, [r0] ; CHECK-T1-NEXT: bx lr ; ; CHECK-T2-LABEL: ldr_ri_negative255: @@ -824,9 +815,8 @@ entry: define void @strb_ri_negative255(i8* %p, i32 %x) { ; CHECK-T1-LABEL: strb_ri_negative255: ; CHECK-T1: @ %bb.0: @ %entry -; CHECK-T1-NEXT: movs r2, #254 -; CHECK-T1-NEXT: mvns r2, r2 -; CHECK-T1-NEXT: strb r1, [r0, r2] +; CHECK-T1-NEXT: subs r0, #255 +; CHECK-T1-NEXT: strb r1, [r0] ; CHECK-T1-NEXT: bx lr ; ; CHECK-T2-LABEL: strb_ri_negative255: @@ -843,9 +833,8 @@ entry: define void @strh_ri_negative255(i8* %p, i32 %x) { ; CHECK-T1-LABEL: strh_ri_negative255: ; CHECK-T1: @ %bb.0: @ %entry -; CHECK-T1-NEXT: movs r2, #254 -; CHECK-T1-NEXT: mvns r2, r2 -; CHECK-T1-NEXT: strh r1, [r0, r2] +; CHECK-T1-NEXT: subs r0, #255 +; CHECK-T1-NEXT: strh r1, [r0] ; CHECK-T1-NEXT: bx lr ; ; CHECK-T2-LABEL: strh_ri_negative255: @@ -863,9 +852,8 @@ entry: define void @str_ri_negative255(i8* %p, i32 %x) { ; CHECK-T1-LABEL: str_ri_negative255: ; CHECK-T1: @ %bb.0: @ %entry -; CHECK-T1-NEXT: movs r2, #254 -; CHECK-T1-NEXT: mvns r2, r2 -; CHECK-T1-NEXT: str r1, [r0, r2] +; CHECK-T1-NEXT: subs r0, #255 +; CHECK-T1-NEXT: str r1, [r0] ; CHECK-T1-NEXT: bx lr ; ; CHECK-T2-LABEL: str_ri_negative255: |

