Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit fae74b2

Browse files
authored
[VPlan] Add VPlan printing test for call widening decisions. (NFC) (#195930)
Add VPlan-printing test for #195518.
1 parent 461e473 commit fae74b2

1 file changed

Lines changed: 110 additions & 0 deletions

File tree

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --filter-out-after "middle.block:" --version 6
2+
; -RUN: opt -mattr=+neon -vector-library=LIBMVEC -passes=inject-tli-mappings,loop-vectorize -force-vector-width=2 -force-vector-interleave=1 -S -disable-output -vplan-print-after=makeMemOpWideningDecisions %s 2>&1 | FileCheck %s
3+
4+
target triple = "arm64-apple-macosx"
5+
6+
declare double @acos(double)
7+
8+
define void @pick_wide_call(ptr noalias %in.ptr, ptr noalias %out.ptr) {
9+
; CHECK-LABEL: VPlan for loop in 'pick_wide_call'
10+
; CHECK: VPlan ' for UF>=1' {
11+
; CHECK-NEXT: Live-in vp<[[VP0:%[0-9]+]]> = VF
12+
; CHECK-NEXT: Live-in vp<[[VP1:%[0-9]+]]> = VF * UF
13+
; CHECK-NEXT: Live-in vp<[[VP2:%[0-9]+]]> = vector-trip-count
14+
; CHECK-NEXT: Live-in ir<1000> = original trip-count
15+
; CHECK-EMPTY:
16+
; CHECK-NEXT: ir-bb<entry>:
17+
; CHECK-NEXT: Successor(s): scalar.ph, vector.ph
18+
; CHECK-EMPTY:
19+
; CHECK-NEXT: vector.ph:
20+
; CHECK-NEXT: Successor(s): vector loop
21+
; CHECK-EMPTY:
22+
; CHECK-NEXT: <x1> vector loop: {
23+
; CHECK-NEXT: vp<[[VP3:%[0-9]+]]> = CANONICAL-IV
24+
; CHECK-EMPTY:
25+
; CHECK-NEXT: vector.body:
26+
; CHECK-NEXT: ir<%iv> = WIDEN-INDUCTION nuw nsw ir<0>, ir<1>, vp<[[VP0]]>
27+
; CHECK-NEXT: EMIT ir<%in.gep> = getelementptr inbounds ir<%in.ptr>, ir<%iv>
28+
; CHECK-NEXT: vp<[[VP4:%[0-9]+]]> = vector-pointer inbounds ir<%in.gep>
29+
; CHECK-NEXT: WIDEN ir<%in> = load vp<[[VP4]]>
30+
; CHECK-NEXT: EMIT ir<%call> = call ir<%in>, ir<@acos>
31+
; CHECK-NEXT: EMIT ir<%out.gep> = getelementptr inbounds ir<%out.ptr>, ir<%iv>
32+
; CHECK-NEXT: vp<[[VP5:%[0-9]+]]> = vector-pointer inbounds ir<%out.gep>
33+
; CHECK-NEXT: WIDEN store vp<[[VP5]]>, ir<%call>
34+
; CHECK-NEXT: EMIT vp<%index.next> = add nuw vp<[[VP3]]>, vp<[[VP1]]>
35+
; CHECK-NEXT: EMIT branch-on-count vp<%index.next>, vp<[[VP2]]>
36+
; CHECK-NEXT: No successors
37+
; CHECK-NEXT: }
38+
; CHECK-NEXT: Successor(s): middle.block
39+
; CHECK-EMPTY:
40+
; CHECK-NEXT: middle.block:
41+
;
42+
entry:
43+
br label %loop
44+
45+
loop:
46+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
47+
%in.gep = getelementptr inbounds double, ptr %in.ptr, i64 %iv
48+
%in = load double, ptr %in.gep, align 8
49+
%call = tail call double @acos(double %in)
50+
%out.gep = getelementptr inbounds double, ptr %out.ptr, i64 %iv
51+
store double %call, ptr %out.gep, align 8
52+
%iv.next = add nuw nsw i64 %iv, 1
53+
%exitcond = icmp eq i64 %iv.next, 1000
54+
br i1 %exitcond, label %exit, label %loop
55+
56+
exit:
57+
ret void
58+
}
59+
60+
define void @pick_intrinsic_call(ptr noalias %in.ptr, ptr noalias %out.ptr) {
61+
; CHECK-LABEL: VPlan for loop in 'pick_intrinsic_call'
62+
; CHECK: VPlan ' for UF>=1' {
63+
; CHECK-NEXT: Live-in vp<[[VP0:%[0-9]+]]> = VF
64+
; CHECK-NEXT: Live-in vp<[[VP1:%[0-9]+]]> = VF * UF
65+
; CHECK-NEXT: Live-in vp<[[VP2:%[0-9]+]]> = vector-trip-count
66+
; CHECK-NEXT: Live-in ir<1000> = original trip-count
67+
; CHECK-EMPTY:
68+
; CHECK-NEXT: ir-bb<entry>:
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<[[VP3:%[0-9]+]]> = CANONICAL-IV
76+
; CHECK-EMPTY:
77+
; CHECK-NEXT: vector.body:
78+
; CHECK-NEXT: ir<%iv> = WIDEN-INDUCTION nuw nsw ir<0>, ir<1>, vp<[[VP0]]>
79+
; CHECK-NEXT: EMIT ir<%in.gep> = getelementptr inbounds ir<%in.ptr>, ir<%iv>
80+
; CHECK-NEXT: vp<[[VP4:%[0-9]+]]> = vector-pointer inbounds ir<%in.gep>
81+
; CHECK-NEXT: WIDEN ir<%in> = load vp<[[VP4]]>
82+
; CHECK-NEXT: EMIT ir<%call> = call ir<100>, ir<%in>, ir<@llvm.umin.i64>
83+
; CHECK-NEXT: EMIT ir<%out.gep> = getelementptr inbounds ir<%out.ptr>, ir<%iv>
84+
; CHECK-NEXT: vp<[[VP5:%[0-9]+]]> = vector-pointer inbounds ir<%out.gep>
85+
; CHECK-NEXT: WIDEN store vp<[[VP5]]>, ir<%call>
86+
; CHECK-NEXT: EMIT vp<%index.next> = add nuw vp<[[VP3]]>, vp<[[VP1]]>
87+
; CHECK-NEXT: EMIT branch-on-count vp<%index.next>, vp<[[VP2]]>
88+
; CHECK-NEXT: No successors
89+
; CHECK-NEXT: }
90+
; CHECK-NEXT: Successor(s): middle.block
91+
; CHECK-EMPTY:
92+
; CHECK-NEXT: middle.block:
93+
;
94+
entry:
95+
br label %loop
96+
97+
loop:
98+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
99+
%in.gep = getelementptr inbounds i64, ptr %in.ptr, i64 %iv
100+
%in = load i64, ptr %in.gep, align 8
101+
%call = tail call i64 @llvm.umin.i64(i64 100, i64 %in)
102+
%out.gep = getelementptr inbounds i64, ptr %out.ptr, i64 %iv
103+
store i64 %call, ptr %out.gep, align 8
104+
%iv.next = add nuw nsw i64 %iv, 1
105+
%exitcond = icmp eq i64 %iv.next, 1000
106+
br i1 %exitcond, label %exit, label %loop
107+
108+
exit:
109+
ret void
110+
}

0 commit comments

Comments
 (0)