@@ -7,7 +7,7 @@ define float @does_not_alias_errno(ptr noundef %p, float noundef %f) {
7
7
; CHECK-LABEL: define float @does_not_alias_errno(
8
8
; CHECK-SAME: ptr noundef [[P:%.*]], float noundef [[F:%.*]]) {
9
9
; CHECK-NEXT: [[ENTRY:.*:]]
10
- ; CHECK-NEXT: store float 0.000000e+00, ptr [[P]], align 4, !tbaa [[TBAA3 :![0-9]+]]
10
+ ; CHECK-NEXT: store float 0.000000e+00, ptr [[P]], align 4, !tbaa [[TBAA4 :![0-9]+]]
11
11
; CHECK-NEXT: [[CALL:%.*]] = call float @sinf(float noundef [[F]])
12
12
; CHECK-NEXT: ret float 0.000000e+00
13
13
;
@@ -18,6 +18,42 @@ entry:
18
18
ret float %0
19
19
}
20
20
21
+ ; sinf clobbering errno, but %p is alloca memory, wich can never aliases errno.
22
+ ; Hence, can do constant store-to-load forwarding.
23
+ define float @does_not_alias_errno_2 (float %f ) {
24
+ ; CHECK-LABEL: define float @does_not_alias_errno_2(
25
+ ; CHECK-SAME: float [[F:%.*]]) {
26
+ ; CHECK-NEXT: [[P:%.*]] = alloca float, align 4
27
+ ; CHECK-NEXT: call void @escape(ptr nonnull [[P]])
28
+ ; CHECK-NEXT: store float 0.000000e+00, ptr [[P]], align 4
29
+ ; CHECK-NEXT: [[TMP1:%.*]] = call float @sinf(float [[F]])
30
+ ; CHECK-NEXT: ret float 0.000000e+00
31
+ ;
32
+ %p = alloca float
33
+ call void @escape (ptr %p )
34
+ store float 0 .0 , ptr %p
35
+ call float @sinf (float %f )
36
+ %v = load float , ptr %p
37
+ ret float %v
38
+ }
39
+
40
+ ; sinf clobbering errno, but %p is memory accessed w/ size larger than errno.
41
+ ; Hence, can do constant store-to-load forwarding.
42
+ define double @does_not_alias_errno_3 (ptr %p , float %f ) {
43
+ ; CHECK-LABEL: define double @does_not_alias_errno_3(
44
+ ; CHECK-SAME: ptr [[P:%.*]], float [[F:%.*]]) {
45
+ ; CHECK-NEXT: call void @escape(ptr [[P]])
46
+ ; CHECK-NEXT: store double 0.000000e+00, ptr [[P]], align 8
47
+ ; CHECK-NEXT: [[TMP1:%.*]] = call float @sinf(float [[F]])
48
+ ; CHECK-NEXT: ret double 0.000000e+00
49
+ ;
50
+ call void @escape (ptr %p )
51
+ store double 0 .0 , ptr %p
52
+ call float @sinf (float %f )
53
+ %v = load double , ptr %p
54
+ ret double %v
55
+ }
56
+
21
57
; sinf clobbering errno, unknown TBAA info, %p may alias errno.
22
58
define float @may_alias_errno (ptr noundef %p , float noundef %f ) {
23
59
; CHECK-LABEL: define float @may_alias_errno(
36
72
}
37
73
38
74
declare float @sinf (float noundef) memory(errnomem: write)
75
+ declare void @escape (ptr %p )
39
76
40
77
!llvm.errno.tbaa = !{!0 }
41
78
@@ -45,3 +82,9 @@ declare float @sinf(float noundef) memory(errnomem: write)
45
82
!3 = !{!"Simple C/C++ TBAA" }
46
83
!4 = !{!5 , !5 , i64 0 }
47
84
!5 = !{!"float" , !2 , i64 0 }
85
+ ;.
86
+ ; CHECK: [[META2:![0-9]+]] = !{!"omnipotent char", [[META3:![0-9]+]], i64 0}
87
+ ; CHECK: [[META3]] = !{!"Simple C/C++ TBAA"}
88
+ ; CHECK: [[TBAA4]] = !{[[META5:![0-9]+]], [[META5]], i64 0}
89
+ ; CHECK: [[META5]] = !{!"float", [[META2]], i64 0}
90
+ ;.
0 commit comments