| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| ; RUN: opt -S -instsimplify < %s | FileCheck %s |
| |
| declare void @bar(i8* %a, i8* nonnull %b) |
| |
| ; 'y' must be nonnull. |
| |
| define i1 @caller1(i8* %x, i8* %y) { |
| ; CHECK-LABEL: @caller1( |
| ; CHECK-NEXT: call void @bar(i8* %x, i8* %y) |
| ; CHECK-NEXT: [[NULL_CHECK:%.*]] = icmp eq i8* %y, null |
| ; CHECK-NEXT: ret i1 [[NULL_CHECK]] |
| ; |
| call void @bar(i8* %x, i8* %y) |
| %null_check = icmp eq i8* %y, null |
| ret i1 %null_check |
| } |
| |
| ; Don't know anything about 'y'. |
| |
| define i1 @caller2(i8* %x, i8* %y) { |
| ; CHECK-LABEL: @caller2( |
| ; CHECK-NEXT: call void @bar(i8* %y, i8* %x) |
| ; CHECK-NEXT: [[NULL_CHECK:%.*]] = icmp eq i8* %y, null |
| ; CHECK-NEXT: ret i1 [[NULL_CHECK]] |
| ; |
| call void @bar(i8* %y, i8* %x) |
| %null_check = icmp eq i8* %y, null |
| ret i1 %null_check |
| } |
| |
| ; 'y' must be nonnull. |
| |
| define i1 @caller3(i8* %x, i8* %y) { |
| ; CHECK-LABEL: @caller3( |
| ; CHECK-NEXT: call void @bar(i8* %x, i8* %y) |
| ; CHECK-NEXT: [[NULL_CHECK:%.*]] = icmp ne i8* %y, null |
| ; CHECK-NEXT: ret i1 [[NULL_CHECK]] |
| ; |
| call void @bar(i8* %x, i8* %y) |
| %null_check = icmp ne i8* %y, null |
| ret i1 %null_check |
| } |
| |
| ; Don't know anything about 'y'. |
| |
| define i1 @caller4(i8* %x, i8* %y) { |
| ; CHECK-LABEL: @caller4( |
| ; CHECK-NEXT: call void @bar(i8* %y, i8* %x) |
| ; CHECK-NEXT: [[NULL_CHECK:%.*]] = icmp ne i8* %y, null |
| ; CHECK-NEXT: ret i1 [[NULL_CHECK]] |
| ; |
| call void @bar(i8* %y, i8* %x) |
| %null_check = icmp ne i8* %y, null |
| ret i1 %null_check |
| } |
| |