|
5 | 5 |
|
6 | 6 | declare ptr @foo()
|
7 | 7 | declare void @use.ptr(ptr) willreturn nounwind
|
| 8 | +declare void @use.val(i8) willreturn nounwind |
8 | 9 | declare void @bar()
|
9 | 10 | declare void @baz()
|
10 | 11 | declare ptr @llvm.ptrmask.p0.i64(ptr, i64)
|
11 | 12 | declare i1 @val()
|
| 13 | +declare i8 @val8() |
12 | 14 |
|
13 | 15 | define ptr @callee0123() {
|
14 | 16 | ; CHECK-LABEL: define ptr @callee0123() {
|
@@ -337,3 +339,74 @@ define ptr @caller12_todo() {
|
337 | 339 | %r = call nonnull ptr @callee12()
|
338 | 340 | ret ptr %r
|
339 | 341 | }
|
| 342 | + |
| 343 | +define i8 @callee13() { |
| 344 | +; CHECK-LABEL: define i8 @callee13() { |
| 345 | +; CHECK-NEXT: [[R:%.*]] = call i8 @val8() |
| 346 | +; CHECK-NEXT: ret i8 [[R]] |
| 347 | +; |
| 348 | + %r = call i8 @val8() |
| 349 | + ret i8 %r |
| 350 | +} |
| 351 | + |
| 352 | +define i8 @caller13_okay_use_after_poison_anyways() { |
| 353 | +; CHECK-LABEL: define i8 @caller13_okay_use_after_poison_anyways() { |
| 354 | +; CHECK-NEXT: [[R_I:%.*]] = call i8 @val8() |
| 355 | +; CHECK-NEXT: call void @use.val(i8 [[R_I]]) |
| 356 | +; CHECK-NEXT: ret i8 [[R_I]] |
| 357 | +; |
| 358 | + %r = call range(i8 0, 10) i8 @callee13() |
| 359 | + call void @use.val(i8 %r) |
| 360 | + ret i8 %r |
| 361 | +} |
| 362 | + |
| 363 | +define i8 @callee14() { |
| 364 | +; CHECK-LABEL: define i8 @callee14() { |
| 365 | +; CHECK-NEXT: [[R:%.*]] = call noundef i8 @val8() |
| 366 | +; CHECK-NEXT: ret i8 [[R]] |
| 367 | +; |
| 368 | + %r = call noundef i8 @val8() |
| 369 | + ret i8 %r |
| 370 | +} |
| 371 | + |
| 372 | +define i8 @caller14_fail_creates_ub() { |
| 373 | +; CHECK-LABEL: define i8 @caller14_fail_creates_ub() { |
| 374 | +; CHECK-NEXT: [[R_I:%.*]] = call noundef i8 @val8() |
| 375 | +; CHECK-NEXT: call void @use.val(i8 [[R_I]]) |
| 376 | +; CHECK-NEXT: ret i8 [[R_I]] |
| 377 | +; |
| 378 | + %r = call range(i8 0, 10) i8 @callee14() |
| 379 | + call void @use.val(i8 %r) |
| 380 | + ret i8 %r |
| 381 | +} |
| 382 | + |
| 383 | +define i8 @caller14_okay_is_ub_anyways() { |
| 384 | +; CHECK-LABEL: define i8 @caller14_okay_is_ub_anyways() { |
| 385 | +; CHECK-NEXT: [[R_I:%.*]] = call noundef i8 @val8() |
| 386 | +; CHECK-NEXT: call void @use.val(i8 [[R_I]]) |
| 387 | +; CHECK-NEXT: ret i8 [[R_I]] |
| 388 | +; |
| 389 | + %r = call noundef range(i8 0, 10) i8 @callee14() |
| 390 | + call void @use.val(i8 %r) |
| 391 | + ret i8 %r |
| 392 | +} |
| 393 | + |
| 394 | +define i8 @callee15() { |
| 395 | +; CHECK-LABEL: define i8 @callee15() { |
| 396 | +; CHECK-NEXT: [[R:%.*]] = call range(i8 5, 10) i8 @val8() |
| 397 | +; CHECK-NEXT: ret i8 [[R]] |
| 398 | +; |
| 399 | + %r = call range(i8 5, 10) i8 @val8() |
| 400 | + ret i8 %r |
| 401 | +} |
| 402 | + |
| 403 | +define i8 @caller15_okay_intersect_ranges() { |
| 404 | +; CHECK-LABEL: define i8 @caller15_okay_intersect_ranges() { |
| 405 | +; CHECK-NEXT: [[R_I:%.*]] = call range(i8 5, 10) i8 @val8() |
| 406 | +; CHECK-NEXT: call void @use.val(i8 [[R_I]]) |
| 407 | +; CHECK-NEXT: ret i8 [[R_I]] |
| 408 | +; |
| 409 | + %r = call range(i8 0, 7) i8 @callee15() |
| 410 | + call void @use.val(i8 %r) |
| 411 | + ret i8 %r |
| 412 | +} |
0 commit comments