xref: /llvm-project/llvm/test/Transforms/LoopVectorize/pointer-induction-unroll.ll (revision 06bb8c9f202e37f215b26ca0dd9b2d8adaf5a83d)
1a512ce5eSPhilip Reames; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2c416f670SPhilip Reames; RUN: opt < %s -passes=loop-vectorize -force-vector-interleave=4 -force-vector-width=1 -S | FileCheck --check-prefixes=CHECK,DEFAULT %s
3c416f670SPhilip Reames; RUN: opt < %s -passes=loop-vectorize -force-vector-interleave=4 -force-vector-width=1 -lv-strided-pointer-ivs=true -S | FileCheck --check-prefixes=CHECK,STRIDED %s
4a512ce5eSPhilip Reamestarget datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
5a512ce5eSPhilip Reames
6a512ce5eSPhilip Reames; Test the scalar expansion of a non-constant stride pointer IV
7a512ce5eSPhilip Reamesdefine void @non_constant_scalar_expansion(i32 %0, ptr %call) {
8c416f670SPhilip Reames; DEFAULT-LABEL: @non_constant_scalar_expansion(
9c416f670SPhilip Reames; DEFAULT-NEXT:  entry:
10c416f670SPhilip Reames; DEFAULT-NEXT:    [[MUL:%.*]] = shl i32 [[TMP0:%.*]], 1
11c416f670SPhilip Reames; DEFAULT-NEXT:    br label [[FOR_COND:%.*]]
12c416f670SPhilip Reames; DEFAULT:       for.cond:
13c416f670SPhilip Reames; DEFAULT-NEXT:    [[TMP1:%.*]] = phi i32 [ 30, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_COND]] ]
14c416f670SPhilip Reames; DEFAULT-NEXT:    [[P_0:%.*]] = phi ptr [ null, [[ENTRY]] ], [ [[ADD_PTR:%.*]], [[FOR_COND]] ]
15c416f670SPhilip Reames; DEFAULT-NEXT:    [[ADD_PTR]] = getelementptr i8, ptr [[P_0]], i32 [[MUL]]
16c416f670SPhilip Reames; DEFAULT-NEXT:    [[ARRAYIDX:%.*]] = getelementptr ptr, ptr [[CALL:%.*]], i32 [[TMP1]]
17c416f670SPhilip Reames; DEFAULT-NEXT:    store ptr [[P_0]], ptr [[ARRAYIDX]], align 4
18c416f670SPhilip Reames; DEFAULT-NEXT:    [[INC]] = add i32 [[TMP1]], 1
19c416f670SPhilip Reames; DEFAULT-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP1]], 0
20c416f670SPhilip Reames; DEFAULT-NEXT:    br i1 [[TOBOOL_NOT]], label [[FOR_END:%.*]], label [[FOR_COND]]
21c416f670SPhilip Reames; DEFAULT:       for.end:
22c416f670SPhilip Reames; DEFAULT-NEXT:    ret void
23c416f670SPhilip Reames;
24c416f670SPhilip Reames; STRIDED-LABEL: @non_constant_scalar_expansion(
25c416f670SPhilip Reames; STRIDED-NEXT:  entry:
26c416f670SPhilip Reames; STRIDED-NEXT:    [[MUL:%.*]] = shl i32 [[TMP0:%.*]], 1
27b85a402dSFlorian Hahn; STRIDED-NEXT:    [[TMP1:%.*]] = sext i32 [[MUL]] to i64
28c416f670SPhilip Reames; STRIDED-NEXT:    br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
29c416f670SPhilip Reames; STRIDED:       vector.ph:
30236a0e82SFlorian Hahn; STRIDED-NEXT:    [[TMP2:%.*]] = mul i64 4294967264, [[TMP1]]
31236a0e82SFlorian Hahn; STRIDED-NEXT:    [[IND_END:%.*]] = getelementptr i8, ptr null, i64 [[TMP2]]
32c416f670SPhilip Reames; STRIDED-NEXT:    br label [[VECTOR_BODY:%.*]]
33c416f670SPhilip Reames; STRIDED:       vector.body:
34c416f670SPhilip Reames; STRIDED-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
35c416f670SPhilip Reames; STRIDED-NEXT:    [[DOTCAST:%.*]] = trunc i64 [[INDEX]] to i32
36c416f670SPhilip Reames; STRIDED-NEXT:    [[OFFSET_IDX:%.*]] = add i32 30, [[DOTCAST]]
37*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[TMP3:%.*]] = add i32 [[OFFSET_IDX]], 0
38*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[TMP4:%.*]] = add i32 [[OFFSET_IDX]], 1
39*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[TMP5:%.*]] = add i32 [[OFFSET_IDX]], 2
40*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[TMP6:%.*]] = add i32 [[OFFSET_IDX]], 3
41*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[OFFSET_IDX2:%.*]] = mul i64 [[INDEX]], [[TMP1]]
42*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[TMP7:%.*]] = mul i64 0, [[TMP1]]
43*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[TMP8:%.*]] = add i64 [[OFFSET_IDX2]], [[TMP7]]
44*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[TMP9:%.*]] = mul i64 1, [[TMP1]]
45*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[TMP10:%.*]] = add i64 [[OFFSET_IDX2]], [[TMP9]]
46*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[TMP11:%.*]] = mul i64 2, [[TMP1]]
47*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[TMP12:%.*]] = add i64 [[OFFSET_IDX2]], [[TMP11]]
48*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[TMP13:%.*]] = mul i64 3, [[TMP1]]
49*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[TMP14:%.*]] = add i64 [[OFFSET_IDX2]], [[TMP13]]
50*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[TMP15:%.*]] = getelementptr i8, ptr null, i64 [[TMP8]]
51*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[TMP16:%.*]] = getelementptr i8, ptr null, i64 [[TMP10]]
52*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[TMP17:%.*]] = getelementptr i8, ptr null, i64 [[TMP12]]
53*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[TMP18:%.*]] = getelementptr i8, ptr null, i64 [[TMP14]]
54*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[TMP19:%.*]] = getelementptr ptr, ptr [[CALL:%.*]], i32 [[TMP3]]
55*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[TMP20:%.*]] = getelementptr ptr, ptr [[CALL]], i32 [[TMP4]]
56*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[TMP21:%.*]] = getelementptr ptr, ptr [[CALL]], i32 [[TMP5]]
57*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[TMP22:%.*]] = getelementptr ptr, ptr [[CALL]], i32 [[TMP6]]
58*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    store ptr [[TMP15]], ptr [[TMP19]], align 4
59*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    store ptr [[TMP16]], ptr [[TMP20]], align 4
60*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    store ptr [[TMP17]], ptr [[TMP21]], align 4
61*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    store ptr [[TMP18]], ptr [[TMP22]], align 4
62c416f670SPhilip Reames; STRIDED-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
63*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[TMP23:%.*]] = icmp eq i64 [[INDEX_NEXT]], 4294967264
64*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    br i1 [[TMP23]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
65c416f670SPhilip Reames; STRIDED:       middle.block:
6696e83d37SFlorian Hahn; STRIDED-NEXT:    br i1 false, label [[FOR_END:%.*]], label [[SCALAR_PH]]
67c416f670SPhilip Reames; STRIDED:       scalar.ph:
68c416f670SPhilip Reames; STRIDED-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i32 [ -2, [[MIDDLE_BLOCK]] ], [ 30, [[ENTRY:%.*]] ]
69c416f670SPhilip Reames; STRIDED-NEXT:    [[BC_RESUME_VAL1:%.*]] = phi ptr [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ null, [[ENTRY]] ]
70c416f670SPhilip Reames; STRIDED-NEXT:    br label [[FOR_COND:%.*]]
71c416f670SPhilip Reames; STRIDED:       for.cond:
72*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[TMP24:%.*]] = phi i32 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[INC:%.*]], [[FOR_COND]] ]
73c416f670SPhilip Reames; STRIDED-NEXT:    [[P_0:%.*]] = phi ptr [ [[BC_RESUME_VAL1]], [[SCALAR_PH]] ], [ [[ADD_PTR:%.*]], [[FOR_COND]] ]
74c416f670SPhilip Reames; STRIDED-NEXT:    [[ADD_PTR]] = getelementptr i8, ptr [[P_0]], i32 [[MUL]]
75*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[ARRAYIDX:%.*]] = getelementptr ptr, ptr [[CALL]], i32 [[TMP24]]
76c416f670SPhilip Reames; STRIDED-NEXT:    store ptr [[P_0]], ptr [[ARRAYIDX]], align 4
77*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[INC]] = add i32 [[TMP24]], 1
78*06bb8c9fSFlorian Hahn; STRIDED-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP24]], 0
79c416f670SPhilip Reames; STRIDED-NEXT:    br i1 [[TOBOOL_NOT]], label [[FOR_END]], label [[FOR_COND]], !llvm.loop [[LOOP3:![0-9]+]]
80c416f670SPhilip Reames; STRIDED:       for.end:
81c416f670SPhilip Reames; STRIDED-NEXT:    ret void
82a512ce5eSPhilip Reames;
83a512ce5eSPhilip Reamesentry:
84a512ce5eSPhilip Reames  %mul = shl i32 %0, 1
85a512ce5eSPhilip Reames  br label %for.cond
86a512ce5eSPhilip Reames
87a512ce5eSPhilip Reamesfor.cond:                                         ; preds = %for.body, %entry
88a512ce5eSPhilip Reames  %1 = phi i32 [ 30, %entry ], [ %inc, %for.cond ]
89a512ce5eSPhilip Reames  %p.0 = phi ptr [ null, %entry ], [ %add.ptr, %for.cond ]
90a512ce5eSPhilip Reames  %add.ptr = getelementptr i8, ptr %p.0, i32 %mul
91a512ce5eSPhilip Reames  %arrayidx = getelementptr ptr, ptr %call, i32 %1
92a512ce5eSPhilip Reames  store ptr %p.0, ptr %arrayidx, align 4
93a512ce5eSPhilip Reames  %inc = add i32 %1, 1
94a512ce5eSPhilip Reames  %tobool.not = icmp eq i32 %1, 0
95a512ce5eSPhilip Reames  br i1 %tobool.not, label %for.end, label %for.cond
96a512ce5eSPhilip Reames
97a512ce5eSPhilip Reames
98a512ce5eSPhilip Reamesfor.end:                                          ; preds = %for.cond
99a512ce5eSPhilip Reames  ret void
100a512ce5eSPhilip Reames}
101c416f670SPhilip Reames;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
102c416f670SPhilip Reames; CHECK: {{.*}}
103