@@ -26,18 +26,58 @@ 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 (
29+ define i1 @aligned_alloc_pointer_only_used_by_cmp (i32 %size , i32 %alignment , i8 %value ) {
30+ ; CHECK-LABEL: @aligned_alloc_pointer_only_used_by_cmp (
3131; CHECK-NEXT: ret i1 true
3232;
3333 %aligned_allocation = tail call ptr @aligned_alloc (i32 %alignment , i32 %size )
3434 %cmp = icmp ne ptr %aligned_allocation , null
3535 ret i1 %cmp
3636}
3737
38+ define i1 @aligned_alloc_pointer_only_used_by_cmp_alignment_and_value_known_ok (i32 %size , i32 %alignment , i8 %value ) {
39+ ; CHECK-LABEL: @aligned_alloc_pointer_only_used_by_cmp_alignment_and_value_known_ok(
40+ ; CHECK-NEXT: ret i1 true
41+ ;
42+ %aligned_allocation = tail call ptr @aligned_alloc (i32 8 , i32 32 )
43+ %cmp = icmp ne ptr %aligned_allocation , null
44+ ret i1 %cmp
45+ }
46+
47+ define i1 @aligned_alloc_pointer_only_used_by_cmp_alignment_no_power_of_2 (i32 %size , i32 %alignment , i8 %value ) {
48+ ; CHECK-LABEL: @aligned_alloc_pointer_only_used_by_cmp_alignment_no_power_of_2(
49+ ; CHECK-NEXT: ret i1 true
50+ ;
51+ %aligned_allocation = tail call ptr @aligned_alloc (i32 3 , i32 32 )
52+ %cmp = icmp ne ptr %aligned_allocation , null
53+ ret i1 %cmp
54+ }
55+
56+ define i1 @aligned_alloc_pointer_only_used_by_cmp_size_not_multiple_of_alignment (i32 %size , i32 %alignment , i8 %value ) {
57+ ; CHECK-LABEL: @aligned_alloc_pointer_only_used_by_cmp_size_not_multiple_of_alignment(
58+ ; CHECK-NEXT: ret i1 true
59+ ;
60+ %aligned_allocation = tail call ptr @aligned_alloc (i32 8 , i32 31 )
61+ %cmp = icmp ne ptr %aligned_allocation , null
62+ ret i1 %cmp
63+ }
64+
65+ ; This test uses a aligned allocation function different to @aligned_alloc,
66+ ; and should be treated as having @aligned_alloc's constraints on alignment
67+ ; and size operands.
68+ define i1 @other_aligned_allocation_function (i32 %size , i32 %alignment , i8 %value ) {
69+ ; CHECK-LABEL: @other_aligned_allocation_function(
70+ ; CHECK-NEXT: ret i1 true
71+ ;
72+ %aligned_allocation = tail call ptr @other_aligned_alloc (i32 %alignment , i32 %size )
73+ %cmp = icmp ne ptr %aligned_allocation , null
74+ ret i1 %cmp
75+ }
76+
3877declare noalias ptr @calloc (i32 , i32 ) nounwind allockind("alloc,zeroed" ) allocsize(0 ,1 ) "alloc-family" ="malloc"
3978declare noalias ptr @malloc (i32 ) allockind("alloc,uninitialized" ) allocsize(0 ) "alloc-family" ="malloc"
4079declare noalias ptr @aligned_alloc (i32 , i32 ) allockind("alloc,uninitialized,aligned" ) allocsize(1 ) "alloc-family" ="malloc"
80+ declare noalias ptr @other_aligned_alloc (i32 , i32 ) allockind("alloc,uninitialized,aligned" ) allocsize(1 ) "alloc-family" ="malloc"
4181declare void @free (ptr ) allockind("free" ) "alloc-family" ="malloc"
4282
4383define i1 @foo () {
0 commit comments