svf-tools 1.0.613 → 1.0.614
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CMakeLists.txt +13 -0
- package/SVF-doxygen/html/html/AndersenPWC_8h_source.html +1 -1
- package/SVF-doxygen/html/html/AndersenSCD_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/AndersenSFR_8cpp_source.html +7 -6
- package/SVF-doxygen/html/html/AndersenStat_8cpp_source.html +15 -15
- package/SVF-doxygen/html/html/AndersenWaveDiff_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/Andersen_8cpp_source.html +22 -22
- package/SVF-doxygen/html/html/Andersen_8h_source.html +16 -16
- package/SVF-doxygen/html/html/CFLAlias_8cpp_source.html +6 -6
- package/SVF-doxygen/html/html/CFLAlias_8h_source.html +7 -7
- package/SVF-doxygen/html/html/CFLBase_8cpp_source.html +6 -6
- package/SVF-doxygen/html/html/CFLGrammar_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/CFLGrammar_8h_source.html +1 -1
- package/SVF-doxygen/html/html/CFLGraphBuilder_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/CFLGraph_8cpp_source.html +11 -11
- package/SVF-doxygen/html/html/CFLGraph_8h_source.html +1 -1
- package/SVF-doxygen/html/html/CFLVF_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/CHGBuilder_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/CHG_8h_source.html +1 -1
- package/SVF-doxygen/html/html/CSC_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/ConditionalPT_8h_source.html +14 -14
- package/SVF-doxygen/html/html/ConsGNode_8h_source.html +1 -1
- package/SVF-doxygen/html/html/ConsG_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/ConsG_8h_source.html +9 -9
- package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +18 -18
- package/SVF-doxygen/html/html/ContextDDA_8h_source.html +9 -9
- package/SVF-doxygen/html/html/DCHG_8cpp_source.html +4 -4
- package/SVF-doxygen/html/html/DCHG_8h_source.html +1 -1
- package/SVF-doxygen/html/html/DDAClient_8cpp_source.html +8 -8
- package/SVF-doxygen/html/html/DDAClient_8h_source.html +1 -1
- package/SVF-doxygen/html/html/DDAPass_8cpp_source.html +4 -6
- package/SVF-doxygen/html/html/DDAPass_8h_source.html +3 -3
- package/SVF-doxygen/html/html/DDAStat_8cpp_source.html +9 -9
- package/SVF-doxygen/html/html/DDAStat_8h_source.html +1 -1
- package/SVF-doxygen/html/html/DDAVFSolver_8h_source.html +22 -22
- package/SVF-doxygen/html/html/DoubleFreeChecker_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/DoubleFreeChecker_8h_source.html +1 -1
- package/SVF-doxygen/html/html/ExtAPI_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +21 -21
- package/SVF-doxygen/html/html/FSMPTA_8h_source.html +3 -3
- package/SVF-doxygen/html/html/FileChecker_8h_source.html +1 -1
- package/SVF-doxygen/html/html/FlowDDA_8cpp_source.html +10 -10
- package/SVF-doxygen/html/html/FlowDDA_8h_source.html +7 -7
- package/SVF-doxygen/html/html/FlowSensitiveStat_8cpp_source.html +13 -13
- package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +27 -28
- package/SVF-doxygen/html/html/FlowSensitive_8h_source.html +65 -65
- package/SVF-doxygen/html/html/ICFGBuilder_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/ICFG_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/ICFG_8h_source.html +2 -2
- package/SVF-doxygen/html/html/IRAnnotator_8h_source.html +3 -3
- package/SVF-doxygen/html/html/IRGraph_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/IRGraph_8h_source.html +2 -2
- package/SVF-doxygen/html/html/LLVMLoopAnalysis_8cpp_source.html +6 -6
- package/SVF-doxygen/html/html/LLVMLoopAnalysis_8h_source.html +3 -3
- package/SVF-doxygen/html/html/LLVMModule_8cpp_source.html +23 -28
- package/SVF-doxygen/html/html/LLVMModule_8h_source.html +8 -8
- package/SVF-doxygen/html/html/LLVMUtil_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/LeakChecker_8cpp_source.html +9 -9
- package/SVF-doxygen/html/html/LeakChecker_8h_source.html +2 -2
- package/SVF-doxygen/html/html/LocationSet_8cpp_source.html +9 -9
- package/SVF-doxygen/html/html/LocationSet_8h_source.html +3 -3
- package/SVF-doxygen/html/html/LockAnalysis_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/LockAnalysis_8h_source.html +3 -3
- package/SVF-doxygen/html/html/LockResultValidator_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/MHP_8cpp_source.html +10 -10
- package/SVF-doxygen/html/html/MHP_8h_source.html +5 -5
- package/SVF-doxygen/html/html/MTAAnnotator_8cpp_source.html +17 -17
- package/SVF-doxygen/html/html/MTAResultValidator_8cpp_source.html +8 -8
- package/SVF-doxygen/html/html/MTAStat_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/MTA_8cpp_source.html +12 -17
- package/SVF-doxygen/html/html/MTA_8h_source.html +3 -4
- package/SVF-doxygen/html/html/MemPartition_8cpp_source.html +10 -10
- package/SVF-doxygen/html/html/MemPartition_8h_source.html +1 -1
- package/SVF-doxygen/html/html/MemRegion_8cpp_source.html +34 -34
- package/SVF-doxygen/html/html/MemRegion_8h_source.html +7 -7
- package/SVF-doxygen/html/html/MemSSA_8cpp_source.html +16 -15
- package/SVF-doxygen/html/html/MemSSA_8h_source.html +53 -52
- package/SVF-doxygen/html/html/MutablePointsToDS_8h_source.html +7 -8
- package/SVF-doxygen/html/html/NodeIDAllocator_8cpp_source.html +7 -7
- package/SVF-doxygen/html/html/Options_8cpp_source.html +52 -53
- package/SVF-doxygen/html/html/Options_8h_source.html +53 -54
- package/SVF-doxygen/html/html/PCG_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/PTACallGraph_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/PTACallGraph_8h_source.html +1 -1
- package/SVF-doxygen/html/html/PTAStat_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/PTAStat_8h_source.html +1 -1
- package/SVF-doxygen/html/html/PersistentPointsToCache_8h_source.html +33 -33
- package/SVF-doxygen/html/html/PersistentPointsToDS_8h_source.html +91 -95
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +31 -39
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8h_source.html +85 -92
- package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +20 -20
- package/SVF-doxygen/html/html/PointerAnalysis_8h_source.html +16 -16
- package/SVF-doxygen/html/html/PointsTo_8cpp.html +1 -0
- package/SVF-doxygen/html/html/PointsTo_8cpp_source.html +51 -51
- package/SVF-doxygen/html/html/PointsTo_8h_source.html +38 -38
- package/SVF-doxygen/html/html/ProgSlice_8cpp_source.html +6 -6
- package/SVF-doxygen/html/html/SCC_8h_source.html +4 -4
- package/SVF-doxygen/html/html/SVFGBuilder_8cpp_source.html +11 -22
- package/SVF-doxygen/html/html/SVFGBuilder_8h_source.html +14 -17
- package/SVF-doxygen/html/html/SVFGEdge_8h_source.html +1 -1
- package/SVF-doxygen/html/html/SVFGNode_8h_source.html +1 -1
- package/SVF-doxygen/html/html/SVFGOPT_8cpp_source.html +7 -7
- package/SVF-doxygen/html/html/SVFGOPT_8h_source.html +21 -19
- package/SVF-doxygen/html/html/SVFGReadWrite_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/SVFGStat_8cpp_source.html +18 -18
- package/SVF-doxygen/html/html/SVFG_8cpp_source.html +49 -62
- package/SVF-doxygen/html/html/SVFG_8h_source.html +45 -45
- package/SVF-doxygen/html/html/SVFIR2ItvExeState_8cpp_source.html +12 -12
- package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +8 -8
- package/SVF-doxygen/html/html/SVFIRBuilder_8h_source.html +3 -3
- package/SVF-doxygen/html/html/SVFIR_8cpp_source.html +10 -16
- package/SVF-doxygen/html/html/SVFIR_8h_source.html +83 -83
- package/SVF-doxygen/html/html/SVFStat_8cpp_source.html +19 -19
- package/SVF-doxygen/html/html/SVFType_8h.html +22 -22
- package/SVF-doxygen/html/html/SVFType_8h_source.html +76 -77
- package/SVF-doxygen/html/html/SVFUtil_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/SVFUtil_8h_source.html +11 -11
- package/SVF-doxygen/html/html/SVFValue_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/SVFValue_8h_source.html +4 -4
- package/SVF-doxygen/html/html/SVFVariables_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SVFVariables_8h_source.html +3 -3
- package/SVF-doxygen/html/html/SaberCondAllocator_8cpp_source.html +6 -6
- package/SVF-doxygen/html/html/SaberCondAllocator_8h_source.html +4 -4
- package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp_source.html +15 -15
- package/SVF-doxygen/html/html/SaberSVFGBuilder_8h_source.html +2 -3
- package/SVF-doxygen/html/html/SparseBitVector_8h_source.html +69 -71
- package/SVF-doxygen/html/html/SrcSnkDDA_8cpp_source.html +13 -13
- package/SVF-doxygen/html/html/SrcSnkDDA_8h_source.html +39 -39
- package/SVF-doxygen/html/html/Steensgaard_8h_source.html +1 -1
- package/SVF-doxygen/html/html/SymbolTableBuilder_8cpp_source.html +7 -7
- package/SVF-doxygen/html/html/SymbolTableInfo_8cpp_source.html +49 -51
- package/SVF-doxygen/html/html/SymbolTableInfo_8h_source.html +13 -13
- package/SVF-doxygen/html/html/TCT_8cpp_source.html +4 -4
- package/SVF-doxygen/html/html/TCT_8h_source.html +4 -4
- package/SVF-doxygen/html/html/ThreadCallGraph_8cpp_source.html +8 -8
- package/SVF-doxygen/html/html/TypeAnalysis_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/VFGNode_8h_source.html +1 -1
- package/SVF-doxygen/html/html/VFG_8cpp_source.html +17 -17
- package/SVF-doxygen/html/html/VFG_8h_source.html +5 -5
- package/SVF-doxygen/html/html/VersionedFlowSensitiveStat_8cpp_source.html +8 -8
- package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +33 -33
- package/SVF-doxygen/html/html/VersionedFlowSensitive_8h_source.html +4 -4
- package/SVF-doxygen/html/html/WPAFSSolver_8h_source.html +11 -11
- package/SVF-doxygen/html/html/WPAPass_8cpp_source.html +12 -12
- package/SVF-doxygen/html/html/WPAPass_8h_source.html +2 -2
- package/SVF-doxygen/html/html/WPASolver_8h_source.html +25 -25
- package/SVF-doxygen/html/html/Z3Expr_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/cfl_8cpp.html +1 -5
- package/SVF-doxygen/html/html/cfl_8cpp_source.html +1 -5
- package/SVF-doxygen/html/html/classSVF_1_1ActualParmVFGNode.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ActualRetVFGNode.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1AddrVFGNode.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1AliasDDAClient.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1Andersen-members.html +187 -188
- package/SVF-doxygen/html/html/classSVF_1_1Andersen.html +104 -107
- package/SVF-doxygen/html/html/classSVF_1_1AndersenBase-members.html +163 -164
- package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +47 -50
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD-members.html +194 -195
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD.html +45 -48
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR-members.html +204 -205
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR.html +35 -38
- package/SVF-doxygen/html/html/classSVF_1_1AndersenStat.html +17 -17
- package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff-members.html +191 -192
- package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff.html +29 -32
- package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl-members.html +122 -123
- package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +158 -219
- package/SVF-doxygen/html/html/classSVF_1_1BinaryOPVFGNode.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1CFLAlias-members.html +137 -138
- package/SVF-doxygen/html/html/classSVF_1_1CFLAlias.html +57 -49
- package/SVF-doxygen/html/html/classSVF_1_1CFLBase-members.html +138 -139
- package/SVF-doxygen/html/html/classSVF_1_1CFLBase.html +34 -34
- package/SVF-doxygen/html/html/classSVF_1_1CFLGraph.html +7 -7
- package/SVF-doxygen/html/html/classSVF_1_1CFLGraphBuilder.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1CFLVF-members.html +140 -141
- package/SVF-doxygen/html/html/classSVF_1_1CFLVF.html +30 -30
- package/SVF-doxygen/html/html/classSVF_1_1CHGBuilder.html +8 -8
- package/SVF-doxygen/html/html/classSVF_1_1CSC.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1CmpVFGNode.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl.html +114 -114
- package/SVF-doxygen/html/html/classSVF_1_1ConstraintGraph.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1ConstraintNode.html +8 -8
- package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +28 -28
- package/SVF-doxygen/html/html/classSVF_1_1CopyVFGNode.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1DCHGraph.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1DDAClient.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1DDAPass-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1DDAPass.html +17 -31
- package/SVF-doxygen/html/html/classSVF_1_1DDAStat.html +10 -10
- package/SVF-doxygen/html/html/classSVF_1_1DDAVFSolver.html +40 -40
- package/SVF-doxygen/html/html/classSVF_1_1DFPTData.html +15 -15
- package/SVF-doxygen/html/html/classSVF_1_1DiffPTData.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1DistinctMRG.html +11 -11
- package/SVF-doxygen/html/html/classSVF_1_1DoubleFreeChecker-members.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1DoubleFreeChecker.html +16 -16
- package/SVF-doxygen/html/html/classSVF_1_1DummyVersionPropSVFGNode.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ExtAPI.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1FSMPTA-members.html +228 -229
- package/SVF-doxygen/html/html/classSVF_1_1FSMPTA.html +62 -65
- package/SVF-doxygen/html/html/classSVF_1_1FileChecker-members.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1FileChecker.html +17 -17
- package/SVF-doxygen/html/html/classSVF_1_1FlowDDA-members.html +194 -195
- package/SVF-doxygen/html/html/classSVF_1_1FlowDDA.html +55 -55
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive-members.html +219 -220
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +335 -342
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +57 -57
- package/SVF-doxygen/html/html/classSVF_1_1ForkJoinAnalysis.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1FormalParmVFGNode.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1FormalRetVFGNode.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1FunptrDDAClient.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1GepObjVar.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1GepVFGNode.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ICFG-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1ICFG.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1ICFGBuilder.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1IRAnnotator.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1IRGraph.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1InterDisjointMRG.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1IntraDisjointMRG.html +8 -8
- package/SVF-doxygen/html/html/classSVF_1_1LLVMLoopAnalysis-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1LLVMLoopAnalysis.html +20 -14
- package/SVF-doxygen/html/html/classSVF_1_1LLVMModuleSet-members.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1LLVMModuleSet.html +106 -92
- package/SVF-doxygen/html/html/classSVF_1_1LeakChecker-members.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1LeakChecker.html +36 -36
- package/SVF-doxygen/html/html/classSVF_1_1LoadVFGNode.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1LocationSet.html +12 -12
- package/SVF-doxygen/html/html/classSVF_1_1LockAnalysis.html +25 -25
- package/SVF-doxygen/html/html/classSVF_1_1LockResultValidator.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1MHP.html +26 -26
- package/SVF-doxygen/html/html/classSVF_1_1MRGenerator.html +87 -87
- package/SVF-doxygen/html/html/classSVF_1_1MTA-members.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1MTA.html +27 -33
- package/SVF-doxygen/html/html/classSVF_1_1MTAAnnotator.html +21 -21
- package/SVF-doxygen/html/html/classSVF_1_1MTAResultValidator.html +14 -14
- package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder-members.html +41 -43
- package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder.html +57 -80
- package/SVF-doxygen/html/html/classSVF_1_1MTAStat.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1MemObj.html +54 -54
- package/SVF-doxygen/html/html/classSVF_1_1MemRegion.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1MemSSA-members.html +4 -3
- package/SVF-doxygen/html/html/classSVF_1_1MemSSA.html +170 -143
- package/SVF-doxygen/html/html/classSVF_1_1MemSSAStat.html +16 -16
- package/SVF-doxygen/html/html/classSVF_1_1MutableDFPTData.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1MutableDiffPTData-members.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1MutableDiffPTData.html +13 -15
- package/SVF-doxygen/html/html/classSVF_1_1NodeIDAllocator_1_1Clusterer.html +7 -7
- package/SVF-doxygen/html/html/classSVF_1_1NullPtrVFGNode.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ObjTypeInfo.html +8 -8
- package/SVF-doxygen/html/html/classSVF_1_1ObjVar.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1Options-members.html +17 -18
- package/SVF-doxygen/html/html/classSVF_1_1Options.html +53 -79
- package/SVF-doxygen/html/html/classSVF_1_1PAGBuilderFromFile.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1PCG.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1PHIVFGNode.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1PTACallGraph.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1PTACallGraphNode.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1PTAStat.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1PTData.html +11 -11
- package/SVF-doxygen/html/html/classSVF_1_1PersistentDFPTData-members.html +28 -28
- package/SVF-doxygen/html/html/classSVF_1_1PersistentDFPTData.html +174 -177
- package/SVF-doxygen/html/html/classSVF_1_1PersistentDiffPTData-members.html +17 -17
- package/SVF-doxygen/html/html/classSVF_1_1PersistentDiffPTData.html +99 -102
- package/SVF-doxygen/html/html/classSVF_1_1PersistentIncDFPTData-members.html +30 -30
- package/SVF-doxygen/html/html/classSVF_1_1PersistentIncDFPTData.html +125 -127
- package/SVF-doxygen/html/html/classSVF_1_1PersistentPTData-members.html +13 -13
- package/SVF-doxygen/html/html/classSVF_1_1PersistentPTData.html +83 -86
- package/SVF-doxygen/html/html/classSVF_1_1PersistentPointsToCache-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1PersistentPointsToCache.html +122 -122
- package/SVF-doxygen/html/html/classSVF_1_1PersistentVersionedPTData-members.html +22 -22
- package/SVF-doxygen/html/html/classSVF_1_1PersistentVersionedPTData.html +137 -140
- package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +56 -56
- package/SVF-doxygen/html/html/classSVF_1_1PointsTo-members.html +16 -16
- package/SVF-doxygen/html/html/classSVF_1_1PointsTo.html +183 -178
- package/SVF-doxygen/html/html/classSVF_1_1PointsTo_1_1PointsToIterator-members.html +7 -7
- package/SVF-doxygen/html/html/classSVF_1_1PointsTo_1_1PointsToIterator.html +87 -65
- package/SVF-doxygen/html/html/classSVF_1_1ProgSlice.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1SCCDetection.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1SCCDetection_1_1GNodeSCCInfo.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SVFArgument-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SVFArgument.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1SVFArrayType.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1SVFBasicBlock-members.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1SVFBasicBlock.html +13 -16
- package/SVF-doxygen/html/html/classSVF_1_1SVFBlackHoleValue-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SVFBlackHoleValue.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SVFCallInst-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SVFCallInst.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SVFConstant-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SVFConstant.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1SVFConstantData-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SVFConstantData.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SVFConstantFP-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SVFConstantFP.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SVFConstantInt-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SVFConstantInt.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SVFConstantNullPtr-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SVFConstantNullPtr.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SVFFunction-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SVFFunction.html +5 -7
- package/SVF-doxygen/html/html/classSVF_1_1SVFFunctionType.html +9 -9
- package/SVF-doxygen/html/html/classSVF_1_1SVFG-members.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SVFG.html +211 -236
- package/SVF-doxygen/html/html/classSVF_1_1SVFGBuilder-members.html +7 -9
- package/SVF-doxygen/html/html/classSVF_1_1SVFGBuilder.html +50 -138
- package/SVF-doxygen/html/html/classSVF_1_1SVFGOPT-members.html +9 -9
- package/SVF-doxygen/html/html/classSVF_1_1SVFGOPT.html +82 -82
- package/SVF-doxygen/html/html/classSVF_1_1SVFGStat.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1SVFGlobalValue-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SVFGlobalValue.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SVFIR-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SVFIR.html +203 -215
- package/SVF-doxygen/html/html/classSVF_1_1SVFIR2ItvExeState.html +13 -13
- package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +79 -79
- package/SVF-doxygen/html/html/classSVF_1_1SVFInstruction-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SVFInstruction.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1SVFIntergerType.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1SVFMetadataAsValue-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SVFMetadataAsValue.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SVFModule.html +0 -4
- package/SVF-doxygen/html/html/classSVF_1_1SVFOtherType.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1SVFOtherValue-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SVFOtherValue.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1SVFPointerType.html +9 -9
- package/SVF-doxygen/html/html/classSVF_1_1SVFStat.html +19 -19
- package/SVF-doxygen/html/html/classSVF_1_1SVFStructType.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1SVFType.html +38 -38
- package/SVF-doxygen/html/html/classSVF_1_1SVFValue-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SVFValue.html +4 -5
- package/SVF-doxygen/html/html/classSVF_1_1SVFVar.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SVFVirtualCallInst-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SVFVirtualCallInst.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SaberCondAllocator.html +9 -9
- package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder-members.html +12 -14
- package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder.html +42 -68
- package/SVF-doxygen/html/html/classSVF_1_1SparseBitVector-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SparseBitVector.html +108 -109
- package/SVF-doxygen/html/html/classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html +50 -50
- package/SVF-doxygen/html/html/classSVF_1_1SrcSnkDDA-members.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1SrcSnkDDA.html +146 -146
- package/SVF-doxygen/html/html/classSVF_1_1StInfo-members.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1StInfo.html +48 -61
- package/SVF-doxygen/html/html/classSVF_1_1Steensgaard-members.html +178 -179
- package/SVF-doxygen/html/html/classSVF_1_1Steensgaard.html +35 -38
- package/SVF-doxygen/html/html/classSVF_1_1StoreVFGNode.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder.html +20 -20
- package/SVF-doxygen/html/html/classSVF_1_1SymbolTableInfo.html +42 -46
- package/SVF-doxygen/html/html/classSVF_1_1TCT.html +10 -10
- package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraph.html +8 -8
- package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis-members.html +169 -170
- package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +29 -32
- package/SVF-doxygen/html/html/classSVF_1_1UnaryOPVFGNode.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1VFG.html +28 -28
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive-members.html +263 -264
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +112 -115
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitiveStat.html +41 -41
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive_1_1SCC.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1VersionedPTData.html +9 -9
- package/SVF-doxygen/html/html/classSVF_1_1WPAFSSolver-members.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1WPAFSSolver.html +9 -9
- package/SVF-doxygen/html/html/classSVF_1_1WPAMinimumSolver-members.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1WPAMinimumSolver.html +15 -15
- package/SVF-doxygen/html/html/classSVF_1_1WPAPass.html +25 -25
- package/SVF-doxygen/html/html/classSVF_1_1WPASCCSolver-members.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1WPASCCSolver.html +17 -17
- package/SVF-doxygen/html/html/classSVF_1_1WPASolver-members.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1WPASolver.html +76 -81
- package/SVF-doxygen/html/html/classSVF_1_1Z3Expr.html +2 -2
- package/SVF-doxygen/html/html/dda_8cpp.html +1 -1
- package/SVF-doxygen/html/html/dda_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/functions.html +1 -1
- package/SVF-doxygen/html/html/functions_0x7e.html +16 -16
- package/SVF-doxygen/html/html/functions_a.html +7 -7
- package/SVF-doxygen/html/html/functions_b.html +6 -6
- package/SVF-doxygen/html/html/functions_c.html +27 -27
- package/SVF-doxygen/html/html/functions_d.html +10 -11
- package/SVF-doxygen/html/html/functions_e.html +2 -2
- package/SVF-doxygen/html/html/functions_f.html +6 -6
- package/SVF-doxygen/html/html/functions_func.html +6 -6
- package/SVF-doxygen/html/html/functions_func_0x7e.html +16 -16
- package/SVF-doxygen/html/html/functions_func_b.html +6 -6
- package/SVF-doxygen/html/html/functions_func_c.html +27 -27
- package/SVF-doxygen/html/html/functions_func_d.html +10 -11
- package/SVF-doxygen/html/html/functions_func_e.html +2 -2
- package/SVF-doxygen/html/html/functions_func_f.html +5 -5
- package/SVF-doxygen/html/html/functions_func_g.html +22 -22
- package/SVF-doxygen/html/html/functions_func_h.html +3 -3
- package/SVF-doxygen/html/html/functions_func_i.html +2 -2
- package/SVF-doxygen/html/html/functions_func_o.html +3 -3
- package/SVF-doxygen/html/html/functions_func_p.html +5 -5
- package/SVF-doxygen/html/html/functions_func_r.html +5 -8
- package/SVF-doxygen/html/html/functions_func_s.html +5 -5
- package/SVF-doxygen/html/html/functions_func_t.html +1 -1
- package/SVF-doxygen/html/html/functions_func_u.html +23 -23
- package/SVF-doxygen/html/html/functions_g.html +25 -28
- package/SVF-doxygen/html/html/functions_h.html +3 -3
- package/SVF-doxygen/html/html/functions_i.html +5 -5
- package/SVF-doxygen/html/html/functions_m.html +1 -1
- package/SVF-doxygen/html/html/functions_o.html +13 -13
- package/SVF-doxygen/html/html/functions_p.html +19 -19
- package/SVF-doxygen/html/html/functions_r.html +11 -12
- package/SVF-doxygen/html/html/functions_s.html +32 -35
- package/SVF-doxygen/html/html/functions_t.html +12 -12
- package/SVF-doxygen/html/html/functions_type_t.html +1 -1
- package/SVF-doxygen/html/html/functions_u.html +26 -23
- package/SVF-doxygen/html/html/functions_v.html +6 -6
- package/SVF-doxygen/html/html/functions_vars.html +1 -1
- package/SVF-doxygen/html/html/functions_vars_f.html +1 -1
- package/SVF-doxygen/html/html/functions_vars_g.html +0 -3
- package/SVF-doxygen/html/html/functions_vars_i.html +1 -1
- package/SVF-doxygen/html/html/functions_vars_m.html +1 -1
- package/SVF-doxygen/html/html/functions_vars_p.html +2 -2
- package/SVF-doxygen/html/html/functions_vars_s.html +5 -8
- package/SVF-doxygen/html/html/functions_vars_t.html +1 -1
- package/SVF-doxygen/html/html/functions_vars_u.html +3 -0
- package/SVF-doxygen/html/html/functions_w.html +3 -7
- package/SVF-doxygen/html/html/include_2MTA_2MTAResultValidator_8h_source.html +1 -1
- package/SVF-doxygen/html/html/mta_8cpp.html +1 -1
- package/SVF-doxygen/html/html/mta_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/namespaceSVF.html +35 -35
- package/SVF-doxygen/html/html/namespaceSVF_1_1LLVMUtil.html +2 -2
- package/SVF-doxygen/html/html/namespaceSVF_1_1SVFUtil.html +4 -4
- package/SVF-doxygen/html/html/saber_8cpp.html +1 -5
- package/SVF-doxygen/html/html/saber_8cpp_source.html +1 -5
- package/SVF-doxygen/html/html/search/all_0.js +1 -1
- package/SVF-doxygen/html/html/search/all_1.js +4 -4
- package/SVF-doxygen/html/html/search/all_10.js +15 -15
- package/SVF-doxygen/html/html/search/all_11.js +1 -2
- package/SVF-doxygen/html/html/search/all_12.js +19 -20
- package/SVF-doxygen/html/html/search/all_13.js +8 -8
- package/SVF-doxygen/html/html/search/all_14.js +13 -12
- package/SVF-doxygen/html/html/search/all_15.js +4 -4
- package/SVF-doxygen/html/html/search/all_16.js +2 -2
- package/SVF-doxygen/html/html/search/all_19.js +16 -16
- package/SVF-doxygen/html/html/search/all_2.js +6 -6
- package/SVF-doxygen/html/html/search/all_3.js +14 -14
- package/SVF-doxygen/html/html/search/all_4.js +5 -5
- package/SVF-doxygen/html/html/search/all_5.js +2 -2
- package/SVF-doxygen/html/html/search/all_6.js +5 -5
- package/SVF-doxygen/html/html/search/all_7.js +11 -12
- package/SVF-doxygen/html/html/search/all_8.js +3 -3
- package/SVF-doxygen/html/html/search/all_9.js +3 -3
- package/SVF-doxygen/html/html/search/all_b.js +1 -1
- package/SVF-doxygen/html/html/search/all_c.js +3 -3
- package/SVF-doxygen/html/html/search/all_d.js +3 -3
- package/SVF-doxygen/html/html/search/all_e.js +2 -2
- package/SVF-doxygen/html/html/search/all_f.js +5 -5
- package/SVF-doxygen/html/html/search/functions_0.js +4 -4
- package/SVF-doxygen/html/html/search/functions_1.js +6 -6
- package/SVF-doxygen/html/html/search/functions_10.js +1 -2
- package/SVF-doxygen/html/html/search/functions_11.js +10 -10
- package/SVF-doxygen/html/html/search/functions_12.js +1 -1
- package/SVF-doxygen/html/html/search/functions_13.js +12 -12
- package/SVF-doxygen/html/html/search/functions_17.js +16 -16
- package/SVF-doxygen/html/html/search/functions_2.js +14 -14
- package/SVF-doxygen/html/html/search/functions_3.js +5 -5
- package/SVF-doxygen/html/html/search/functions_4.js +2 -2
- package/SVF-doxygen/html/html/search/functions_5.js +4 -4
- package/SVF-doxygen/html/html/search/functions_6.js +11 -11
- package/SVF-doxygen/html/html/search/functions_7.js +3 -3
- package/SVF-doxygen/html/html/search/functions_8.js +2 -2
- package/SVF-doxygen/html/html/search/functions_d.js +1 -1
- package/SVF-doxygen/html/html/search/functions_e.js +3 -3
- package/SVF-doxygen/html/html/search/functions_f.js +5 -5
- package/SVF-doxygen/html/html/search/typedefs_11.js +1 -1
- package/SVF-doxygen/html/html/search/variables_0.js +1 -1
- package/SVF-doxygen/html/html/search/variables_10.js +2 -2
- package/SVF-doxygen/html/html/search/variables_12.js +5 -6
- package/SVF-doxygen/html/html/search/variables_13.js +3 -3
- package/SVF-doxygen/html/html/search/variables_14.js +1 -0
- package/SVF-doxygen/html/html/search/variables_6.js +1 -1
- package/SVF-doxygen/html/html/search/variables_7.js +0 -1
- package/SVF-doxygen/html/html/search/variables_9.js +1 -1
- package/SVF-doxygen/html/html/search/variables_d.js +1 -1
- package/SVF-doxygen/html/html/search/variables_e.js +1 -1
- package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01CFLGraph_01_5_01_4.html +14 -14
- package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01ConstraintGraph_01_5_01_4.html +2 -2
- package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01IRGraph_01_5_01_4.html +1 -1
- package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01SVFG_01_5_01_4.html +1 -1
- package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1SVFG_01_5_01_4.html +2 -2
- package/SVF-doxygen/html/html/structSVF_1_1Hash_3_01NodePair_01_4.html +3 -3
- package/SVF-doxygen/html/html/structSVF_1_1SparseBitVectorElement-members.html +1 -1
- package/SVF-doxygen/html/html/structSVF_1_1SparseBitVectorElement.html +47 -57
- package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1NodePair_01_4.html +3 -3
- package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1PointsTo_01_4.html +1 -1
- package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1SparseBitVector_3_01N_01_4_01_4.html +5 -5
- package/SVF-doxygen/html/html/structstd_1_1hash_3_01std_1_1vector_3_01T_01_4_01_4.html +3 -3
- package/SVF-doxygen/html/html/svf-ex_8cpp.html +6 -7
- package/SVF-doxygen/html/html/svf-ex_8cpp_source.html +7 -7
- package/SVF-doxygen/html/html/tools_2MTA_2MTAResultValidator_8h_source.html +1 -1
- package/SVF-doxygen/html/html/wpa_8cpp.html +1 -1
- package/SVF-doxygen/html/html/wpa_8cpp_source.html +1 -1
- package/build.sh +2 -2
- package/include/DDA/DDAPass.h +1 -1
- package/include/DDA/FlowDDA.h +1 -1
- package/include/Graphs/ICFG.h +1 -1
- package/include/Graphs/SVFG.h +3 -4
- package/include/Graphs/SVFGOPT.h +7 -7
- package/include/MSSA/MemSSA.h +2 -0
- package/include/MSSA/SVFGBuilder.h +5 -14
- package/include/MTA/MTA.h +2 -2
- package/include/MemoryModel/MutablePointsToDS.h +3 -3
- package/include/MemoryModel/PersistentPointsToCache.h +7 -8
- package/include/MemoryModel/PersistentPointsToDS.h +93 -93
- package/include/MemoryModel/PointerAnalysisImpl.h +17 -28
- package/include/MemoryModel/PointsTo.h +24 -24
- package/include/SABER/SrcSnkDDA.h +10 -13
- package/include/SVF-LLVM/LLVMLoopAnalysis.h +2 -1
- package/include/SVF-LLVM/LLVMModule.h +6 -6
- package/include/SVFIR/SVFIR.h +3 -5
- package/include/SVFIR/SVFType.h +6 -8
- package/include/SVFIR/SVFValue.h +3 -3
- package/include/Util/Options.h +0 -1
- package/include/Util/SparseBitVector.h +6 -14
- package/include/WPA/FlowSensitive.h +13 -20
- package/include/WPA/WPASolver.h +5 -9
- package/lib/DDA/DDAPass.cpp +4 -4
- package/lib/Graphs/CFLGraph.cpp +3 -0
- package/lib/Graphs/SVFG.cpp +1 -1
- package/lib/MSSA/MemSSA.cpp +5 -3
- package/lib/MSSA/SVFGBuilder.cpp +9 -27
- package/lib/MTA/MTA.cpp +4 -4
- package/lib/MemoryModel/PointerAnalysisImpl.cpp +10 -10
- package/lib/MemoryModel/PointsTo.cpp +23 -19
- package/lib/SVF-LLVM/LLVMLoopAnalysis.cpp +3 -4
- package/lib/SVF-LLVM/LLVMModule.cpp +32 -21
- package/lib/SVFIR/SVFIR.cpp +1 -1
- package/lib/SVFIR/SymbolTableInfo.cpp +4 -15
- package/lib/Util/Options.cpp +0 -6
- package/lib/WPA/AndersenSFR.cpp +1 -1
- package/lib/WPA/FlowSensitive.cpp +1 -1
- package/package.json +1 -1
- package/tools/CFL/cfl.cpp +5 -4
- package/tools/DDA/dda.cpp +3 -2
- package/tools/Example/svf-ex.cpp +3 -2
- package/tools/MTA/mta.cpp +6 -4
- package/tools/SABER/saber.cpp +7 -5
- package/tools/WPA/wpa.cpp +3 -2
|
@@ -66,53 +66,53 @@ $(function() {
|
|
|
66
66
|
<div class="title">PersistentPointsToCache.h</div> </div>
|
|
67
67
|
</div><!--header-->
|
|
68
68
|
<div class="contents">
|
|
69
|
-
<a href="PersistentPointsToCache_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">//===- PersistentPointsToCache.h -- Persistent points-to sets ----------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> </div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">/*</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"> * PersistentPointsToCache.h</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment"> * The implementation is based on</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment"> * Mohamad Barbar and Yulei Sui. Hash Consed Points-To Sets.</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment"> * 28th Static Analysis Symposium (SAS'21)</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment"> *</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment"> * Created on: Sep 28, 2020</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment"> * Author: Mohamad Barbar</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="comment"> */</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> </div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="preprocessor">#ifndef PERSISTENT_POINTS_TO_H_</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="preprocessor">#define PERSISTENT_POINTS_TO_H_</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="preprocessor">#include <iomanip></span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#include <iostream></span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="preprocessor">#include <vector></span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="preprocessor">#include "<a class="code" href="SVFType_8h.html">SVFIR/SVFType.h</a>"</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> </div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="keyword">namespace </span><a class="code" href="namespaceSVF.html">SVF</a></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> {</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> </div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Data></div><div class="line"><a name="l00031"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html"> 31</a></span> <span class="keyword">class </span><a class="code" href="classSVF_1_1PersistentPointsToCache.html">PersistentPointsToCache</a></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> {</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00034"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a9a1b0d0d215c048c7200da0e8f816943"> 34</a></span>  <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<Data, PointsToID></a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a9a1b0d0d215c048c7200da0e8f816943">PTSToIDMap</a>;</div><div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a5a0f1b93f29ce62ad13042ab8435c62c"> 35</a></span>  <span class="keyword">typedef</span> std::function<Data(const Data &, const Data &)> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a5a0f1b93f29ce62ad13042ab8435c62c">DataOp</a>;</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  <span class="comment">// TODO: an unordered pair type may be better.</span></div><div class="line"><a name="l00037"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a896bab5039f4bf2d0da71045e2c63ad7"> 37</a></span>  <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<std::pair<PointsToID, PointsToID></a>, <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a>> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a896bab5039f4bf2d0da71045e2c63ad7">OpCache</a>;</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> </div><div class="line"><a name="l00039"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57"> 39</a></span>  <span class="keyword">static</span> <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  {</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  };</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> </div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00045"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#acbfc07bb91fb08658a911abe0a8113c5"> 45</a></span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#acbfc07bb91fb08658a911abe0a8113c5">PersistentPointsToCache</a>(<span class="keywordtype">void</span>) : <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5">idCounter</a>(1)</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  {</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a390c08099f16afb4b80b6e094d1adf25">idToPts</a>.push_back(<span class="keyword">new</span> Data());</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>[Data()] = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>();</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span> </div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab19e4e17b1896565e0bada1f161d1266">initStats</a>();</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  }</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> </div><div class="line"><a name="l00054"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ae9017daca63227066bb1be6dedef8b0f"> 54</a></span>  <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ae9017daca63227066bb1be6dedef8b0f">clear</a>()</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  {</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> Data *d : <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a390c08099f16afb4b80b6e094d1adf25">idToPts</a>) <span class="keyword">delete</span> d;</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  idToPts.clear();</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>.clear();</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span> </div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>.clear();</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#adef498f8a0d4c75023382e6312a85a58">complementCache</a>.clear();</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>.clear();</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  }</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span> </div><div class="line"><a name="l00066"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#af7e82410738f2cbaf06ea5249932a142"> 66</a></span>  <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#af7e82410738f2cbaf06ea5249932a142">reset</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  {</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ae9017daca63227066bb1be6dedef8b0f">clear</a>();</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span> </div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  <span class="comment">// Put the empty data back in.</span></div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>[Data()] = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>();</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a390c08099f16afb4b80b6e094d1adf25">idToPts</a>.push_back(<span class="keyword">new</span> Data());</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span> </div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5">idCounter</a> = 1;</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  <span class="comment">// Cache is empty...</span></div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab19e4e17b1896565e0bada1f161d1266">initStats</a>();</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  }</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span> </div><div class="line"><a name="l00080"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a89c4e8c8edcc6744f298e90d721a0745"> 80</a></span>  <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a89c4e8c8edcc6744f298e90d721a0745">remapAllPts</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  {</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  <span class="keywordflow">for</span> (Data *d : <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a390c08099f16afb4b80b6e094d1adf25">idToPts</a>) d->checkAndRemap();</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span> </div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  <span class="comment">// Rebuild ptsToId from idToPts.</span></div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>.clear();</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> i = 0; i < idToPts.size(); ++i) <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>[*idToPts[i]] = i;</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  }</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span> </div><div class="line"><a name="l00091"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a98d176e384469e0308bfee2061ef84b5"> 91</a></span>  <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a98d176e384469e0308bfee2061ef84b5">emplacePts</a>(<span class="keyword">const</span> Data &pts)</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  {</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  <span class="comment">// Is it already in the cache?</span></div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  <span class="keyword">typename</span> PTSToIDMap::const_iterator foundId = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>.find(pts);</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  <span class="keywordflow">if</span> (foundId != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>.end()) <span class="keywordflow">return</span> foundId->second;</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span> </div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  <span class="comment">// Otherwise, insert it.</span></div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <span class="keywordtype">id</span> = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a52ec4a787a199bb4d7553e8bafa9c127">newPointsToId</a>();</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a390c08099f16afb4b80b6e094d1adf25">idToPts</a>.push_back(<span class="keyword">new</span> Data(pts));</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>[pts] = id;</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span> </div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  <span class="keywordflow">return</span> id;</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  }</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span> </div><div class="line"><a name="l00106"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ab2888b033a29de3af48d377dc2fe70aa"> 106</a></span>  <span class="keyword">const</span> Data &<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab2888b033a29de3af48d377dc2fe70aa">getActualPts</a>(<a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <span class="keywordtype">id</span>)<span class="keyword"> const</span></div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span> <span class="keyword"> </span>{</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  <span class="comment">// Check if the points-to set for ID has already been stored.</span></div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  assert(<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a390c08099f16afb4b80b6e094d1adf25">idToPts</a>.size() > <span class="keywordtype">id</span> && <span class="stringliteral">"PPTC::getActualPts: points-to set not stored!"</span>);</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <span class="keywordflow">return</span> *<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a390c08099f16afb4b80b6e094d1adf25">idToPts</a>.at(<span class="keywordtype">id</span>);</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  }</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span> </div><div class="line"><a name="l00114"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a178b49cca2c22e874ff9e772cc4df72b"> 114</a></span>  <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a178b49cca2c22e874ff9e772cc4df72b">unionPts</a>(<a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> lhs, <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> rhs)</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  {</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <span class="keyword">static</span> <span class="keyword">const</span> DataOp unionOp = [](<span class="keyword">const</span> Data &lhs, <span class="keyword">const</span> Data &rhs)</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  {</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  <span class="keywordflow">return</span> lhs | rhs;</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  };</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span> </div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a>;</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span> </div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  <span class="comment">// Order operands so we don't perform x U y and y U x separately.</span></div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  std::pair<PointsToID, PointsToID> operands = std::minmax(lhs, rhs);</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span> </div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  <span class="comment">// Property cases.</span></div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  <span class="comment">// EMPTY_SET U x</span></div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <span class="keywordflow">if</span> (operands.first == <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>())</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  {</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a>;</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  <span class="keywordflow">return</span> operands.second;</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  }</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span> </div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <span class="comment">// x U x</span></div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  <span class="keywordflow">if</span> (operands.first == operands.second)</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  {</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a>;</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  <span class="keywordflow">return</span> operands.first;</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  }</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span> </div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  <span class="keywordtype">bool</span> opPerformed = <span class="keyword">false</span>;</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> result = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac7865b3ea1d76d2c522b465cc8e86639">opPts</a>(lhs, rhs, unionOp, <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>, <span class="keyword">true</span>, opPerformed);</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span> </div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  <span class="keywordflow">if</span> (opPerformed)</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  {</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#aacebdd87b1dd45250391d035b032f9d4">uniqueUnions</a>;</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span> </div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  <span class="comment">// We can use lhs/rhs here rather than our ordered operands,</span></div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  <span class="comment">// because the operation was commutative.</span></div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span> </div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  <span class="comment">// if x U y = z, then x U z = z,</span></div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <span class="keywordflow">if</span> (lhs != result)</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  {</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>[std::minmax(lhs, result)] = result;</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a98dad4f4d39904d90564f1a2279ac664">preemptiveUnions</a>;</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a>;</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  }</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span> </div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <span class="comment">// and y U z = z.</span></div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  <span class="keywordflow">if</span> (rhs != result)</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  {</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>[std::minmax(rhs, result)] = result;</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a98dad4f4d39904d90564f1a2279ac664">preemptiveUnions</a>;</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a>;</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  }</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  }</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  <span class="keywordflow">else</span> ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8">lookupUnions</a>;</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span> </div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  }</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span> </div><div class="line"><a name="l00173"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a86bf6959fb5587e350015d58d529af14"> 173</a></span>  <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a86bf6959fb5587e350015d58d529af14">complementPts</a>(<a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> lhs, <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> rhs)</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  {</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  <span class="keyword">static</span> <span class="keyword">const</span> DataOp complementOp = [](<span class="keyword">const</span> Data &lhs, <span class="keyword">const</span> Data &rhs)</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  {</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  <span class="keywordflow">return</span> lhs - rhs;</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  };</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span> </div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0">totalComplements</a>;</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span> </div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  <span class="comment">// Property cases.</span></div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  <span class="comment">// x - x</span></div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  <span class="keywordflow">if</span> (lhs == rhs)</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  {</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a>;</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>();</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  }</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span> </div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  <span class="comment">// x - EMPTY_SET</span></div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  <span class="keywordflow">if</span> (rhs == <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>())</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  {</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a>;</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <span class="keywordflow">return</span> lhs;</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  }</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span> </div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  <span class="comment">// EMPTY_SET - x</span></div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  <span class="keywordflow">if</span> (lhs == <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>())</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  {</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a>;</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>();</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  }</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span> </div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  <span class="keywordtype">bool</span> opPerformed = <span class="keyword">false</span>;</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> result = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac7865b3ea1d76d2c522b465cc8e86639">opPts</a>(lhs, rhs, complementOp, <a class="code" href="classSVF_1_1PersistentPointsToCache.html#adef498f8a0d4c75023382e6312a85a58">complementCache</a>, <span class="keyword">false</span>, opPerformed);</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span> </div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <span class="keywordflow">if</span> (opPerformed)</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  {</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a5c1afbaebce46eac6b1172aa5f2824ee">uniqueComplements</a>;</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span> </div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <span class="comment">// We performed lhs - rhs = result, so...</span></div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  <span class="keywordflow">if</span> (result != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>())</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  {</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  <span class="comment">// result AND rhs = EMPTY_SET,</span></div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>[std::minmax(result, rhs)] = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>();</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ae80c5037ff49f70d9a87a83a8fcb07c7">preemptiveIntersections</a>;</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a>;</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span> </div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  <span class="comment">// and result AND lhs = result,</span></div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>[std::minmax(result, lhs)] = result;</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ae80c5037ff49f70d9a87a83a8fcb07c7">preemptiveIntersections</a>;</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a>;</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span> </div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <span class="comment">// and result - rhs = result.</span></div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#adef498f8a0d4c75023382e6312a85a58">complementCache</a>[std::make_pair(result, rhs)] = result;</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad9a761bcece141764322247cc326bcbe">preemptiveComplements</a>;</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0">totalComplements</a>;</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  }</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  }</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  <span class="keywordflow">else</span> ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a47f4e8ef1461396afb2e1c3cbe055e95">lookupComplements</a>;</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span> </div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  }</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span> </div><div class="line"><a name="l00236"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a17d33558208c19019e541ee167009494"> 236</a></span>  <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a17d33558208c19019e541ee167009494">intersectPts</a>(<a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> lhs, <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> rhs)</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  {</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  <span class="keyword">static</span> <span class="keyword">const</span> DataOp intersectionOp = [](<span class="keyword">const</span> Data &lhs, <span class="keyword">const</span> Data &rhs)</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  {</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <span class="keywordflow">return</span> lhs & rhs;</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  };</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span> </div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a>;</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span> </div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  <span class="comment">// Order operands so we don't perform x U y and y U x separately.</span></div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  std::pair<PointsToID, PointsToID> operands = std::minmax(lhs, rhs);</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span> </div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  <span class="comment">// Property cases.</span></div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  <span class="comment">// EMPTY_SET & x</span></div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <span class="keywordflow">if</span> (operands.first == <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>())</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  {</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a>;</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>();</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  }</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span> </div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <span class="comment">// x & x</span></div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  <span class="keywordflow">if</span> (operands.first == operands.second)</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  {</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a>;</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  <span class="keywordflow">return</span> operands.first;</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  }</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span> </div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <span class="keywordtype">bool</span> opPerformed = <span class="keyword">false</span>;</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> result = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac7865b3ea1d76d2c522b465cc8e86639">opPts</a>(lhs, rhs, intersectionOp, <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>, <span class="keyword">true</span>, opPerformed);</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <span class="keywordflow">if</span> (opPerformed)</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  {</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a474023fe293b080fbda7da06ef380531">uniqueIntersections</a>;</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span> </div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  <span class="comment">// When the result is empty, we won't be adding anything of substance.</span></div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <span class="keywordflow">if</span> (result != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>())</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  {</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  <span class="comment">// We performed lhs AND rhs = result, so...</span></div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <span class="comment">// result AND rhs = result,</span></div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  <span class="keywordflow">if</span> (result != rhs)</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  {</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>[std::minmax(result, rhs)] = result;</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ae80c5037ff49f70d9a87a83a8fcb07c7">preemptiveIntersections</a>;</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a>;</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  }</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span> </div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  <span class="comment">// and result AND lhs = result,</span></div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  <span class="keywordflow">if</span> (result != lhs)</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  {</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>[std::minmax(result, lhs)] = result;</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ae80c5037ff49f70d9a87a83a8fcb07c7">preemptiveIntersections</a>;</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a>;</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  }</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span> </div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <span class="comment">// Also (thanks reviewer #2)</span></div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <span class="comment">// result U lhs = result,</span></div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  <span class="keywordflow">if</span> (result != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>() && result != lhs)</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  {</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>[std::minmax(lhs, result)] = lhs;</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a98dad4f4d39904d90564f1a2279ac664">preemptiveUnions</a>;</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a>;</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  }</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span> </div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  <span class="comment">// And result U rhs = rhs.</span></div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  <span class="keywordflow">if</span> (result != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>() && result != rhs)</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  {</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>[std::minmax(rhs, result)] = rhs;</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a98dad4f4d39904d90564f1a2279ac664">preemptiveUnions</a>;</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a>;</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  }</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  }</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  }</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  <span class="keywordflow">else</span> ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a15d3235017b35f4a5c668d0b6626faff">lookupIntersections</a>;</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span> </div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  }</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span> </div><div class="line"><a name="l00313"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a7d101df4e73b8fbf9ec0df25190417b5"> 313</a></span>  <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7d101df4e73b8fbf9ec0df25190417b5">printStats</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> subtitle)<span class="keyword"> const</span></div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span> <span class="keyword"> </span>{</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> fieldWidth = 25;</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>().flags(std::ios::left);</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span> </div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"UniquePointsToSets"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a390c08099f16afb4b80b6e094d1adf25">idToPts</a>.size() << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span> </div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"TotalUnions"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"PropertyUnions"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"UniqueUnions"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#aacebdd87b1dd45250391d035b032f9d4">uniqueUnions</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"LookupUnions"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8">lookupUnions</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"PreemptiveUnions"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a98dad4f4d39904d90564f1a2279ac664">preemptiveUnions</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span> </div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"TotalComplements"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0">totalComplements</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"PropertyComplements"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"UniqueComplements"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a5c1afbaebce46eac6b1172aa5f2824ee">uniqueComplements</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"LookupComplements"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a47f4e8ef1461396afb2e1c3cbe055e95">lookupComplements</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"PreemptiveComplements"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad9a761bcece141764322247cc326bcbe">preemptiveComplements</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span> </div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"TotalIntersections"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"PropertyIntersections"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"UniqueIntersections"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a474023fe293b080fbda7da06ef380531">uniqueIntersections</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"LookupIntersections"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a15d3235017b35f4a5c668d0b6626faff">lookupIntersections</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"PreemptiveIntersections"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ae80c5037ff49f70d9a87a83a8fcb07c7">preemptiveIntersections</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span> </div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>().flush();</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  }</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span> </div><div class="line"><a name="l00345"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ab84d0806e87c982bf81ae309f28751e3"> 345</a></span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<Data, unsigned></a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab84d0806e87c982bf81ae309f28751e3">getAllPts</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  {</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<Data, unsigned></a> allPts;</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> Data *d : <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a390c08099f16afb4b80b6e094d1adf25">idToPts</a>) allPts[*d] = 1;</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  <span class="keywordflow">return</span> allPts;</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  }</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span> </div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  <span class="comment">// TODO: ref count API for garbage collection.</span></div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span> </div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span> <span class="keyword">private</span>:</div><div class="line"><a name="l00355"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a52ec4a787a199bb4d7553e8bafa9c127"> 355</a></span>  <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a52ec4a787a199bb4d7553e8bafa9c127">newPointsToId</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  {</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  <span class="comment">// Make sure we don't overflow.</span></div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  assert(<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5">idCounter</a> != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>() && <span class="stringliteral">"PPTC::newPointsToId: PointsToIDs exhausted! Try a larger type."</span>);</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5">idCounter</a>++;</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  }</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span> </div><div class="line"><a name="l00365"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ac7865b3ea1d76d2c522b465cc8e86639"> 365</a></span>  <span class="keyword">inline</span> <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac7865b3ea1d76d2c522b465cc8e86639">opPts</a>(<a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> lhs, <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> rhs, <span class="keyword">const</span> DataOp &dataOp, OpCache &opCache,</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  <span class="keywordtype">bool</span> commutative, <span class="keywordtype">bool</span> &opPerformed)</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  {</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  std::pair<PointsToID, PointsToID> operands;</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  <span class="comment">// If we're commutative, we want to always perform the same operation: x op y.</span></div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  <span class="comment">// Performing x op y sometimes and y op x other times is a waste of time.</span></div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  <span class="keywordflow">if</span> (commutative) operands = std::minmax(lhs, rhs);</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  <span class="keywordflow">else</span> operands = std::make_pair(lhs, rhs);</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span> </div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  <span class="comment">// Check if we have performed this operation</span></div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  OpCache::const_iterator foundResult = opCache.find(operands);</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  <span class="keywordflow">if</span> (foundResult != opCache.end()) <span class="keywordflow">return</span> foundResult->second;</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span> </div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  opPerformed = <span class="keyword">true</span>;</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span> </div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  <span class="keyword">const</span> Data &lhsPts = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab2888b033a29de3af48d377dc2fe70aa">getActualPts</a>(lhs);</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  <span class="keyword">const</span> Data &rhsPts = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab2888b033a29de3af48d377dc2fe70aa">getActualPts</a>(rhs);</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span> </div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  Data result = dataOp(lhsPts, rhsPts);</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span> </div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> resultId;</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  <span class="comment">// Intern points-to set: check if result already exists.</span></div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  <span class="keyword">typename</span> PTSToIDMap::const_iterator foundId = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>.find(result);</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  <span class="keywordflow">if</span> (foundId != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>.end()) resultId = foundId->second;</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  {</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  resultId = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a52ec4a787a199bb4d7553e8bafa9c127">newPointsToId</a>();</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a390c08099f16afb4b80b6e094d1adf25">idToPts</a>.push_back(<span class="keyword">new</span> Data(result));</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>[result] = resultId;</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  }</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span> </div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  <span class="comment">// Cache the result, for hash-consing.</span></div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  opCache[operands] = resultId;</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span> </div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  <span class="keywordflow">return</span> resultId;</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  }</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span> </div><div class="line"><a name="l00403"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ab19e4e17b1896565e0bada1f161d1266"> 403</a></span>  <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab19e4e17b1896565e0bada1f161d1266">initStats</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  {</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span> </div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a> = 0;</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#aacebdd87b1dd45250391d035b032f9d4">uniqueUnions</a> = 0;</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a> = 0;</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8">lookupUnions</a> = 0;</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a98dad4f4d39904d90564f1a2279ac664">preemptiveUnions</a> = 0;</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0">totalComplements</a> = 0;</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a5c1afbaebce46eac6b1172aa5f2824ee">uniqueComplements</a> = 0;</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a> = 0;</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a47f4e8ef1461396afb2e1c3cbe055e95">lookupComplements</a> = 0;</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad9a761bcece141764322247cc326bcbe">preemptiveComplements</a> = 0;</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a> = 0;</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a474023fe293b080fbda7da06ef380531">uniqueIntersections</a> = 0;</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a> = 0;</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a15d3235017b35f4a5c668d0b6626faff">lookupIntersections</a> = 0;</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ae80c5037ff49f70d9a87a83a8fcb07c7">preemptiveIntersections</a> = 0;</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  }</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span> </div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span> <span class="keyword">private</span>:</div><div class="line"><a name="l00429"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a390c08099f16afb4b80b6e094d1adf25"> 429</a></span>  std::vector<Data *> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a390c08099f16afb4b80b6e094d1adf25">idToPts</a>;</div><div class="line"><a name="l00431"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c"> 431</a></span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a9a1b0d0d215c048c7200da0e8f816943">PTSToIDMap</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>;</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span> </div><div class="line"><a name="l00434"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05"> 434</a></span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a896bab5039f4bf2d0da71045e2c63ad7">OpCache</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>;</div><div class="line"><a name="l00436"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#adef498f8a0d4c75023382e6312a85a58"> 436</a></span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a896bab5039f4bf2d0da71045e2c63ad7">OpCache</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#adef498f8a0d4c75023382e6312a85a58">complementCache</a>;</div><div class="line"><a name="l00438"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2"> 438</a></span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a896bab5039f4bf2d0da71045e2c63ad7">OpCache</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>;</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span> </div><div class="line"><a name="l00441"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5"> 441</a></span>  <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5">idCounter</a>;</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span> </div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  <span class="comment">// Statistics:</span></div><div class="line"><a name="l00444"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2"> 444</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a>;</div><div class="line"><a name="l00445"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#aacebdd87b1dd45250391d035b032f9d4"> 445</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#aacebdd87b1dd45250391d035b032f9d4">uniqueUnions</a>;</div><div class="line"><a name="l00446"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd"> 446</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a>;</div><div class="line"><a name="l00447"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8"> 447</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8">lookupUnions</a>;</div><div class="line"><a name="l00448"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a98dad4f4d39904d90564f1a2279ac664"> 448</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a98dad4f4d39904d90564f1a2279ac664">preemptiveUnions</a>;</div><div class="line"><a name="l00449"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0"> 449</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0">totalComplements</a>;</div><div class="line"><a name="l00450"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a5c1afbaebce46eac6b1172aa5f2824ee"> 450</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a5c1afbaebce46eac6b1172aa5f2824ee">uniqueComplements</a>;</div><div class="line"><a name="l00451"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8"> 451</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a>;</div><div class="line"><a name="l00452"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a47f4e8ef1461396afb2e1c3cbe055e95"> 452</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a47f4e8ef1461396afb2e1c3cbe055e95">lookupComplements</a>;</div><div class="line"><a name="l00453"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ad9a761bcece141764322247cc326bcbe"> 453</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad9a761bcece141764322247cc326bcbe">preemptiveComplements</a>;</div><div class="line"><a name="l00454"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22"> 454</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a>;</div><div class="line"><a name="l00455"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a474023fe293b080fbda7da06ef380531"> 455</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a474023fe293b080fbda7da06ef380531">uniqueIntersections</a>;</div><div class="line"><a name="l00456"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991"> 456</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a>;</div><div class="line"><a name="l00457"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a15d3235017b35f4a5c668d0b6626faff"> 457</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a15d3235017b35f4a5c668d0b6626faff">lookupIntersections</a>;</div><div class="line"><a name="l00458"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ae80c5037ff49f70d9a87a83a8fcb07c7"> 458</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ae80c5037ff49f70d9a87a83a8fcb07c7">preemptiveIntersections</a>;</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span> };</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span> </div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span> } <span class="comment">// End namespace SVF</span></div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span> </div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span> <span class="preprocessor">#endif </span><span class="comment">/* PERSISTENT_POINTS_TO_H_ */</span><span class="preprocessor"></span></div><div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_ace976f138cf1b8ab6bbf7a5c5d0b60b8"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8">SVF::PersistentPointsToCache::lookupUnions</a></div><div class="ttdeci">u64_t lookupUnions</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00447">PersistentPointsToCache.h:447</a></div></div>
|
|
69
|
+
<a href="PersistentPointsToCache_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">//===- PersistentPointsToCache.h -- Persistent points-to sets ----------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> </div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">/*</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"> * PersistentPointsToCache.h</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment"> * The implementation is based on</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment"> * Mohamad Barbar and Yulei Sui. Hash Consed Points-To Sets.</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment"> * 28th Static Analysis Symposium (SAS'21)</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment"> *</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment"> * Created on: Sep 28, 2020</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment"> * Author: Mohamad Barbar</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="comment"> */</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> </div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="preprocessor">#ifndef PERSISTENT_POINTS_TO_H_</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="preprocessor">#define PERSISTENT_POINTS_TO_H_</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="preprocessor">#include <iomanip></span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="preprocessor">#include <iostream></span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="preprocessor">#include <vector></span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="preprocessor">#include "<a class="code" href="SVFType_8h.html">SVFIR/SVFType.h</a>"</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> </div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="keyword">namespace </span><a class="code" href="namespaceSVF.html">SVF</a></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> {</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> </div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> <span class="keyword">template</span> <<span class="keyword">typename</span> Data></div><div class="line"><a name="l00031"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html"> 31</a></span> <span class="keyword">class </span><a class="code" href="classSVF_1_1PersistentPointsToCache.html">PersistentPointsToCache</a></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> {</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00034"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a9a1b0d0d215c048c7200da0e8f816943"> 34</a></span>  <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<Data, PointsToID></a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a9a1b0d0d215c048c7200da0e8f816943">PTSToIDMap</a>;</div><div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a5a0f1b93f29ce62ad13042ab8435c62c"> 35</a></span>  <span class="keyword">typedef</span> std::function<Data(const Data &, const Data &)> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a5a0f1b93f29ce62ad13042ab8435c62c">DataOp</a>;</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  <span class="comment">// TODO: an unordered pair type may be better.</span></div><div class="line"><a name="l00037"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a896bab5039f4bf2d0da71045e2c63ad7"> 37</a></span>  <span class="keyword">typedef</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<std::pair<PointsToID, PointsToID></a>, <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a>> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a896bab5039f4bf2d0da71045e2c63ad7">OpCache</a>;</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> </div><div class="line"><a name="l00039"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57"> 39</a></span>  <span class="keyword">static</span> <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  {</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  <span class="keywordflow">return</span> 0;</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  };</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> </div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00045"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#acbfc07bb91fb08658a911abe0a8113c5"> 45</a></span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#acbfc07bb91fb08658a911abe0a8113c5">PersistentPointsToCache</a>(<span class="keywordtype">void</span>) : <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5">idCounter</a>(1)</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  {</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a32009561c9d3a340ec4e6230ef17f998">idToPts</a>.push_back(std::make_unique<Data>());</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>[Data()] = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>();</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span> </div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab19e4e17b1896565e0bada1f161d1266">initStats</a>();</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  }</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> </div><div class="line"><a name="l00054"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ae9017daca63227066bb1be6dedef8b0f"> 54</a></span>  <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ae9017daca63227066bb1be6dedef8b0f">clear</a>()</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  {</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a32009561c9d3a340ec4e6230ef17f998">idToPts</a>.clear();</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>.clear();</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> </div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>.clear();</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#adef498f8a0d4c75023382e6312a85a58">complementCache</a>.clear();</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>.clear();</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  }</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span> </div><div class="line"><a name="l00065"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#af7e82410738f2cbaf06ea5249932a142"> 65</a></span>  <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#af7e82410738f2cbaf06ea5249932a142">reset</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  {</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ae9017daca63227066bb1be6dedef8b0f">clear</a>();</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span> </div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  <span class="comment">// Put the empty data back in.</span></div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>[Data()] = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>();</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a32009561c9d3a340ec4e6230ef17f998">idToPts</a>.push_back(std::make_unique<Data>());</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span> </div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5">idCounter</a> = 1;</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <span class="comment">// Cache is empty...</span></div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab19e4e17b1896565e0bada1f161d1266">initStats</a>();</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  }</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span> </div><div class="line"><a name="l00079"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a89c4e8c8edcc6744f298e90d721a0745"> 79</a></span>  <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a89c4e8c8edcc6744f298e90d721a0745">remapAllPts</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  {</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> &d : <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a32009561c9d3a340ec4e6230ef17f998">idToPts</a>) d->checkAndRemap();</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span> </div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  <span class="comment">// Rebuild ptsToId from idToPts.</span></div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>.clear();</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> i = 0; i < idToPts.size(); ++i) <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>[*idToPts[i]] = i;</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  }</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span> </div><div class="line"><a name="l00090"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a98d176e384469e0308bfee2061ef84b5"> 90</a></span>  <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a98d176e384469e0308bfee2061ef84b5">emplacePts</a>(<span class="keyword">const</span> Data &pts)</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  {</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  <span class="comment">// Is it already in the cache?</span></div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  <span class="keyword">typename</span> PTSToIDMap::const_iterator foundId = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>.find(pts);</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  <span class="keywordflow">if</span> (foundId != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>.end()) <span class="keywordflow">return</span> foundId->second;</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span> </div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  <span class="comment">// Otherwise, insert it.</span></div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <span class="keywordtype">id</span> = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a52ec4a787a199bb4d7553e8bafa9c127">newPointsToId</a>();</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a32009561c9d3a340ec4e6230ef17f998">idToPts</a>.push_back(std::make_unique<Data>(pts));</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>[pts] = id;</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span> </div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  <span class="keywordflow">return</span> id;</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  }</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span> </div><div class="line"><a name="l00105"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ab2888b033a29de3af48d377dc2fe70aa"> 105</a></span>  <span class="keyword">const</span> Data &<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab2888b033a29de3af48d377dc2fe70aa">getActualPts</a>(<a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <span class="keywordtype">id</span>)<span class="keyword"> const</span></div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span> <span class="keyword"> </span>{</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  <span class="comment">// Check if the points-to set for ID has already been stored.</span></div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  assert(<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a32009561c9d3a340ec4e6230ef17f998">idToPts</a>.size() > <span class="keywordtype">id</span> && <span class="stringliteral">"PPTC::getActualPts: points-to set not stored!"</span>);</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  <span class="keywordflow">return</span> *<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a32009561c9d3a340ec4e6230ef17f998">idToPts</a>.at(<span class="keywordtype">id</span>);</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  }</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span> </div><div class="line"><a name="l00113"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a178b49cca2c22e874ff9e772cc4df72b"> 113</a></span>  <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a178b49cca2c22e874ff9e772cc4df72b">unionPts</a>(<a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> lhs, <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> rhs)</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  {</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  <span class="keyword">static</span> <span class="keyword">const</span> DataOp unionOp = [](<span class="keyword">const</span> Data &lhs, <span class="keyword">const</span> Data &rhs)</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  {</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  <span class="keywordflow">return</span> lhs | rhs;</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  };</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span> </div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a>;</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span> </div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  <span class="comment">// Order operands so we don't perform x U y and y U x separately.</span></div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  std::pair<PointsToID, PointsToID> operands = std::minmax(lhs, rhs);</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span> </div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  <span class="comment">// Property cases.</span></div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  <span class="comment">// EMPTY_SET U x</span></div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  <span class="keywordflow">if</span> (operands.first == <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>())</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  {</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a>;</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  <span class="keywordflow">return</span> operands.second;</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  }</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span> </div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  <span class="comment">// x U x</span></div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <span class="keywordflow">if</span> (operands.first == operands.second)</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  {</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a>;</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  <span class="keywordflow">return</span> operands.first;</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  }</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span> </div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  <span class="keywordtype">bool</span> opPerformed = <span class="keyword">false</span>;</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> result = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac7865b3ea1d76d2c522b465cc8e86639">opPts</a>(lhs, rhs, unionOp, <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>, <span class="keyword">true</span>, opPerformed);</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span> </div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  <span class="keywordflow">if</span> (opPerformed)</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  {</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#aacebdd87b1dd45250391d035b032f9d4">uniqueUnions</a>;</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span> </div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  <span class="comment">// We can use lhs/rhs here rather than our ordered operands,</span></div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  <span class="comment">// because the operation was commutative.</span></div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span> </div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  <span class="comment">// if x U y = z, then x U z = z,</span></div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  <span class="keywordflow">if</span> (lhs != result)</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  {</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>[std::minmax(lhs, result)] = result;</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a98dad4f4d39904d90564f1a2279ac664">preemptiveUnions</a>;</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a>;</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  }</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span> </div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  <span class="comment">// and y U z = z.</span></div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  <span class="keywordflow">if</span> (rhs != result)</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  {</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>[std::minmax(rhs, result)] = result;</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a98dad4f4d39904d90564f1a2279ac664">preemptiveUnions</a>;</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a>;</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  }</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  }</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  <span class="keywordflow">else</span> ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8">lookupUnions</a>;</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span> </div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  }</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span> </div><div class="line"><a name="l00172"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a86bf6959fb5587e350015d58d529af14"> 172</a></span>  <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a86bf6959fb5587e350015d58d529af14">complementPts</a>(<a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> lhs, <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> rhs)</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  {</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  <span class="keyword">static</span> <span class="keyword">const</span> DataOp complementOp = [](<span class="keyword">const</span> Data &lhs, <span class="keyword">const</span> Data &rhs)</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  {</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  <span class="keywordflow">return</span> lhs - rhs;</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  };</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span> </div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0">totalComplements</a>;</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span> </div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  <span class="comment">// Property cases.</span></div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  <span class="comment">// x - x</span></div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  <span class="keywordflow">if</span> (lhs == rhs)</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  {</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a>;</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>();</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  }</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span> </div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  <span class="comment">// x - EMPTY_SET</span></div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  <span class="keywordflow">if</span> (rhs == <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>())</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  {</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a>;</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  <span class="keywordflow">return</span> lhs;</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  }</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span> </div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  <span class="comment">// EMPTY_SET - x</span></div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  <span class="keywordflow">if</span> (lhs == <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>())</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  {</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a>;</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>();</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  }</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span> </div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  <span class="keywordtype">bool</span> opPerformed = <span class="keyword">false</span>;</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> result = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac7865b3ea1d76d2c522b465cc8e86639">opPts</a>(lhs, rhs, complementOp, <a class="code" href="classSVF_1_1PersistentPointsToCache.html#adef498f8a0d4c75023382e6312a85a58">complementCache</a>, <span class="keyword">false</span>, opPerformed);</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span> </div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  <span class="keywordflow">if</span> (opPerformed)</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  {</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a5c1afbaebce46eac6b1172aa5f2824ee">uniqueComplements</a>;</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span> </div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  <span class="comment">// We performed lhs - rhs = result, so...</span></div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <span class="keywordflow">if</span> (result != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>())</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  {</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  <span class="comment">// result AND rhs = EMPTY_SET,</span></div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>[std::minmax(result, rhs)] = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>();</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ae80c5037ff49f70d9a87a83a8fcb07c7">preemptiveIntersections</a>;</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a>;</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span> </div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  <span class="comment">// and result AND lhs = result,</span></div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>[std::minmax(result, lhs)] = result;</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ae80c5037ff49f70d9a87a83a8fcb07c7">preemptiveIntersections</a>;</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a>;</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span> </div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <span class="comment">// and result - rhs = result.</span></div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#adef498f8a0d4c75023382e6312a85a58">complementCache</a>[std::make_pair(result, rhs)] = result;</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad9a761bcece141764322247cc326bcbe">preemptiveComplements</a>;</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0">totalComplements</a>;</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  }</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  }</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <span class="keywordflow">else</span> ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a47f4e8ef1461396afb2e1c3cbe055e95">lookupComplements</a>;</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span> </div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  }</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span> </div><div class="line"><a name="l00235"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a17d33558208c19019e541ee167009494"> 235</a></span>  <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a17d33558208c19019e541ee167009494">intersectPts</a>(<a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> lhs, <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> rhs)</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  {</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  <span class="keyword">static</span> <span class="keyword">const</span> DataOp intersectionOp = [](<span class="keyword">const</span> Data &lhs, <span class="keyword">const</span> Data &rhs)</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  {</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  <span class="keywordflow">return</span> lhs & rhs;</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  };</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span> </div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a>;</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span> </div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  <span class="comment">// Order operands so we don't perform x U y and y U x separately.</span></div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  std::pair<PointsToID, PointsToID> operands = std::minmax(lhs, rhs);</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span> </div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  <span class="comment">// Property cases.</span></div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  <span class="comment">// EMPTY_SET & x</span></div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  <span class="keywordflow">if</span> (operands.first == <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>())</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  {</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a>;</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>();</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  }</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span> </div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  <span class="comment">// x & x</span></div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <span class="keywordflow">if</span> (operands.first == operands.second)</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  {</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a>;</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  <span class="keywordflow">return</span> operands.first;</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  }</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span> </div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  <span class="keywordtype">bool</span> opPerformed = <span class="keyword">false</span>;</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> result = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac7865b3ea1d76d2c522b465cc8e86639">opPts</a>(lhs, rhs, intersectionOp, <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>, <span class="keyword">true</span>, opPerformed);</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <span class="keywordflow">if</span> (opPerformed)</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  {</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a474023fe293b080fbda7da06ef380531">uniqueIntersections</a>;</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span> </div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>  <span class="comment">// When the result is empty, we won't be adding anything of substance.</span></div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  <span class="keywordflow">if</span> (result != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>())</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  {</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <span class="comment">// We performed lhs AND rhs = result, so...</span></div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  <span class="comment">// result AND rhs = result,</span></div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <span class="keywordflow">if</span> (result != rhs)</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  {</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>[std::minmax(result, rhs)] = result;</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ae80c5037ff49f70d9a87a83a8fcb07c7">preemptiveIntersections</a>;</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a>;</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  }</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span> </div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  <span class="comment">// and result AND lhs = result,</span></div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  <span class="keywordflow">if</span> (result != lhs)</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  {</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>[std::minmax(result, lhs)] = result;</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ae80c5037ff49f70d9a87a83a8fcb07c7">preemptiveIntersections</a>;</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a>;</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  }</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span> </div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  <span class="comment">// Also (thanks reviewer #2)</span></div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <span class="comment">// result U lhs = result,</span></div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <span class="keywordflow">if</span> (result != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>() && result != lhs)</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  {</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>[std::minmax(lhs, result)] = lhs;</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a98dad4f4d39904d90564f1a2279ac664">preemptiveUnions</a>;</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a>;</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  }</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span> </div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  <span class="comment">// And result U rhs = rhs.</span></div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  <span class="keywordflow">if</span> (result != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>() && result != rhs)</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  {</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>[std::minmax(rhs, result)] = rhs;</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a98dad4f4d39904d90564f1a2279ac664">preemptiveUnions</a>;</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a>;</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  }</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  }</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  }</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  <span class="keywordflow">else</span> ++<a class="code" href="classSVF_1_1PersistentPointsToCache.html#a15d3235017b35f4a5c668d0b6626faff">lookupIntersections</a>;</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span> </div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  <span class="keywordflow">return</span> result;</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  }</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span> </div><div class="line"><a name="l00312"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a7d101df4e73b8fbf9ec0df25190417b5"> 312</a></span>  <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7d101df4e73b8fbf9ec0df25190417b5">printStats</a>(<span class="keyword">const</span> <a class="code" href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">std::string</a> subtitle)<span class="keyword"> const</span></div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span> <span class="keyword"> </span>{</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> fieldWidth = 25;</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>().flags(std::ios::left);</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span> </div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"UniquePointsToSets"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a32009561c9d3a340ec4e6230ef17f998">idToPts</a>.size() << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span> </div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"TotalUnions"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"PropertyUnions"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"UniqueUnions"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#aacebdd87b1dd45250391d035b032f9d4">uniqueUnions</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"LookupUnions"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8">lookupUnions</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"PreemptiveUnions"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a98dad4f4d39904d90564f1a2279ac664">preemptiveUnions</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span> </div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"TotalComplements"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0">totalComplements</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"PropertyComplements"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"UniqueComplements"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a5c1afbaebce46eac6b1172aa5f2824ee">uniqueComplements</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"LookupComplements"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a47f4e8ef1461396afb2e1c3cbe055e95">lookupComplements</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"PreemptiveComplements"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad9a761bcece141764322247cc326bcbe">preemptiveComplements</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span> </div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"TotalIntersections"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"PropertyIntersections"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"UniqueIntersections"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a474023fe293b080fbda7da06ef380531">uniqueIntersections</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"LookupIntersections"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a15d3235017b35f4a5c668d0b6626faff">lookupIntersections</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>() << std::setw(fieldWidth) << <span class="stringliteral">"PreemptiveIntersections"</span> << <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ae80c5037ff49f70d9a87a83a8fcb07c7">preemptiveIntersections</a> << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span> </div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVFUtil::outs</a>().flush();</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  }</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span> </div><div class="line"><a name="l00344"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ab84d0806e87c982bf81ae309f28751e3"> 344</a></span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<Data, unsigned></a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab84d0806e87c982bf81ae309f28751e3">getAllPts</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  {</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<Data, unsigned></a> allPts;</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keyword">auto</span> &d : <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a32009561c9d3a340ec4e6230ef17f998">idToPts</a>) allPts[*d] = 1;</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  <span class="keywordflow">return</span> allPts;</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  }</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span> </div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  <span class="comment">// TODO: ref count API for garbage collection.</span></div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span> </div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span> <span class="keyword">private</span>:</div><div class="line"><a name="l00354"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a52ec4a787a199bb4d7553e8bafa9c127"> 354</a></span>  <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a52ec4a787a199bb4d7553e8bafa9c127">newPointsToId</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  {</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  <span class="comment">// Make sure we don't overflow.</span></div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  assert(<a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5">idCounter</a> != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">emptyPointsToId</a>() && <span class="stringliteral">"PPTC::newPointsToId: PointsToIDs exhausted! Try a larger type."</span>);</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5">idCounter</a>++;</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  }</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span> </div><div class="line"><a name="l00364"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ac7865b3ea1d76d2c522b465cc8e86639"> 364</a></span>  <span class="keyword">inline</span> <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ac7865b3ea1d76d2c522b465cc8e86639">opPts</a>(<a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> lhs, <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> rhs, <span class="keyword">const</span> DataOp &dataOp, OpCache &opCache,</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  <span class="keywordtype">bool</span> commutative, <span class="keywordtype">bool</span> &opPerformed)</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  {</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  std::pair<PointsToID, PointsToID> operands;</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  <span class="comment">// If we're commutative, we want to always perform the same operation: x op y.</span></div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  <span class="comment">// Performing x op y sometimes and y op x other times is a waste of time.</span></div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  <span class="keywordflow">if</span> (commutative) operands = std::minmax(lhs, rhs);</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  <span class="keywordflow">else</span> operands = std::make_pair(lhs, rhs);</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span> </div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  <span class="comment">// Check if we have performed this operation</span></div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  OpCache::const_iterator foundResult = opCache.find(operands);</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  <span class="keywordflow">if</span> (foundResult != opCache.end()) <span class="keywordflow">return</span> foundResult->second;</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span> </div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  opPerformed = <span class="keyword">true</span>;</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span> </div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  <span class="keyword">const</span> Data &lhsPts = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab2888b033a29de3af48d377dc2fe70aa">getActualPts</a>(lhs);</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  <span class="keyword">const</span> Data &rhsPts = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab2888b033a29de3af48d377dc2fe70aa">getActualPts</a>(rhs);</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span> </div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  Data result = dataOp(lhsPts, rhsPts);</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span> </div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> resultId;</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  <span class="comment">// Intern points-to set: check if result already exists.</span></div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  <span class="keyword">typename</span> PTSToIDMap::const_iterator foundId = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>.find(result);</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  <span class="keywordflow">if</span> (foundId != <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>.end()) resultId = foundId->second;</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  {</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  resultId = <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a52ec4a787a199bb4d7553e8bafa9c127">newPointsToId</a>();</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a32009561c9d3a340ec4e6230ef17f998">idToPts</a>.push_back(std::make_unique<Data>(result));</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>[result] = resultId;</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  }</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span> </div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  <span class="comment">// Cache the result, for hash-consing.</span></div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  opCache[operands] = resultId;</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span> </div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  <span class="keywordflow">return</span> resultId;</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  }</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span> </div><div class="line"><a name="l00402"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ab19e4e17b1896565e0bada1f161d1266"> 402</a></span>  <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ab19e4e17b1896565e0bada1f161d1266">initStats</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  {</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span> </div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a> = 0;</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#aacebdd87b1dd45250391d035b032f9d4">uniqueUnions</a> = 0;</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a> = 0;</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8">lookupUnions</a> = 0;</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a98dad4f4d39904d90564f1a2279ac664">preemptiveUnions</a> = 0;</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0">totalComplements</a> = 0;</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a5c1afbaebce46eac6b1172aa5f2824ee">uniqueComplements</a> = 0;</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a> = 0;</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a47f4e8ef1461396afb2e1c3cbe055e95">lookupComplements</a> = 0;</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad9a761bcece141764322247cc326bcbe">preemptiveComplements</a> = 0;</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a> = 0;</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a474023fe293b080fbda7da06ef380531">uniqueIntersections</a> = 0;</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a> = 0;</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a15d3235017b35f4a5c668d0b6626faff">lookupIntersections</a> = 0;</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ae80c5037ff49f70d9a87a83a8fcb07c7">preemptiveIntersections</a> = 0;</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  }</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span> </div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span> <span class="keyword">private</span>:</div><div class="line"><a name="l00428"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a32009561c9d3a340ec4e6230ef17f998"> 428</a></span>  std::vector<std::unique_ptr<Data>> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a32009561c9d3a340ec4e6230ef17f998">idToPts</a>;</div><div class="line"><a name="l00430"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c"> 430</a></span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a9a1b0d0d215c048c7200da0e8f816943">PTSToIDMap</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">ptsToId</a>;</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span> </div><div class="line"><a name="l00433"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05"> 433</a></span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a896bab5039f4bf2d0da71045e2c63ad7">OpCache</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">unionCache</a>;</div><div class="line"><a name="l00435"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#adef498f8a0d4c75023382e6312a85a58"> 435</a></span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a896bab5039f4bf2d0da71045e2c63ad7">OpCache</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#adef498f8a0d4c75023382e6312a85a58">complementCache</a>;</div><div class="line"><a name="l00437"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2"> 437</a></span>  <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a896bab5039f4bf2d0da71045e2c63ad7">OpCache</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">intersectionCache</a>;</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span> </div><div class="line"><a name="l00440"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5"> 440</a></span>  <a class="code" href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">PointsToID</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5">idCounter</a>;</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span> </div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  <span class="comment">// Statistics:</span></div><div class="line"><a name="l00443"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2"> 443</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">totalUnions</a>;</div><div class="line"><a name="l00444"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#aacebdd87b1dd45250391d035b032f9d4"> 444</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#aacebdd87b1dd45250391d035b032f9d4">uniqueUnions</a>;</div><div class="line"><a name="l00445"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd"> 445</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">propertyUnions</a>;</div><div class="line"><a name="l00446"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8"> 446</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8">lookupUnions</a>;</div><div class="line"><a name="l00447"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a98dad4f4d39904d90564f1a2279ac664"> 447</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a98dad4f4d39904d90564f1a2279ac664">preemptiveUnions</a>;</div><div class="line"><a name="l00448"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0"> 448</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0">totalComplements</a>;</div><div class="line"><a name="l00449"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a5c1afbaebce46eac6b1172aa5f2824ee"> 449</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a5c1afbaebce46eac6b1172aa5f2824ee">uniqueComplements</a>;</div><div class="line"><a name="l00450"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8"> 450</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">propertyComplements</a>;</div><div class="line"><a name="l00451"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a47f4e8ef1461396afb2e1c3cbe055e95"> 451</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a47f4e8ef1461396afb2e1c3cbe055e95">lookupComplements</a>;</div><div class="line"><a name="l00452"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ad9a761bcece141764322247cc326bcbe"> 452</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ad9a761bcece141764322247cc326bcbe">preemptiveComplements</a>;</div><div class="line"><a name="l00453"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22"> 453</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">totalIntersections</a>;</div><div class="line"><a name="l00454"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a474023fe293b080fbda7da06ef380531"> 454</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a474023fe293b080fbda7da06ef380531">uniqueIntersections</a>;</div><div class="line"><a name="l00455"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991"> 455</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">propertyIntersections</a>;</div><div class="line"><a name="l00456"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#a15d3235017b35f4a5c668d0b6626faff"> 456</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#a15d3235017b35f4a5c668d0b6626faff">lookupIntersections</a>;</div><div class="line"><a name="l00457"></a><span class="lineno"><a class="line" href="classSVF_1_1PersistentPointsToCache.html#ae80c5037ff49f70d9a87a83a8fcb07c7"> 457</a></span>  <a class="code" href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">u64_t</a> <a class="code" href="classSVF_1_1PersistentPointsToCache.html#ae80c5037ff49f70d9a87a83a8fcb07c7">preemptiveIntersections</a>;</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span> };</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span> </div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span> } <span class="comment">// End namespace SVF</span></div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span> </div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span> <span class="preprocessor">#endif </span><span class="comment">/* PERSISTENT_POINTS_TO_H_ */</span><span class="preprocessor"></span></div><div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_ace976f138cf1b8ab6bbf7a5c5d0b60b8"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#ace976f138cf1b8ab6bbf7a5c5d0b60b8">SVF::PersistentPointsToCache::lookupUnions</a></div><div class="ttdeci">u64_t lookupUnions</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00446">PersistentPointsToCache.h:446</a></div></div>
|
|
70
70
|
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_ae9017daca63227066bb1be6dedef8b0f"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#ae9017daca63227066bb1be6dedef8b0f">SVF::PersistentPointsToCache::clear</a></div><div class="ttdeci">void clear()</div><div class="ttdoc">Clear the cache. </div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00054">PersistentPointsToCache.h:54</a></div></div>
|
|
71
|
-
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a7961dd7af7db2774e852beabcba1e5a8"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">SVF::PersistentPointsToCache::propertyComplements</a></div><div class="ttdeci">u64_t propertyComplements</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#
|
|
72
|
-
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_ac7865b3ea1d76d2c522b465cc8e86639"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#ac7865b3ea1d76d2c522b465cc8e86639">SVF::PersistentPointsToCache::opPts</a></div><div class="ttdeci">PointsToID opPts(PointsToID lhs, PointsToID rhs, const DataOp &dataOp, OpCache &opCache, bool commutative, bool &opPerformed)</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#
|
|
73
|
-
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a98d176e384469e0308bfee2061ef84b5"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a98d176e384469e0308bfee2061ef84b5">SVF::PersistentPointsToCache::emplacePts</a></div><div class="ttdeci">PointsToID emplacePts(const Data &pts)</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#
|
|
74
|
-
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_ae80c5037ff49f70d9a87a83a8fcb07c7"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#ae80c5037ff49f70d9a87a83a8fcb07c7">SVF::PersistentPointsToCache::preemptiveIntersections</a></div><div class="ttdeci">u64_t preemptiveIntersections</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#
|
|
75
|
-
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a5c1afbaebce46eac6b1172aa5f2824ee"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a5c1afbaebce46eac6b1172aa5f2824ee">SVF::PersistentPointsToCache::uniqueComplements</a></div><div class="ttdeci">u64_t uniqueComplements</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#
|
|
76
|
-
<div class="ttc" id="
|
|
77
|
-
<div class="ttc" id="
|
|
78
|
-
<div class="ttc" id="
|
|
79
|
-
<div class="ttc" id="
|
|
80
|
-
<div class="ttc" id="
|
|
71
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a7961dd7af7db2774e852beabcba1e5a8"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a7961dd7af7db2774e852beabcba1e5a8">SVF::PersistentPointsToCache::propertyComplements</a></div><div class="ttdeci">u64_t propertyComplements</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00450">PersistentPointsToCache.h:450</a></div></div>
|
|
72
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_ac7865b3ea1d76d2c522b465cc8e86639"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#ac7865b3ea1d76d2c522b465cc8e86639">SVF::PersistentPointsToCache::opPts</a></div><div class="ttdeci">PointsToID opPts(PointsToID lhs, PointsToID rhs, const DataOp &dataOp, OpCache &opCache, bool commutative, bool &opPerformed)</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00364">PersistentPointsToCache.h:364</a></div></div>
|
|
73
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a98d176e384469e0308bfee2061ef84b5"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a98d176e384469e0308bfee2061ef84b5">SVF::PersistentPointsToCache::emplacePts</a></div><div class="ttdeci">PointsToID emplacePts(const Data &pts)</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00090">PersistentPointsToCache.h:90</a></div></div>
|
|
74
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_ae80c5037ff49f70d9a87a83a8fcb07c7"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#ae80c5037ff49f70d9a87a83a8fcb07c7">SVF::PersistentPointsToCache::preemptiveIntersections</a></div><div class="ttdeci">u64_t preemptiveIntersections</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00457">PersistentPointsToCache.h:457</a></div></div>
|
|
75
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a5c1afbaebce46eac6b1172aa5f2824ee"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a5c1afbaebce46eac6b1172aa5f2824ee">SVF::PersistentPointsToCache::uniqueComplements</a></div><div class="ttdeci">u64_t uniqueComplements</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00449">PersistentPointsToCache.h:449</a></div></div>
|
|
76
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a32009561c9d3a340ec4e6230ef17f998"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a32009561c9d3a340ec4e6230ef17f998">SVF::PersistentPointsToCache::idToPts</a></div><div class="ttdeci">std::vector< std::unique_ptr< Data > > idToPts</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00428">PersistentPointsToCache.h:428</a></div></div>
|
|
77
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a7d101df4e73b8fbf9ec0df25190417b5"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a7d101df4e73b8fbf9ec0df25190417b5">SVF::PersistentPointsToCache::printStats</a></div><div class="ttdeci">void printStats(const std::string subtitle) const</div><div class="ttdoc">Print statistics on operations and points-to set numbers. </div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00312">PersistentPointsToCache.h:312</a></div></div>
|
|
78
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a178b49cca2c22e874ff9e772cc4df72b"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a178b49cca2c22e874ff9e772cc4df72b">SVF::PersistentPointsToCache::unionPts</a></div><div class="ttdeci">PointsToID unionPts(PointsToID lhs, PointsToID rhs)</div><div class="ttdoc">Unions lhs and rhs and returns their union&#39;s ID. </div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00113">PersistentPointsToCache.h:113</a></div></div>
|
|
79
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a7a1c296f9c2dfd49e5b60f52fb1901c2"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a7a1c296f9c2dfd49e5b60f52fb1901c2">SVF::PersistentPointsToCache::totalUnions</a></div><div class="ttdeci">u64_t totalUnions</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00443">PersistentPointsToCache.h:443</a></div></div>
|
|
80
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_adef498f8a0d4c75023382e6312a85a58"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#adef498f8a0d4c75023382e6312a85a58">SVF::PersistentPointsToCache::complementCache</a></div><div class="ttdeci">OpCache complementCache</div><div class="ttdoc">Maps two IDs to their relative complement. </div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00435">PersistentPointsToCache.h:435</a></div></div>
|
|
81
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_ab84d0806e87c982bf81ae309f28751e3"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#ab84d0806e87c982bf81ae309f28751e3">SVF::PersistentPointsToCache::getAllPts</a></div><div class="ttdeci">Map< Data, unsigned > getAllPts(void)</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00344">PersistentPointsToCache.h:344</a></div></div>
|
|
81
82
|
<div class="ttc" id="SVFType_8h_html"><div class="ttname"><a href="SVFType_8h.html">SVFType.h</a></div></div>
|
|
82
83
|
<div class="ttc" id="namespaceSVF_html_a8234d4b959abc9123993bcff4eee34c1"><div class="ttname"><a href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">SVF::Map</a></div><div class="ttdeci">std::unordered_map< Key, Value, Hash, KeyEqual, Allocator > Map</div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00099">SVFType.h:99</a></div></div>
|
|
83
|
-
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_ad045302497c76b9dfa656882cc0192dd"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">SVF::PersistentPointsToCache::propertyUnions</a></div><div class="ttdeci">u64_t propertyUnions</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#
|
|
84
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_ad045302497c76b9dfa656882cc0192dd"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#ad045302497c76b9dfa656882cc0192dd">SVF::PersistentPointsToCache::propertyUnions</a></div><div class="ttdeci">u64_t propertyUnions</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00445">PersistentPointsToCache.h:445</a></div></div>
|
|
84
85
|
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a5a0f1b93f29ce62ad13042ab8435c62c"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a5a0f1b93f29ce62ad13042ab8435c62c">SVF::PersistentPointsToCache::DataOp</a></div><div class="ttdeci">std::function< Data(const Data &, const Data &)> DataOp</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00035">PersistentPointsToCache.h:35</a></div></div>
|
|
85
|
-
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a89c4e8c8edcc6744f298e90d721a0745"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a89c4e8c8edcc6744f298e90d721a0745">SVF::PersistentPointsToCache::remapAllPts</a></div><div class="ttdeci">void remapAllPts(void)</div><div class="ttdoc">Remaps all points-to sets stored in the cache to the current mapping. </div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#
|
|
86
|
-
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_af7e82410738f2cbaf06ea5249932a142"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#af7e82410738f2cbaf06ea5249932a142">SVF::PersistentPointsToCache::reset</a></div><div class="ttdeci">void reset(void)</div><div class="ttdoc">Resets the cache removing everything except the emptyData it was initialised with. </div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#
|
|
86
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a89c4e8c8edcc6744f298e90d721a0745"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a89c4e8c8edcc6744f298e90d721a0745">SVF::PersistentPointsToCache::remapAllPts</a></div><div class="ttdeci">void remapAllPts(void)</div><div class="ttdoc">Remaps all points-to sets stored in the cache to the current mapping. </div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00079">PersistentPointsToCache.h:79</a></div></div>
|
|
87
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_af7e82410738f2cbaf06ea5249932a142"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#af7e82410738f2cbaf06ea5249932a142">SVF::PersistentPointsToCache::reset</a></div><div class="ttdeci">void reset(void)</div><div class="ttdoc">Resets the cache removing everything except the emptyData it was initialised with. </div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00065">PersistentPointsToCache.h:65</a></div></div>
|
|
87
88
|
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html">SVF::PersistentPointsToCache</a></div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00031">PersistentPointsToCache.h:31</a></div></div>
|
|
88
89
|
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a9a1b0d0d215c048c7200da0e8f816943"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a9a1b0d0d215c048c7200da0e8f816943">SVF::PersistentPointsToCache::PTSToIDMap</a></div><div class="ttdeci">Map< Data, PointsToID > PTSToIDMap</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00034">PersistentPointsToCache.h:34</a></div></div>
|
|
89
|
-
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_ab2888b033a29de3af48d377dc2fe70aa"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#ab2888b033a29de3af48d377dc2fe70aa">SVF::PersistentPointsToCache::getActualPts</a></div><div class="ttdeci">const Data & getActualPts(PointsToID id) const</div><div class="ttdoc">Returns the points-to set which id represents. id must be stored in the cache. </div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#
|
|
90
|
-
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a6a3b33721ae00efd2fdf2d71f3298e1c"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">SVF::PersistentPointsToCache::ptsToId</a></div><div class="ttdeci">PTSToIDMap ptsToId</div><div class="ttdoc">Maps points-to sets to their corresponding ID. </div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#
|
|
91
|
-
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a86bf6959fb5587e350015d58d529af14"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a86bf6959fb5587e350015d58d529af14">SVF::PersistentPointsToCache::complementPts</a></div><div class="ttdeci">PointsToID complementPts(PointsToID lhs, PointsToID rhs)</div><div class="ttdoc">Relatively complements lhs and rhs (lhs \ rhs) and returns it&#39;s ID. </div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#
|
|
92
|
-
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a15d3235017b35f4a5c668d0b6626faff"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a15d3235017b35f4a5c668d0b6626faff">SVF::PersistentPointsToCache::lookupIntersections</a></div><div class="ttdeci">u64_t lookupIntersections</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#
|
|
93
|
-
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a474023fe293b080fbda7da06ef380531"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a474023fe293b080fbda7da06ef380531">SVF::PersistentPointsToCache::uniqueIntersections</a></div><div class="ttdeci">u64_t uniqueIntersections</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#
|
|
94
|
-
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a6b601ce2055d83f2c1df0c7af039ce05"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">SVF::PersistentPointsToCache::unionCache</a></div><div class="ttdeci">OpCache unionCache</div><div class="ttdoc">Maps two IDs to their union. Keys must be sorted. </div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#
|
|
95
|
-
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a099c2319277797ac96aeee859ded9b22"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">SVF::PersistentPointsToCache::totalIntersections</a></div><div class="ttdeci">u64_t totalIntersections</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#
|
|
90
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_ab2888b033a29de3af48d377dc2fe70aa"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#ab2888b033a29de3af48d377dc2fe70aa">SVF::PersistentPointsToCache::getActualPts</a></div><div class="ttdeci">const Data & getActualPts(PointsToID id) const</div><div class="ttdoc">Returns the points-to set which id represents. id must be stored in the cache. </div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00105">PersistentPointsToCache.h:105</a></div></div>
|
|
91
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a6a3b33721ae00efd2fdf2d71f3298e1c"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a6a3b33721ae00efd2fdf2d71f3298e1c">SVF::PersistentPointsToCache::ptsToId</a></div><div class="ttdeci">PTSToIDMap ptsToId</div><div class="ttdoc">Maps points-to sets to their corresponding ID. </div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00430">PersistentPointsToCache.h:430</a></div></div>
|
|
92
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a86bf6959fb5587e350015d58d529af14"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a86bf6959fb5587e350015d58d529af14">SVF::PersistentPointsToCache::complementPts</a></div><div class="ttdeci">PointsToID complementPts(PointsToID lhs, PointsToID rhs)</div><div class="ttdoc">Relatively complements lhs and rhs (lhs \ rhs) and returns it&#39;s ID. </div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00172">PersistentPointsToCache.h:172</a></div></div>
|
|
93
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a15d3235017b35f4a5c668d0b6626faff"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a15d3235017b35f4a5c668d0b6626faff">SVF::PersistentPointsToCache::lookupIntersections</a></div><div class="ttdeci">u64_t lookupIntersections</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00456">PersistentPointsToCache.h:456</a></div></div>
|
|
94
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a474023fe293b080fbda7da06ef380531"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a474023fe293b080fbda7da06ef380531">SVF::PersistentPointsToCache::uniqueIntersections</a></div><div class="ttdeci">u64_t uniqueIntersections</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00454">PersistentPointsToCache.h:454</a></div></div>
|
|
95
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a6b601ce2055d83f2c1df0c7af039ce05"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a6b601ce2055d83f2c1df0c7af039ce05">SVF::PersistentPointsToCache::unionCache</a></div><div class="ttdeci">OpCache unionCache</div><div class="ttdoc">Maps two IDs to their union. Keys must be sorted. </div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00433">PersistentPointsToCache.h:433</a></div></div>
|
|
96
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a099c2319277797ac96aeee859ded9b22"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a099c2319277797ac96aeee859ded9b22">SVF::PersistentPointsToCache::totalIntersections</a></div><div class="ttdeci">u64_t totalIntersections</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00453">PersistentPointsToCache.h:453</a></div></div>
|
|
96
97
|
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a896bab5039f4bf2d0da71045e2c63ad7"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a896bab5039f4bf2d0da71045e2c63ad7">SVF::PersistentPointsToCache::OpCache</a></div><div class="ttdeci">Map< std::pair< PointsToID, PointsToID >, PointsToID > OpCache</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00037">PersistentPointsToCache.h:37</a></div></div>
|
|
97
|
-
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_ad8d24772f7503e0e735f546506d2bcc5"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5">SVF::PersistentPointsToCache::idCounter</a></div><div class="ttdeci">PointsToID idCounter</div><div class="ttdoc">Used to generate new PointsToIDs. Any non-zero is valid. </div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#
|
|
98
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_ad8d24772f7503e0e735f546506d2bcc5"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#ad8d24772f7503e0e735f546506d2bcc5">SVF::PersistentPointsToCache::idCounter</a></div><div class="ttdeci">PointsToID idCounter</div><div class="ttdoc">Used to generate new PointsToIDs. Any non-zero is valid. </div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00440">PersistentPointsToCache.h:440</a></div></div>
|
|
98
99
|
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_aed0b0b9f035057552a6a82154fd88e61"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVF::SVFUtil::outs</a></div><div class="ttdeci">std::ostream & outs()</div><div class="ttdoc">Overwrite llvm::outs() </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00049">SVFUtil.h:49</a></div></div>
|
|
99
100
|
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a921a4ef4c72ccde5724860f98ad62a57"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a921a4ef4c72ccde5724860f98ad62a57">SVF::PersistentPointsToCache::emptyPointsToId</a></div><div class="ttdeci">static PointsToID emptyPointsToId(void)</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00039">PersistentPointsToCache.h:39</a></div></div>
|
|
100
|
-
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_ab19e4e17b1896565e0bada1f161d1266"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#ab19e4e17b1896565e0bada1f161d1266">SVF::PersistentPointsToCache::initStats</a></div><div class="ttdeci">void initStats(void)</div><div class="ttdoc">Initialises statistics variables to 0. </div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#
|
|
101
|
-
<div class="ttc" id="
|
|
102
|
-
<div class="ttc" id="
|
|
103
|
-
<div class="ttc" id="
|
|
104
|
-
<div class="ttc" id="
|
|
105
|
-
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_ad9a761bcece141764322247cc326bcbe"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#ad9a761bcece141764322247cc326bcbe">SVF::PersistentPointsToCache::preemptiveComplements</a></div><div class="ttdeci">u64_t preemptiveComplements</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00453">PersistentPointsToCache.h:453</a></div></div>
|
|
101
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_ab19e4e17b1896565e0bada1f161d1266"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#ab19e4e17b1896565e0bada1f161d1266">SVF::PersistentPointsToCache::initStats</a></div><div class="ttdeci">void initStats(void)</div><div class="ttdoc">Initialises statistics variables to 0. </div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00402">PersistentPointsToCache.h:402</a></div></div>
|
|
102
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a525fbb49c91040c078fbcaaae2339ef2"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a525fbb49c91040c078fbcaaae2339ef2">SVF::PersistentPointsToCache::intersectionCache</a></div><div class="ttdeci">OpCache intersectionCache</div><div class="ttdoc">Maps two IDs to their intersection. Keys must be sorted. </div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00437">PersistentPointsToCache.h:437</a></div></div>
|
|
103
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a6d52fb93d22b2ce3e4e4acbdd82b88b0"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a6d52fb93d22b2ce3e4e4acbdd82b88b0">SVF::PersistentPointsToCache::totalComplements</a></div><div class="ttdeci">u64_t totalComplements</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00448">PersistentPointsToCache.h:448</a></div></div>
|
|
104
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a98dad4f4d39904d90564f1a2279ac664"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a98dad4f4d39904d90564f1a2279ac664">SVF::PersistentPointsToCache::preemptiveUnions</a></div><div class="ttdeci">u64_t preemptiveUnions</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00447">PersistentPointsToCache.h:447</a></div></div>
|
|
105
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_ad9a761bcece141764322247cc326bcbe"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#ad9a761bcece141764322247cc326bcbe">SVF::PersistentPointsToCache::preemptiveComplements</a></div><div class="ttdeci">u64_t preemptiveComplements</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00452">PersistentPointsToCache.h:452</a></div></div>
|
|
106
106
|
<div class="ttc" id="namespaceSVF_html"><div class="ttname"><a href="namespaceSVF.html">SVF</a></div><div class="ttdoc">for isBitcode </div><div class="ttdef"><b>Definition:</b> <a href="AbstractValue_8h_source.html#l00037">AbstractValue.h:37</a></div></div>
|
|
107
|
-
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a47f4e8ef1461396afb2e1c3cbe055e95"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a47f4e8ef1461396afb2e1c3cbe055e95">SVF::PersistentPointsToCache::lookupComplements</a></div><div class="ttdeci">u64_t lookupComplements</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#
|
|
107
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a47f4e8ef1461396afb2e1c3cbe055e95"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a47f4e8ef1461396afb2e1c3cbe055e95">SVF::PersistentPointsToCache::lookupComplements</a></div><div class="ttdeci">u64_t lookupComplements</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00451">PersistentPointsToCache.h:451</a></div></div>
|
|
108
108
|
<div class="ttc" id="namespaceSVF_html_ae545a88267bd2246de827cf590675aca"><div class="ttname"><a href="namespaceSVF.html#ae545a88267bd2246de827cf590675aca">SVF::PointsToID</a></div><div class="ttdeci">unsigned PointsToID</div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00062">SVFType.h:62</a></div></div>
|
|
109
109
|
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_acbfc07bb91fb08658a911abe0a8113c5"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#acbfc07bb91fb08658a911abe0a8113c5">SVF::PersistentPointsToCache::PersistentPointsToCache</a></div><div class="ttdeci">PersistentPointsToCache(void)</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00045">PersistentPointsToCache.h:45</a></div></div>
|
|
110
|
-
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a4c58a058c50703ba5f35e8bf052ee991"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">SVF::PersistentPointsToCache::propertyIntersections</a></div><div class="ttdeci">u64_t propertyIntersections</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#
|
|
111
|
-
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a52ec4a787a199bb4d7553e8bafa9c127"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a52ec4a787a199bb4d7553e8bafa9c127">SVF::PersistentPointsToCache::newPointsToId</a></div><div class="ttdeci">PointsToID newPointsToId(void)</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#
|
|
110
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a4c58a058c50703ba5f35e8bf052ee991"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a4c58a058c50703ba5f35e8bf052ee991">SVF::PersistentPointsToCache::propertyIntersections</a></div><div class="ttdeci">u64_t propertyIntersections</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00455">PersistentPointsToCache.h:455</a></div></div>
|
|
111
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a52ec4a787a199bb4d7553e8bafa9c127"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a52ec4a787a199bb4d7553e8bafa9c127">SVF::PersistentPointsToCache::newPointsToId</a></div><div class="ttdeci">PointsToID newPointsToId(void)</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00354">PersistentPointsToCache.h:354</a></div></div>
|
|
112
112
|
<div class="ttc" id="cJSON_8h_html_ad4c68ea99a26b0a98ad9a79982960458"><div class="ttname"><a href="cJSON_8h.html#ad4c68ea99a26b0a98ad9a79982960458">string</a></div><div class="ttdeci">const char *const string</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8h_source.html#l00172">cJSON.h:172</a></div></div>
|
|
113
113
|
<div class="ttc" id="namespaceSVF_html_a366625858f450a1ea5f985a3c83e0f14"><div class="ttname"><a href="namespaceSVF.html#a366625858f450a1ea5f985a3c83e0f14">SVF::u64_t</a></div><div class="ttdeci">unsigned long long u64_t</div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00052">SVFType.h:52</a></div></div>
|
|
114
|
-
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_aacebdd87b1dd45250391d035b032f9d4"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#aacebdd87b1dd45250391d035b032f9d4">SVF::PersistentPointsToCache::uniqueUnions</a></div><div class="ttdeci">u64_t uniqueUnions</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#
|
|
115
|
-
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a17d33558208c19019e541ee167009494"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a17d33558208c19019e541ee167009494">SVF::PersistentPointsToCache::intersectPts</a></div><div class="ttdeci">PointsToID intersectPts(PointsToID lhs, PointsToID rhs)</div><div class="ttdoc">Intersects lhs and rhs (lhs AND rhs) and returns the intersection&#39;s ID. </div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#
|
|
114
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_aacebdd87b1dd45250391d035b032f9d4"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#aacebdd87b1dd45250391d035b032f9d4">SVF::PersistentPointsToCache::uniqueUnions</a></div><div class="ttdeci">u64_t uniqueUnions</div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00444">PersistentPointsToCache.h:444</a></div></div>
|
|
115
|
+
<div class="ttc" id="classSVF_1_1PersistentPointsToCache_html_a17d33558208c19019e541ee167009494"><div class="ttname"><a href="classSVF_1_1PersistentPointsToCache.html#a17d33558208c19019e541ee167009494">SVF::PersistentPointsToCache::intersectPts</a></div><div class="ttdeci">PointsToID intersectPts(PointsToID lhs, PointsToID rhs)</div><div class="ttdoc">Intersects lhs and rhs (lhs AND rhs) and returns the intersection&#39;s ID. </div><div class="ttdef"><b>Definition:</b> <a href="PersistentPointsToCache_8h_source.html#l00235">PersistentPointsToCache.h:235</a></div></div>
|
|
116
116
|
</div><!-- fragment --></div><!-- contents -->
|
|
117
117
|
<!-- start footer part -->
|
|
118
118
|
<hr class="footer"/><address class="footer"><small>
|