Revert "Warn when unique objects might be duplicated in shared libraries (#117622)"
[llvm-project.git] / llvm / test / Transforms / LoopVectorize / single_early_exit_unsafe_ptrs.ll
blobc68eeac19c9ecfd1afd7c2a1d22b35bdd1064fc2
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
4 declare void @init_mem(ptr, i64);
7 define 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]]
31 entry:
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
38 loop:
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
47 loop.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
52 loop.end:
53   %retval = phi i64 [ %index, %loop ], [ 67, %loop.inc ]
54   ret i64 %retval
58 define 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]]
79 entry:
80   br label %loop
82 loop:
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
91 loop.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
96 loop.end:
97   %retval = phi i64 [ %index, %loop ], [ 67, %loop.inc ]
98   ret i64 %retval
102 define 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]]
123 entry:
124   br label %loop
126 loop:
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
135 loop.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
140 loop.end:
141   %retval = phi i64 [ %index, %loop ], [ 67, %loop.inc ]
142   ret i64 %retval