Skip to content

Commit 535ed4e

Browse files
committed
[ARM] Prefer << 31 >> 31 over -(a & 1) for THUMB1 only
Materializing the 1 requires its own instruction for Thumb1
1 parent b698927 commit 535ed4e

File tree

3 files changed

+23
-16
lines changed

3 files changed

+23
-16
lines changed

llvm/lib/Target/ARM/ARMInstrThumb.td

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1571,6 +1571,14 @@ def : T1Pat<(ARMcmpZ tGPR:$Rn, imm0_255:$imm8),
15711571
def : T1Pat<(ARMcmpZ tGPR:$Rn, tGPR:$Rm),
15721572
(tCMPr tGPR:$Rn, tGPR:$Rm)>;
15731573

1574+
// -(n & 1) -> (n << 31) >> 31 to avoid materializing constants on Thumb1
1575+
def : T1Pat<(ineg (and tGPR:$Rn, (i32 1))),
1576+
(tASRri (tLSLri tGPR:$Rn, 31), 31)>,
1577+
Requires<[IsThumb, IsThumb1Only]>;
1578+
def : T1Pat<(sub (i32 0), (and tGPR:$Rn, (i32 1))),
1579+
(tASRri (tLSLri tGPR:$Rn, 31), 31)>,
1580+
Requires<[IsThumb, IsThumb1Only]>;
1581+
15741582
// Bswap 16 with load/store
15751583
def : T1Pat<(srl (bswap (extloadi16 t_addrmode_is2:$addr)), (i32 16)),
15761584
(tREV16 (tLDRHi t_addrmode_is2:$addr))>;

llvm/test/CodeGen/ARM/select_const.ll

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -276,9 +276,8 @@ define i32 @select_neg1_or_0(i1 %cond) {
276276
;
277277
; THUMB-LABEL: select_neg1_or_0:
278278
; THUMB: @ %bb.0:
279-
; THUMB-NEXT: movs r1, #1
280-
; THUMB-NEXT: ands r1, r0
281-
; THUMB-NEXT: rsbs r0, r1, #0
279+
; THUMB-NEXT: lsls r0, r0, #31
280+
; THUMB-NEXT: asrs r0, r0, #31
282281
; THUMB-NEXT: bx lr
283282
%sel = select i1 %cond, i32 -1, i32 0
284283
ret i32 %sel

llvm/test/CodeGen/Thumb/srem-seteq-illegal-types.ll

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -81,15 +81,14 @@ define <3 x i1> @test_srem_vec(<3 x i33> %X) nounwind {
8181
; CHECK-NEXT: push {r4, r5, r6, r7, lr}
8282
; CHECK-NEXT: .pad #12
8383
; CHECK-NEXT: sub sp, #12
84-
; CHECK-NEXT: movs r7, r3
85-
; CHECK-NEXT: str r2, [sp, #4] @ 4-byte Spill
86-
; CHECK-NEXT: movs r5, #1
87-
; CHECK-NEXT: ands r1, r5
88-
; CHECK-NEXT: rsbs r1, r1, #0
84+
; CHECK-NEXT: str r3, [sp, #4] @ 4-byte Spill
85+
; CHECK-NEXT: movs r5, r2
86+
; CHECK-NEXT: lsls r1, r1, #31
87+
; CHECK-NEXT: asrs r1, r1, #31
8988
; CHECK-NEXT: movs r6, #9
90-
; CHECK-NEXT: movs r3, #0
91-
; CHECK-NEXT: str r3, [sp] @ 4-byte Spill
89+
; CHECK-NEXT: movs r7, #0
9290
; CHECK-NEXT: movs r2, r6
91+
; CHECK-NEXT: movs r3, r7
9392
; CHECK-NEXT: bl __aeabi_ldivmod
9493
; CHECK-NEXT: movs r4, r2
9594
; CHECK-NEXT: movs r0, #3
@@ -98,13 +97,14 @@ define <3 x i1> @test_srem_vec(<3 x i33> %X) nounwind {
9897
; CHECK-NEXT: orrs r4, r3
9998
; CHECK-NEXT: subs r0, r4, #1
10099
; CHECK-NEXT: sbcs r4, r0
101-
; CHECK-NEXT: ands r7, r5
102-
; CHECK-NEXT: rsbs r1, r7, #0
103100
; CHECK-NEXT: ldr r0, [sp, #4] @ 4-byte Reload
101+
; CHECK-NEXT: lsls r0, r0, #31
102+
; CHECK-NEXT: asrs r1, r0, #31
103+
; CHECK-NEXT: movs r0, r5
104104
; CHECK-NEXT: movs r2, r6
105-
; CHECK-NEXT: ldr r7, [sp] @ 4-byte Reload
106105
; CHECK-NEXT: movs r3, r7
107106
; CHECK-NEXT: bl __aeabi_ldivmod
107+
; CHECK-NEXT: movs r5, #1
108108
; CHECK-NEXT: movs r0, r5
109109
; CHECK-NEXT: bics r0, r3
110110
; CHECK-NEXT: movs r1, #2
@@ -113,12 +113,12 @@ define <3 x i1> @test_srem_vec(<3 x i33> %X) nounwind {
113113
; CHECK-NEXT: orrs r6, r0
114114
; CHECK-NEXT: subs r0, r6, #1
115115
; CHECK-NEXT: sbcs r6, r0
116-
; CHECK-NEXT: ldr r0, [sp, #36]
117-
; CHECK-NEXT: ands r0, r5
118-
; CHECK-NEXT: rsbs r1, r0, #0
119116
; CHECK-NEXT: movs r0, #8
120117
; CHECK-NEXT: mvns r2, r0
121118
; CHECK-NEXT: mvns r3, r7
119+
; CHECK-NEXT: ldr r0, [sp, #36]
120+
; CHECK-NEXT: lsls r0, r0, #31
121+
; CHECK-NEXT: asrs r1, r0, #31
122122
; CHECK-NEXT: ldr r0, [sp, #32]
123123
; CHECK-NEXT: bl __aeabi_ldivmod
124124
; CHECK-NEXT: ands r5, r3

0 commit comments

Comments
 (0)