Skip to content

Commit 7d65cb1

Browse files
authored
[ARM] Copy (SELECT_CC setgt, iN lhs, -1, 1, -1) -> (OR (ASR lhs, N-1), 1 from AArch64 to ARM (llvm#146561)
It works perfectly for ARM too.
1 parent 3448e9c commit 7d65cb1

File tree

2 files changed

+186
-0
lines changed

2 files changed

+186
-0
lines changed

llvm/lib/Target/ARM/ARMISelLowering.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5526,6 +5526,21 @@ SDValue ARMTargetLowering::LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const {
55265526
SDValue FalseVal = Op.getOperand(3);
55275527
ConstantSDNode *CFVal = dyn_cast<ConstantSDNode>(FalseVal);
55285528
ConstantSDNode *CTVal = dyn_cast<ConstantSDNode>(TrueVal);
5529+
ConstantSDNode *RHSC = dyn_cast<ConstantSDNode>(RHS);
5530+
if (Op.getValueType().isInteger()) {
5531+
// Check for sign pattern (SELECT_CC setgt, iN lhs, -1, 1, -1) and transform
5532+
// into (OR (ASR lhs, N-1), 1), which requires less instructions for the
5533+
// supported types.
5534+
if (CC == ISD::SETGT && RHSC && RHSC->isAllOnes() && CTVal && CFVal &&
5535+
CTVal->isOne() && CFVal->isAllOnes() &&
5536+
LHS.getValueType() == TrueVal.getValueType()) {
5537+
EVT VT = LHS.getValueType();
5538+
SDValue Shift =
5539+
DAG.getNode(ISD::SRA, dl, VT, LHS,
5540+
DAG.getConstant(VT.getSizeInBits() - 1, dl, VT));
5541+
return DAG.getNode(ISD::OR, dl, VT, Shift, DAG.getConstant(1, dl, VT));
5542+
}
5543+
}
55295544

55305545
if (Subtarget->hasV8_1MMainlineOps() && CFVal && CTVal &&
55315546
LHS.getValueType() == MVT::i32 && RHS.getValueType() == MVT::i32) {
Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=armv7a < %s | FileCheck %s --check-prefix=ARM
3+
; RUN: llc -mtriple=armv6m < %s | FileCheck %s --check-prefix=THUMB
4+
; RUN: llc -mtriple=armv7m < %s | FileCheck %s --check-prefix=THUMB2
5+
; RUN: llc -mtriple=thumbv8.1m.main < %s | FileCheck %s --check-prefix=THUMBV8
6+
7+
define i3 @sign_i3(i3 %a) {
8+
; ARM-LABEL: sign_i3:
9+
; ARM: @ %bb.0:
10+
; ARM-NEXT: lsl r0, r0, #29
11+
; ARM-NEXT: mov r1, #1
12+
; ARM-NEXT: orr r0, r1, r0, asr #31
13+
; ARM-NEXT: bx lr
14+
;
15+
; THUMB-LABEL: sign_i3:
16+
; THUMB: @ %bb.0:
17+
; THUMB-NEXT: lsls r0, r0, #29
18+
; THUMB-NEXT: asrs r1, r0, #31
19+
; THUMB-NEXT: movs r0, #1
20+
; THUMB-NEXT: orrs r0, r1
21+
; THUMB-NEXT: bx lr
22+
;
23+
; THUMB2-LABEL: sign_i3:
24+
; THUMB2: @ %bb.0:
25+
; THUMB2-NEXT: lsls r0, r0, #29
26+
; THUMB2-NEXT: movs r1, #1
27+
; THUMB2-NEXT: orr.w r0, r1, r0, asr #31
28+
; THUMB2-NEXT: bx lr
29+
;
30+
; THUMBV8-LABEL: sign_i3:
31+
; THUMBV8: @ %bb.0:
32+
; THUMBV8-NEXT: lsls r0, r0, #29
33+
; THUMBV8-NEXT: movs r1, #1
34+
; THUMBV8-NEXT: orr.w r0, r1, r0, asr #31
35+
; THUMBV8-NEXT: bx lr
36+
%c = icmp sgt i3 %a, -1
37+
%res = select i1 %c, i3 1, i3 -1
38+
ret i3 %res
39+
}
40+
41+
define i4 @sign_i4(i4 %a) {
42+
; ARM-LABEL: sign_i4:
43+
; ARM: @ %bb.0:
44+
; ARM-NEXT: lsl r0, r0, #28
45+
; ARM-NEXT: mov r1, #1
46+
; ARM-NEXT: orr r0, r1, r0, asr #31
47+
; ARM-NEXT: bx lr
48+
;
49+
; THUMB-LABEL: sign_i4:
50+
; THUMB: @ %bb.0:
51+
; THUMB-NEXT: lsls r0, r0, #28
52+
; THUMB-NEXT: asrs r1, r0, #31
53+
; THUMB-NEXT: movs r0, #1
54+
; THUMB-NEXT: orrs r0, r1
55+
; THUMB-NEXT: bx lr
56+
;
57+
; THUMB2-LABEL: sign_i4:
58+
; THUMB2: @ %bb.0:
59+
; THUMB2-NEXT: lsls r0, r0, #28
60+
; THUMB2-NEXT: movs r1, #1
61+
; THUMB2-NEXT: orr.w r0, r1, r0, asr #31
62+
; THUMB2-NEXT: bx lr
63+
;
64+
; THUMBV8-LABEL: sign_i4:
65+
; THUMBV8: @ %bb.0:
66+
; THUMBV8-NEXT: lsls r0, r0, #28
67+
; THUMBV8-NEXT: movs r1, #1
68+
; THUMBV8-NEXT: orr.w r0, r1, r0, asr #31
69+
; THUMBV8-NEXT: bx lr
70+
%c = icmp sgt i4 %a, -1
71+
%res = select i1 %c, i4 1, i4 -1
72+
ret i4 %res
73+
}
74+
75+
define i8 @sign_i8(i8 %a) {
76+
; ARM-LABEL: sign_i8:
77+
; ARM: @ %bb.0:
78+
; ARM-NEXT: lsl r0, r0, #24
79+
; ARM-NEXT: mov r1, #1
80+
; ARM-NEXT: orr r0, r1, r0, asr #31
81+
; ARM-NEXT: bx lr
82+
;
83+
; THUMB-LABEL: sign_i8:
84+
; THUMB: @ %bb.0:
85+
; THUMB-NEXT: lsls r0, r0, #24
86+
; THUMB-NEXT: asrs r1, r0, #31
87+
; THUMB-NEXT: movs r0, #1
88+
; THUMB-NEXT: orrs r0, r1
89+
; THUMB-NEXT: bx lr
90+
;
91+
; THUMB2-LABEL: sign_i8:
92+
; THUMB2: @ %bb.0:
93+
; THUMB2-NEXT: lsls r0, r0, #24
94+
; THUMB2-NEXT: movs r1, #1
95+
; THUMB2-NEXT: orr.w r0, r1, r0, asr #31
96+
; THUMB2-NEXT: bx lr
97+
;
98+
; THUMBV8-LABEL: sign_i8:
99+
; THUMBV8: @ %bb.0:
100+
; THUMBV8-NEXT: lsls r0, r0, #24
101+
; THUMBV8-NEXT: movs r1, #1
102+
; THUMBV8-NEXT: orr.w r0, r1, r0, asr #31
103+
; THUMBV8-NEXT: bx lr
104+
%c = icmp sgt i8 %a, -1
105+
%res = select i1 %c, i8 1, i8 -1
106+
ret i8 %res
107+
}
108+
109+
define i16 @sign_i16(i16 %a) {
110+
; ARM-LABEL: sign_i16:
111+
; ARM: @ %bb.0:
112+
; ARM-NEXT: lsl r0, r0, #16
113+
; ARM-NEXT: mov r1, #1
114+
; ARM-NEXT: orr r0, r1, r0, asr #31
115+
; ARM-NEXT: bx lr
116+
;
117+
; THUMB-LABEL: sign_i16:
118+
; THUMB: @ %bb.0:
119+
; THUMB-NEXT: lsls r0, r0, #16
120+
; THUMB-NEXT: asrs r1, r0, #31
121+
; THUMB-NEXT: movs r0, #1
122+
; THUMB-NEXT: orrs r0, r1
123+
; THUMB-NEXT: bx lr
124+
;
125+
; THUMB2-LABEL: sign_i16:
126+
; THUMB2: @ %bb.0:
127+
; THUMB2-NEXT: lsls r0, r0, #16
128+
; THUMB2-NEXT: movs r1, #1
129+
; THUMB2-NEXT: orr.w r0, r1, r0, asr #31
130+
; THUMB2-NEXT: bx lr
131+
;
132+
; THUMBV8-LABEL: sign_i16:
133+
; THUMBV8: @ %bb.0:
134+
; THUMBV8-NEXT: lsls r0, r0, #16
135+
; THUMBV8-NEXT: movs r1, #1
136+
; THUMBV8-NEXT: orr.w r0, r1, r0, asr #31
137+
; THUMBV8-NEXT: bx lr
138+
%c = icmp sgt i16 %a, -1
139+
%res = select i1 %c, i16 1, i16 -1
140+
ret i16 %res
141+
}
142+
143+
define i32 @sign_i32(i32 %a) {
144+
; ARM-LABEL: sign_i32:
145+
; ARM: @ %bb.0:
146+
; ARM-NEXT: mov r1, #1
147+
; ARM-NEXT: orr r0, r1, r0, asr #31
148+
; ARM-NEXT: bx lr
149+
;
150+
; THUMB-LABEL: sign_i32:
151+
; THUMB: @ %bb.0:
152+
; THUMB-NEXT: asrs r1, r0, #31
153+
; THUMB-NEXT: movs r0, #1
154+
; THUMB-NEXT: orrs r0, r1
155+
; THUMB-NEXT: bx lr
156+
;
157+
; THUMB2-LABEL: sign_i32:
158+
; THUMB2: @ %bb.0:
159+
; THUMB2-NEXT: movs r1, #1
160+
; THUMB2-NEXT: orr.w r0, r1, r0, asr #31
161+
; THUMB2-NEXT: bx lr
162+
;
163+
; THUMBV8-LABEL: sign_i32:
164+
; THUMBV8: @ %bb.0:
165+
; THUMBV8-NEXT: movs r1, #1
166+
; THUMBV8-NEXT: orr.w r0, r1, r0, asr #31
167+
; THUMBV8-NEXT: bx lr
168+
%c = icmp sgt i32 %a, -1
169+
%res = select i1 %c, i32 1, i32 -1
170+
ret i32 %res
171+
}

0 commit comments

Comments
 (0)