Skip to content

Commit 49b2936

Browse files
committed
[AArch64][GlobalISel] Expand handling of phi operations
Like other operations, non-power-2 vectors are widened to a power-2, larger vectors with i128 elements are scalarized and smaller vectors are widened to be at least 64bit.
1 parent 5b1b6a6 commit 49b2936

File tree

2 files changed

+193
-83
lines changed

2 files changed

+193
-83
lines changed

llvm/lib/Target/AArch64/GISel/AArch64LegalizerInfo.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,12 @@ AArch64LegalizerInfo::AArch64LegalizerInfo(const AArch64Subtarget &ST)
109109
.legalFor({p0, s16, s32, s64})
110110
.legalFor(PackedVectorAllTypeList)
111111
.widenScalarToNextPow2(0)
112+
.moreElementsToNextPow2(0)
113+
.scalarizeIf(scalarOrEltWiderThan(0, 64), 0)
112114
.clampScalar(0, s16, s64)
113-
// Maximum: sN * k = 128
114-
.clampMaxNumElements(0, s8, 16)
115-
.clampMaxNumElements(0, s16, 8)
116-
.clampMaxNumElements(0, s32, 4)
115+
.clampNumElements(0, v8s8, v16s8)
116+
.clampNumElements(0, v4s16, v8s16)
117+
.clampNumElements(0, v2s32, v4s32)
117118
.clampMaxNumElements(0, s64, 2)
118119
.clampMaxNumElements(0, p0, 2);
119120

llvm/test/CodeGen/AArch64/phi.ll

Lines changed: 188 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,6 @@
22
; RUN: llc -mtriple=aarch64 -global-isel=0 -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,CHECK-SD
33
; RUN: llc -mtriple=aarch64 -global-isel=1 -global-isel-abort=2 -verify-machineinstrs %s -o - 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI
44

5-
; CHECK-GI: warning: Instruction selection used fallback path for tv2i8
6-
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for tv3i8
7-
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for tv4i8
8-
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for tv2i16
9-
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for tv3i16
10-
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for tv3i32
11-
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for tv2i128
12-
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for tv2f16
13-
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for tv3f16
14-
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for tv3f32
15-
; CHECK-GI-NEXT: warning: Instruction selection used fallback path for tv2f128
16-
175
define i8 @ti8(i1 %c, ptr %p, i8 %a, i8 %b) {
186
; CHECK-SD-LABEL: ti8:
197
; CHECK-SD: // %bb.0: // %entry
@@ -271,15 +259,37 @@ e:
271259
}
272260

273261
define <2 x i8> @tv2i8(i1 %c, ptr %p, <2 x i8> %a, <2 x i8> %b) {
274-
; CHECK-LABEL: tv2i8:
275-
; CHECK: // %bb.0: // %entry
276-
; CHECK-NEXT: tbz w0, #0, .LBB9_2
277-
; CHECK-NEXT: // %bb.1: // %t
278-
; CHECK-NEXT: fmov d1, d0
279-
; CHECK-NEXT: str wzr, [x1]
280-
; CHECK-NEXT: .LBB9_2: // %e
281-
; CHECK-NEXT: fmov d0, d1
282-
; CHECK-NEXT: ret
262+
; CHECK-SD-LABEL: tv2i8:
263+
; CHECK-SD: // %bb.0: // %entry
264+
; CHECK-SD-NEXT: tbz w0, #0, .LBB9_2
265+
; CHECK-SD-NEXT: // %bb.1: // %t
266+
; CHECK-SD-NEXT: fmov d1, d0
267+
; CHECK-SD-NEXT: str wzr, [x1]
268+
; CHECK-SD-NEXT: .LBB9_2: // %e
269+
; CHECK-SD-NEXT: fmov d0, d1
270+
; CHECK-SD-NEXT: ret
271+
;
272+
; CHECK-GI-LABEL: tv2i8:
273+
; CHECK-GI: // %bb.0: // %entry
274+
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0
275+
; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1
276+
; CHECK-GI-NEXT: tbz w0, #0, .LBB9_2
277+
; CHECK-GI-NEXT: // %bb.1: // %t
278+
; CHECK-GI-NEXT: mov w8, v0.s[1]
279+
; CHECK-GI-NEXT: str wzr, [x1]
280+
; CHECK-GI-NEXT: mov v0.b[1], w8
281+
; CHECK-GI-NEXT: fmov d1, d0
282+
; CHECK-GI-NEXT: b .LBB9_3
283+
; CHECK-GI-NEXT: .LBB9_2:
284+
; CHECK-GI-NEXT: mov w8, v1.s[1]
285+
; CHECK-GI-NEXT: mov v1.b[1], w8
286+
; CHECK-GI-NEXT: .LBB9_3: // %e
287+
; CHECK-GI-NEXT: umov w8, v1.b[0]
288+
; CHECK-GI-NEXT: umov w9, v1.b[1]
289+
; CHECK-GI-NEXT: mov v0.s[0], w8
290+
; CHECK-GI-NEXT: mov v0.s[1], w9
291+
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
292+
; CHECK-GI-NEXT: ret
283293
entry:
284294
br i1 %c, label %t, label %e
285295
t:
@@ -291,19 +301,38 @@ e:
291301
}
292302

