|
20 | 20 | define void @test2() personality ptr @__gxx_personality_v0 {
|
21 | 21 | ; CHECK-LABEL: @test2(
|
22 | 22 | ; CHECK-NEXT: entry:
|
23 |
| -; CHECK-NEXT: call void @test2() #[[ATTR3:[0-9]+]] |
| 23 | +; CHECK-NEXT: call void @test2() #[[ATTR4:[0-9]+]] |
24 | 24 | ; CHECK-NEXT: ret void
|
25 | 25 | ;
|
26 | 26 | entry:
|
@@ -242,6 +242,8 @@ declare ptr @fn_nonnull_deref_arg(ptr nonnull dereferenceable(4) %p)
|
242 | 242 | declare ptr @fn_nonnull_deref_or_null_arg(ptr nonnull dereferenceable_or_null(4) %p)
|
243 | 243 | declare ptr @fn_nonnull_arg(ptr nonnull %p)
|
244 | 244 | declare ptr @fn_noundef_arg(ptr noundef %p)
|
| 245 | +declare ptr @fn_ptr_arg(ptr) |
| 246 | +declare ptr @fn_ptr_arg_nounwind_willreturn(ptr) nounwind willreturn |
245 | 247 |
|
246 | 248 | define void @test9(i1 %X, ptr %Y) {
|
247 | 249 | ; CHECK-LABEL: @test9(
|
@@ -855,10 +857,72 @@ exit:
|
855 | 857 | ret i32 %res
|
856 | 858 | }
|
857 | 859 |
|
| 860 | +; From bb to bb5 is UB. |
| 861 | +define i32 @test9_null_user_order_1(ptr %arg, i1 %arg1, ptr %arg2) { |
| 862 | +; CHECK-LABEL: @test9_null_user_order_1( |
| 863 | +; CHECK-NEXT: bb: |
| 864 | +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG1:%.*]], true |
| 865 | +; CHECK-NEXT: call void @llvm.assume(i1 [[TMP0]]) |
| 866 | +; CHECK-NEXT: [[I:%.*]] = load ptr, ptr [[ARG:%.*]], align 8 |
| 867 | +; CHECK-NEXT: [[I4:%.*]] = getelementptr inbounds i8, ptr [[I]], i64 1 |
| 868 | +; CHECK-NEXT: store ptr [[I4]], ptr [[ARG]], align 8 |
| 869 | +; CHECK-NEXT: [[I7:%.*]] = load i32, ptr [[I]], align 4 |
| 870 | +; CHECK-NEXT: [[I8:%.*]] = icmp ne ptr [[I]], [[ARG2:%.*]] |
| 871 | +; CHECK-NEXT: call void @fn_ptr_arg(i1 [[I8]]) |
| 872 | +; CHECK-NEXT: ret i32 [[I7]] |
| 873 | +; |
| 874 | +bb: |
| 875 | + br i1 %arg1, label %bb5, label %bb3 |
| 876 | + |
| 877 | +bb3: ; preds = %bb |
| 878 | + %i = load ptr, ptr %arg, align 8 |
| 879 | + %i4 = getelementptr inbounds i8, ptr %i, i64 1 |
| 880 | + store ptr %i4, ptr %arg, align 8 |
| 881 | + br label %bb5 |
| 882 | + |
| 883 | +bb5: ; preds = %bb3, %bb |
| 884 | + %i6 = phi ptr [ %i, %bb3 ], [ null, %bb ] |
| 885 | + %i7 = load i32, ptr %i6, align 4 |
| 886 | + %i8 = icmp ne ptr %i6, %arg2 |
| 887 | + call void @fn_ptr_arg(i1 %i8) |
| 888 | + ret i32 %i7 |
| 889 | +} |
| 890 | + |
| 891 | +define i32 @test9_null_user_order_2(ptr %arg, i1 %arg1, ptr %arg2) { |
| 892 | +; CHECK-LABEL: @test9_null_user_order_2( |
| 893 | +; CHECK-NEXT: bb: |
| 894 | +; CHECK-NEXT: [[TMP0:%.*]] = xor i1 [[ARG1:%.*]], true |
| 895 | +; CHECK-NEXT: call void @llvm.assume(i1 [[TMP0]]) |
| 896 | +; CHECK-NEXT: [[I:%.*]] = load ptr, ptr [[ARG:%.*]], align 8 |
| 897 | +; CHECK-NEXT: [[I4:%.*]] = getelementptr inbounds i8, ptr [[I]], i64 1 |
| 898 | +; CHECK-NEXT: store ptr [[I4]], ptr [[ARG]], align 8 |
| 899 | +; CHECK-NEXT: [[I8:%.*]] = icmp ne ptr [[I]], [[ARG2:%.*]] |
| 900 | +; CHECK-NEXT: call void @fn_ptr_arg_nounwind_willreturn(i1 [[I8]]) |
| 901 | +; CHECK-NEXT: [[I7:%.*]] = load i32, ptr [[I]], align 4 |
| 902 | +; CHECK-NEXT: ret i32 [[I7]] |
| 903 | +; |
| 904 | +bb: |
| 905 | + br i1 %arg1, label %bb5, label %bb3 |
| 906 | + |
| 907 | +bb3: ; preds = %bb |
| 908 | + %i = load ptr, ptr %arg, align 8 |
| 909 | + %i4 = getelementptr inbounds i8, ptr %i, i64 1 |
| 910 | + store ptr %i4, ptr %arg, align 8 |
| 911 | + br label %bb5 |
| 912 | + |
| 913 | +bb5: ; preds = %bb3, %bb |
| 914 | + %i6 = phi ptr [ %i, %bb3 ], [ null, %bb ] |
| 915 | + %i8 = icmp ne ptr %i6, %arg2 |
| 916 | + call void @fn_ptr_arg_nounwind_willreturn(i1 %i8) |
| 917 | + %i7 = load i32, ptr %i6, align 4 |
| 918 | + ret i32 %i7 |
| 919 | +} |
| 920 | + |
858 | 921 | attributes #0 = { null_pointer_is_valid }
|
859 | 922 | ;.
|
860 | 923 | ; CHECK: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: write) }
|
861 | 924 | ; CHECK: attributes #[[ATTR1:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
|
862 | 925 | ; CHECK: attributes #[[ATTR2:[0-9]+]] = { null_pointer_is_valid }
|
863 |
| -; CHECK: attributes #[[ATTR3]] = { nounwind } |
| 926 | +; CHECK: attributes #[[ATTR3:[0-9]+]] = { nounwind willreturn } |
| 927 | +; CHECK: attributes #[[ATTR4]] = { nounwind } |
864 | 928 | ;.
|
0 commit comments