xref: /llvm-project/llvm/test/Transforms/LoopVectorize/single_early_exit_unsafe_ptrs.ll (revision 76f377618532fe486d1fff1250598a73c55f4310)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2; RUN: opt -S < %s -p loop-vectorize | FileCheck %s
3
4declare void @init_mem(ptr, i64);
5
6
7define i64 @same_exit_block_pre_inc_use1_too_small_allocas() {
8; CHECK-LABEL: define i64 @same_exit_block_pre_inc_use1_too_small_allocas() {
9; CHECK-NEXT:  entry:
10; CHECK-NEXT:    [[P1:%.*]] = alloca [42 x i8], align 1
11; CHECK-NEXT:    [[P2:%.*]] = alloca [42 x i8], align 1
12; CHECK-NEXT:    call void @init_mem(ptr [[P1]], i64 1024)
13; CHECK-NEXT:    call void @init_mem(ptr [[P2]], i64 1024)
14; CHECK-NEXT:    br label [[LOOP:%.*]]
15; CHECK:       loop:
16; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ]
17; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
18; CHECK-NEXT:    [[LD1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
19; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX]]
20; CHECK-NEXT:    [[LD2:%.*]] = load i8, ptr [[ARRAYIDX1]], align 1
21; CHECK-NEXT:    [[CMP3:%.*]] = icmp eq i8 [[LD1]], [[LD2]]
22; CHECK-NEXT:    br i1 [[CMP3]], label [[LOOP_INC]], label [[LOOP_END:%.*]]
23; CHECK:       loop.inc:
24; CHECK-NEXT:    [[INDEX_NEXT]] = add i64 [[INDEX]], 1
25; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
26; CHECK-NEXT:    br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]]
27; CHECK:       loop.end:
28; CHECK-NEXT:    [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ]
29; CHECK-NEXT:    ret i64 [[RETVAL]]
30;
31entry:
32  %p1 = alloca [42 x i8]
33  %p2 = alloca [42 x i8]
34  call void @init_mem(ptr %p1, i64 1024)
35  call void @init_mem(ptr %p2, i64 1024)
36  br label %loop
37
38loop:
39  %index = phi i64 [ %index.next, %loop.inc ], [ 3, %entry ]
40  %arrayidx = getelementptr inbounds i8, ptr %p1, i64 %index
41  %ld1 = load i8, ptr %arrayidx, align 1
42  %arrayidx1 = getelementptr inbounds i8, ptr %p2, i64 %index
43  %ld2 = load i8, ptr %arrayidx1, align 1
44  %cmp3 = icmp eq i8 %ld1, %ld2
45  br i1 %cmp3, label %loop.inc, label %loop.end
46
47loop.inc:
48  %index.next = add i64 %index, 1
49  %exitcond = icmp ne i64 %index.next, 67
50  br i1 %exitcond, label %loop, label %loop.end
51
52loop.end:
53  %retval = phi i64 [ %index, %loop ], [ 67, %loop.inc ]
54  ret i64 %retval
55}
56
57
58define i64 @same_exit_block_pre_inc_use1_too_small_deref_ptrs(ptr dereferenceable(42) %p1, ptr dereferenceable(42) %p2) {
59; CHECK-LABEL: define i64 @same_exit_block_pre_inc_use1_too_small_deref_ptrs(
60; CHECK-SAME: ptr dereferenceable(42) [[P1:%.*]], ptr dereferenceable(42) [[P2:%.*]]) {
61; CHECK-NEXT:  entry:
62; CHECK-NEXT:    br label [[LOOP:%.*]]
63; CHECK:       loop:
64; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ]
65; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
66; CHECK-NEXT:    [[LD1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
67; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX]]
68; CHECK-NEXT:    [[LD2:%.*]] = load i8, ptr [[ARRAYIDX1]], align 1
69; CHECK-NEXT:    [[CMP3:%.*]] = icmp eq i8 [[LD1]], [[LD2]]
70; CHECK-NEXT:    br i1 [[CMP3]], label [[LOOP_INC]], label [[LOOP_END:%.*]]
71; CHECK:       loop.inc:
72; CHECK-NEXT:    [[INDEX_NEXT]] = add i64 [[INDEX]], 1
73; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
74; CHECK-NEXT:    br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]]
75; CHECK:       loop.end:
76; CHECK-NEXT:    [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ]
77; CHECK-NEXT:    ret i64 [[RETVAL]]
78;
79entry:
80  br label %loop
81
82loop:
83  %index = phi i64 [ %index.next, %loop.inc ], [ 3, %entry ]
84  %arrayidx = getelementptr inbounds i8, ptr %p1, i64 %index
85  %ld1 = load i8, ptr %arrayidx, align 1
86  %arrayidx1 = getelementptr inbounds i8, ptr %p2, i64 %index
87  %ld2 = load i8, ptr %arrayidx1, align 1
88  %cmp3 = icmp eq i8 %ld1, %ld2
89  br i1 %cmp3, label %loop.inc, label %loop.end
90
91loop.inc:
92  %index.next = add i64 %index, 1
93  %exitcond = icmp ne i64 %index.next, 67
94  br i1 %exitcond, label %loop, label %loop.end
95
96loop.end:
97  %retval = phi i64 [ %index, %loop ], [ 67, %loop.inc ]
98  ret i64 %retval
99}
100
101
102define i64 @same_exit_block_pre_inc_use1_unknown_ptrs(ptr %p1, ptr %p2) {
103; CHECK-LABEL: define i64 @same_exit_block_pre_inc_use1_unknown_ptrs(
104; CHECK-SAME: ptr [[P1:%.*]], ptr [[P2:%.*]]) {
105; CHECK-NEXT:  entry:
106; CHECK-NEXT:    br label [[LOOP:%.*]]
107; CHECK:       loop:
108; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 3, [[ENTRY:%.*]] ]
109; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
110; CHECK-NEXT:    [[LD1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
111; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX]]
112; CHECK-NEXT:    [[LD2:%.*]] = load i8, ptr [[ARRAYIDX1]], align 1
113; CHECK-NEXT:    [[CMP3:%.*]] = icmp eq i8 [[LD1]], [[LD2]]
114; CHECK-NEXT:    br i1 [[CMP3]], label [[LOOP_INC]], label [[LOOP_END:%.*]]
115; CHECK:       loop.inc:
116; CHECK-NEXT:    [[INDEX_NEXT]] = add i64 [[INDEX]], 1
117; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], 67
118; CHECK-NEXT:    br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]]
119; CHECK:       loop.end:
120; CHECK-NEXT:    [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ 67, [[LOOP_INC]] ]
121; CHECK-NEXT:    ret i64 [[RETVAL]]
122;
123entry:
124  br label %loop
125
126loop:
127  %index = phi i64 [ %index.next, %loop.inc ], [ 3, %entry ]
128  %arrayidx = getelementptr inbounds i8, ptr %p1, i64 %index
129  %ld1 = load i8, ptr %arrayidx, align 1
130  %arrayidx1 = getelementptr inbounds i8, ptr %p2, i64 %index
131  %ld2 = load i8, ptr %arrayidx1, align 1
132  %cmp3 = icmp eq i8 %ld1, %ld2
133  br i1 %cmp3, label %loop.inc, label %loop.end
134
135loop.inc:
136  %index.next = add i64 %index, 1
137  %exitcond = icmp ne i64 %index.next, 67
138  br i1 %exitcond, label %loop, label %loop.end
139
140loop.end:
141  %retval = phi i64 [ %index, %loop ], [ 67, %loop.inc ]
142  ret i64 %retval
143}
144