h$c~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                                                                  Safe-Inferred}None 567  #"! $)('&%*0/.-,+1324657;98:=TZYXWVU[\]^_edcba`fihgjklmnqporstvuwxyz}|{~~z}|{wxytvursnqpolmjkfihg_edcba`]^[\TZYXWVU=7;98:465132*0/.-,+$)('&%#"!    None None None#$ :None None ,None #$&> f None#$%  None } NonefglslAll variable names are equal.We used to ignore temporary names only, considering all other names as globals and a fixed part of the code. This check is quite expensive and it turns out that most of the time the global variables *are* the same. If they are not, we'll need to pass them as arguments to our new function, but this is rare enough so it won't increase the average function parameter list length too much.   None#$glsl8Maximum number of statements to look ahead for equality.Increasing this potentially finds more de-inlining opportunities but also drastically increases the cost of not finding any. This number does not matter if we always find an opportunity quickly.glslMinimum number of times a piece of code needs to appear for it to be worth extracting into a function.glslMaximum number of initial repeats to use for maximization. If we find enough, we're happy and stop looking. Most of the time we'll find fewer than 10, but sometimes a bit of code is repeated a lot which would slow down the algorithm significantly.glsl+Number of statements in the sliding window.glslRemove all occurrences of body from ss.glslCheck for each statement whether it's structurally equal to the first one. None j !"#$%&'()*+,-./0123456789:;<=>??@AABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgghhijklmnopqrstuvwxyz{|}~t                                                                 #glsl-0.0.0.1-1svuw8D4B1eBuFSbJvkGmqLanguage.GLSL.Runtime.MathLanguage.GLSL.Types Language.GLSL.Optimizer.Liveness)Language.GLSL.Optimizer.FunctionGeneratorLanguage.GLSL.DeclsLanguage.GLSL.Runtime.ValueLanguage.GLSL.Runtime.PrimFunsLanguage.GLSL.Runtime.EvalLanguage.GLSL.Optimizer.DFGLanguage.GLSL.ConstExpr Language.GLSL.StructuralEquality Language.GLSL.Optimizer.DeinlineLanguage.GLSL.Optimizerfloorfractmodclampsaturatestep smoothstepAnnot parseAnnotppAnnotEmit EmitPosition EmitFragDepthStmt AssignStmtDeclStmtEmitStmtIfStmt StmtAnnotSAannotunAnnotUnaryOpUOpMinusUOpNotBinaryOpBOpPlusBOpMinusBOpMulBOpDivBOpGEBOpGTBOpLEBOpLTBOpAndBOpOrExpr UnaryExpr BinaryExpr FunCallExpr TextureExprAtomExprExprAtom LitIntExpr LitFloatExprIdentifierExpr SwizzleExpr VecIndexExpr MatIndexExprCastNoCastNameExpr UniformExprSwizzleXYZWFunNamePrimMain PrimMat3x3 PrimMat4x4PrimVec2PrimVec3PrimVec4PrimPowPrimDotPrimCosPrimAtanPrimModPrimAbs PrimCross PrimLengthPrimAsinPrimSmoothstepPrimStep PrimFract PrimFloorPrimSinPrimTanPrimSqrt PrimNormalize NamespaceNsTNsSNsUNsVFNsInNsOutNameNameIdTypeTyBoolTyFloat TySampler2DTyVecTyMatTyStruct GDeclKindGkInGkOut GkUniform GlobalDeclGDecl LocalDeclLDecl ParamKindPkInPkOutPkInout ParamDeclParam LayoutSpec LayoutStd140LayoutLocationProcNameProcMainTopDecl LayoutDeclProcDeclVersionGLSL parseShader printShader parseGLSLppGLSL parseVersion ppVersion parseTopDecl ppTopDecl parseProcName ppProcNameparseLayoutSpec ppLayoutSpecparseParamDecl ppParamDeclparseParamKind ppParamKindparseLocalDecl ppLocalDeclparseGlobalDecl ppGlobalDeclparseGDeclKind ppGDeclKind parseTypeppType parseNameIdppNameId parseNameppNameparseNamespace ppNamespace parseFunName ppFunName parseSwizzle ppSwizzle parseVecIndex ppVecIndex parseNameExpr ppNameExpr parseExprAtom ppExprAtom parseExprppExpr parseBinaryOp ppBinaryOp parseUnaryOp ppUnaryOpparseStmtAnnot ppStmtAnnot parseStmtppStmt parseEmitppEmitppIntppFloatppLppS parseTesttppppl$fApplicativeStmt$fApplicativeStmtAnnot $fAnnot(,) $fAnnot() $fShowGLSL $fFunctorGLSL$fFoldableGLSL$fTraversableGLSL $fShowTopDecl$fFunctorTopDecl$fFoldableTopDecl$fTraversableTopDecl $fShowStmt $fFunctorStmt$fFoldableStmt$fTraversableStmt$fShowStmtAnnot$fFunctorStmtAnnot$fFoldableStmtAnnot$fTraversableStmtAnnot $fShowEmit$fShowParamDecl$fShowLocalDecl $fShowExpr $fShowUnaryOp $fEqUnaryOp$fShowBinaryOp $fEqBinaryOp$fShowExprAtom $fShowCast$fShowNameExpr $fShowSwizzle $fEqSwizzle $fShowFunName $fEqFunName$fShowGlobalDecl $fShowName$fShowNamespace $fEqNamespace$fShowProcName $fShowType$fEqType $fShowNameId $fEqNameId$fShowGDeclKind$fShowParamKind$fShowLayoutSpec $fShowVersionLiveness unLivenessemptycomputeLiveness clTopDecl clStmtAnnots clStmtAnnotclStmtclEmitclExpr clExprAtom clNameExprinsertdeleteunion$fAnnotLiveness makeFunctionDeclsdeclsSdeclsTdeclsUdeclsVFdeclsIndeclsOut emptyDeclsaddDecladdDeclN addDeclNEgetDeclsgetDeclgetDeclN getDeclNE toUniformId fromUniformId showUniformIdValue FloatValueIntValue BoolValue Vec2Value Vec3Value Vec4Value Mat4x4ValueEval EvalResult fromResult EvalStatestProcs stMainProcglobals gl_PositionProc defaultValue isNaNValue roundValue evalCoerce evalBinaryOp evalUnaryOp$fMonadFailEvalResult $fShowValue $fEqValue$fFunctorEvalResult$fApplicativeEvalResult$fMonadEvalResultfltv4eval LocalStatetempstraceAssignmentstrace startStateevalGLSLdiscoverTopDecldiscoverGlobalDeclevalMain emptyLocalsevalProc evalStmtAnnotevalStmtevalEmit evalLocalDeclevalExpr evalExprAtom evalVecIndex evalMatIndexsetValuegetValuemainDFGStateDFGNodeDFGEdgeDFGgrdecls nextNodeIdifCondemptyDFGgenDFGdfgGLSL dfgTopDecl dfgGlobalDecldfgStructMemberdfgStmt dfgStmtAnnot dfgLocalDecldfgExpr dfgExprAtomnodeForUniformnodeForNameExpr nodeForNamenodeForaddEdgeaddNodetoDottoSvg$fLabellableDFGEdge$fLabellableDFGNode $fShowDFGNode $fShowDFGEdge ConstExprscollectConstExprs isConstExpr eqStmtAnnots eqStmtAnnoteqStmteqExpr eqExprAtom eqNameExpr eqLocalDecleqTypeeqEmiteqMaybeConfig maxLookahead minRepeats maxRepeats windowSize defaultConfigpass diTopDecldiStmts deleteBodyfindBody transposeallEqualoptimizeShaderparseoptimize