@@ -77,3 +77,137 @@ return: ; preds = %entry,%if.then
7777 %retval = load double , ptr %x.addr
7878 ret double %retval
7979}
80+
81+ define double @phi_with_nnan (double %x ) "no-nans-fp-math" ="true" {
82+ ; CHECK-LABEL: define double @phi_with_nnan(
83+ ; CHECK-SAME: double [[X:%.*]]) #[[ATTR2:[0-9]+]] {
84+ ; CHECK-NEXT: entry:
85+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X]], 0.000000e+00
86+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[RETURN:%.*]]
87+ ; CHECK: if.then:
88+ ; CHECK-NEXT: [[FNEG:%.*]] = fneg double [[X]]
89+ ; CHECK-NEXT: br label [[RETURN]]
90+ ; CHECK: return:
91+ ; CHECK-NEXT: [[X_ADDR_0:%.*]] = phi nnan double [ [[FNEG]], [[IF_THEN]] ], [ undef, [[ENTRY:%.*]] ]
92+ ; CHECK-NEXT: ret double [[X_ADDR_0]]
93+ ;
94+ entry:
95+ %x.addr = alloca double
96+ %cmp = fcmp olt double %x , 0 .0
97+ br i1 %cmp , label %if.then , label %return
98+
99+ if.then: ; preds = %entry
100+ %fneg = fneg double %x
101+ store double %fneg , ptr %x.addr
102+ br label %return
103+
104+ return: ; preds = %entry,%if.then
105+ %retval = load double , ptr %x.addr
106+ ret double %retval
107+ }
108+
109+ define <2 x double > @vector_phi_with_nnan (<2 x double > %x , i1 %cmp , <2 x double > %a , <2 x double > %b ) "no-nans-fp-math" ="true" {
110+ ; CHECK-LABEL: define <2 x double> @vector_phi_with_nnan(
111+ ; CHECK-SAME: <2 x double> [[X:%.*]], i1 [[CMP:%.*]], <2 x double> [[A:%.*]], <2 x double> [[B:%.*]]) #[[ATTR2]] {
112+ ; CHECK-NEXT: entry:
113+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[RETURN:%.*]]
114+ ; CHECK: if.then:
115+ ; CHECK-NEXT: br label [[RETURN]]
116+ ; CHECK: return:
117+ ; CHECK-NEXT: [[X_ADDR_0:%.*]] = phi nnan <2 x double> [ [[B]], [[IF_THEN]] ], [ [[A]], [[ENTRY:%.*]] ]
118+ ; CHECK-NEXT: ret <2 x double> [[X_ADDR_0]]
119+ ;
120+ entry:
121+ %x.addr = alloca <2 x double >
122+ store <2 x double > %a , ptr %x.addr
123+ br i1 %cmp , label %if.then , label %return
124+
125+ if.then: ; preds = %entry
126+ store <2 x double > %b , ptr %x.addr
127+ br label %return
128+
129+ return: ; preds = %entry,%if.then
130+ %retval = load <2 x double >, ptr %x.addr
131+ ret <2 x double > %retval
132+ }
133+
134+ define double @phi_without_nnan (double %x ) "no-nans-fp-math" ="false" {
135+ ; CHECK-LABEL: define double @phi_without_nnan(
136+ ; CHECK-SAME: double [[X:%.*]]) #[[ATTR3:[0-9]+]] {
137+ ; CHECK-NEXT: entry:
138+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X]], 0.000000e+00
139+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[RETURN:%.*]]
140+ ; CHECK: if.then:
141+ ; CHECK-NEXT: [[FNEG:%.*]] = fneg double [[X]]
142+ ; CHECK-NEXT: br label [[RETURN]]
143+ ; CHECK: return:
144+ ; CHECK-NEXT: [[X_ADDR_0:%.*]] = phi double [ [[FNEG]], [[IF_THEN]] ], [ undef, [[ENTRY:%.*]] ]
145+ ; CHECK-NEXT: ret double [[X_ADDR_0]]
146+ ;
147+ entry:
148+ %x.addr = alloca double
149+ %cmp = fcmp olt double %x , 0 .0
150+ br i1 %cmp , label %if.then , label %return
151+
152+ if.then: ; preds = %entry
153+ %fneg = fneg double %x
154+ store double %fneg , ptr %x.addr
155+ br label %return
156+
157+ return: ; preds = %entry,%if.then
158+ %retval = load double , ptr %x.addr
159+ ret double %retval
160+ }
161+
162+ define <2 x double > @vector_phi_with_ninf (<2 x double > %x , i1 %cmp , <2 x double > %a , <2 x double > %b ) "no-infs-fp-math" ="true" {
163+ ; CHECK-LABEL: define <2 x double> @vector_phi_with_ninf(
164+ ; CHECK-SAME: <2 x double> [[X:%.*]], i1 [[CMP:%.*]], <2 x double> [[A:%.*]], <2 x double> [[B:%.*]]) #[[ATTR4:[0-9]+]] {
165+ ; CHECK-NEXT: entry:
166+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[RETURN:%.*]]
167+ ; CHECK: if.then:
168+ ; CHECK-NEXT: br label [[RETURN]]
169+ ; CHECK: return:
170+ ; CHECK-NEXT: [[X_ADDR_0:%.*]] = phi ninf <2 x double> [ [[B]], [[IF_THEN]] ], [ [[A]], [[ENTRY:%.*]] ]
171+ ; CHECK-NEXT: ret <2 x double> [[X_ADDR_0]]
172+ ;
173+ entry:
174+ %x.addr = alloca <2 x double >
175+ store <2 x double > %a , ptr %x.addr
176+ br i1 %cmp , label %if.then , label %return
177+
178+ if.then: ; preds = %entry
179+ store <2 x double > %b , ptr %x.addr
180+ br label %return
181+
182+ return: ; preds = %entry,%if.then
183+ %retval = load <2 x double >, ptr %x.addr
184+ ret <2 x double > %retval
185+ }
186+
187+ define double @phi_without_ninf (double %x ) "no-infs-fp-math" ="false" {
188+ ; CHECK-LABEL: define double @phi_without_ninf(
189+ ; CHECK-SAME: double [[X:%.*]]) #[[ATTR5:[0-9]+]] {
190+ ; CHECK-NEXT: entry:
191+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X]], 0.000000e+00
192+ ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[RETURN:%.*]]
193+ ; CHECK: if.then:
194+ ; CHECK-NEXT: [[FNEG:%.*]] = fneg double [[X]]
195+ ; CHECK-NEXT: br label [[RETURN]]
196+ ; CHECK: return:
197+ ; CHECK-NEXT: [[X_ADDR_0:%.*]] = phi double [ [[FNEG]], [[IF_THEN]] ], [ undef, [[ENTRY:%.*]] ]
198+ ; CHECK-NEXT: ret double [[X_ADDR_0]]
199+ ;
200+ entry:
201+ %x.addr = alloca double
202+ %cmp = fcmp olt double %x , 0 .0
203+ br i1 %cmp , label %if.then , label %return
204+
205+ if.then: ; preds = %entry
206+ %fneg = fneg double %x
207+ store double %fneg , ptr %x.addr
208+ br label %return
209+
210+ return: ; preds = %entry,%if.then
211+ %retval = load double , ptr %x.addr
212+ ret double %retval
213+ }
0 commit comments