@@ -26,9 +26,64 @@ define i32 @dead_aligned_alloc(i32 %size, i32 %alignment, i8 %value) {
2626 ret i32 0
2727}
2828
29+ define i1 @aligned_alloc_only_pointe (i32 %size , i32 %alignment , i8 %value ) {
30+ ; CHECK-LABEL: @aligned_alloc_only_pointe(
31+ ; CHECK-NEXT: [[ALIGNED_ALLOCATION:%.*]] = tail call ptr @aligned_alloc(i32 [[ALIGNMENT:%.*]], i32 [[SIZE:%.*]])
32+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr [[ALIGNED_ALLOCATION]], null
33+ ; CHECK-NEXT: ret i1 [[CMP]]
34+ ;
35+ %aligned_allocation = tail call ptr @aligned_alloc (i32 %alignment , i32 %size )
36+ %cmp = icmp ne ptr %aligned_allocation , null
37+ ret i1 %cmp
38+ }
39+
40+ define i1 @aligned_alloc_pointer_only_used_by_cmp_alignment_and_value_known_ok (i32 %size , i32 %alignment , i8 %value ) {
41+ ; CHECK-LABEL: @aligned_alloc_pointer_only_used_by_cmp_alignment_and_value_known_ok(
42+ ; CHECK-NEXT: ret i1 true
43+ ;
44+ %aligned_allocation = tail call ptr @aligned_alloc (i32 8 , i32 32 )
45+ %cmp = icmp ne ptr %aligned_allocation , null
46+ ret i1 %cmp
47+ }
48+
49+ define i1 @aligned_alloc_pointer_only_used_by_cmp_alignment_no_power_of_2 (i32 %size , i32 %alignment , i8 %value ) {
50+ ; CHECK-LABEL: @aligned_alloc_pointer_only_used_by_cmp_alignment_no_power_of_2(
51+ ; CHECK-NEXT: [[ALIGNED_ALLOCATION:%.*]] = tail call dereferenceable_or_null(32) ptr @aligned_alloc(i32 3, i32 32)
52+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr [[ALIGNED_ALLOCATION]], null
53+ ; CHECK-NEXT: ret i1 [[CMP]]
54+ ;
55+ %aligned_allocation = tail call ptr @aligned_alloc (i32 3 , i32 32 )
56+ %cmp = icmp ne ptr %aligned_allocation , null
57+ ret i1 %cmp
58+ }
59+
60+ define i1 @aligned_alloc_pointer_only_used_by_cmp_size_not_multiple_of_alignment (i32 %size , i32 %alignment , i8 %value ) {
61+ ; CHECK-LABEL: @aligned_alloc_pointer_only_used_by_cmp_size_not_multiple_of_alignment(
62+ ; CHECK-NEXT: [[ALIGNED_ALLOCATION:%.*]] = tail call dereferenceable_or_null(31) ptr @aligned_alloc(i32 8, i32 31)
63+ ; CHECK-NEXT: [[CMP:%.*]] = icmp ne ptr [[ALIGNED_ALLOCATION]], null
64+ ; CHECK-NEXT: ret i1 [[CMP]]
65+ ;
66+ %aligned_allocation = tail call ptr @aligned_alloc (i32 8 , i32 31 )
67+ %cmp = icmp ne ptr %aligned_allocation , null
68+ ret i1 %cmp
69+ }
70+
71+ ; This test uses a aligned allocation function different to @aligned_alloc,
72+ ; and should be treated as having @aligned_alloc's constraints on alignment
73+ ; and size operands.
74+ define i1 @other_aligned_allocation_function (i32 %size , i32 %alignment , i8 %value ) {
75+ ; CHECK-LABEL: @other_aligned_allocation_function(
76+ ; CHECK-NEXT: ret i1 true
77+ ;
78+ %aligned_allocation = tail call ptr @other_aligned_alloc (i32 %alignment , i32 %size )
79+ %cmp = icmp ne ptr %aligned_allocation , null
80+ ret i1 %cmp
81+ }
82+
2983declare noalias ptr @calloc (i32 , i32 ) nounwind allockind("alloc,zeroed" ) allocsize(0 ,1 ) "alloc-family" ="malloc"
3084declare noalias ptr @malloc (i32 ) allockind("alloc,uninitialized" ) allocsize(0 ) "alloc-family" ="malloc"
3185declare noalias ptr @aligned_alloc (i32 , i32 ) allockind("alloc,uninitialized,aligned" ) allocsize(1 ) "alloc-family" ="malloc"
86+ declare noalias ptr @other_aligned_alloc (i32 , i32 ) allockind("alloc,uninitialized,aligned" ) allocsize(1 ) "alloc-family" ="malloc"
3287declare void @free (ptr ) allockind("free" ) "alloc-family" ="malloc"
3388
3489define i1 @foo () {
0 commit comments