293303
define <3 x i8> @tv3i8(i1 %c, ptr %p, <3 x i8> %a, <3 x i8> %b) {
294-
; CHECK-LABEL: tv3i8:
295-
; CHECK: // %bb.0: // %entry
296-
; CHECK-NEXT: tbz w0, #0, .LBB10_2
297-
; CHECK-NEXT: // %bb.1: // %t
298-
; CHECK-NEXT: mov w5, w2
299-
; CHECK-NEXT: mov w6, w3
300-
; CHECK-NEXT: mov w7, w4
301-
; CHECK-NEXT: str wzr, [x1]
302-
; CHECK-NEXT: .LBB10_2: // %e
303-
; CHECK-NEXT: mov w0, w5
304-
; CHECK-NEXT: mov w1, w6
305-
; CHECK-NEXT: mov w2, w7
306-
; CHECK-NEXT: ret
304+
; CHECK-SD-LABEL: tv3i8:
305+
; CHECK-SD: // %bb.0: // %entry
306+
; CHECK-SD-NEXT: tbz w0, #0, .LBB10_2
307+
; CHECK-SD-NEXT: // %bb.1: // %t
308+
; CHECK-SD-NEXT: mov w5, w2
309+
; CHECK-SD-NEXT: mov w6, w3
310+
; CHECK-SD-NEXT: mov w7, w4
311+
; CHECK-SD-NEXT: str wzr, [x1]
312+
; CHECK-SD-NEXT: .LBB10_2: // %e
313+
; CHECK-SD-NEXT: mov w0, w5
314+
; CHECK-SD-NEXT: mov w1, w6
315+
; CHECK-SD-NEXT: mov w2, w7
316+
; CHECK-SD-NEXT: ret
317+
;
318+
; CHECK-GI-LABEL: tv3i8:
319+
; CHECK-GI: // %bb.0: // %entry
320+
; CHECK-GI-NEXT: tbz w0, #0, .LBB10_2
321+
; CHECK-GI-NEXT: // %bb.1: // %t
322+
; CHECK-GI-NEXT: fmov s0, w2
323+
; CHECK-GI-NEXT: str wzr, [x1]
324+
; CHECK-GI-NEXT: mov v0.b[1], w3
325+
; CHECK-GI-NEXT: mov v0.b[2], w4
326+
; CHECK-GI-NEXT: b .LBB10_3
327+
; CHECK-GI-NEXT: .LBB10_2:
328+
; CHECK-GI-NEXT: fmov s0, w5
329+
; CHECK-GI-NEXT: mov v0.b[1], w6
330+
; CHECK-GI-NEXT: mov v0.b[2], w7
331+
; CHECK-GI-NEXT: .LBB10_3: // %e
332+
; CHECK-GI-NEXT: umov w0, v0.b[0]
333+
; CHECK-GI-NEXT: umov w1, v0.b[1]
334+
; CHECK-GI-NEXT: umov w2, v0.b[2]
335+
; CHECK-GI-NEXT: ret
307336
entry:
308337
br i1 %c, label %t, label %e
309338
t:
@@ -315,15 +344,30 @@ e:
315344
}
316345

