From d2c055e9da8706addea1440ea51ced571534b03b Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Mon, 12 May 2014 17:42:44 +0400 Subject: [PATCH] Pseudocode: Introduce pseudo-value analysis --- .../jet/lang/cfg/JetControlFlowBuilder.java | 58 ++- .../cfg/JetControlFlowBuilderAdapter.java | 100 ++-- .../jet/lang/cfg/JetControlFlowProcessor.java | 459 +++++++++++++----- .../lang/cfg/JetFlowInformationProvider.java | 30 +- .../jet/lang/cfg/TailRecursionDetector.java | 5 + .../ConditionalJumpInstruction.java | 22 +- .../jet/lang/cfg/pseudocode/Instruction.java | 11 + .../lang/cfg/pseudocode/InstructionImpl.java | 15 + .../cfg/pseudocode/InstructionVisitor.java | 17 +- .../InstructionVisitorWithResult.java | 17 +- .../pseudocode/InstructionWithReceiver.java | 42 ++ .../JetControlFlowInstructionsGenerator.java | 146 ++++-- .../pseudocode/JetElementInstructionImpl.java | 1 + .../NondeterministicJumpInstruction.java | 30 +- .../jet/lang/cfg/pseudocode/PseudoValue.kt | 32 ++ .../lang/cfg/pseudocode/PseudoValueImpl.kt | 35 ++ .../jet/lang/cfg/pseudocode/Pseudocode.java | 4 + .../lang/cfg/pseudocode/PseudocodeImpl.java | 12 + .../cfg/pseudocode/ReadValueInstruction.java | 32 +- .../pseudocode/ReturnValueInstruction.java | 19 +- .../pseudocode/ThrowExceptionInstruction.java | 19 +- .../cfg/pseudocode/WriteValueInstruction.java | 35 +- .../jet/lang/cfg/pseudocode/instructions.kt | 88 +++- .../basic/IfWithUninitialized.instructions | 29 +- .../basic/InitializedNotDeclared.instructions | 4 +- .../basic/UsageInFunctionLiteral.instructions | 54 ++- .../VariablesInitialization.instructions | 25 +- .../basic/VariablesUsage.instructions | 33 +- ...eferenceToPropertyInitializer.instructions | 80 +-- .../bugs/varInitializationInIf.instructions | 19 +- .../varInitializationInIfInCycle.instructions | 41 +- .../lexicalScopes/doWhileScope.instructions | 16 +- .../lexicalScopes/forScope.instructions | 17 +- .../functionLiteralScope.instructions | 39 +- .../lexicalScopes/ifScope.instructions | 16 +- .../lexicalScopes/localClass.instructions | 15 +- .../localFunctionScope.instructions | 35 +- ...localFunctionScopeWithoutBody.instructions | 27 +- .../lexicalScopes/localObject.instructions | 12 +- .../objectLiteralScope.instructions | 16 +- .../propertyAccessorScope.instructions | 23 +- .../lexicalScopes/tryScope.instructions | 21 +- .../lexicalScopes/whileScope.instructions | 6 +- .../cfg/arrays/ArrayAccess.instructions | 42 +- .../cfg/arrays/ArrayOfFunctions.instructions | 19 +- .../arrays/arrayAccessExpression.instructions | 17 +- .../testData/cfg/arrays/arrayInc.instructions | 27 ++ compiler/testData/cfg/arrays/arrayInc.kt | 3 + .../testData/cfg/arrays/arraySet.instructions | 17 +- .../arrays/arraySetPlusAssign.instructions | 27 +- .../testData/cfg/basic/Basic.instructions | 88 ++-- .../cfg/basic/ShortFunction.instructions | 8 +- .../cfg/bugs/jumpToOuterScope.instructions | 16 +- .../controlStructures/Finally.instructions | 387 ++++++++------- .../FinallyTestCopy.instructions | 200 ++++---- .../cfg/controlStructures/For.instructions | 26 +- .../cfg/controlStructures/If.instructions | 70 +-- .../OnlyWhileInFunctionBody.instructions | 42 +- .../returnsInWhen.instructions | 14 +- .../cfg/conventions/equals.instructions | 24 +- .../incrementAtTheEnd.instructions | 16 +- .../cfg/conventions/invoke.instructions | 13 +- .../cfg/conventions/notEqual.instructions | 24 +- .../cfg/deadCode/DeadCode.instructions | 8 +- .../cfg/deadCode/returnInElvis.instructions | 4 +- .../cfg/deadCode/stringTemplate.instructions | 14 +- .../AnonymousInitializers.instructions | 12 +- .../unusedFunctionLiteral.instructions | 12 +- .../functions/FailFunction.instructions | 10 +- .../functions/typeParameter.instructions | 1 + .../local/LocalDeclarations.instructions | 83 ++-- .../local/ObjectExpression.instructions | 23 +- .../local/localClass.instructions | 8 +- .../local/localProperty.instructions | 4 +- .../multiDeclaration/MultiDecl.instructions | 33 +- .../multiDeclarationWithError.instructions | 13 +- .../properties/DelegatedProperty.instructions | 26 +- .../backingFieldAccess.instructions | 2 +- ...backingFieldQualifiedWithThis.instructions | 14 +- .../cfg/expressions/Assignments.instructions | 76 +-- .../testData/cfg/expressions/Assignments.kt | 1 + .../cfg/expressions/LazyBooleans.instructions | 77 +-- .../ReturnFromExpression.instructions | 16 +- .../expressions/assignmentToThis.instructions | 5 +- .../chainedQualifiedExpression.instructions | 297 ++++++------ .../expressionAsFunction.instructions | 13 +- .../cfg/expressions/nothingExpr.instructions | 58 +++ .../testData/cfg/expressions/nothingExpr.kt | 8 + .../expressions/propertySafeCall.instructions | 13 +- ...fiedExpressionWithoutSelector.instructions | 12 +- .../expressions/thisExpression.instructions | 8 +- ...structions => unresolvedCall.instructions} | 6 +- .../{unresolved.kt => unresolvedCall.kt} | 0 .../unresolvedProperty.instructions | 22 + .../cfg/expressions/unresolvedProperty.kt | 3 + .../unusedExpressionSimpleName.instructions | 10 +- .../cfg/tailCalls/finally.instructions | 4 +- .../tailCalls/finallyWithReturn.instructions | 10 +- .../testData/cfg/tailCalls/sum.instructions | 40 +- .../testData/cfg/tailCalls/try.instructions | 9 +- .../tailCalls/tryCatchFinally.instructions | 34 +- .../controlFlowAnalysis/unreachableCode.kt | 2 +- .../jet/cfg/ControlFlowTestGenerated.java | 21 +- 103 files changed, 2417 insertions(+), 1432 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/InstructionWithReceiver.java create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/PseudoValue.kt create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/PseudoValueImpl.kt create mode 100644 compiler/testData/cfg/arrays/arrayInc.instructions create mode 100644 compiler/testData/cfg/arrays/arrayInc.kt create mode 100644 compiler/testData/cfg/expressions/nothingExpr.instructions create mode 100644 compiler/testData/cfg/expressions/nothingExpr.kt rename compiler/testData/cfg/expressions/{unresolved.instructions => unresolvedCall.instructions} (82%) rename compiler/testData/cfg/expressions/{unresolved.kt => unresolvedCall.kt} (100%) create mode 100644 compiler/testData/cfg/expressions/unresolvedProperty.instructions create mode 100644 compiler/testData/cfg/expressions/unresolvedProperty.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java index 42083b19c4f..0728b81efdf 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowBuilder.java @@ -18,6 +18,7 @@ package org.jetbrains.jet.lang.cfg; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.cfg.pseudocode.PseudoValue; import org.jetbrains.jet.lang.cfg.pseudocode.Pseudocode; import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor; import org.jetbrains.jet.lang.descriptors.VariableDescriptor; @@ -64,16 +65,16 @@ public interface JetControlFlowBuilder { // Jumps void jump(@NotNull Label label, @NotNull JetElement element); - void jumpOnFalse(@NotNull Label label, @NotNull JetElement element); - void jumpOnTrue(@NotNull Label label, @NotNull JetElement element); - void nondeterministicJump(@NotNull Label label, @NotNull JetElement element); // Maybe, jump to label + void jumpOnFalse(@NotNull Label label, @NotNull JetElement element, @Nullable PseudoValue conditionValue); + void jumpOnTrue(@NotNull Label label, @NotNull JetElement element, @Nullable PseudoValue conditionValue); + void nondeterministicJump(@NotNull Label label, @NotNull JetElement element, @Nullable PseudoValue inputValue); // Maybe, jump to label void nondeterministicJump(@NotNull List