[llvm] 6705f63 - Attributor: Start looking at uses when inferring nofpclass
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 17 04:02:50 PDT 2023
Author: Matt Arsenault
Date: 2023-03-17T07:02:41-04:00
New Revision: 6705f634f6455100ba66734c96a3cc04a5f00d7d
URL: https://github.com/llvm/llvm-project/commit/6705f634f6455100ba66734c96a3cc04a5f00d7d
DIFF: https://github.com/llvm/llvm-project/commit/6705f634f6455100ba66734c96a3cc04a5f00d7d.diff
LOG: Attributor: Start looking at uses when inferring nofpclass
Pretty much just copy pasted from noundef handling
Added:
Modified:
llvm/lib/Transforms/IPO/AttributorAttributes.cpp
llvm/test/Transforms/Attributor/nofpclass.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
index e2abf9b95b2f..e8d74d325e6e 100644
--- a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
+++ b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
@@ -10234,6 +10234,33 @@ struct AANoFPClassImpl : AANoFPClass {
}
}
+ /// See followUsesInMBEC
+ bool followUseInMBEC(Attributor &A, const Use *U, const Instruction *I,
+ AANoFPClass::StateType &State) {
+ const Value *UseV = U->get();
+ const DominatorTree *DT = nullptr;
+ AssumptionCache *AC = nullptr;
+ const TargetLibraryInfo *TLI = nullptr;
+ InformationCache &InfoCache = A.getInfoCache();
+
+ if (Function *F = getAnchorScope()) {
+ DT = InfoCache.getAnalysisResultForFunction<DominatorTreeAnalysis>(*F);
+ AC = InfoCache.getAnalysisResultForFunction<AssumptionAnalysis>(*F);
+ TLI = InfoCache.getTargetLibraryInfoForFunction(*F);
+ }
+
+ const DataLayout &DL = A.getDataLayout();
+
+ KnownFPClass KnownFPClass =
+ computeKnownFPClass(UseV, DL,
+ /*InterestedClasses=*/fcAllFlags,
+ /*Depth=*/0, TLI, AC, I, DT);
+ State.addKnownBits(~KnownFPClass.KnownFPClasses);
+
+ bool TrackUse = false;
+ return TrackUse;
+ }
+
const std::string getAsStr() const override {
std::string Result = "nofpclass";
raw_string_ostream OS(Result);
@@ -10251,9 +10278,39 @@ struct AANoFPClassFloating : public AANoFPClassImpl {
AANoFPClassFloating(const IRPosition &IRP, Attributor &A)
: AANoFPClassImpl(IRP, A) {}
+ /// See AbstractAttribute::initialize(...).
+ void initialize(Attributor &A) override {
+ AANoFPClassImpl::initialize(A);
+ }
+
/// See AbstractAttribute::updateImpl(...).
ChangeStatus updateImpl(Attributor &A) override {
- return indicatePessimisticFixpoint();
+ SmallVector<AA::ValueAndContext> Values;
+ bool UsedAssumedInformation = false;
+ if (!A.getAssumedSimplifiedValues(getIRPosition(), *this, Values,
+ AA::AnyScope, UsedAssumedInformation)) {
+ Values.push_back({getAssociatedValue(), getCtxI()});
+ }
+
+ StateType T;
+ auto VisitValueCB = [&](Value &V, const Instruction *CtxI) -> bool {
+ const auto &AA = A.getAAFor<AANoFPClass>(*this, IRPosition::value(V),
+ DepClassTy::REQUIRED);
+ if (this == &AA) {
+ T.indicatePessimisticFixpoint();
+ } else {
+ const AANoFPClass::StateType &S =
+ static_cast<const AANoFPClass::StateType &>(AA.getState());
+ T ^= S;
+ }
+ return T.isValidState();
+ };
+
+ for (const auto &VAC : Values)
+ if (!VisitValueCB(*VAC.getValue(), VAC.getCtxI()))
+ return indicatePessimisticFixpoint();
+
+ return clampStateAndIndicateChange(getState(), T);
}
/// See AbstractAttribute::trackStatistics()
diff --git a/llvm/test/Transforms/Attributor/nofpclass.ll b/llvm/test/Transforms/Attributor/nofpclass.ll
index 9f6514e097ab..5b2d7ddeee90 100644
--- a/llvm/test/Transforms/Attributor/nofpclass.ll
+++ b/llvm/test/Transforms/Attributor/nofpclass.ll
@@ -167,7 +167,7 @@ define void @arg_used_by_nofpclass_nan_callsite(float %arg) {
define void @ninf_arg_used_by_nofpclass_nan_callsite(float nofpclass(inf) %arg) {
; CHECK-LABEL: define void @ninf_arg_used_by_nofpclass_nan_callsite
; CHECK-SAME: (float nofpclass(inf) [[ARG:%.*]]) {
-; CHECK-NEXT: call void @extern.use(float nofpclass(nan) [[ARG]])
+; CHECK-NEXT: call void @extern.use(float nofpclass(nan inf) [[ARG]])
; CHECK-NEXT: ret void
;
call void @extern.use(float nofpclass(nan) %arg)
@@ -260,7 +260,7 @@ define float @fcmp_uno_check(float %arg) local_unnamed_addr {
; CHECK-NEXT: [[ISNAN:%.*]] = fcmp uno float [[ARG]], 0.000000e+00
; CHECK-NEXT: br i1 [[ISNAN]], label [[BB0:%.*]], label [[BB1:%.*]]
; CHECK: bb0:
-; CHECK-NEXT: [[CALL:%.*]] = call float @ret_nofpclass_nan()
+; CHECK-NEXT: [[CALL:%.*]] = call nofpclass(nan) float @ret_nofpclass_nan()
; CHECK-NEXT: br label [[BB1]]
; CHECK: bb1:
; CHECK-NEXT: [[PHI:%.*]] = phi float [ [[CALL]], [[BB0]] ], [ [[ARG]], [[ENTRY:%.*]] ]
More information about the llvm-commits
mailing list