@@ -94,3 +94,50 @@ loop.end:
94
94
%retval = phi i64 [ %index , %loop ], [ -1 , %loop.inc ]
95
95
ret i64 %retval
96
96
}
97
+
98
+ define i64 @early_exit_alignment_and_deref_known_via_assumption (ptr noalias %p1 , ptr noalias %p2 , i64 %n ) nofree nosync {
99
+ ; CHECK-LABEL: define i64 @early_exit_alignment_and_deref_known_via_assumption(
100
+ ; CHECK-SAME: ptr noalias [[P1:%.*]], ptr noalias [[P2:%.*]], i64 [[N:%.*]]) #[[ATTR0]] {
101
+ ; CHECK-NEXT: entry:
102
+ ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P1]], i64 4), "dereferenceable"(ptr [[P1]], i64 [[N]]) ]
103
+ ; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[P2]], i64 4), "dereferenceable"(ptr [[P2]], i64 [[N]]) ]
104
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
105
+ ; CHECK: loop:
106
+ ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ [[INDEX_NEXT:%.*]], [[LOOP_INC:%.*]] ], [ 0, [[ENTRY:%.*]] ]
107
+ ; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[P1]], i64 [[INDEX]]
108
+ ; CHECK-NEXT: [[LD1:%.*]] = load i8, ptr [[ARRAYIDX]], align 1
109
+ ; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i8, ptr [[P2]], i64 [[INDEX]]
110
+ ; CHECK-NEXT: [[LD2:%.*]] = load i8, ptr [[ARRAYIDX1]], align 1
111
+ ; CHECK-NEXT: [[CMP3:%.*]] = icmp eq i8 [[LD1]], [[LD2]]
112
+ ; CHECK-NEXT: br i1 [[CMP3]], label [[LOOP_INC]], label [[LOOP_END:%.*]]
113
+ ; CHECK: loop.inc:
114
+ ; CHECK-NEXT: [[INDEX_NEXT]] = add i64 [[INDEX]], 1
115
+ ; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDEX_NEXT]], [[N]]
116
+ ; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[LOOP_END]]
117
+ ; CHECK: loop.end:
118
+ ; CHECK-NEXT: [[RETVAL:%.*]] = phi i64 [ [[INDEX]], [[LOOP]] ], [ -1, [[LOOP_INC]] ]
119
+ ; CHECK-NEXT: ret i64 [[RETVAL]]
120
+ ;
121
+ entry:
122
+ call void @llvm.assume (i1 true ) [ "align" (ptr %p1 , i64 4 ), "dereferenceable" (ptr %p1 , i64 %n ) ]
123
+ call void @llvm.assume (i1 true ) [ "align" (ptr %p2 , i64 4 ), "dereferenceable" (ptr %p2 , i64 %n ) ]
124
+ br label %loop
125
+
126
+ loop:
127
+ %index = phi i64 [ %index.next , %loop.inc ], [ 0 , %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
+
135
+ loop.inc:
136
+ %index.next = add i64 %index , 1
137
+ %exitcond = icmp ne i64 %index.next , %n
138
+ br i1 %exitcond , label %loop , label %loop.end
139
+
140
+ loop.end:
141
+ %retval = phi i64 [ %index , %loop ], [ -1 , %loop.inc ]
142
+ ret i64 %retval
143
+ }
0 commit comments