317346
define <4 x i8> @tv4i8(i1 %c, ptr %p, <4 x i8> %a, <4 x i8> %b) {
318-
; CHECK-LABEL: tv4i8:
319-
; CHECK: // %bb.0: // %entry
320-
; CHECK-NEXT: tbz w0, #0, .LBB11_2
321-
; CHECK-NEXT: // %bb.1: // %t
322-
; CHECK-NEXT: fmov d1, d0
323-
; CHECK-NEXT: str wzr, [x1]
324-
; CHECK-NEXT: .LBB11_2: // %e
325-
; CHECK-NEXT: fmov d0, d1
326-
; CHECK-NEXT: ret
347+
; CHECK-SD-LABEL: tv4i8:
348+
; CHECK-SD: // %bb.0: // %entry
349+
; CHECK-SD-NEXT: tbz w0, #0, .LBB11_2
350+
; CHECK-SD-NEXT: // %bb.1: // %t
351+
; CHECK-SD-NEXT: fmov d1, d0
352+
; CHECK-SD-NEXT: str wzr, [x1]
353+
; CHECK-SD-NEXT: .LBB11_2: // %e
354+
; CHECK-SD-NEXT: fmov d0, d1
355+
; CHECK-SD-NEXT: ret
356+
;
357+
; CHECK-GI-LABEL: tv4i8:
358+
; CHECK-GI: // %bb.0: // %entry
359+
; CHECK-GI-NEXT: tbz w0, #0, .LBB11_2
360+
; CHECK-GI-NEXT: // %bb.1: // %t
361+
; CHECK-GI-NEXT: uzp1 v0.8b, v0.8b, v0.8b
362+
; CHECK-GI-NEXT: str wzr, [x1]
363+
; CHECK-GI-NEXT: ushll v0.8h, v0.8b, #0
364+
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
365+
; CHECK-GI-NEXT: ret
366+
; CHECK-GI-NEXT: .LBB11_2:
367+
; CHECK-GI-NEXT: uzp1 v0.8b, v1.8b, v0.8b
368+
; CHECK-GI-NEXT: ushll v0.8h, v0.8b, #0
369+
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
370+
; CHECK-GI-NEXT: ret
327371
entry:
328372
br i1 %c, label %t, label %e
329373
t:
@@ -410,15 +454,30 @@ e:
410454
}
411455

