@@ -26,18 +26,58 @@ 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 (
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 (
31
31
; CHECK-NEXT: ret i1 true
32
32
;
33
33
%aligned_allocation = tail call ptr @aligned_alloc (i32 %alignment , i32 %size )
34
34
%cmp = icmp ne ptr %aligned_allocation , null
35
35
ret i1 %cmp
36
36
}
37
37
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
+
38
77
declare noalias ptr @calloc (i32 , i32 ) nounwind allockind("alloc,zeroed" ) allocsize(0 ,1 ) "alloc-family" ="malloc"
39
78
declare noalias ptr @malloc (i32 ) allockind("alloc,uninitialized" ) allocsize(0 ) "alloc-family" ="malloc"
40
79
declare 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"
41
81
declare void @free (ptr ) allockind("free" ) "alloc-family" ="malloc"
42
82
43
83
define i1 @foo () {
0 commit comments