@@ -10234,6 +10234,33 @@ struct AANoFPClassImpl : AANoFPClass {
10234
10234
}
10235
10235
}
10236
10236
10237
+ // / See followUsesInMBEC
10238
+ bool followUseInMBEC (Attributor &A, const Use *U, const Instruction *I,
10239
+ AANoFPClass::StateType &State) {
10240
+ const Value *UseV = U->get ();
10241
+ const DominatorTree *DT = nullptr ;
10242
+ AssumptionCache *AC = nullptr ;
10243
+ const TargetLibraryInfo *TLI = nullptr ;
10244
+ InformationCache &InfoCache = A.getInfoCache ();
10245
+
10246
+ if (Function *F = getAnchorScope ()) {
10247
+ DT = InfoCache.getAnalysisResultForFunction <DominatorTreeAnalysis>(*F);
10248
+ AC = InfoCache.getAnalysisResultForFunction <AssumptionAnalysis>(*F);
10249
+ TLI = InfoCache.getTargetLibraryInfoForFunction (*F);
10250
+ }
10251
+
10252
+ const DataLayout &DL = A.getDataLayout ();
10253
+
10254
+ KnownFPClass KnownFPClass =
10255
+ computeKnownFPClass (UseV, DL,
10256
+ /* InterestedClasses=*/ fcAllFlags,
10257
+ /* Depth=*/ 0 , TLI, AC, I, DT);
10258
+ State.addKnownBits (~KnownFPClass.KnownFPClasses );
10259
+
10260
+ bool TrackUse = false ;
10261
+ return TrackUse;
10262
+ }
10263
+
10237
10264
const std::string getAsStr () const override {
10238
10265
std::string Result = " nofpclass" ;
10239
10266
raw_string_ostream OS (Result);
@@ -10251,9 +10278,39 @@ struct AANoFPClassFloating : public AANoFPClassImpl {
10251
10278
AANoFPClassFloating (const IRPosition &IRP, Attributor &A)
10252
10279
: AANoFPClassImpl(IRP, A) {}
10253
10280
10281
+ // / See AbstractAttribute::initialize(...).
10282
+ void initialize (Attributor &A) override {
10283
+ AANoFPClassImpl::initialize (A);
10284
+ }
10285
+
10254
10286
// / See AbstractAttribute::updateImpl(...).
10255
10287
ChangeStatus updateImpl (Attributor &A) override {
10256
- return indicatePessimisticFixpoint ();
10288
+ SmallVector<AA::ValueAndContext> Values;
10289
+ bool UsedAssumedInformation = false ;
10290
+ if (!A.getAssumedSimplifiedValues (getIRPosition (), *this , Values,
10291
+ AA::AnyScope, UsedAssumedInformation)) {
10292
+ Values.push_back ({getAssociatedValue (), getCtxI ()});
10293
+ }
10294
+
10295
+ StateType T;
10296
+ auto VisitValueCB = [&](Value &V, const Instruction *CtxI) -> bool {
10297
+ const auto &AA = A.getAAFor <AANoFPClass>(*this , IRPosition::value (V),
10298
+ DepClassTy::REQUIRED);
10299
+ if (this == &AA) {
10300
+ T.indicatePessimisticFixpoint ();
10301
+ } else {
10302
+ const AANoFPClass::StateType &S =
10303
+ static_cast <const AANoFPClass::StateType &>(AA.getState ());
10304
+ T ^= S;
10305
+ }
10306
+ return T.isValidState ();
10307
+ };
10308
+
10309
+ for (const auto &VAC : Values)
10310
+ if (!VisitValueCB (*VAC.getValue (), VAC.getCtxI ()))
10311
+ return indicatePessimisticFixpoint ();
10312
+
10313
+ return clampStateAndIndicateChange (getState (), T);
10257
10314
}
10258
10315
10259
10316
// / See AbstractAttribute::trackStatistics()
0 commit comments