Jason Kim
2014-Mar-14 22:27 UTC
[LLVMdev] ModulePass Strangeness and OnTheFly Pass Management
Hi everyone In a recent rev of llvm [203866], I tried adding a ModulePass as part of IPO/ which uses the "on the fly" system to have access to Scalar Evolution and other related analyeses, but quickly ran into a problem. Inside my ModulePass's runOnModule(), I am able to successfully use getAnalysisIfAvailable<DataLayoutPass>() to get a pointer to the DataLayout. However, within ScalarEvolution's runOnFunction(), the comparable call to get at the DataLayout always returns NULL. This normally isn't a problem unless you are in a 32bit land - which causes SCEV to do lots of fun things like unnecessary conversion to 64bit types etc... This happens regardless of whether or not DataLayout pass is declared in the ModulePass's getAnalysisUsage(). I've managed to get around this issue using an absolutely horrendous hack in MPPassManager::addLowerLevelRequiredPass so that a new DataLayoutPass instance can be correctly added. Unfortunately, this exposes an even bigger problem exposed by --debug-pass=Details: Pass Arguments: -targetlibinfo -datalayout -notti -basictti -x86tti -foo -verify Target Library Information Data Layout No target information Target independent code generator's TTI X86 Target Transform Info ModulePass Manager Foo Unnamed pass: implement Pass::getPassName() FunctionPass Manager Module Verifier Pass Arguments: -no-aa -targetlibinfo -domtree -loops -scalar-evolution -da No Alias Analysis (always returns 'may' alias) Target Library Information FunctionPass Manager Dominator Tree Construction Natural Loop Information Scalar Evolution Analysis Dependence Analysis 0x. Executing Pass 'Foo' on Module 'foo.ll'... 0x. Required Analyses: Natural Loop Information, No target information, Dominator Tree Construction, Dependence Analysis, Scalar Evolution Analysis 0x. Executing Pass 'Dominator Tree Construction' on Function 'foo'... 0x. Executing Pass 'Natural Loop Information' on Function 'foo'... 0x. Required Analyses: Dominator Tree Construction 0x. Executing Pass 'Scalar Evolution Analysis' on Function 'foo'... 0x. Required Analyses: Natural Loop Information, Dominator Tree Construction, Target Library Information 0x. Executing Pass 'Dependence Analysis' on Function 'foo'... 0x. Required Analyses: No Alias Analysis (always returns 'may' alias), Scalar Evolution Analysis, Natural Loop Information So now, dependence analysis always defaults to the NoAliasAnalysis, regardless of whether AliasAnalysis is declared as a direct dependency. Since AA is not a "pass" per se, I am somewhat confused as to how to "hack around" this problem. With some amount of software archaeology, it seems that the OnTheFly pass management for ModulePasses is likely forgetting the required pass details, and it seems to have been never really tested. Can anyone suggest a way forward? Thanks! -jason p.s. There are a few minor patches for problems/crashes encountered while doing this experiment. I'll post them soon to llvm-commits for review. Thanks again
Jason Kim
2014-Mar-17 20:37 UTC
[LLVMdev] ModulePass Strangeness and OnTheFly Pass Management
cc'ing the usual suspects :-)> > Hi everyone > > In a recent rev of llvm [203866], I tried adding a ModulePass as part of > IPO/ which uses the "on the fly" system to have access to Scalar Evolution > and other related analyeses, but quickly ran into a problem. > > Inside my ModulePass's runOnModule(), I am able to successfully use > getAnalysisIfAvailable<DataLayoutPass>() to get a pointer to the > DataLayout. > > However, within ScalarEvolution's runOnFunction(), the comparable call > to get at the DataLayout always returns NULL. > This normally isn't a problem unless you are in a 32bit land - which > causes SCEV to do lots of fun things like unnecessary conversion to 64bit > types etc... > > This happens regardless of whether or not DataLayout pass is declared in > the ModulePass's getAnalysisUsage(). > > I've managed to get around this issue using an absolutely horrendous hack > in MPPassManager::addLowerLevelRequiredPass so that a new DataLayoutPass > instance can be correctly added. > > Unfortunately, this exposes an even bigger problem exposed by > --debug-pass=Details: > > Pass Arguments: -targetlibinfo -datalayout -notti -basictti -x86tti -foo > -verify > Target Library Information > Data Layout > No target information > Target independent code generator's TTI > X86 Target Transform Info > ModulePass Manager > Foo > Unnamed pass: implement Pass::getPassName() > FunctionPass Manager > Module Verifier > Pass Arguments: -no-aa -targetlibinfo -domtree -loops -scalar-evolution > -da > No Alias Analysis (always returns 'may' alias) > Target Library Information > FunctionPass Manager > Dominator Tree Construction > Natural Loop Information > Scalar Evolution Analysis > Dependence Analysis > 0x. Executing Pass 'Foo' on Module 'foo.ll'... > 0x. Required Analyses: Natural Loop Information, No target > information, Dominator Tree Construction, Dependence Analysis, Scalar > Evolution Analysis > 0x. Executing Pass 'Dominator Tree Construction' on Function 'foo'... > 0x. Executing Pass 'Natural Loop Information' on Function 'foo'... > 0x. Required Analyses: Dominator Tree Construction > 0x. Executing Pass 'Scalar Evolution Analysis' on Function 'foo'... > 0x. Required Analyses: Natural Loop Information, Dominator Tree > Construction, Target Library Information > 0x. Executing Pass 'Dependence Analysis' on Function 'foo'... > 0x. Required Analyses: No Alias Analysis (always returns 'may' alias), > Scalar Evolution Analysis, Natural Loop Information > > So now, dependence analysis always defaults to the NoAliasAnalysis, > regardless of whether AliasAnalysis is declared as a direct dependency. > Since AA is not a "pass" per se, I am somewhat confused as to how to "hack > around" this problem. > > With some amount of software archaeology, it seems that the OnTheFly pass > management for ModulePasses is likely forgetting the required pass > details, and it seems to have been never really tested. > > Can anyone suggest a way forward? > Thanks! > > -jason > p.s. > There are a few minor patches for problems/crashes encountered while doing > this experiment. I'll post them soon to llvm-commits for review. > > Thanks again > > > >