@@ -46,41 +46,91 @@ define float @no_mul_zero_3(float %a) {
46
46
ret float %b
47
47
}
48
48
49
- ; fadd [nnan ninf] X, (fsub [nnan ninf] 0, X) ==> 0
50
- ; where nnan and ninf have to occur at least once somewhere in this
51
- ; expression
52
- define float @fadd_fsub_0 (float %a ) {
53
- ; CHECK-LABEL: @fadd_fsub_0(
54
- ; CHECK-NEXT: [[NOFOLD:%.*]] = fsub float 0.000000e+00, [[A:%.*]]
55
- ; CHECK-NEXT: [[NO_ZERO:%.*]] = fadd nnan float [[NOFOLD]], [[A]]
56
- ; CHECK-NEXT: ret float [[NO_ZERO]]
49
+ ; FIXME: -X + X --> 0.0 (with nnan on the fadd)
50
+
51
+ define float @fadd_fnegx (float %x ) {
52
+ ; CHECK-LABEL: @fadd_fnegx(
53
+ ; CHECK-NEXT: [[NEGX:%.*]] = fsub float -0.000000e+00, [[X:%.*]]
54
+ ; CHECK-NEXT: [[R:%.*]] = fadd nnan float [[NEGX]], [[X]]
55
+ ; CHECK-NEXT: ret float [[R]]
57
56
;
58
- ; X + -X ==> 0
59
- %t1 = fsub nnan ninf float 0 .0 , %a
60
- %zero1 = fadd nnan ninf float %t1 , %a
57
+ %negx = fsub float -0 .0 , %x
58
+ %r = fadd nnan float %negx , %x
59
+ ret float %r
60
+ }
61
61
62
- %t2 = fsub nnan float 0 .0 , %a
63
- %zero2 = fadd ninf float %t2 , %a
62
+ ; FIXME: X + -X --> 0.0 (with nnan on the fadd)
64
63
65
- %t3 = fsub nnan ninf float 0 .0 , %a
66
- %zero3 = fadd float %t3 , %a
64
+ define <2 x float > @fadd_fnegx_commute_vec (<2 x float > %x ) {
65
+ ; CHECK-LABEL: @fadd_fnegx_commute_vec(
66
+ ; CHECK-NEXT: [[NEGX:%.*]] = fsub <2 x float> <float -0.000000e+00, float -0.000000e+00>, [[X:%.*]]
67
+ ; CHECK-NEXT: [[R:%.*]] = fadd nnan <2 x float> [[X]], [[NEGX]]
68
+ ; CHECK-NEXT: ret <2 x float> [[R]]
69
+ ;
70
+ %negx = fsub <2 x float > <float -0 .0 , float -0 .0 >, %x
71
+ %r = fadd nnan <2 x float > %x , %negx
72
+ ret <2 x float > %r
73
+ }
67
74
68
- %t4 = fsub float 0 .0 , %a
69
- %zero4 = fadd nnan ninf float %t4 , %a
75
+ ; FIXME: Could be NaN.
76
+ ; https://bugs.llvm.org/show_bug.cgi?id=26958
77
+ ; https://bugs.llvm.org/show_bug.cgi?id=27151
70
78
71
- ; Dont fold this
72
- %nofold = fsub float 0 .0 , %a
73
- %no_zero = fadd nnan float %nofold , %a
79
+ define float @fadd_fneg_nan (float %x ) {
80
+ ; CHECK-LABEL: @fadd_fneg_nan(
81
+ ; CHECK-NEXT: ret float 0.000000e+00
82
+ ;
83
+ %t = fsub nnan float -0 .0 , %x
84
+ %could_be_nan = fadd ninf float %t , %x
85
+ ret float %could_be_nan
86
+ }
74
87
75
- ; Coalesce the folded zeros
76
- %zero5 = fadd float %zero1 , %zero2
77
- %zero6 = fadd float %zero3 , %zero4
78
- %zero7 = fadd float %zero5 , %zero6
88
+ ; FIXME: Could be NaN.
79
89
80
- ; Should get folded
81
- %ret = fadd nsz float %no_zero , %zero7
90
+ define float @fadd_fneg_nan_commute (float %x ) {
91
+ ; CHECK-LABEL: @fadd_fneg_nan_commute(
92
+ ; CHECK-NEXT: ret float 0.000000e+00
93
+ ;
94
+ %t = fsub nnan ninf float -0 .0 , %x
95
+ %could_be_nan = fadd float %x , %t
96
+ ret float %could_be_nan
97
+ }
82
98
83
- ret float %ret
99
+ ; X + (0.0 - X) --> 0.0 (with nnan on the fadd)
100
+
101
+ define float @fadd_fsub_nnan_ninf (float %x ) {
102
+ ; CHECK-LABEL: @fadd_fsub_nnan_ninf(
103
+ ; CHECK-NEXT: ret float 0.000000e+00
104
+ ;
105
+ %sub = fsub float 0 .0 , %x
106
+ %zero = fadd nnan ninf float %x , %sub
107
+ ret float %zero
108
+ }
109
+
110
+ ; (0.0 - X) + X --> 0.0 (with nnan on the fadd)
111
+
112
+ define <2 x float > @fadd_fsub_nnan_ninf_commute_vec (<2 x float > %x ) {
113
+ ; CHECK-LABEL: @fadd_fsub_nnan_ninf_commute_vec(
114
+ ; CHECK-NEXT: ret <2 x float> zeroinitializer
115
+ ;
116
+ %sub = fsub <2 x float > zeroinitializer , %x
117
+ %zero = fadd nnan ninf <2 x float > %sub , %x
118
+ ret <2 x float > %zero
119
+ }
120
+
121
+ ; FIXME: Do fold this.
122
+ ; 'ninf' is not required because 'nnan' allows us to assume
123
+ ; that X is not INF/-INF (adding opposite INFs would be NaN).
124
+
125
+ define float @fadd_fsub_nnan (float %x ) {
126
+ ; CHECK-LABEL: @fadd_fsub_nnan(
127
+ ; CHECK-NEXT: [[SUB:%.*]] = fsub float 0.000000e+00, [[X:%.*]]
128
+ ; CHECK-NEXT: [[ZERO:%.*]] = fadd nnan float [[SUB]], [[X]]
129
+ ; CHECK-NEXT: ret float [[ZERO]]
130
+ ;
131
+ %sub = fsub float 0 .0 , %x
132
+ %zero = fadd nnan float %sub , %x
133
+ ret float %zero
84
134
}
85
135
86
136
; fsub nnan x, x ==> 0.0
0 commit comments