Index: llvm/include/llvm/CodeGen/SelectionDAGISel.h =================================================================== --- llvm/include/llvm/CodeGen/SelectionDAGISel.h +++ llvm/include/llvm/CodeGen/SelectionDAGISel.h @@ -21,6 +21,7 @@ namespace llvm { class AAResults; +class AssumptionCache; class TargetInstrInfo; class TargetMachine; class SelectionDAGBuilder; @@ -48,6 +49,7 @@ SelectionDAG *CurDAG; std::unique_ptr SDB; AAResults *AA = nullptr; + AssumptionCache *AC = nullptr; GCFunctionInfo *GFI = nullptr; CodeGenOpt::Level OptLevel; const TargetInstrInfo *TII; Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h =================================================================== --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h @@ -42,6 +42,7 @@ class AllocaInst; class AtomicCmpXchgInst; class AtomicRMWInst; +class AssumptionCache; class BasicBlock; class BranchInst; class CallInst; @@ -191,6 +192,7 @@ SelectionDAG &DAG; AAResults *AA = nullptr; + AssumptionCache *AC = nullptr; const TargetLibraryInfo *LibInfo; class SDAGSwitchLowering : public SwitchCG::SwitchLowering { @@ -244,7 +246,7 @@ SL(std::make_unique(this, funcinfo)), FuncInfo(funcinfo), SwiftError(swifterror) {} - void init(GCFunctionInfo *gfi, AAResults *AA, + void init(GCFunctionInfo *gfi, AAResults *AA, AssumptionCache *AC, const TargetLibraryInfo *li); /// Clear out the current SelectionDAG and the associated state and prepare Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp =================================================================== --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -1026,8 +1026,10 @@ } void SelectionDAGBuilder::init(GCFunctionInfo *gfi, AliasAnalysis *aa, + AssumptionCache *ac, const TargetLibraryInfo *li) { AA = aa; + AC = ac; GFI = gfi; LibInfo = li; Context = DAG.getContext(); @@ -4139,7 +4141,7 @@ } if (isDereferenceableAndAlignedPointer(SV, Ty, Alignment, DAG.getDataLayout(), - &I, nullptr, nullptr, LibInfo)) + &I, AC, nullptr, LibInfo)) MMOFlags |= MachineMemOperand::MODereferenceable; SDLoc dl = getCurSDLoc(); Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp =================================================================== --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -22,6 +22,7 @@ #include "llvm/ADT/Statistic.h" #include "llvm/ADT/StringRef.h" #include "llvm/Analysis/AliasAnalysis.h" +#include "llvm/Analysis/AssumptionCache.h" #include "llvm/Analysis/BranchProbabilityInfo.h" #include "llvm/Analysis/CFG.h" #include "llvm/Analysis/EHPersonalities.h" @@ -336,6 +337,7 @@ AU.addPreserved(); AU.addRequired(); AU.addRequired(); + AU.addRequired(); if (UseMBPI && OptLevel != CodeGenOpt::None) AU.addRequired(); AU.addRequired(); @@ -403,6 +405,7 @@ LibInfo = &getAnalysis().getTLI(Fn); GFI = Fn.hasGC() ? &getAnalysis().getFunctionInfo(Fn) : nullptr; ORE = std::make_unique(&Fn); + AC = &getAnalysis().getAssumptionCache(mf.getFunction()); auto *PSI = &getAnalysis().getPSI(); BlockFrequencyInfo *BFI = nullptr; if (PSI && PSI->hasProfileSummary() && OptLevel != CodeGenOpt::None) @@ -430,7 +433,7 @@ else AA = nullptr; - SDB->init(GFI, AA, LibInfo); + SDB->init(GFI, AA, AC, LibInfo); MF->setHasInlineAsm(false);