Skip to content

Commit 067c06d

Browse files
JonPssontstellar
authored andcommitted
[SystemZ] Don't use libcall for 128 bit shifts.
Expand 128 bit shifts instead of using a libcall. This patch removes the 128 bit shift libcalls and thereby causes ExpandShiftWithUnknownAmountBit() to be called. Review: Ulrich Weigand Differential Revision: https://reviews.llvm.org/D101993 (cherry picked from commit 1c4cb51)
1 parent 24535af commit 067c06d

File tree

2 files changed

+79
-20
lines changed

2 files changed

+79
-20
lines changed

llvm/lib/Target/SystemZ/SystemZISelLowering.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,10 +285,13 @@ SystemZTargetLowering::SystemZTargetLowering(const TargetMachine &TM,
285285
// Give LowerOperation the chance to replace 64-bit ORs with subregs.
286286
setOperationAction(ISD::OR, MVT::i64, Custom);
287287

288-
// FIXME: Can we support these natively?
288+
// Expand 128 bit shifts without using a libcall.
289289
setOperationAction(ISD::SRL_PARTS, MVT::i64, Expand);
290290
setOperationAction(ISD::SHL_PARTS, MVT::i64, Expand);
291291
setOperationAction(ISD::SRA_PARTS, MVT::i64, Expand);
292+
setLibcallName(RTLIB::SRL_I128, nullptr);
293+
setLibcallName(RTLIB::SHL_I128, nullptr);
294+
setLibcallName(RTLIB::SRA_I128, nullptr);
292295

293296
// We have native instructions for i8, i16 and i32 extensions, but not i1.
294297
setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i1, Expand);

llvm/test/CodeGen/SystemZ/shift-12.ll

Lines changed: 75 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
; Test removal of AND operations that don't affect last 6 bits of shift amount
33
; operand.
44
;
5-
; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
5+
; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s
66

