@@ -26,9 +26,64 @@ define i32 @dead_aligned_alloc(i32 %size, i32 %alignment, i8 %value) {
26
26
ret i32 0
27
27
}
28
28
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
+
29
83
declare noalias ptr @calloc (i32 , i32 ) nounwind allockind("alloc,zeroed" ) allocsize(0 ,1 ) "alloc-family" ="malloc"
30
84
declare noalias ptr @malloc (i32 ) allockind("alloc,uninitialized" ) allocsize(0 ) "alloc-family" ="malloc"
31
85
declare 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"
32
87
declare void @free (ptr ) allockind("free" ) "alloc-family" ="malloc"
33
88
34
89
define i1 @foo () {
0 commit comments