@@ -174,12 +174,14 @@ void use(double*);
174174// CHECK-NEXT: [[VLA:%.*]] = alloca double, i64 [[TMP0]], align 16
175175// CHECK-NEXT: call void @use(ptr noundef nonnull [[VLA]]) #[[ATTR7:[0-9]+]]
176176// CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[I]] to i64
177- // CHECK-NEXT: [[DOTNOT:%.*]] = icmp ugt i64 [[TMP0]], [[IDXPROM]]
178- // CHECK-NEXT: br i1 [[DOTNOT]], label %[[BB1:.*]], label %[[TRAP:.*]]
179- // CHECK: [[BB1]]:
177+ // CHECK-NEXT: [[TMP1:%.*]] = icmp ule i64 [[TMP0]], [[IDXPROM]]
178+ // CHECK-NEXT: [[TMP2:%.*]] = call i1 @llvm.allow.ubsan.check(i8 71), !nosanitize [[META2]]
179+ // CHECK-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]], !nosanitize [[META2]]
180+ // CHECK-NEXT: br i1 [[TMP3]], label %[[TRAP:.*]], label %[[BB4:.*]]
181+ // CHECK: [[BB4]]:
180182// CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds double, ptr [[VLA]], i64 [[IDXPROM]]
181- // CHECK-NEXT: [[TMP2 :%.*]] = load double, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA8:![0-9]+]]
182- // CHECK-NEXT: ret double [[TMP2 ]]
183+ // CHECK-NEXT: [[TMP5 :%.*]] = load double, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA8:![0-9]+]]
184+ // CHECK-NEXT: ret double [[TMP5 ]]
183185// CHECK: [[TRAP]]:
184186// CHECK-NEXT: call void @__ubsan_handle_local_out_of_bounds_abort() #[[ATTR6]], !nosanitize [[META2]]
185187// CHECK-NEXT: unreachable, !nosanitize [[META2]]
@@ -191,12 +193,14 @@ void use(double*);
191193// TR-NEXT: [[VLA:%.*]] = alloca double, i64 [[TMP0]], align 16
192194// TR-NEXT: call void @use(ptr noundef nonnull [[VLA]]) #[[ATTR6:[0-9]+]]
193195// TR-NEXT: [[IDXPROM:%.*]] = sext i32 [[I]] to i64
194- // TR-NEXT: [[DOTNOT:%.*]] = icmp ugt i64 [[TMP0]], [[IDXPROM]]
195- // TR-NEXT: br i1 [[DOTNOT]], label %[[BB1:.*]], label %[[TRAP:.*]]
196- // TR: [[BB1]]:
196+ // TR-NEXT: [[TMP1:%.*]] = icmp ule i64 [[TMP0]], [[IDXPROM]]
197+ // TR-NEXT: [[TMP2:%.*]] = call i1 @llvm.allow.ubsan.check(i8 71), !nosanitize [[META2]]
198+ // TR-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]], !nosanitize [[META2]]
199+ // TR-NEXT: br i1 [[TMP3]], label %[[TRAP:.*]], label %[[BB4:.*]]
200+ // TR: [[BB4]]:
197201// TR-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds double, ptr [[VLA]], i64 [[IDXPROM]]
198- // TR-NEXT: [[TMP2 :%.*]] = load double, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA7:![0-9]+]]
199- // TR-NEXT: ret double [[TMP2 ]]
202+ // TR-NEXT: [[TMP5 :%.*]] = load double, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA7:![0-9]+]]
203+ // TR-NEXT: ret double [[TMP5 ]]
200204// TR: [[TRAP]]:
201205// TR-NEXT: call void @llvm.ubsantrap(i8 3) #[[ATTR5]], !nosanitize [[META2]]
202206// TR-NEXT: unreachable, !nosanitize [[META2]]
@@ -208,15 +212,17 @@ void use(double*);
208212// REC-NEXT: [[VLA:%.*]] = alloca double, i64 [[TMP0]], align 16
209213// REC-NEXT: call void @use(ptr noundef nonnull [[VLA]]) #[[ATTR5:[0-9]+]]
210214// REC-NEXT: [[IDXPROM:%.*]] = sext i32 [[I]] to i64
211- // REC-NEXT: [[DOTNOT:%.*]] = icmp ugt i64 [[TMP0]], [[IDXPROM]]
212- // REC-NEXT: br i1 [[DOTNOT]], label %[[BB1:.*]], label %[[TRAP:.*]]
213- // REC: [[BB1]]:
215+ // REC-NEXT: [[TMP1:%.*]] = icmp ule i64 [[TMP0]], [[IDXPROM]]
216+ // REC-NEXT: [[TMP2:%.*]] = call i1 @llvm.allow.ubsan.check(i8 71), !nosanitize [[META2]]
217+ // REC-NEXT: [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]], !nosanitize [[META2]]
218+ // REC-NEXT: br i1 [[TMP3]], label %[[TRAP:.*]], label %[[BB4:.*]]
219+ // REC: [[BB4]]:
214220// REC-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds double, ptr [[VLA]], i64 [[IDXPROM]]
215- // REC-NEXT: [[TMP2 :%.*]] = load double, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA8:![0-9]+]]
216- // REC-NEXT: ret double [[TMP2 ]]
221+ // REC-NEXT: [[TMP5 :%.*]] = load double, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA8:![0-9]+]]
222+ // REC-NEXT: ret double [[TMP5 ]]
217223// REC: [[TRAP]]:
218224// REC-NEXT: call void @__ubsan_handle_local_out_of_bounds() #[[ATTR6]], !nosanitize [[META2]]
219- // REC-NEXT: br label %[[BB1 ]], !nosanitize [[META2]]
225+ // REC-NEXT: br label %[[BB4 ]], !nosanitize [[META2]]
220226//
221227double lbounds (int b , int i ) {
222228 double a [b ];
0 commit comments