77
; Test that AND is not removed when some lower 6 bits are not set.
88
define i32 @f1(i32 %a, i32 %sh) {
@@ -119,35 +119,91 @@ define i32 @f10(i32 %a, i32 %sh) {
119119
ret i32 %reuse
120120
}
121121

122-
; Test that AND is not removed for i128 (which calls __ashlti3)
123122
define i128 @f11(i128 %a, i32 %sh) {
124123
; CHECK-LABEL: f11:
125124
; CHECK: # %bb.0:
126-
; CHECK-NEXT: stmg %r13, %r15, 104(%r15)
127-
; CHECK-NEXT: .cfi_offset %r13, -56
125+
; CHECK-NEXT: stmg %r14, %r15, 112(%r15)
128126
; CHECK-NEXT: .cfi_offset %r14, -48
129127
; CHECK-NEXT: .cfi_offset %r15, -40
130-
; CHECK-NEXT: aghi %r15, -192
131-
; CHECK-NEXT: .cfi_def_cfa_offset 352
132128
; CHECK-NEXT: lg %r0, 8(%r3)
133-
; CHECK-NEXT: # kill: def $r4l killed $r4l def $r4d
134-
; CHECK-NEXT: lgr %r13, %r2
135129
; CHECK-NEXT: lg %r1, 0(%r3)
136-
; CHECK-NEXT: stg %r0, 168(%r15)
137-
; CHECK-NEXT: risbg %r4, %r4, 57, 191, 0
138-
; CHECK-NEXT: la %r2, 176(%r15)
139-
; CHECK-NEXT: la %r3, 160(%r15)
140-
; CHECK-NEXT: stg %r1, 160(%r15)
141-
; CHECK-NEXT: brasl %r14, __ashlti3@PLT
142-
; CHECK-NEXT: lg %r0, 184(%r15)
143-
; CHECK-NEXT: lg %r1, 176(%r15)
144-
; CHECK-NEXT: stg %r0, 8(%r13)
145-
; CHECK-NEXT: stg %r1, 0(%r13)
146-
; CHECK-NEXT: lmg %r13, %r15, 296(%r15)
130+
; CHECK-NEXT: risblg %r3, %r4, 25, 159, 0
131+
; CHECK-NEXT: lcr %r14, %r3
132+
; CHECK-NEXT: sllg %r5, %r1, 0(%r4)
133+
; CHECK-NEXT: srlg %r14, %r0, 0(%r14)
134+
; CHECK-NEXT: ogr %r5, %r14
135+
; CHECK-NEXT: sllg %r3, %r0, -64(%r3)
136+
; CHECK-NEXT: tmll %r4, 127
137+
; CHECK-NEXT: locgrle %r3, %r5
138+
; CHECK-NEXT: sllg %r0, %r0, 0(%r4)
139+
; CHECK-NEXT: locgre %r3, %r1
140+
; CHECK-NEXT: locghinle %r0, 0
141+
; CHECK-NEXT: stg %r0, 8(%r2)
142+
; CHECK-NEXT: stg %r3, 0(%r2)
143+
; CHECK-NEXT: lmg %r14, %r15, 112(%r15)
147144
; CHECK-NEXT: br %r14
148145
%and = and i32 %sh, 127
149146
%ext = zext i32 %and to i128
150147
%shift = shl i128 %a, %ext
151148
ret i128 %shift
152149
}
153150

151+
define i128 @f12(i128 %a, i32 %sh) {
152+
; CHECK-LABEL: f12:
153+
; CHECK: # %bb.0:
154+
; CHECK-NEXT: stmg %r14, %r15, 112(%r15)
155+
; CHECK-NEXT: .cfi_offset %r14, -48
156+
; CHECK-NEXT: .cfi_offset %r15, -40
157+
; CHECK-NEXT: lg %r0, 0(%r3)
158+
; CHECK-NEXT: lg %r1, 8(%r3)
159+
; CHECK-NEXT: risblg %r3, %r4, 25, 159, 0
160+
; CHECK-NEXT: lcr %r14, %r3
161+
; CHECK-NEXT: srlg %r5, %r1, 0(%r4)
162+
; CHECK-NEXT: sllg %r14, %r0, 0(%r14)
163+
; CHECK-NEXT: ogr %r5, %r14
164+
; CHECK-NEXT: srlg %r3, %r0, -64(%r3)
165+
; CHECK-NEXT: tmll %r4, 127
166+
; CHECK-NEXT: locgrle %r3, %r5
167+
; CHECK-NEXT: srlg %r0, %r0, 0(%r4)
168+
; CHECK-NEXT: locgre %r3, %r1
169+
; CHECK-NEXT: locghinle %r0, 0
170+
; CHECK-NEXT: stg %r0, 0(%r2)
171+
; CHECK-NEXT: stg %r3, 8(%r2)
172+
; CHECK-NEXT: lmg %r14, %r15, 112(%r15)
173+
; CHECK-NEXT: br %r14
174+
%and = and i32 %sh, 127
175+
%ext = zext i32 %and to i128
176+
%shift = lshr i128 %a, %ext
177+
ret i128 %shift
178+
}
179+
180+
define i128 @f13(i128 %a, i32 %sh) {
181+
; CHECK-LABEL: f13:
182+
; CHECK: # %bb.0:
183+
; CHECK-NEXT: stmg %r14, %r15, 112(%r15)
184+
; CHECK-NEXT: .cfi_offset %r14, -48
185+
; CHECK-NEXT: .cfi_offset %r15, -40
186+
; CHECK-NEXT: lg %r0, 0(%r3)
187+
; CHECK-NEXT: lg %r1, 8(%r3)
188+
; CHECK-NEXT: risblg %r3, %r4, 25, 159, 0
189+
; CHECK-NEXT: lcr %r14, %r3
190+
; CHECK-NEXT: srlg %r5, %r1, 0(%r4)
191+
; CHECK-NEXT: sllg %r14, %r0, 0(%r14)
192+
; CHECK-NEXT: ogr %r5, %r14
193+
; CHECK-NEXT: srag %r14, %r0, 0(%r4)
194+
; CHECK-NEXT: srag %r3, %r0, -64(%r3)
195+
; CHECK-NEXT: srag %r0, %r0, 63
196+
; CHECK-NEXT: tmll %r4, 127
197+
; CHECK-NEXT: locgrle %r3, %r5
198+
; CHECK-NEXT: locgre %r3, %r1
199+
; CHECK-NEXT: locgrle %r0, %r14
200+
; CHECK-NEXT: stg %r0, 0(%r2)
201+
; CHECK-NEXT: stg %r3, 8(%r2)
202+
; CHECK-NEXT: lmg %r14, %r15, 112(%r15)
203+
; CHECK-NEXT: br %r14
204+
%and = and i32 %sh, 127
205+
%ext = zext i32 %and to i128
206+
%shift = ashr i128 %a, %ext
207+
ret i128 %shift
208+
}
209+

0 commit comments

Comments
 (0)