@@ -12579,7 +12579,7 @@ struct AAInvariantLoadPointerImpl
1257912579
1258012580 ChangeStatus updateImpl (Attributor &A) override {
1258112581 if (isKnownInvariant ())
12582- return ChangeStatus::UNCHANGED ;
12582+ return indicateOptimisticFixpoint () ;
1258312583
1258412584 ChangeStatus Changed = ChangeStatus::UNCHANGED;
1258512585
@@ -12605,15 +12605,13 @@ struct AAInvariantLoadPointerImpl
1260512605 const auto *AUO = A.getOrCreateAAFor <AAUnderlyingObjects>(
1260612606 getIRPosition (), this , DepClassTy::REQUIRED);
1260712607
12608- if (!AUO->forallUnderlyingObjects (IsInvariantLoadIfPointer)) {
12609- removeAssumedBits (IS_INVARIANT);
12610- return ChangeStatus::CHANGED;
12611- }
12608+ if (!AUO->forallUnderlyingObjects (IsInvariantLoadIfPointer))
12609+ return indicatePessimisticFixpoint ();
1261212610
1261312611 if (!UsedAssumedInformation) {
1261412612 // pointer is known (not assumed) to be invariant
1261512613 addKnownBits (IS_INVARIANT);
12616- return ChangeStatus::CHANGED ;
12614+ return indicateOptimisticFixpoint () | Changed ;
1261712615 }
1261812616
1261912617 return Changed;
@@ -12671,53 +12669,90 @@ struct AAInvariantLoadPointerImpl
1267112669 if (isKnown (IS_NOALIAS) || !isAssumed (IS_NOALIAS))
1267212670 return ChangeStatus::UNCHANGED;
1267312671
12674- const auto *ANoAlias = A.getOrCreateAAFor <AANoAlias>(getIRPosition (), this ,
12675- DepClassTy::REQUIRED);
12676- if (!ANoAlias)
12677- return tryInferNoAlias (A);
12672+ const auto *F = getAssociatedFunction ();
1267812673
12679- if (!ANoAlias->isAssumedNoAlias ()) {
12674+ if (F && isCallableCC (F->getCallingConv ())) {
12675+ // program-wide alias information cannot be inferred
1268012676 removeAssumedBits (IS_NOALIAS);
1268112677 return ChangeStatus::CHANGED;
1268212678 }
12683- if (ANoAlias->isKnownNoAlias ())
12684- addKnownBits (IS_NOALIAS);
1268512679
12686- return ChangeStatus::UNCHANGED;
12687- }
12680+ // try to use AANoAlias
12681+ if (const auto *ANoAlias = A.getOrCreateAAFor <AANoAlias>(
12682+ getIRPosition (), this , DepClassTy::REQUIRED)) {
12683+ if (ANoAlias->isKnownNoAlias ()) {
12684+ addKnownBits (IS_NOALIAS);
12685+ return ChangeStatus::UNCHANGED;
12686+ }
12687+
12688+ if (!ANoAlias->isAssumedNoAlias ()) {
12689+ removeAssumedBits (IS_NOALIAS);
12690+ return ChangeStatus::CHANGED;
12691+ }
12692+
12693+ return ChangeStatus::UNCHANGED;
12694+ }
12695+
12696+ // if the function is not callable, try to infer noalias from argument
12697+ // attribute, since it is applicable for the duration of the function
12698+ if (const auto *Arg = getAssociatedArgument ()) {
12699+ if (Arg->hasNoAliasAttr ()) {
12700+ addKnownBits (IS_NOALIAS);
12701+ return ChangeStatus::UNCHANGED;
12702+ }
12703+
12704+ // noalias information is not provided, and cannot be inferred,
12705+ // so we conservatively assume the pointer aliases.
12706+ removeAssumedBits (IS_NOALIAS);
12707+ return ChangeStatus::CHANGED;
12708+ }
1268812709
12689- // / Fallback method if updateNoAlias fails to infer noalias information from
12690- // / AANoAlias.
12691- virtual ChangeStatus tryInferNoAlias (Attributor &A) {
1269212710 return ChangeStatus::UNCHANGED;
1269312711 }
1269412712
1269512713 ChangeStatus updateReadOnly (Attributor &A) {
1269612714 if (isKnown (IS_READONLY) || !isAssumed (IS_READONLY))
1269712715 return ChangeStatus::UNCHANGED;
1269812716
12699- // AAMemoryBehavior may crash if value is global
12700- if (!getAssociatedFunction ())
12701- return tryInferReadOnly (A);
12717+ const auto *F = getAssociatedFunction ();
1270212718
12703- const auto *AMemoryBehavior = A.getOrCreateAAFor <AAMemoryBehavior>(
12704- getIRPosition (), this , DepClassTy::REQUIRED);
12705- if (!AMemoryBehavior)
12706- return tryInferReadOnly (A);
12719+ if (!F)
12720+ return ChangeStatus::UNCHANGED;
1270712721
12708- if (!AMemoryBehavior->isAssumedReadOnly ()) {
12722+ if (isCallableCC (F->getCallingConv ())) {
12723+ // readonly attribute is only useful if applicable program-wide
1270912724 removeAssumedBits (IS_READONLY);
1271012725 return ChangeStatus::CHANGED;
1271112726 }
12712- if (AMemoryBehavior->isKnownReadOnly ())
12713- addKnownBits (IS_READONLY);
1271412727
12715- return ChangeStatus::UNCHANGED;
12716- }
12728+ // try to use AAMemoryBehavior to infer readonly attribute
12729+ if (const auto *AMemoryBehavior = A.getOrCreateAAFor <AAMemoryBehavior>(
12730+ getIRPosition (), this , DepClassTy::REQUIRED)) {
12731+ if (!AMemoryBehavior->isAssumedReadOnly ()) {
12732+ removeAssumedBits (IS_READONLY);
12733+ return ChangeStatus::CHANGED;
12734+ }
12735+
12736+ if (AMemoryBehavior->isKnownReadOnly ()) {
12737+ addKnownBits (IS_READONLY);
12738+ return ChangeStatus::UNCHANGED;
12739+ }
12740+
12741+ return ChangeStatus::UNCHANGED;
12742+ }
12743+
12744+ if (const auto *Arg = getAssociatedArgument ()) {
12745+ if (Arg->onlyReadsMemory ()) {
12746+ addKnownBits (IS_READONLY);
12747+ return ChangeStatus::UNCHANGED;
12748+ }
12749+
12750+ // readonly information is not provided, and cannot be inferred from
12751+ // AAMemoryBehavior
12752+ removeAssumedBits (IS_READONLY);
12753+ return ChangeStatus::CHANGED;
12754+ }
1271712755
12718- // / Fallback method if updateReadOnly fails to infer readonly information from
12719- // / AAMemoryBehavior.
12720- virtual ChangeStatus tryInferReadOnly (Attributor &A) {
1272112756 return ChangeStatus::UNCHANGED;
1272212757 }
1272312758};
@@ -12741,33 +12776,6 @@ struct AAInvariantLoadPointerCallSiteReturned final
1274112776struct AAInvariantLoadPointerArgument final : AAInvariantLoadPointerImpl {
1274212777 AAInvariantLoadPointerArgument (const IRPosition &IRP, Attributor &A)
1274312778 : AAInvariantLoadPointerImpl(IRP, A) {}
12744-
12745- protected:
12746- ChangeStatus tryInferNoAlias (Attributor &A) override {
12747- const auto *Arg = getAssociatedArgument ();
12748- if (Arg->hasNoAliasAttr ()) {
12749- addKnownBits (IS_NOALIAS);
12750- return ChangeStatus::UNCHANGED;
12751- }
12752-
12753- // noalias information is not provided, and cannot be inferred from
12754- // AANoAlias
12755- removeAssumedBits (IS_NOALIAS);
12756- return ChangeStatus::CHANGED;
12757- }
12758-
12759- ChangeStatus tryInferReadOnly (Attributor &A) override {
12760- const auto *Arg = getAssociatedArgument ();
12761- if (Arg->onlyReadsMemory ()) {
12762- addKnownBits (IS_READONLY);
12763- return ChangeStatus::UNCHANGED;
12764- }
12765-
12766- // readonly information is not provided, and cannot be inferred from
12767- // AAMemoryBehavior
12768- removeAssumedBits (IS_READONLY);
12769- return ChangeStatus::CHANGED;
12770- }
1277112779};
1277212780
1277312781struct AAInvariantLoadPointerCallSiteArgument final
0 commit comments