@@ -96,6 +96,104 @@ TEST_F(AArch64GISelMITest, TestFPClassCstVecNegZero) {
96
96
EXPECT_EQ (true , Known.SignBit );
97
97
}
98
98
99
+ TEST_F (AArch64GISelMITest, TestFPClassCstZeroFPExt) {
100
+ StringRef MIRString = R"(
101
+ %c0:_(s32) = G_FCONSTANT float 0.0
102
+ %ext:_(s64) = nnan ninf G_FPEXT %c0
103
+ %copy_vector:_(s64) = COPY %ext
104
+ )" ;
105
+
106
+ setUp (MIRString);
107
+ if (!TM)
108
+ GTEST_SKIP ();
109
+
110
+ Register CopyReg = Copies[Copies.size () - 1 ];
111
+ MachineInstr *FinalCopy = MRI->getVRegDef (CopyReg);
112
+ Register SrcReg = FinalCopy->getOperand (1 ).getReg ();
113
+
114
+ GISelValueTracking Info (*MF);
115
+
116
+ KnownFPClass Known = Info.computeKnownFPClass (SrcReg);
117
+
118
+ EXPECT_EQ (fcZero | fcNormal, Known.KnownFPClasses );
119
+ EXPECT_EQ (std::nullopt, Known.SignBit );
120
+ }
121
+
122
+ TEST_F (AArch64GISelMITest, TestFPClassCstVecZeroFPExt) {
123
+ StringRef MIRString = R"(
124
+ %c0:_(s32) = G_FCONSTANT float 0.0
125
+ %c1:_(s32) = G_FCONSTANT float 0.0
126
+ %c2:_(s32) = G_FCONSTANT float 0.0
127
+ %vector:_(<3 x s32>) = G_BUILD_VECTOR %c0, %c1, %c2
128
+ %ext:_(<3 x s64>) = nnan ninf G_FPEXT %vector
129
+ %copy_vector:_(<3 x s64>) = COPY %ext
130
+ )" ;
131
+
132
+ setUp (MIRString);
133
+ if (!TM)
134
+ GTEST_SKIP ();
135
+
136
+ Register CopyReg = Copies[Copies.size () - 1 ];
137
+ MachineInstr *FinalCopy = MRI->getVRegDef (CopyReg);
138
+ Register SrcReg = FinalCopy->getOperand (1 ).getReg ();
139
+
140
+ GISelValueTracking Info (*MF);
141
+
142
+ KnownFPClass Known = Info.computeKnownFPClass (SrcReg);
143
+
144
+ EXPECT_EQ (fcZero | fcNormal, Known.KnownFPClasses );
145
+ EXPECT_EQ (std::nullopt, Known.SignBit );
146
+ }
147
+
148
+ TEST_F (AArch64GISelMITest, TestFPClassCstZeroFPTrunc) {
149
+ StringRef MIRString = R"(
150
+ %c0:_(s64) = G_FCONSTANT double 0.0
151
+ %trunc:_(s32) = nnan ninf G_FPTRUNC %c0
152
+ %copy_vector:_(s32) = COPY %trunc
153
+ )" ;
154
+
155
+ setUp (MIRString);
156
+ if (!TM)
157
+ GTEST_SKIP ();
158
+
159
+ Register CopyReg = Copies[Copies.size () - 1 ];
160
+ MachineInstr *FinalCopy = MRI->getVRegDef (CopyReg);
161
+ Register SrcReg = FinalCopy->getOperand (1 ).getReg ();
162
+
163
+ GISelValueTracking Info (*MF);
164
+
165
+ KnownFPClass Known = Info.computeKnownFPClass (SrcReg);
166
+
167
+ EXPECT_EQ (fcZero | fcPosSubnormal | fcPosNormal, Known.KnownFPClasses );
168
+ EXPECT_EQ (false , Known.SignBit );
169
+ }
170
+
171
+ TEST_F (AArch64GISelMITest, TestFPClassCstVecZeroFPTrunc) {
172
+ StringRef MIRString = R"(
173
+ %c0:_(s64) = G_FCONSTANT double 0.0
174
+ %c1:_(s64) = G_FCONSTANT double 0.0
175
+ %c2:_(s64) = G_FCONSTANT double 0.0
176
+ %vector:_(<3 x s64>) = G_BUILD_VECTOR %c0, %c1, %c2
177
+ %trunc:_(<3 x s32>) = nnan ninf G_FPTRUNC %vector
178
+ %copy_vector:_(<3 x s32>) = COPY %trunc
179
+ )" ;
180
+
181
+ setUp (MIRString);
182
+ if (!TM)
183
+ GTEST_SKIP ();
184
+
185
+ Register CopyReg = Copies[Copies.size () - 1 ];
186
+ MachineInstr *FinalCopy = MRI->getVRegDef (CopyReg);
187
+ Register SrcReg = FinalCopy->getOperand (1 ).getReg ();
188
+
189
+ GISelValueTracking Info (*MF);
190
+
191
+ KnownFPClass Known = Info.computeKnownFPClass (SrcReg);
192
+
193
+ EXPECT_EQ (fcZero | fcPosSubnormal | fcPosNormal, Known.KnownFPClasses );
194
+ EXPECT_EQ (false , Known.SignBit );
195
+ }
196
+
99
197
TEST_F (AArch64GISelMITest, TestFPClassSelectPos0) {
100
198
StringRef MIRString = R"(
101
199
%ptr:_(p0) = G_IMPLICIT_DEF
0 commit comments