412456
define <2 x i16> @tv2i16(i1 %c, ptr %p, <2 x i16> %a, <2 x i16> %b) {
413-
; CHECK-LABEL: tv2i16:
414-
; CHECK: // %bb.0: // %entry
415-
; CHECK-NEXT: tbz w0, #0, .LBB15_2
416-
; CHECK-NEXT: // %bb.1: // %t
417-
; CHECK-NEXT: fmov d1, d0
418-
; CHECK-NEXT: str wzr, [x1]
419-
; CHECK-NEXT: .LBB15_2: // %e
420-
; CHECK-NEXT: fmov d0, d1
421-
; CHECK-NEXT: ret
457+
; CHECK-SD-LABEL: tv2i16:
458+
; CHECK-SD: // %bb.0: // %entry
459+
; CHECK-SD-NEXT: tbz w0, #0, .LBB15_2
460+
; CHECK-SD-NEXT: // %bb.1: // %t
461+
; CHECK-SD-NEXT: fmov d1, d0
462+
; CHECK-SD-NEXT: str wzr, [x1]
463+
; CHECK-SD-NEXT: .LBB15_2: // %e
464+
; CHECK-SD-NEXT: fmov d0, d1
465+
; CHECK-SD-NEXT: ret
466+
;
467+
; CHECK-GI-LABEL: tv2i16:
468+
; CHECK-GI: // %bb.0: // %entry
469+
; CHECK-GI-NEXT: tbz w0, #0, .LBB15_2
470+
; CHECK-GI-NEXT: // %bb.1: // %t
471+
; CHECK-GI-NEXT: uzp1 v0.4h, v0.4h, v0.4h
472+
; CHECK-GI-NEXT: str wzr, [x1]
473+
; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0
474+
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
475+
; CHECK-GI-NEXT: ret
476+
; CHECK-GI-NEXT: .LBB15_2:
477+
; CHECK-GI-NEXT: uzp1 v0.4h, v1.4h, v0.4h
478+
; CHECK-GI-NEXT: ushll v0.4s, v0.4h, #0
479+
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
480+
; CHECK-GI-NEXT: ret
422481
entry:
423482
br i1 %c, label %t, label %e
424483
t:
@@ -661,15 +720,19 @@ define <3 x i64> @tv3i64(i1 %c, ptr %p, <3 x i64> %a, <3 x i64> %b) {
661720
; CHECK-GI-NEXT: tbz w0, #0, .LBB25_2
662721
; CHECK-GI-NEXT: // %bb.1: // %t
663722
; CHECK-GI-NEXT: fmov d6, d0
723+
; CHECK-GI-NEXT: fmov d7, d2
664724
; CHECK-GI-NEXT: str wzr, [x1]
665725
; CHECK-GI-NEXT: mov v6.d[1], v1.d[0]
726+
; CHECK-GI-NEXT: mov v2.16b, v7.16b
727+
; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q2
666728
; CHECK-GI-NEXT: mov d1, v6.d[1]
667729
; CHECK-GI-NEXT: mov v0.16b, v6.16b
668730
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
669731
; CHECK-GI-NEXT: ret
670732
; CHECK-GI-NEXT: .LBB25_2:
671733
; CHECK-GI-NEXT: fmov d0, d3
672734
; CHECK-GI-NEXT: fmov d2, d5
735+
; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q2
673736
; CHECK-GI-NEXT: mov v0.d[1], v4.d[0]
674737
; CHECK-GI-NEXT: mov d1, v0.d[1]
675738
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
@@ -720,22 +783,40 @@ e:
720783
}
721784

722785
define <2 x i128> @tv2i128(i1 %c, ptr %p, <2 x i128> %a, <2 x i128> %b) {
723-
; CHECK-LABEL: tv2i128:
724-
; CHECK: // %bb.0: // %entry
725-
; CHECK-NEXT: tbz w0, #0, .LBB27_2
726-
; CHECK-NEXT: // %bb.1: // %t
727-
; CHECK-NEXT: mov x6, x2
728-
; CHECK-NEXT: mov x7, x3
729-
; CHECK-NEXT: str wzr, [x1]
730-
; CHECK-NEXT: b .LBB27_3
731-
; CHECK-NEXT: .LBB27_2:
732-
; CHECK-NEXT: ldp x4, x5, [sp]
733-
; CHECK-NEXT: .LBB27_3: // %e
734-
; CHECK-NEXT: mov x0, x6
735-
; CHECK-NEXT: mov x1, x7
736-
; CHECK-NEXT: mov x2, x4
737-
; CHECK-NEXT: mov x3, x5
738-
; CHECK-NEXT: ret
786+
; CHECK-SD-LABEL: tv2i128:
787+
; CHECK-SD: // %bb.0: // %entry
788+
; CHECK-SD-NEXT: tbz w0, #0, .LBB27_2
789+
; CHECK-SD-NEXT: // %bb.1: // %t
790+
; CHECK-SD-NEXT: mov x6, x2
791+
; CHECK-SD-NEXT: mov x7, x3
792+
; CHECK-SD-NEXT: str wzr, [x1]
793+
; CHECK-SD-NEXT: b .LBB27_3
794+
; CHECK-SD-NEXT: .LBB27_2:
795+
; CHECK-SD-NEXT: ldp x4, x5, [sp]
796+
; CHECK-SD-NEXT: .LBB27_3: // %e
797+
; CHECK-SD-NEXT: mov x0, x6
798+
; CHECK-SD-NEXT: mov x1, x7
799+
; CHECK-SD-NEXT: mov x2, x4
800+
; CHECK-SD-NEXT: mov x3, x5
801+
; CHECK-SD-NEXT: ret
802+
;
803+
; CHECK-GI-LABEL: tv2i128:
804+
; CHECK-GI: // %bb.0: // %entry
805+
; CHECK-GI-NEXT: tbz w0, #0, .LBB27_2
806+
; CHECK-GI-NEXT: // %bb.1: // %t
807+
; CHECK-GI-NEXT: mov x9, x2
808+
; CHECK-GI-NEXT: mov x10, x3
809+
; CHECK-GI-NEXT: mov x2, x4
810+
; CHECK-GI-NEXT: mov x3, x5
811+
; CHECK-GI-NEXT: str wzr, [x1]
812+
; CHECK-GI-NEXT: mov x0, x9
813+
; CHECK-GI-NEXT: mov x1, x10
814+
; CHECK-GI-NEXT: ret
815+
; CHECK-GI-NEXT: .LBB27_2:
816+
; CHECK-GI-NEXT: ldp x2, x3, [sp]
817+
; CHECK-GI-NEXT: mov x0, x6
818+
; CHECK-GI-NEXT: mov x1, x7
819+
; CHECK-GI-NEXT: ret
739820
entry:
740821
br i1 %c, label %t, label %e
741822
t:
@@ -998,15 +1079,19 @@ define <3 x double> @tv3f64(i1 %c, ptr %p, <3 x double> %a, <3 x double> %b) {
9981079
; CHECK-GI-NEXT: tbz w0, #0, .LBB38_2
9991080
; CHECK-GI-NEXT: // %bb.1: // %t
10001081
; CHECK-GI-NEXT: fmov d6, d0
1082+
; CHECK-GI-NEXT: fmov d7, d2
10011083
; CHECK-GI-NEXT: str wzr, [x1]
10021084
; CHECK-GI-NEXT: mov v6.d[1], v1.d[0]
1085+
; CHECK-GI-NEXT: mov v2.16b, v7.16b
1086+
; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q2
10031087
; CHECK-GI-NEXT: mov d1, v6.d[1]
10041088
; CHECK-GI-NEXT: mov v0.16b, v6.16b
10051089
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
10061090
; CHECK-GI-NEXT: ret
10071091
; CHECK-GI-NEXT: .LBB38_2:
10081092
; CHECK-GI-NEXT: fmov d0, d3
10091093
; CHECK-GI-NEXT: fmov d2, d5
1094+
; CHECK-GI-NEXT: // kill: def $d2 killed $d2 killed $q2
10101095
; CHECK-GI-NEXT: mov v0.d[1], v4.d[0]
10111096
; CHECK-GI-NEXT: mov d1, v0.d[1]
10121097
; CHECK-GI-NEXT: // kill: def $d0 killed $d0 killed $q0
@@ -1057,17 +1142,41 @@ e:
10571142
}
10581143

10591144
define <2 x fp128> @tv2f128(i1 %c, ptr %p, <2 x fp128> %a, <2 x fp128> %b) {
1060-
; CHECK-LABEL: tv2f128:
1061-
; CHECK: // %bb.0: // %entry
1062-
; CHECK-NEXT: tbz w0, #0, .LBB40_2
1063-
; CHECK-NEXT: // %bb.1: // %t
1064-
; CHECK-NEXT: mov v2.16b, v0.16b
1065-
; CHECK-NEXT: mov v3.16b, v1.16b
1066-
; CHECK-NEXT: str wzr, [x1]
1067-
; CHECK-NEXT: .LBB40_2: // %e
1068-
; CHECK-NEXT: mov v0.16b, v2.16b
1069-
; CHECK-NEXT: mov v1.16b, v3.16b
1070-
; CHECK-NEXT: ret
1145+
; CHECK-SD-LABEL: tv2f128:
1146+
; CHECK-SD: // %bb.0: // %entry
1147+
; CHECK-SD-NEXT: tbz w0, #0, .LBB40_2
1148+
; CHECK-SD-NEXT: // %bb.1: // %t
1149+
; CHECK-SD-NEXT: mov v2.16b, v0.16b
1150+
; CHECK-SD-NEXT: mov v3.16b, v1.16b
1151+
; CHECK-SD-NEXT: str wzr, [x1]
1152+
; CHECK-SD-NEXT: .LBB40_2: // %e
1153+
; CHECK-SD-NEXT: mov v0.16b, v2.16b
1154+
; CHECK-SD-NEXT: mov v1.16b, v3.16b
1155+
; CHECK-SD-NEXT: ret
1156+
;
1157+
; CHECK-GI-LABEL: tv2f128:
1158+
; CHECK-GI: // %bb.0: // %entry
1159+
; CHECK-GI-NEXT: tbz w0, #0, .LBB40_2
1160+
; CHECK-GI-NEXT: // %bb.1: // %t
1161+
; CHECK-GI-NEXT: mov d4, v1.d[1]
1162+
; CHECK-GI-NEXT: mov d5, v0.d[1]
1163+
; CHECK-GI-NEXT: str wzr, [x1]
1164+
; CHECK-GI-NEXT: fmov d2, d0
1165+
; CHECK-GI-NEXT: fmov d3, d1
1166+
; CHECK-GI-NEXT: b .LBB40_3
1167+
; CHECK-GI-NEXT: .LBB40_2:
1168+
; CHECK-GI-NEXT: mov d4, v3.d[1]
1169+
; CHECK-GI-NEXT: mov d5, v2.d[1]
1170+
; CHECK-GI-NEXT: .LBB40_3: // %e
1171+
; CHECK-GI-NEXT: fmov x8, d2
1172+
; CHECK-GI-NEXT: fmov x9, d3
1173+
; CHECK-GI-NEXT: mov v0.d[0], x8
1174+
; CHECK-GI-NEXT: mov v1.d[0], x9
1175+
; CHECK-GI-NEXT: fmov x8, d5
1176+
; CHECK-GI-NEXT: fmov x9, d4
1177+
; CHECK-GI-NEXT: mov v0.d[1], x8
1178+
; CHECK-GI-NEXT: mov v1.d[1], x9
1179+
; CHECK-GI-NEXT: ret
10711180
entry:
10721181
br i1 %c, label %t, label %e
10731182
t:

0 commit comments

Comments
 (0)