Skip to content

Commit b1d1bb2

Browse files
authored
[LV] Add VPlan printing test with casts converted to single scalar (NFC) (#202200)
Add test coverage for additional paths that can create single-scalar casts: sinkScalarOperands and induction optimization.
1 parent 86940d7 commit b1d1bb2

1 file changed

Lines changed: 134 additions & 0 deletions

File tree

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --filter-out-after "middle.block:" --filter-out-after "middleb.block:" --version 6
2+
; RUN: opt -passes=loop-vectorize -force-vector-interleave=1 -force-vector-width=2 -vplan-print-after=printOptimizedVPlan -disable-output %s 2>&1 | FileCheck %s
3+
4+
target triple = "arm64-apple-macosx"
5+
6+
define i16 @narrow_iv_cast_to_single_scalar(ptr %p, ptr %q) {
7+
; CHECK-LABEL: VPlan for loop in 'narrow_iv_cast_to_single_scalar'
8+
; CHECK: VPlan 'Initial VPlan for VF={2},UF>=1' {
9+
; CHECK-NEXT: Live-in vp<[[VP0:%[0-9]+]]> = VF
10+
; CHECK-NEXT: Live-in vp<[[VP1:%[0-9]+]]> = VF * UF
11+
; CHECK-NEXT: Live-in vp<[[VP2:%[0-9]+]]> = vector-trip-count
12+
; CHECK-NEXT: Live-in ir<2> = original trip-count
13+
; CHECK-EMPTY:
14+
; CHECK-NEXT: ir-bb<entry>:
15+
; CHECK-NEXT: Successor(s): scalar.ph, vector.ph
16+
; CHECK-EMPTY:
17+
; CHECK-NEXT: vector.ph:
18+
; CHECK-NEXT: Successor(s): vector loop
19+
; CHECK-EMPTY:
20+
; CHECK-NEXT: <x1> vector loop: {
21+
; CHECK-NEXT: vp<[[VP3:%[0-9]+]]> = CANONICAL-IV
22+
; CHECK-EMPTY:
23+
; CHECK-NEXT: vector.body:
24+
; CHECK-NEXT: vp<[[VP4:%[0-9]+]]> = SCALAR-STEPS vp<[[VP3]]>, ir<1>, vp<[[VP0]]>
25+
; CHECK-NEXT: CLONE ir<%shr> = lshr vp<[[VP4]]>, ir<1>
26+
; CHECK-NEXT: CLONE ir<%shr.ext> = zext ir<%shr>
27+
; CHECK-NEXT: CLONE ir<%gep.p> = getelementptr ir<%p>, ir<%shr.ext>
28+
; CHECK-NEXT: CLONE ir<%l> = load ir<%gep.p>
29+
; CHECK-NEXT: EMIT vp<%index.next> = add nuw vp<[[VP3]]>, vp<[[VP1]]>
30+
; CHECK-NEXT: EMIT branch-on-count vp<%index.next>, vp<[[VP2]]>
31+
; CHECK-NEXT: No successors
32+
; CHECK-NEXT: }
33+
; CHECK-NEXT: Successor(s): middle.block
34+
; CHECK-EMPTY:
35+
; CHECK-NEXT: middle.block:
36+
;
37+
entry:
38+
br label %loop
39+
40+
loop:
41+
%iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
42+
%shr = lshr i32 %iv, 1
43+
%shr.ext = zext i32 %shr to i64
44+
%gep.p = getelementptr i8, ptr %p, i64 %shr.ext
45+
%l = load i8, ptr %gep.p, align 1
46+
%l.ext = zext i8 %l to i32
47+
%idxprom = zext i32 %l.ext to i64
48+
%gep.q = getelementptr i8, ptr %q, i64 %idxprom
49+
%l.q = load i32, ptr %gep.q, align 4
50+
%iv.next = add i32 %iv, 1
51+
%ec = icmp eq i32 %iv, 1
52+
br i1 %ec, label %exit, label %loop
53+
54+
exit:
55+
%res = trunc i32 %l.ext to i16
56+
ret i16 %res
57+
}
58+
59+
define void @sink_replicate_region_with_cast(ptr %dst, i64 %n) {
60+
; CHECK-LABEL: VPlan for loop in 'sink_replicate_region_with_cast'
61+
; CHECK: VPlan 'Initial VPlan for VF={2},UF>=1' {
62+
; CHECK-NEXT: Live-in vp<[[VP0:%[0-9]+]]> = VF
63+
; CHECK-NEXT: Live-in vp<[[VP1:%[0-9]+]]> = VF * UF
64+
; CHECK-NEXT: Live-in vp<[[VP2:%[0-9]+]]> = vector-trip-count
65+
; CHECK-NEXT: vp<[[VP3:%[0-9]+]]> = original trip-count
66+
; CHECK-EMPTY:
67+
; CHECK-NEXT: ir-bb<entry>:
68+
; CHECK-NEXT: EMIT vp<[[VP3]]> = EXPAND SCEV (1 + (trunc i64 %n to i32))
69+
; CHECK-NEXT: Successor(s): scalar.ph, vector.ph
70+
; CHECK-EMPTY:
71+
; CHECK-NEXT: vector.ph:
72+
; CHECK-NEXT: Successor(s): vector loop
73+
; CHECK-EMPTY:
74+
; CHECK-NEXT: <x1> vector loop: {
75+
; CHECK-NEXT: vp<[[VP4:%[0-9]+]]> = CANONICAL-IV
76+
; CHECK-EMPTY:
77+
; CHECK-NEXT: vector.body:
78+
; CHECK-NEXT: vp<[[VP5:%[0-9]+]]> = SCALAR-STEPS vp<[[VP4]]>, ir<1>, vp<[[VP0]]>
79+
; CHECK-NEXT: CLONE ir<%conv> = zext vp<[[VP5]]>
80+
; CHECK-NEXT: CLONE ir<%gep> = getelementptr ir<%dst>, ir<%conv>
81+
; CHECK-NEXT: vp<[[VP6:%[0-9]+]]> = vector-pointer ir<%gep>, ir<1>
82+
; CHECK-NEXT: WIDEN ir<%l> = load vp<[[VP6]]>
83+
; CHECK-NEXT: WIDEN ir<%c> = fcmp olt ir<%l>, ir<0.000000e+00>
84+
; CHECK-NEXT: Successor(s): pred.store
85+
; CHECK-EMPTY:
86+
; CHECK-NEXT: <xVFxUF> pred.store: {
87+
; CHECK-NEXT: pred.store.entry:
88+
; CHECK-NEXT: BRANCH-ON-MASK ir<%c>
89+
; CHECK-NEXT: Successor(s): pred.store.if, pred.store.continue
90+
; CHECK-EMPTY:
91+
; CHECK-NEXT: pred.store.if:
92+
; CHECK-NEXT: vp<[[VP7:%[0-9]+]]> = SCALAR-STEPS vp<[[VP4]]>, ir<1>, vp<[[VP0]]>
93+
; CHECK-NEXT: REPLICATE ir<%conv>.1 = zext vp<[[VP7]]>
94+
; CHECK-NEXT: REPLICATE ir<%gep>.1 = getelementptr ir<%dst>, ir<%conv>.1
95+
; CHECK-NEXT: REPLICATE store ir<0.000000e+00>, ir<%gep>.1
96+
; CHECK-NEXT: Successor(s): pred.store.continue
97+
; CHECK-EMPTY:
98+
; CHECK-NEXT: pred.store.continue:
99+
; CHECK-NEXT: No successors
100+
; CHECK-NEXT: }
101+
; CHECK-NEXT: Successor(s): then.0
102+
; CHECK-EMPTY:
103+
; CHECK-NEXT: then.0:
104+
; CHECK-NEXT: EMIT vp<%index.next> = add nuw vp<[[VP4]]>, vp<[[VP1]]>
105+
; CHECK-NEXT: EMIT branch-on-count vp<%index.next>, vp<[[VP2]]>
106+
; CHECK-NEXT: No successors
107+
; CHECK-NEXT: }
108+
; CHECK-NEXT: Successor(s): middle.block
109+
; CHECK-EMPTY:
110+
; CHECK-NEXT: middle.block:
111+
;
112+
entry:
113+
br label %loop.header
114+
115+
loop.header:
116+
%iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]
117+
%conv = zext i32 %iv to i64
118+
%gep = getelementptr double, ptr %dst, i64 %conv
119+
%l = load double, ptr %gep, align 8
120+
%c = fcmp olt double %l, 0.000000e+00
121+
br i1 %c, label %then, label %loop.latch
122+
123+
then:
124+
store double 0.000000e+00, ptr %gep, align 8
125+
br label %loop.latch
126+
127+
loop.latch:
128+
%iv.next = add i32 %iv, 1
129+
%ec = icmp ugt i64 %n, %conv
130+
br i1 %ec, label %loop.header, label %exit
131+
132+
exit:
133+
ret void
134+
}

0 commit comments

Comments
 (0)