From d03a4f86e59ce27b840827881a2a6dce72cc14ed Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Wed, 23 Oct 2019 11:59:05 -0700 Subject: [PATCH 1/5] C++/C#: Add `AliasedUse` instruction to all functions This new instruction is the dual of the existing `AliasedDefinition` instruction. Whereas that instruction defines the contents of aliased memory before the function was called, `AliasedUse` represents the potential use of all aliased memory after the function returns. This ensures that writes to aliased memory do not appear "dead", even if there are no further reads from aliased memory within the function itself. --- .../code/cpp/ir/implementation/Opcode.qll | 5 + .../aliased_ssa/Instruction.qll | 11 +- .../ir/implementation/aliased_ssa/Operand.qll | 3 + .../cpp/ir/implementation/raw/Instruction.qll | 11 +- .../cpp/ir/implementation/raw/Operand.qll | 3 + .../raw/internal/InstructionTag.qll | 3 + .../raw/internal/TranslatedFunction.qll | 16 ++ .../unaliased_ssa/Instruction.qll | 11 +- .../implementation/unaliased_ssa/Operand.qll | 3 + .../ir/ssa/aliased_ssa_ir.expected | 63 ++++--- .../ir/ssa/unaliased_ssa_ir.expected | 63 ++++--- .../syntax-zoo/raw_sanity.expected | 80 -------- .../code/csharp/ir/implementation/Opcode.qll | 5 + .../ir/implementation/raw/Instruction.qll | 11 +- .../csharp/ir/implementation/raw/Operand.qll | 3 + .../raw/internal/InstructionTag.qll | 3 + .../raw/internal/TranslatedFunction.qll | 16 ++ .../unaliased_ssa/Instruction.qll | 11 +- .../implementation/unaliased_ssa/Operand.qll | 3 + .../test/library-tests/ir/ir/raw_ir.expected | 177 ++++++++++++------ 20 files changed, 315 insertions(+), 186 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/Opcode.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/Opcode.qll index 0c1009b4fac..3b32aac811d 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/Opcode.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/Opcode.qll @@ -57,6 +57,7 @@ private newtype TOpcode = TUnmodeledDefinition() or TUnmodeledUse() or TAliasedDefinition() or + TAliasedUse() or TPhi() or TBuiltIn() or TVarArgsStart() or @@ -393,6 +394,10 @@ module Opcode { final override string toString() { result = "AliasedDefinition" } } + class AliasedUse extends Opcode, TAliasedUse { + final override string toString() { result = "AliasedUse" } + } + class Phi extends Opcode, TPhi { final override string toString() { result = "Phi" } } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll index 6d5e697150e..43c0e1eb8a1 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll @@ -49,7 +49,8 @@ module InstructionSanity { ( opcode instanceof ReadSideEffectOpcode or opcode instanceof Opcode::InlineAsm or - opcode instanceof Opcode::CallSideEffect + opcode instanceof Opcode::CallSideEffect or + opcode instanceof Opcode::AliasedUse ) and tag instanceof SideEffectOperandTag ) @@ -260,6 +261,7 @@ module InstructionSanity { ) { exists(IRBlock useBlock, int useIndex, Instruction defInstr, IRBlock defBlock, int defIndex | not useOperand.getUse() instanceof UnmodeledUseInstruction and + not defInstr instanceof UnmodeledDefinitionInstruction and pointOfEvaluation(useOperand, useBlock, useIndex) and defInstr = useOperand.getAnyDef() and ( @@ -1423,6 +1425,13 @@ class AliasedDefinitionInstruction extends Instruction { final override MemoryAccessKind getResultMemoryAccess() { result instanceof EscapedMemoryAccess } } +/** + * An instruction that consumes all escaped memory on exit from the function. + */ +class AliasedUseInstruction extends Instruction { + AliasedUseInstruction() { getOpcode() instanceof Opcode::AliasedUse } +} + class UnmodeledUseInstruction extends Instruction { UnmodeledUseInstruction() { getOpcode() instanceof Opcode::UnmodeledUse } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll index a23fb081afe..b869e09f5dd 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll @@ -388,6 +388,9 @@ class SideEffectOperand extends TypedOperand { } override MemoryAccessKind getMemoryAccess() { + useInstr instanceof AliasedUseInstruction and + result instanceof EscapedMayMemoryAccess + or useInstr instanceof CallSideEffectInstruction and result instanceof EscapedMayMemoryAccess or diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Instruction.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Instruction.qll index 6d5e697150e..43c0e1eb8a1 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Instruction.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Instruction.qll @@ -49,7 +49,8 @@ module InstructionSanity { ( opcode instanceof ReadSideEffectOpcode or opcode instanceof Opcode::InlineAsm or - opcode instanceof Opcode::CallSideEffect + opcode instanceof Opcode::CallSideEffect or + opcode instanceof Opcode::AliasedUse ) and tag instanceof SideEffectOperandTag ) @@ -260,6 +261,7 @@ module InstructionSanity { ) { exists(IRBlock useBlock, int useIndex, Instruction defInstr, IRBlock defBlock, int defIndex | not useOperand.getUse() instanceof UnmodeledUseInstruction and + not defInstr instanceof UnmodeledDefinitionInstruction and pointOfEvaluation(useOperand, useBlock, useIndex) and defInstr = useOperand.getAnyDef() and ( @@ -1423,6 +1425,13 @@ class AliasedDefinitionInstruction extends Instruction { final override MemoryAccessKind getResultMemoryAccess() { result instanceof EscapedMemoryAccess } } +/** + * An instruction that consumes all escaped memory on exit from the function. + */ +class AliasedUseInstruction extends Instruction { + AliasedUseInstruction() { getOpcode() instanceof Opcode::AliasedUse } +} + class UnmodeledUseInstruction extends Instruction { UnmodeledUseInstruction() { getOpcode() instanceof Opcode::UnmodeledUse } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Operand.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Operand.qll index a23fb081afe..b869e09f5dd 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Operand.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Operand.qll @@ -388,6 +388,9 @@ class SideEffectOperand extends TypedOperand { } override MemoryAccessKind getMemoryAccess() { + useInstr instanceof AliasedUseInstruction and + result instanceof EscapedMayMemoryAccess + or useInstr instanceof CallSideEffectInstruction and result instanceof EscapedMayMemoryAccess or diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll index ddac5692cdf..edb26b1c8be 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/InstructionTag.qll @@ -26,6 +26,7 @@ newtype TInstructionTag = UnmodeledDefinitionTag() or UnmodeledUseTag() or AliasedDefinitionTag() or + AliasedUseTag() or SwitchBranchTag() or CallTargetTag() or CallTag() or @@ -118,6 +119,8 @@ string getInstructionTagId(TInstructionTag tag) { or tag = AliasedDefinitionTag() and result = "AliasedDef" or + tag = AliasedUseTag() and result = "AliasedUse" + or tag = SwitchBranchTag() and result = "SwitchBranch" or tag = CallTargetTag() and result = "CallTarget" diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll index a035f8b9b31..41c11742dce 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll @@ -95,6 +95,9 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { result = getInstruction(UnmodeledUseTag()) or tag = UnmodeledUseTag() and + result = getInstruction(AliasedUseTag()) + or + tag = AliasedUseTag() and result = getInstruction(ExitFunctionTag()) ) } @@ -176,6 +179,11 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { resultType instanceof VoidType and isGLValue = false or + tag = AliasedUseTag() and + opcode instanceof Opcode::AliasedUse and + resultType instanceof VoidType and + isGLValue = false + or tag = ExitFunctionTag() and opcode instanceof Opcode::ExitFunction and resultType instanceof VoidType and @@ -197,6 +205,10 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { operandTag instanceof UnmodeledUseOperandTag and result = getUnmodeledDefinitionInstruction() or + tag = AliasedUseTag() and + operandTag instanceof SideEffectOperandTag and + result = getUnmodeledDefinitionInstruction() + or tag = ReturnTag() and not getReturnType() instanceof VoidType and ( @@ -213,6 +225,10 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { not getReturnType() instanceof VoidType and operandTag instanceof LoadOperandTag and result = getReturnType() + or + tag = AliasedUseTag() and + operandTag instanceof SideEffectOperandTag and + result instanceof UnknownType } final override IRVariable getInstructionVariable(InstructionTag tag) { diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll index 6d5e697150e..43c0e1eb8a1 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll @@ -49,7 +49,8 @@ module InstructionSanity { ( opcode instanceof ReadSideEffectOpcode or opcode instanceof Opcode::InlineAsm or - opcode instanceof Opcode::CallSideEffect + opcode instanceof Opcode::CallSideEffect or + opcode instanceof Opcode::AliasedUse ) and tag instanceof SideEffectOperandTag ) @@ -260,6 +261,7 @@ module InstructionSanity { ) { exists(IRBlock useBlock, int useIndex, Instruction defInstr, IRBlock defBlock, int defIndex | not useOperand.getUse() instanceof UnmodeledUseInstruction and + not defInstr instanceof UnmodeledDefinitionInstruction and pointOfEvaluation(useOperand, useBlock, useIndex) and defInstr = useOperand.getAnyDef() and ( @@ -1423,6 +1425,13 @@ class AliasedDefinitionInstruction extends Instruction { final override MemoryAccessKind getResultMemoryAccess() { result instanceof EscapedMemoryAccess } } +/** + * An instruction that consumes all escaped memory on exit from the function. + */ +class AliasedUseInstruction extends Instruction { + AliasedUseInstruction() { getOpcode() instanceof Opcode::AliasedUse } +} + class UnmodeledUseInstruction extends Instruction { UnmodeledUseInstruction() { getOpcode() instanceof Opcode::UnmodeledUse } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll index a23fb081afe..b869e09f5dd 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll @@ -388,6 +388,9 @@ class SideEffectOperand extends TypedOperand { } override MemoryAccessKind getMemoryAccess() { + useInstr instanceof AliasedUseInstruction and + result instanceof EscapedMayMemoryAccess + or useInstr instanceof CallSideEffectInstruction and result instanceof EscapedMayMemoryAccess or diff --git a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected index 9d005c57ca8..6bbf4f54131 100644 --- a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected +++ b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected @@ -84,7 +84,8 @@ ssa.cpp: # 13| r6_12(glval) = VariableAddress[#return] : # 13| v6_13(void) = ReturnValue : &:r6_12, m6_11 # 13| v6_14(void) = UnmodeledUse : mu* -# 13| v6_15(void) = ExitFunction : +# 13| v6_15(void) = AliasedUse : ~m6_0 +# 13| v6_16(void) = ExitFunction : # 31| int UnreachableViaGoto() # 31| Block 0 @@ -99,7 +100,8 @@ ssa.cpp: # 31| r0_8(glval) = VariableAddress[#return] : # 31| v0_9(void) = ReturnValue : &:r0_8, m0_7 # 31| v0_10(void) = UnmodeledUse : mu* -# 31| v0_11(void) = ExitFunction : +# 31| v0_11(void) = AliasedUse : ~m0_1 +# 31| v0_12(void) = ExitFunction : # 38| int UnreachableIf(bool) # 38| Block 0 @@ -125,7 +127,8 @@ ssa.cpp: # 38| r1_1(glval) = VariableAddress[#return] : # 38| v1_2(void) = ReturnValue : &:r1_1, m1_0 # 38| v1_3(void) = UnmodeledUse : mu* -# 38| v1_4(void) = ExitFunction : +# 38| v1_4(void) = AliasedUse : ~m0_1 +# 38| v1_5(void) = ExitFunction : # 42| Block 2 # 42| r2_0(glval) = VariableAddress[x] : @@ -188,7 +191,8 @@ ssa.cpp: # 59| r1_4(glval) = VariableAddress[#return] : # 59| v1_5(void) = ReturnValue : &:r1_4, m1_3 # 59| v1_6(void) = UnmodeledUse : mu* -# 59| v1_7(void) = ExitFunction : +# 59| v1_7(void) = AliasedUse : ~m0_1 +# 59| v1_8(void) = ExitFunction : # 59| Block 2 # 59| v2_0(void) = Unreached : @@ -219,7 +223,8 @@ ssa.cpp: # 71| v2_0(void) = NoOp : # 68| v2_1(void) = ReturnVoid : # 68| v2_2(void) = UnmodeledUse : mu* -# 68| v2_3(void) = ExitFunction : +# 68| v2_3(void) = AliasedUse : ~m3_0 +# 68| v2_4(void) = ExitFunction : # 69| Block 3 # 69| m3_0(unknown) = Phi : from 0:~m0_1, from 1:~m1_7 @@ -291,7 +296,8 @@ ssa.cpp: # 89| v3_14(void) = NoOp : # 75| v3_15(void) = ReturnVoid : # 75| v3_16(void) = UnmodeledUse : mu* -# 75| v3_17(void) = ExitFunction : +# 75| v3_17(void) = AliasedUse : ~m0_1 +# 75| v3_18(void) = ExitFunction : # 91| void MustExactlyOverlap(Point) # 91| Block 0 @@ -307,7 +313,8 @@ ssa.cpp: # 93| v0_9(void) = NoOp : # 91| v0_10(void) = ReturnVoid : # 91| v0_11(void) = UnmodeledUse : mu* -# 91| v0_12(void) = ExitFunction : +# 91| v0_12(void) = AliasedUse : ~m0_1 +# 91| v0_13(void) = ExitFunction : # 95| void MustExactlyOverlapEscaped(Point) # 95| Block 0 @@ -333,7 +340,8 @@ ssa.cpp: # 98| v0_19(void) = NoOp : # 95| v0_20(void) = ReturnVoid : # 95| v0_21(void) = UnmodeledUse : mu* -# 95| v0_22(void) = ExitFunction : +# 95| v0_22(void) = AliasedUse : ~m0_18 +# 95| v0_23(void) = ExitFunction : # 100| void MustTotallyOverlap(Point) # 100| Block 0 @@ -355,7 +363,8 @@ ssa.cpp: # 103| v0_15(void) = NoOp : # 100| v0_16(void) = ReturnVoid : # 100| v0_17(void) = UnmodeledUse : mu* -# 100| v0_18(void) = ExitFunction : +# 100| v0_18(void) = AliasedUse : ~m0_1 +# 100| v0_19(void) = ExitFunction : # 105| void MustTotallyOverlapEscaped(Point) # 105| Block 0 @@ -387,7 +396,8 @@ ssa.cpp: # 109| v0_25(void) = NoOp : # 105| v0_26(void) = ReturnVoid : # 105| v0_27(void) = UnmodeledUse : mu* -# 105| v0_28(void) = ExitFunction : +# 105| v0_28(void) = AliasedUse : ~m0_24 +# 105| v0_29(void) = ExitFunction : # 111| void MayPartiallyOverlap(int, int) # 111| Block 0 @@ -417,7 +427,8 @@ ssa.cpp: # 114| v0_23(void) = NoOp : # 111| v0_24(void) = ReturnVoid : # 111| v0_25(void) = UnmodeledUse : mu* -# 111| v0_26(void) = ExitFunction : +# 111| v0_26(void) = AliasedUse : ~m0_1 +# 111| v0_27(void) = ExitFunction : # 116| void MayPartiallyOverlapEscaped(int, int) # 116| Block 0 @@ -457,7 +468,8 @@ ssa.cpp: # 120| v0_33(void) = NoOp : # 116| v0_34(void) = ReturnVoid : # 116| v0_35(void) = UnmodeledUse : mu* -# 116| v0_36(void) = ExitFunction : +# 116| v0_36(void) = AliasedUse : ~m0_32 +# 116| v0_37(void) = ExitFunction : # 122| void MergeMustExactlyOverlap(bool, int, int) # 122| Block 0 @@ -519,7 +531,8 @@ ssa.cpp: # 132| v3_11(void) = NoOp : # 122| v3_12(void) = ReturnVoid : # 122| v3_13(void) = UnmodeledUse : mu* -# 122| v3_14(void) = ExitFunction : +# 122| v3_14(void) = AliasedUse : ~m0_1 +# 122| v3_15(void) = ExitFunction : # 134| void MergeMustExactlyWithMustTotallyOverlap(bool, Point, int) # 134| Block 0 @@ -575,7 +588,8 @@ ssa.cpp: # 143| v3_7(void) = NoOp : # 134| v3_8(void) = ReturnVoid : # 134| v3_9(void) = UnmodeledUse : mu* -# 134| v3_10(void) = ExitFunction : +# 134| v3_10(void) = AliasedUse : ~m0_1 +# 134| v3_11(void) = ExitFunction : # 145| void MergeMustExactlyWithMayPartiallyOverlap(bool, Point, int) # 145| Block 0 @@ -629,7 +643,8 @@ ssa.cpp: # 154| v3_5(void) = NoOp : # 145| v3_6(void) = ReturnVoid : # 145| v3_7(void) = UnmodeledUse : mu* -# 145| v3_8(void) = ExitFunction : +# 145| v3_8(void) = AliasedUse : ~m0_1 +# 145| v3_9(void) = ExitFunction : # 156| void MergeMustTotallyOverlapWithMayPartiallyOverlap(bool, Rect, int) # 156| Block 0 @@ -685,7 +700,8 @@ ssa.cpp: # 165| v3_6(void) = NoOp : # 156| v3_7(void) = ReturnVoid : # 156| v3_8(void) = UnmodeledUse : mu* -# 156| v3_9(void) = ExitFunction : +# 156| v3_9(void) = AliasedUse : ~m0_1 +# 156| v3_10(void) = ExitFunction : # 171| void WrapperStruct(Wrapper) # 171| Block 0 @@ -719,7 +735,8 @@ ssa.cpp: # 177| v0_27(void) = NoOp : # 171| v0_28(void) = ReturnVoid : # 171| v0_29(void) = UnmodeledUse : mu* -# 171| v0_30(void) = ExitFunction : +# 171| v0_30(void) = AliasedUse : ~m0_1 +# 171| v0_31(void) = ExitFunction : # 179| int AsmStmt(int*) # 179| Block 0 @@ -738,7 +755,8 @@ ssa.cpp: # 179| r0_12(glval) = VariableAddress[#return] : # 179| v0_13(void) = ReturnValue : &:r0_12, m0_11 # 179| v0_14(void) = UnmodeledUse : mu* -# 179| v0_15(void) = ExitFunction : +# 179| v0_15(void) = AliasedUse : ~m0_6 +# 179| v0_16(void) = ExitFunction : # 184| void AsmStmtWithOutputs(unsigned int&, unsigned int&, unsigned int&, unsigned int&) # 184| Block 0 @@ -766,7 +784,8 @@ ssa.cpp: # 192| v0_21(void) = NoOp : # 184| v0_22(void) = ReturnVoid : # 184| v0_23(void) = UnmodeledUse : mu* -# 184| v0_24(void) = ExitFunction : +# 184| v0_24(void) = AliasedUse : ~m0_20 +# 184| v0_25(void) = ExitFunction : # 198| int PureFunctions(char*, char*, int) # 198| Block 0 @@ -815,7 +834,8 @@ ssa.cpp: # 198| r0_42(glval) = VariableAddress[#return] : # 198| v0_43(void) = ReturnValue : &:r0_42, m0_41 # 198| v0_44(void) = UnmodeledUse : mu* -# 198| v0_45(void) = ExitFunction : +# 198| v0_45(void) = AliasedUse : ~m0_1 +# 198| v0_46(void) = ExitFunction : # 207| int ModeledCallTarget(int) # 207| Block 0 @@ -845,4 +865,5 @@ ssa.cpp: # 207| r0_23(glval) = VariableAddress[#return] : # 207| v0_24(void) = ReturnValue : &:r0_23, m0_22 # 207| v0_25(void) = UnmodeledUse : mu* -# 207| v0_26(void) = ExitFunction : +# 207| v0_26(void) = AliasedUse : ~m0_18 +# 207| v0_27(void) = ExitFunction : diff --git a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected index a68690c7055..0efd8ed6b1f 100644 --- a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected +++ b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected @@ -78,7 +78,8 @@ ssa.cpp: # 13| r6_11(glval) = VariableAddress[#return] : # 13| v6_12(void) = ReturnValue : &:r6_11, m6_10 # 13| v6_13(void) = UnmodeledUse : mu* -# 13| v6_14(void) = ExitFunction : +# 13| v6_14(void) = AliasedUse : ~mu0_2 +# 13| v6_15(void) = ExitFunction : # 31| int UnreachableViaGoto() # 31| Block 0 @@ -93,7 +94,8 @@ ssa.cpp: # 31| r0_8(glval) = VariableAddress[#return] : # 31| v0_9(void) = ReturnValue : &:r0_8, m0_7 # 31| v0_10(void) = UnmodeledUse : mu* -# 31| v0_11(void) = ExitFunction : +# 31| v0_11(void) = AliasedUse : ~mu0_2 +# 31| v0_12(void) = ExitFunction : # 38| int UnreachableIf(bool) # 38| Block 0 @@ -119,7 +121,8 @@ ssa.cpp: # 38| r1_1(glval) = VariableAddress[#return] : # 38| v1_2(void) = ReturnValue : &:r1_1, m1_0 # 38| v1_3(void) = UnmodeledUse : mu* -# 38| v1_4(void) = ExitFunction : +# 38| v1_4(void) = AliasedUse : ~mu0_2 +# 38| v1_5(void) = ExitFunction : # 42| Block 2 # 42| r2_0(glval) = VariableAddress[x] : @@ -191,7 +194,8 @@ ssa.cpp: # 59| r1_4(glval) = VariableAddress[#return] : # 59| v1_5(void) = ReturnValue : &:r1_4, m1_3 # 59| v1_6(void) = UnmodeledUse : mu* -# 59| v1_7(void) = ExitFunction : +# 59| v1_7(void) = AliasedUse : ~mu0_2 +# 59| v1_8(void) = ExitFunction : # 59| Block 2 # 59| v2_0(void) = Unreached : @@ -221,7 +225,8 @@ ssa.cpp: # 71| v2_0(void) = NoOp : # 68| v2_1(void) = ReturnVoid : # 68| v2_2(void) = UnmodeledUse : mu* -# 68| v2_3(void) = ExitFunction : +# 68| v2_3(void) = AliasedUse : ~mu0_2 +# 68| v2_4(void) = ExitFunction : # 69| Block 3 # 69| m3_0(int) = Phi : from 0:m0_4, from 1:m3_6 @@ -292,7 +297,8 @@ ssa.cpp: # 89| v3_14(void) = NoOp : # 75| v3_15(void) = ReturnVoid : # 75| v3_16(void) = UnmodeledUse : mu* -# 75| v3_17(void) = ExitFunction : +# 75| v3_17(void) = AliasedUse : ~mu0_2 +# 75| v3_18(void) = ExitFunction : # 91| void MustExactlyOverlap(Point) # 91| Block 0 @@ -308,7 +314,8 @@ ssa.cpp: # 93| v0_9(void) = NoOp : # 91| v0_10(void) = ReturnVoid : # 91| v0_11(void) = UnmodeledUse : mu* -# 91| v0_12(void) = ExitFunction : +# 91| v0_12(void) = AliasedUse : ~mu0_2 +# 91| v0_13(void) = ExitFunction : # 95| void MustExactlyOverlapEscaped(Point) # 95| Block 0 @@ -331,7 +338,8 @@ ssa.cpp: # 98| v0_16(void) = NoOp : # 95| v0_17(void) = ReturnVoid : # 95| v0_18(void) = UnmodeledUse : mu* -# 95| v0_19(void) = ExitFunction : +# 95| v0_19(void) = AliasedUse : ~mu0_2 +# 95| v0_20(void) = ExitFunction : # 100| void MustTotallyOverlap(Point) # 100| Block 0 @@ -353,7 +361,8 @@ ssa.cpp: # 103| v0_15(void) = NoOp : # 100| v0_16(void) = ReturnVoid : # 100| v0_17(void) = UnmodeledUse : mu* -# 100| v0_18(void) = ExitFunction : +# 100| v0_18(void) = AliasedUse : ~mu0_2 +# 100| v0_19(void) = ExitFunction : # 105| void MustTotallyOverlapEscaped(Point) # 105| Block 0 @@ -382,7 +391,8 @@ ssa.cpp: # 109| v0_22(void) = NoOp : # 105| v0_23(void) = ReturnVoid : # 105| v0_24(void) = UnmodeledUse : mu* -# 105| v0_25(void) = ExitFunction : +# 105| v0_25(void) = AliasedUse : ~mu0_2 +# 105| v0_26(void) = ExitFunction : # 111| void MayPartiallyOverlap(int, int) # 111| Block 0 @@ -410,7 +420,8 @@ ssa.cpp: # 114| v0_21(void) = NoOp : # 111| v0_22(void) = ReturnVoid : # 111| v0_23(void) = UnmodeledUse : mu* -# 111| v0_24(void) = ExitFunction : +# 111| v0_24(void) = AliasedUse : ~mu0_2 +# 111| v0_25(void) = ExitFunction : # 116| void MayPartiallyOverlapEscaped(int, int) # 116| Block 0 @@ -445,7 +456,8 @@ ssa.cpp: # 120| v0_28(void) = NoOp : # 116| v0_29(void) = ReturnVoid : # 116| v0_30(void) = UnmodeledUse : mu* -# 116| v0_31(void) = ExitFunction : +# 116| v0_31(void) = AliasedUse : ~mu0_2 +# 116| v0_32(void) = ExitFunction : # 122| void MergeMustExactlyOverlap(bool, int, int) # 122| Block 0 @@ -501,7 +513,8 @@ ssa.cpp: # 132| v3_9(void) = NoOp : # 122| v3_10(void) = ReturnVoid : # 122| v3_11(void) = UnmodeledUse : mu* -# 122| v3_12(void) = ExitFunction : +# 122| v3_12(void) = AliasedUse : ~mu0_2 +# 122| v3_13(void) = ExitFunction : # 134| void MergeMustExactlyWithMustTotallyOverlap(bool, Point, int) # 134| Block 0 @@ -552,7 +565,8 @@ ssa.cpp: # 143| v3_5(void) = NoOp : # 134| v3_6(void) = ReturnVoid : # 134| v3_7(void) = UnmodeledUse : mu* -# 134| v3_8(void) = ExitFunction : +# 134| v3_8(void) = AliasedUse : ~mu0_2 +# 134| v3_9(void) = ExitFunction : # 145| void MergeMustExactlyWithMayPartiallyOverlap(bool, Point, int) # 145| Block 0 @@ -602,7 +616,8 @@ ssa.cpp: # 154| v3_4(void) = NoOp : # 145| v3_5(void) = ReturnVoid : # 145| v3_6(void) = UnmodeledUse : mu* -# 145| v3_7(void) = ExitFunction : +# 145| v3_7(void) = AliasedUse : ~mu0_2 +# 145| v3_8(void) = ExitFunction : # 156| void MergeMustTotallyOverlapWithMayPartiallyOverlap(bool, Rect, int) # 156| Block 0 @@ -654,7 +669,8 @@ ssa.cpp: # 165| v3_5(void) = NoOp : # 156| v3_6(void) = ReturnVoid : # 156| v3_7(void) = UnmodeledUse : mu* -# 156| v3_8(void) = ExitFunction : +# 156| v3_8(void) = AliasedUse : ~mu0_2 +# 156| v3_9(void) = ExitFunction : # 171| void WrapperStruct(Wrapper) # 171| Block 0 @@ -688,7 +704,8 @@ ssa.cpp: # 177| v0_27(void) = NoOp : # 171| v0_28(void) = ReturnVoid : # 171| v0_29(void) = UnmodeledUse : mu* -# 171| v0_30(void) = ExitFunction : +# 171| v0_30(void) = AliasedUse : ~mu0_2 +# 171| v0_31(void) = ExitFunction : # 179| int AsmStmt(int*) # 179| Block 0 @@ -706,7 +723,8 @@ ssa.cpp: # 179| r0_11(glval) = VariableAddress[#return] : # 179| v0_12(void) = ReturnValue : &:r0_11, m0_10 # 179| v0_13(void) = UnmodeledUse : mu* -# 179| v0_14(void) = ExitFunction : +# 179| v0_14(void) = AliasedUse : ~mu0_2 +# 179| v0_15(void) = ExitFunction : # 184| void AsmStmtWithOutputs(unsigned int&, unsigned int&, unsigned int&, unsigned int&) # 184| Block 0 @@ -729,7 +747,8 @@ ssa.cpp: # 192| v0_16(void) = NoOp : # 184| v0_17(void) = ReturnVoid : # 184| v0_18(void) = UnmodeledUse : mu* -# 184| v0_19(void) = ExitFunction : +# 184| v0_19(void) = AliasedUse : ~mu0_2 +# 184| v0_20(void) = ExitFunction : # 198| int PureFunctions(char*, char*, int) # 198| Block 0 @@ -778,7 +797,8 @@ ssa.cpp: # 198| r0_42(glval) = VariableAddress[#return] : # 198| v0_43(void) = ReturnValue : &:r0_42, m0_41 # 198| v0_44(void) = UnmodeledUse : mu* -# 198| v0_45(void) = ExitFunction : +# 198| v0_45(void) = AliasedUse : ~mu0_2 +# 198| v0_46(void) = ExitFunction : # 207| int ModeledCallTarget(int) # 207| Block 0 @@ -805,4 +825,5 @@ ssa.cpp: # 207| r0_20(glval) = VariableAddress[#return] : # 207| v0_21(void) = ReturnValue : &:r0_20, m0_19 # 207| v0_22(void) = UnmodeledUse : mu* -# 207| v0_23(void) = ExitFunction : +# 207| v0_23(void) = AliasedUse : ~mu0_2 +# 207| v0_24(void) = ExitFunction : diff --git a/cpp/ql/test/library-tests/syntax-zoo/raw_sanity.expected b/cpp/ql/test/library-tests/syntax-zoo/raw_sanity.expected index feda4271b0f..e52d0934848 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/raw_sanity.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/raw_sanity.expected @@ -611,86 +611,6 @@ lostReachability | range_analysis.c:371:37:371:39 | Constant: 500 | backEdgeCountMismatch useNotDominatedByDefinition -| VacuousDestructorCall.cpp:4:3:4:3 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | IR: CallDestructor | void CallDestructor(int, int*) | -| assume0.cpp:11:2:11:2 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | assume0.cpp:5:6:5:6 | IR: h | void h() | -| condition_decls.cpp:16:15:16:15 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | condition_decls.cpp:15:6:15:17 | IR: if_decl_bind | void if_decl_bind(int) | -| condition_decls.cpp:16:15:16:16 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:15:6:15:17 | IR: if_decl_bind | void if_decl_bind(int) | -| condition_decls.cpp:16:15:16:16 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | condition_decls.cpp:15:6:15:17 | IR: if_decl_bind | void if_decl_bind(int) | -| condition_decls.cpp:17:5:17:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:15:6:15:17 | IR: if_decl_bind | void if_decl_bind(int) | -| condition_decls.cpp:17:11:17:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:15:6:15:17 | IR: if_decl_bind | void if_decl_bind(int) | -| condition_decls.cpp:20:5:20:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:15:6:15:17 | IR: if_decl_bind | void if_decl_bind(int) | -| condition_decls.cpp:20:11:20:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:15:6:15:17 | IR: if_decl_bind | void if_decl_bind(int) | -| condition_decls.cpp:26:19:26:19 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) | -| condition_decls.cpp:26:19:26:20 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) | -| condition_decls.cpp:26:19:26:20 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) | -| condition_decls.cpp:28:5:28:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) | -| condition_decls.cpp:28:11:28:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) | -| condition_decls.cpp:31:5:31:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) | -| condition_decls.cpp:31:11:31:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) | -| condition_decls.cpp:34:5:34:18 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) | -| condition_decls.cpp:34:9:34:13 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) | -| condition_decls.cpp:41:18:41:18 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | condition_decls.cpp:40:6:40:20 | IR: while_decl_bind | void while_decl_bind(int) | -| condition_decls.cpp:41:18:41:19 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:40:6:40:20 | IR: while_decl_bind | void while_decl_bind(int) | -| condition_decls.cpp:41:18:41:19 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | condition_decls.cpp:40:6:40:20 | IR: while_decl_bind | void while_decl_bind(int) | -| condition_decls.cpp:42:5:42:7 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:40:6:40:20 | IR: while_decl_bind | void while_decl_bind(int) | -| condition_decls.cpp:44:3:44:5 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:40:6:40:20 | IR: while_decl_bind | void while_decl_bind(int) | -| condition_decls.cpp:48:48:48:48 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | condition_decls.cpp:47:6:47:18 | IR: for_decl_bind | void for_decl_bind(int) | -| condition_decls.cpp:48:48:48:49 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:47:6:47:18 | IR: for_decl_bind | void for_decl_bind(int) | -| condition_decls.cpp:48:48:48:49 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | condition_decls.cpp:47:6:47:18 | IR: for_decl_bind | void for_decl_bind(int) | -| condition_decls.cpp:48:56:48:61 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:47:6:47:18 | IR: for_decl_bind | void for_decl_bind(int) | -| condition_decls.cpp:49:5:49:7 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:47:6:47:18 | IR: for_decl_bind | void for_decl_bind(int) | -| condition_decls.cpp:51:3:51:5 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:47:6:47:18 | IR: for_decl_bind | void for_decl_bind(int) | -| cpp11.cpp:28:21:28:21 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | cpp11.cpp:27:7:27:14 | IR: getFirst | int range_based_for_11::getFirst() | -| file://:0:0:0:0 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | cpp11.cpp:27:7:27:14 | IR: getFirst | int range_based_for_11::getFirst() | -| misc.c:68:16:68:16 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:70:13:70:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:72:11:72:11 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:82:5:82:12 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:83:5:83:12 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:83:14:83:14 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:83:17:83:17 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:84:6:84:13 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:84:6:84:13 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:84:16:84:16 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:84:19:84:19 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:85:9:85:13 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:86:9:86:9 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:87:10:87:10 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:88:9:88:9 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:88:9:88:17 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:171:15:171:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:168:6:168:8 | IR: vla | void vla() | -| misc.c:173:19:173:24 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | misc.c:168:6:168:8 | IR: vla | void vla() | -| misc.c:174:17:174:22 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | misc.c:168:6:168:8 | IR: vla | void vla() | -| misc.c:174:30:174:35 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | misc.c:168:6:168:8 | IR: vla | void vla() | -| misc.c:219:5:219:26 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:219:5:219:26 | IR: assign_designated_init | int assign_designated_init(someStruct*) | -| misc.c:220:4:220:5 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:219:5:219:26 | IR: assign_designated_init | int assign_designated_init(someStruct*) | -| ms_try_except.cpp:9:19:9:19 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | ms_try_except.cpp:2:6:2:18 | IR: ms_try_except | void ms_try_except(int) | -| ms_try_except.cpp:19:17:19:17 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | ms_try_except.cpp:2:6:2:18 | IR: ms_try_except | void ms_try_except(int) | -| ms_try_mix.cpp:14:16:14:19 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:10:6:10:18 | IR: ms_except_mix | void ms_except_mix(int) | -| ms_try_mix.cpp:15:13:15:14 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:10:6:10:18 | IR: ms_except_mix | void ms_except_mix(int) | -| ms_try_mix.cpp:16:13:16:19 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:10:6:10:18 | IR: ms_except_mix | void ms_except_mix(int) | -| ms_try_mix.cpp:18:16:18:19 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:10:6:10:18 | IR: ms_except_mix | void ms_except_mix(int) | -| ms_try_mix.cpp:21:16:21:19 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:10:6:10:18 | IR: ms_except_mix | void ms_except_mix(int) | -| ms_try_mix.cpp:24:12:24:15 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:10:6:10:18 | IR: ms_except_mix | void ms_except_mix(int) | -| ms_try_mix.cpp:31:16:31:19 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:27:6:27:19 | IR: ms_finally_mix | void ms_finally_mix(int) | -| ms_try_mix.cpp:32:13:32:14 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:27:6:27:19 | IR: ms_finally_mix | void ms_finally_mix(int) | -| ms_try_mix.cpp:33:13:33:19 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:27:6:27:19 | IR: ms_finally_mix | void ms_finally_mix(int) | -| ms_try_mix.cpp:35:16:35:19 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:27:6:27:19 | IR: ms_finally_mix | void ms_finally_mix(int) | -| ms_try_mix.cpp:38:16:38:19 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:27:6:27:19 | IR: ms_finally_mix | void ms_finally_mix(int) | -| ms_try_mix.cpp:41:12:41:15 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:27:6:27:19 | IR: ms_finally_mix | void ms_finally_mix(int) | -| ms_try_mix.cpp:51:5:51:11 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:47:6:47:28 | IR: ms_empty_finally_at_end | void ms_empty_finally_at_end() | | pointer_to_member.cpp:36:11:36:30 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | pointer_to_member.cpp:32:6:32:14 | IR: pmIsConst | void pmIsConst() | | pointer_to_member.cpp:36:13:36:19 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | pointer_to_member.cpp:32:6:32:14 | IR: pmIsConst | void pmIsConst() | -| stmt_expr.cpp:30:20:30:21 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | stmt_expr.cpp:21:6:21:6 | IR: g | void stmtexpr::g(int) | -| stmt_expr.cpp:31:16:31:18 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | stmt_expr.cpp:21:6:21:6 | IR: g | void stmtexpr::g(int) | | try_catch.cpp:21:13:21:24 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | try_catch.cpp:19:6:19:23 | IR: throw_from_nonstmt | void throw_from_nonstmt(int) | -| vla.c:3:5:3:8 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | vla.c:3:5:3:8 | IR: main | int main(int, char**) | -| vla.c:5:16:5:19 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | vla.c:3:5:3:8 | IR: main | int main(int, char**) | -| vla.c:5:22:5:25 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | vla.c:3:5:3:8 | IR: main | int main(int, char**) | -| vla.c:5:27:5:30 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | vla.c:3:5:3:8 | IR: main | int main(int, char**) | -| vla.c:5:27:5:33 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | vla.c:3:5:3:8 | IR: main | int main(int, char**) | -| vla.c:12:37:12:42 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | vla.c:11:6:11:16 | IR: vla_typedef | void vla_typedef() | -| vla.c:12:55:12:60 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | vla.c:11:6:11:16 | IR: vla_typedef | void vla_typedef() | -| vla.c:14:40:14:45 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | vla.c:11:6:11:16 | IR: vla_typedef | void vla_typedef() | -| vla.c:14:58:14:63 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | vla.c:11:6:11:16 | IR: vla_typedef | void vla_typedef() | -| vla.c:14:74:14:79 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | vla.c:11:6:11:16 | IR: vla_typedef | void vla_typedef() | diff --git a/csharp/ql/src/semmle/code/csharp/ir/implementation/Opcode.qll b/csharp/ql/src/semmle/code/csharp/ir/implementation/Opcode.qll index 0c1009b4fac..3b32aac811d 100644 --- a/csharp/ql/src/semmle/code/csharp/ir/implementation/Opcode.qll +++ b/csharp/ql/src/semmle/code/csharp/ir/implementation/Opcode.qll @@ -57,6 +57,7 @@ private newtype TOpcode = TUnmodeledDefinition() or TUnmodeledUse() or TAliasedDefinition() or + TAliasedUse() or TPhi() or TBuiltIn() or TVarArgsStart() or @@ -393,6 +394,10 @@ module Opcode { final override string toString() { result = "AliasedDefinition" } } + class AliasedUse extends Opcode, TAliasedUse { + final override string toString() { result = "AliasedUse" } + } + class Phi extends Opcode, TPhi { final override string toString() { result = "Phi" } } diff --git a/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/Instruction.qll b/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/Instruction.qll index 6d5e697150e..43c0e1eb8a1 100644 --- a/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/Instruction.qll +++ b/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/Instruction.qll @@ -49,7 +49,8 @@ module InstructionSanity { ( opcode instanceof ReadSideEffectOpcode or opcode instanceof Opcode::InlineAsm or - opcode instanceof Opcode::CallSideEffect + opcode instanceof Opcode::CallSideEffect or + opcode instanceof Opcode::AliasedUse ) and tag instanceof SideEffectOperandTag ) @@ -260,6 +261,7 @@ module InstructionSanity { ) { exists(IRBlock useBlock, int useIndex, Instruction defInstr, IRBlock defBlock, int defIndex | not useOperand.getUse() instanceof UnmodeledUseInstruction and + not defInstr instanceof UnmodeledDefinitionInstruction and pointOfEvaluation(useOperand, useBlock, useIndex) and defInstr = useOperand.getAnyDef() and ( @@ -1423,6 +1425,13 @@ class AliasedDefinitionInstruction extends Instruction { final override MemoryAccessKind getResultMemoryAccess() { result instanceof EscapedMemoryAccess } } +/** + * An instruction that consumes all escaped memory on exit from the function. + */ +class AliasedUseInstruction extends Instruction { + AliasedUseInstruction() { getOpcode() instanceof Opcode::AliasedUse } +} + class UnmodeledUseInstruction extends Instruction { UnmodeledUseInstruction() { getOpcode() instanceof Opcode::UnmodeledUse } diff --git a/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/Operand.qll b/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/Operand.qll index a23fb081afe..b869e09f5dd 100644 --- a/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/Operand.qll +++ b/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/Operand.qll @@ -388,6 +388,9 @@ class SideEffectOperand extends TypedOperand { } override MemoryAccessKind getMemoryAccess() { + useInstr instanceof AliasedUseInstruction and + result instanceof EscapedMayMemoryAccess + or useInstr instanceof CallSideEffectInstruction and result instanceof EscapedMayMemoryAccess or diff --git a/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/internal/InstructionTag.qll b/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/internal/InstructionTag.qll index 4130169b0cf..818d37cf803 100644 --- a/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/internal/InstructionTag.qll +++ b/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/internal/InstructionTag.qll @@ -32,6 +32,7 @@ newtype TInstructionTag = UnmodeledDefinitionTag() or UnmodeledUseTag() or AliasedDefinitionTag() or + AliasedUseTag() or SwitchBranchTag() or CallTargetTag() or CallTag() or @@ -131,6 +132,8 @@ string getInstructionTagId(TInstructionTag tag) { or tag = AliasedDefinitionTag() and result = "AliasedDef" or + tag = AliasedUseTag() and result = "AliasedUse" + or tag = SwitchBranchTag() and result = "SwitchBranch" or tag = CallTargetTag() and result = "CallTarget" diff --git a/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/internal/TranslatedFunction.qll b/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/internal/TranslatedFunction.qll index ef0e5fb6a67..c23547d3d3b 100644 --- a/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/internal/TranslatedFunction.qll +++ b/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/internal/TranslatedFunction.qll @@ -98,6 +98,9 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { result = this.getInstruction(UnmodeledUseTag()) or tag = UnmodeledUseTag() and + result = getInstruction(AliasedUseTag()) + or + tag = AliasedUseTag() and result = this.getInstruction(ExitFunctionTag()) ) } @@ -181,6 +184,11 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { resultType instanceof VoidType and isLValue = false or + tag = AliasedUseTag() and + opcode instanceof Opcode::AliasedUse and + resultType instanceof VoidType and + isLValue = false + or tag = ExitFunctionTag() and opcode instanceof Opcode::ExitFunction and resultType instanceof VoidType and @@ -202,6 +210,10 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { operandTag instanceof UnmodeledUseOperandTag and result = getUnmodeledDefinitionInstruction() or + tag = AliasedUseTag() and + operandTag instanceof SideEffectOperandTag and + result = getUnmodeledDefinitionInstruction() + or tag = ReturnTag() and not this.getReturnType() instanceof VoidType and ( @@ -218,6 +230,10 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { not this.getReturnType() instanceof VoidType and operandTag instanceof LoadOperandTag and result = this.getReturnType() + or + tag = AliasedUseTag() and + operandTag instanceof SideEffectOperandTag and + result instanceof Language::UnknownType } final override IRVariable getInstructionVariable(InstructionTag tag) { diff --git a/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/Instruction.qll b/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/Instruction.qll index 6d5e697150e..43c0e1eb8a1 100644 --- a/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/Instruction.qll +++ b/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/Instruction.qll @@ -49,7 +49,8 @@ module InstructionSanity { ( opcode instanceof ReadSideEffectOpcode or opcode instanceof Opcode::InlineAsm or - opcode instanceof Opcode::CallSideEffect + opcode instanceof Opcode::CallSideEffect or + opcode instanceof Opcode::AliasedUse ) and tag instanceof SideEffectOperandTag ) @@ -260,6 +261,7 @@ module InstructionSanity { ) { exists(IRBlock useBlock, int useIndex, Instruction defInstr, IRBlock defBlock, int defIndex | not useOperand.getUse() instanceof UnmodeledUseInstruction and + not defInstr instanceof UnmodeledDefinitionInstruction and pointOfEvaluation(useOperand, useBlock, useIndex) and defInstr = useOperand.getAnyDef() and ( @@ -1423,6 +1425,13 @@ class AliasedDefinitionInstruction extends Instruction { final override MemoryAccessKind getResultMemoryAccess() { result instanceof EscapedMemoryAccess } } +/** + * An instruction that consumes all escaped memory on exit from the function. + */ +class AliasedUseInstruction extends Instruction { + AliasedUseInstruction() { getOpcode() instanceof Opcode::AliasedUse } +} + class UnmodeledUseInstruction extends Instruction { UnmodeledUseInstruction() { getOpcode() instanceof Opcode::UnmodeledUse } diff --git a/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/Operand.qll b/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/Operand.qll index a23fb081afe..b869e09f5dd 100644 --- a/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/Operand.qll +++ b/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/Operand.qll @@ -388,6 +388,9 @@ class SideEffectOperand extends TypedOperand { } override MemoryAccessKind getMemoryAccess() { + useInstr instanceof AliasedUseInstruction and + result instanceof EscapedMayMemoryAccess + or useInstr instanceof CallSideEffectInstruction and result instanceof EscapedMayMemoryAccess or diff --git a/csharp/ql/test/library-tests/ir/ir/raw_ir.expected b/csharp/ql/test/library-tests/ir/ir/raw_ir.expected index acba7e50086..ae80ed44d5d 100644 --- a/csharp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/csharp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -53,7 +53,8 @@ array.cs: # 10| mu0_49(Int32) = Store : &:r0_48, r0_43 # 2| v0_50(Void) = ReturnVoid : # 2| v0_51(Void) = UnmodeledUse : mu* -# 2| v0_52(Void) = ExitFunction : +# 2| v0_52(Void) = AliasedUse : ~mu0_2 +# 2| v0_53(Void) = ExitFunction : # 13| System.Void ArrayTest.twod_and_init_acc() # 13| Block 0 @@ -144,7 +145,8 @@ array.cs: # 20| mu0_84(Int32) = Store : &:r0_83, r0_76 # 13| v0_85(Void) = ReturnVoid : # 13| v0_86(Void) = UnmodeledUse : mu* -# 13| v0_87(Void) = ExitFunction : +# 13| v0_87(Void) = AliasedUse : ~mu0_2 +# 13| v0_88(Void) = ExitFunction : assignop.cs: # 4| System.Void AssignOp.Main() @@ -215,7 +217,8 @@ assignop.cs: # 17| mu0_63(Int32) = Store : &:r0_60, r0_62 # 4| v0_64(Void) = ReturnVoid : # 4| v0_65(Void) = UnmodeledUse : mu* -# 4| v0_66(Void) = ExitFunction : +# 4| v0_66(Void) = AliasedUse : ~mu0_2 +# 4| v0_67(Void) = ExitFunction : casts.cs: # 11| System.Void Casts.Main() @@ -241,7 +244,8 @@ casts.cs: # 15| mu0_18(Casts_B) = Store : &:r0_14, r0_17 # 11| v0_19(Void) = ReturnVoid : # 11| v0_20(Void) = UnmodeledUse : mu* -# 11| v0_21(Void) = ExitFunction : +# 11| v0_21(Void) = AliasedUse : ~mu0_2 +# 11| v0_22(Void) = ExitFunction : collections.cs: # 11| System.Void Collections.Main() @@ -285,7 +289,8 @@ collections.cs: # 13| mu0_36(Dictionary) = Store : &:r0_3, r0_4 # 11| v0_37(Void) = ReturnVoid : # 11| v0_38(Void) = UnmodeledUse : mu* -# 11| v0_39(Void) = ExitFunction : +# 11| v0_39(Void) = AliasedUse : ~mu0_2 +# 11| v0_40(Void) = ExitFunction : constructor_init.cs: # 5| System.Void BaseClass..ctor() @@ -297,7 +302,8 @@ constructor_init.cs: # 6| v0_4(Void) = NoOp : # 5| v0_5(Void) = ReturnVoid : # 5| v0_6(Void) = UnmodeledUse : mu* -# 5| v0_7(Void) = ExitFunction : +# 5| v0_7(Void) = AliasedUse : ~mu0_2 +# 5| v0_8(Void) = ExitFunction : # 9| System.Void BaseClass..ctor(System.Int32) # 9| Block 0 @@ -314,7 +320,8 @@ constructor_init.cs: # 11| mu0_10(Int32) = Store : &:r0_9, r0_7 # 9| v0_11(Void) = ReturnVoid : # 9| v0_12(Void) = UnmodeledUse : mu* -# 9| v0_13(Void) = ExitFunction : +# 9| v0_13(Void) = AliasedUse : ~mu0_2 +# 9| v0_14(Void) = ExitFunction : # 17| System.Void DerivedClass..ctor() # 17| Block 0 @@ -329,7 +336,8 @@ constructor_init.cs: # 18| v0_8(Void) = NoOp : # 17| v0_9(Void) = ReturnVoid : # 17| v0_10(Void) = UnmodeledUse : mu* -# 17| v0_11(Void) = ExitFunction : +# 17| v0_11(Void) = AliasedUse : ~mu0_2 +# 17| v0_12(Void) = ExitFunction : # 21| System.Void DerivedClass..ctor(System.Int32) # 21| Block 0 @@ -348,7 +356,8 @@ constructor_init.cs: # 22| v0_12(Void) = NoOp : # 21| v0_13(Void) = ReturnVoid : # 21| v0_14(Void) = UnmodeledUse : mu* -# 21| v0_15(Void) = ExitFunction : +# 21| v0_15(Void) = AliasedUse : ~mu0_2 +# 21| v0_16(Void) = ExitFunction : # 25| System.Void DerivedClass..ctor(System.Int32,System.Int32) # 25| Block 0 @@ -368,7 +377,8 @@ constructor_init.cs: # 26| v0_13(Void) = NoOp : # 25| v0_14(Void) = ReturnVoid : # 25| v0_15(Void) = UnmodeledUse : mu* -# 25| v0_16(Void) = ExitFunction : +# 25| v0_16(Void) = AliasedUse : ~mu0_2 +# 25| v0_17(Void) = ExitFunction : # 29| System.Void DerivedClass.Main() # 29| Block 0 @@ -398,7 +408,8 @@ constructor_init.cs: # 33| mu0_23(DerivedClass) = Store : &:r0_16, r0_17 # 29| v0_24(Void) = ReturnVoid : # 29| v0_25(Void) = UnmodeledUse : mu* -# 29| v0_26(Void) = ExitFunction : +# 29| v0_26(Void) = AliasedUse : ~mu0_2 +# 29| v0_27(Void) = ExitFunction : crement.cs: # 3| System.Void CrementOpsTest.Main() @@ -439,7 +450,8 @@ crement.cs: # 9| mu0_33(Int32) = Store : &:r0_32, r0_28 # 3| v0_34(Void) = ReturnVoid : # 3| v0_35(Void) = UnmodeledUse : mu* -# 3| v0_36(Void) = ExitFunction : +# 3| v0_36(Void) = AliasedUse : ~mu0_2 +# 3| v0_37(Void) = ExitFunction : delegates.cs: # 6| System.Int32 Delegates.returns(System.Int32) @@ -456,7 +468,8 @@ delegates.cs: # 6| r0_9(glval) = VariableAddress[#return] : # 6| v0_10(Void) = ReturnValue : &:r0_9, ~mu0_2 # 6| v0_11(Void) = UnmodeledUse : mu* -# 6| v0_12(Void) = ExitFunction : +# 6| v0_12(Void) = AliasedUse : ~mu0_2 +# 6| v0_13(Void) = ExitFunction : # 11| System.Void Delegates.Main() # 11| Block 0 @@ -478,7 +491,8 @@ delegates.cs: # 13| mu0_15(null) = ^CallSideEffect : ~mu0_2 # 11| v0_16(Void) = ReturnVoid : # 11| v0_17(Void) = UnmodeledUse : mu* -# 11| v0_18(Void) = ExitFunction : +# 11| v0_18(Void) = AliasedUse : ~mu0_2 +# 11| v0_19(Void) = ExitFunction : events.cs: # 8| System.Void Events..ctor() @@ -497,7 +511,8 @@ events.cs: # 10| mu0_11(MyDel) = Store : &:r0_10, r0_4 # 8| v0_12(Void) = ReturnVoid : # 8| v0_13(Void) = UnmodeledUse : mu* -# 8| v0_14(Void) = ExitFunction : +# 8| v0_14(Void) = AliasedUse : ~mu0_2 +# 8| v0_15(Void) = ExitFunction : # 13| System.Void Events.AddEvent() # 13| Block 0 @@ -514,7 +529,8 @@ events.cs: # 15| mu0_10(null) = ^CallSideEffect : ~mu0_2 # 13| v0_11(Void) = ReturnVoid : # 13| v0_12(Void) = UnmodeledUse : mu* -# 13| v0_13(Void) = ExitFunction : +# 13| v0_13(Void) = AliasedUse : ~mu0_2 +# 13| v0_14(Void) = ExitFunction : # 18| System.Void Events.RemoveEvent() # 18| Block 0 @@ -531,7 +547,8 @@ events.cs: # 20| mu0_10(null) = ^CallSideEffect : ~mu0_2 # 18| v0_11(Void) = ReturnVoid : # 18| v0_12(Void) = UnmodeledUse : mu* -# 18| v0_13(Void) = ExitFunction : +# 18| v0_13(Void) = AliasedUse : ~mu0_2 +# 18| v0_14(Void) = ExitFunction : # 23| System.String Events.Fun(System.String) # 23| Block 0 @@ -548,7 +565,8 @@ events.cs: # 23| r0_10(glval) = VariableAddress[#return] : # 23| v0_11(Void) = ReturnValue : &:r0_10, ~mu0_2 # 23| v0_12(Void) = UnmodeledUse : mu* -# 23| v0_13(Void) = ExitFunction : +# 23| v0_13(Void) = AliasedUse : ~mu0_2 +# 23| v0_14(Void) = ExitFunction : # 28| System.Void Events.Main(System.String[]) # 28| Block 0 @@ -583,7 +601,8 @@ events.cs: # 33| mu0_28(null) = ^CallSideEffect : ~mu0_2 # 28| v0_29(Void) = ReturnVoid : # 28| v0_30(Void) = UnmodeledUse : mu* -# 28| v0_31(Void) = ExitFunction : +# 28| v0_31(Void) = AliasedUse : ~mu0_2 +# 28| v0_32(Void) = ExitFunction : foreach.cs: # 4| System.Void ForEach.Main() @@ -662,7 +681,8 @@ foreach.cs: # 7| mu3_4(null) = ^CallSideEffect : ~mu0_2 # 4| v3_5(Void) = ReturnVoid : # 4| v3_6(Void) = UnmodeledUse : mu* -# 4| v3_7(Void) = ExitFunction : +# 4| v3_7(Void) = AliasedUse : ~mu0_2 +# 4| v3_8(Void) = ExitFunction : func_with_param_call.cs: # 5| System.Int32 test_call_with_param.f(System.Int32,System.Int32) @@ -684,7 +704,8 @@ func_with_param_call.cs: # 5| r0_14(glval) = VariableAddress[#return] : # 5| v0_15(Void) = ReturnValue : &:r0_14, ~mu0_2 # 5| v0_16(Void) = UnmodeledUse : mu* -# 5| v0_17(Void) = ExitFunction : +# 5| v0_17(Void) = AliasedUse : ~mu0_2 +# 5| v0_18(Void) = ExitFunction : # 10| System.Int32 test_call_with_param.g() # 10| Block 0 @@ -701,7 +722,8 @@ func_with_param_call.cs: # 10| r0_10(glval) = VariableAddress[#return] : # 10| v0_11(Void) = ReturnValue : &:r0_10, ~mu0_2 # 10| v0_12(Void) = UnmodeledUse : mu* -# 10| v0_13(Void) = ExitFunction : +# 10| v0_13(Void) = AliasedUse : ~mu0_2 +# 10| v0_14(Void) = ExitFunction : indexers.cs: # 8| System.String Indexers.MyClass.get_Item(System.Int32) @@ -724,7 +746,8 @@ indexers.cs: # 8| r0_15(glval) = VariableAddress[#return] : # 8| v0_16(Void) = ReturnValue : &:r0_15, ~mu0_2 # 8| v0_17(Void) = UnmodeledUse : mu* -# 8| v0_18(Void) = ExitFunction : +# 8| v0_18(Void) = AliasedUse : ~mu0_2 +# 8| v0_19(Void) = ExitFunction : # 12| System.Void Indexers.MyClass.set_Item(System.Int32,System.String) # 12| Block 0 @@ -747,7 +770,8 @@ indexers.cs: # 14| mu0_16(String) = Store : &:r0_15, r0_9 # 12| v0_17(Void) = ReturnVoid : # 12| v0_18(Void) = UnmodeledUse : mu* -# 12| v0_19(Void) = ExitFunction : +# 12| v0_19(Void) = AliasedUse : ~mu0_2 +# 12| v0_20(Void) = ExitFunction : # 19| System.Void Indexers.Main() # 19| Block 0 @@ -788,7 +812,8 @@ indexers.cs: # 24| mu0_34(null) = ^CallSideEffect : ~mu0_2 # 19| v0_35(Void) = ReturnVoid : # 19| v0_36(Void) = UnmodeledUse : mu* -# 19| v0_37(Void) = ExitFunction : +# 19| v0_37(Void) = AliasedUse : ~mu0_2 +# 19| v0_38(Void) = ExitFunction : inheritance_polymorphism.cs: # 3| System.Int32 A.function() @@ -803,7 +828,8 @@ inheritance_polymorphism.cs: # 3| r0_7(glval) = VariableAddress[#return] : # 3| v0_8(Void) = ReturnValue : &:r0_7, ~mu0_2 # 3| v0_9(Void) = UnmodeledUse : mu* -# 3| v0_10(Void) = ExitFunction : +# 3| v0_10(Void) = AliasedUse : ~mu0_2 +# 3| v0_11(Void) = ExitFunction : # 15| System.Int32 C.function() # 15| Block 0 @@ -817,7 +843,8 @@ inheritance_polymorphism.cs: # 15| r0_7(glval) = VariableAddress[#return] : # 15| v0_8(Void) = ReturnValue : &:r0_7, ~mu0_2 # 15| v0_9(Void) = UnmodeledUse : mu* -# 15| v0_10(Void) = ExitFunction : +# 15| v0_10(Void) = AliasedUse : ~mu0_2 +# 15| v0_11(Void) = ExitFunction : # 23| System.Void Program.Main() # 23| Block 0 @@ -861,7 +888,8 @@ inheritance_polymorphism.cs: # 34| mu0_37(null) = ^CallSideEffect : ~mu0_2 # 23| v0_38(Void) = ReturnVoid : # 23| v0_39(Void) = UnmodeledUse : mu* -# 23| v0_40(Void) = ExitFunction : +# 23| v0_40(Void) = AliasedUse : ~mu0_2 +# 23| v0_41(Void) = ExitFunction : inoutref.cs: # 11| System.Void InOutRef.set(MyClass,MyClass) @@ -880,7 +908,8 @@ inoutref.cs: # 13| mu0_11(MyClass) = Store : &:r0_10, r0_8 # 11| v0_12(Void) = ReturnVoid : # 11| v0_13(Void) = UnmodeledUse : mu* -# 11| v0_14(Void) = ExitFunction : +# 11| v0_14(Void) = AliasedUse : ~mu0_2 +# 11| v0_15(Void) = ExitFunction : # 16| System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) # 16| Block 0 @@ -939,7 +968,8 @@ inoutref.cs: # 26| mu0_52(null) = ^CallSideEffect : ~mu0_2 # 16| v0_53(Void) = ReturnVoid : # 16| v0_54(Void) = UnmodeledUse : mu* -# 16| v0_55(Void) = ExitFunction : +# 16| v0_55(Void) = AliasedUse : ~mu0_2 +# 16| v0_56(Void) = ExitFunction : # 29| System.Void InOutRef.Main() # 29| Block 0 @@ -977,7 +1007,8 @@ inoutref.cs: # 36| mu0_31(Int32) = Store : &:r0_27, r0_30 # 29| v0_32(Void) = ReturnVoid : # 29| v0_33(Void) = UnmodeledUse : mu* -# 29| v0_34(Void) = ExitFunction : +# 29| v0_34(Void) = AliasedUse : ~mu0_2 +# 29| v0_35(Void) = ExitFunction : isexpr.cs: # 8| System.Void IsExpr.Main() @@ -1008,7 +1039,8 @@ isexpr.cs: # 8| Block 1 # 8| v1_0(Void) = ReturnVoid : # 8| v1_1(Void) = UnmodeledUse : mu* -# 8| v1_2(Void) = ExitFunction : +# 8| v1_2(Void) = AliasedUse : ~mu0_2 +# 8| v1_3(Void) = ExitFunction : # 13| Block 2 # 13| v2_0(Void) = ConditionalBranch : r0_18 @@ -1214,7 +1246,8 @@ jumps.cs: # 38| mu22_4(null) = ^CallSideEffect : ~mu0_2 # 5| v22_5(Void) = ReturnVoid : # 5| v22_6(Void) = UnmodeledUse : mu* -# 5| v22_7(Void) = ExitFunction : +# 5| v22_7(Void) = AliasedUse : ~mu0_2 +# 5| v22_8(Void) = ExitFunction : lock.cs: # 5| System.Void LockTest.A() @@ -1258,7 +1291,8 @@ lock.cs: # 5| Block 1 # 5| v1_0(Void) = ReturnVoid : # 5| v1_1(Void) = UnmodeledUse : mu* -# 5| v1_2(Void) = ExitFunction : +# 5| v1_2(Void) = AliasedUse : ~mu0_2 +# 5| v1_3(Void) = ExitFunction : # 8| Block 2 # 8| r2_0(glval) = FunctionAddress[Exit] : @@ -1278,7 +1312,8 @@ obj_creation.cs: # 8| v0_4(Void) = NoOp : # 7| v0_5(Void) = ReturnVoid : # 7| v0_6(Void) = UnmodeledUse : mu* -# 7| v0_7(Void) = ExitFunction : +# 7| v0_7(Void) = AliasedUse : ~mu0_2 +# 7| v0_8(Void) = ExitFunction : # 11| System.Void ObjCreation.MyClass..ctor(System.Int32) # 11| Block 0 @@ -1295,7 +1330,8 @@ obj_creation.cs: # 13| mu0_10(Int32) = Store : &:r0_9, r0_7 # 11| v0_11(Void) = ReturnVoid : # 11| v0_12(Void) = UnmodeledUse : mu* -# 11| v0_13(Void) = ExitFunction : +# 11| v0_13(Void) = AliasedUse : ~mu0_2 +# 11| v0_14(Void) = ExitFunction : # 17| System.Void ObjCreation.SomeFun(ObjCreation.MyClass) # 17| Block 0 @@ -1307,7 +1343,8 @@ obj_creation.cs: # 18| v0_5(Void) = NoOp : # 17| v0_6(Void) = ReturnVoid : # 17| v0_7(Void) = UnmodeledUse : mu* -# 17| v0_8(Void) = ExitFunction : +# 17| v0_8(Void) = AliasedUse : ~mu0_2 +# 17| v0_9(Void) = ExitFunction : # 21| System.Void ObjCreation.Main() # 21| Block 0 @@ -1346,7 +1383,8 @@ obj_creation.cs: # 27| mu0_32(null) = ^CallSideEffect : ~mu0_2 # 21| v0_33(Void) = ReturnVoid : # 21| v0_34(Void) = UnmodeledUse : mu* -# 21| v0_35(Void) = ExitFunction : +# 21| v0_35(Void) = AliasedUse : ~mu0_2 +# 21| v0_36(Void) = ExitFunction : pointers.cs: # 3| System.Void Pointers.addone(System.Int32[]) @@ -1380,7 +1418,8 @@ pointers.cs: # 3| Block 1 # 3| v1_0(Void) = ReturnVoid : # 3| v1_1(Void) = UnmodeledUse : mu* -# 3| v1_2(Void) = ExitFunction : +# 3| v1_2(Void) = AliasedUse : ~mu0_2 +# 3| v1_3(Void) = ExitFunction : # 9| Block 2 # 9| r2_0(glval) = VariableAddress[i] : @@ -1475,7 +1514,8 @@ pointers.cs: # 40| mu0_61(null) = ^CallSideEffect : ~mu0_2 # 25| v0_62(Void) = ReturnVoid : # 25| v0_63(Void) = UnmodeledUse : mu* -# 25| v0_64(Void) = ExitFunction : +# 25| v0_64(Void) = AliasedUse : ~mu0_2 +# 25| v0_65(Void) = ExitFunction : prop.cs: # 7| System.Int32 PropClass.get_Prop() @@ -1493,7 +1533,8 @@ prop.cs: # 7| r0_10(glval) = VariableAddress[#return] : # 7| v0_11(Void) = ReturnValue : &:r0_10, ~mu0_2 # 7| v0_12(Void) = UnmodeledUse : mu* -# 7| v0_13(Void) = ExitFunction : +# 7| v0_13(Void) = AliasedUse : ~mu0_2 +# 7| v0_14(Void) = ExitFunction : # 12| System.Void PropClass.set_Prop(System.Int32) # 12| Block 0 @@ -1509,7 +1550,8 @@ prop.cs: # 14| mu0_9(Int32) = Store : &:r0_8, r0_7 # 12| v0_10(Void) = ReturnVoid : # 12| v0_11(Void) = UnmodeledUse : mu* -# 12| v0_12(Void) = ExitFunction : +# 12| v0_12(Void) = AliasedUse : ~mu0_2 +# 12| v0_13(Void) = ExitFunction : # 18| System.Int32 PropClass.func() # 18| Block 0 @@ -1523,7 +1565,8 @@ prop.cs: # 18| r0_7(glval) = VariableAddress[#return] : # 18| v0_8(Void) = ReturnValue : &:r0_7, ~mu0_2 # 18| v0_9(Void) = UnmodeledUse : mu* -# 18| v0_10(Void) = ExitFunction : +# 18| v0_10(Void) = AliasedUse : ~mu0_2 +# 18| v0_11(Void) = ExitFunction : # 26| System.Void Prog.Main() # 26| Block 0 @@ -1551,7 +1594,8 @@ prop.cs: # 30| mu0_21(Int32) = Store : &:r0_15, r0_19 # 26| v0_22(Void) = ReturnVoid : # 26| v0_23(Void) = UnmodeledUse : mu* -# 26| v0_24(Void) = ExitFunction : +# 26| v0_24(Void) = AliasedUse : ~mu0_2 +# 26| v0_25(Void) = ExitFunction : simple_call.cs: # 5| System.Int32 test_simple_call.f() @@ -1565,7 +1609,8 @@ simple_call.cs: # 5| r0_6(glval) = VariableAddress[#return] : # 5| v0_7(Void) = ReturnValue : &:r0_6, ~mu0_2 # 5| v0_8(Void) = UnmodeledUse : mu* -# 5| v0_9(Void) = ExitFunction : +# 5| v0_9(Void) = AliasedUse : ~mu0_2 +# 5| v0_10(Void) = ExitFunction : # 10| System.Int32 test_simple_call.g() # 10| Block 0 @@ -1581,7 +1626,8 @@ simple_call.cs: # 10| r0_9(glval) = VariableAddress[#return] : # 10| v0_10(Void) = ReturnValue : &:r0_9, ~mu0_2 # 10| v0_11(Void) = UnmodeledUse : mu* -# 10| v0_12(Void) = ExitFunction : +# 10| v0_12(Void) = AliasedUse : ~mu0_2 +# 10| v0_13(Void) = ExitFunction : simple_function.cs: # 5| System.Int32 test_simple_function.f() @@ -1595,7 +1641,8 @@ simple_function.cs: # 5| r0_6(glval) = VariableAddress[#return] : # 5| v0_7(Void) = ReturnValue : &:r0_6, ~mu0_2 # 5| v0_8(Void) = UnmodeledUse : mu* -# 5| v0_9(Void) = ExitFunction : +# 5| v0_9(Void) = AliasedUse : ~mu0_2 +# 5| v0_10(Void) = ExitFunction : stmts.cs: # 5| System.Int32 test_stmts.ifStmt(System.Int32) @@ -1617,7 +1664,8 @@ stmts.cs: # 5| r1_0(glval) = VariableAddress[#return] : # 5| v1_1(Void) = ReturnValue : &:r1_0, ~mu0_2 # 5| v1_2(Void) = UnmodeledUse : mu* -# 5| v1_3(Void) = ExitFunction : +# 5| v1_3(Void) = AliasedUse : ~mu0_2 +# 5| v1_4(Void) = ExitFunction : # 10| Block 2 # 10| r2_0(glval) = VariableAddress[#return] : @@ -1646,7 +1694,8 @@ stmts.cs: # 13| Block 1 # 13| v1_0(Void) = ReturnVoid : # 13| v1_1(Void) = UnmodeledUse : mu* -# 13| v1_2(Void) = ExitFunction : +# 13| v1_2(Void) = AliasedUse : ~mu0_2 +# 13| v1_3(Void) = ExitFunction : # 16| Block 2 # 16| r2_0(glval) = VariableAddress[i] : @@ -1693,7 +1742,8 @@ stmts.cs: # 22| r1_0(glval) = VariableAddress[#return] : # 22| v1_1(Void) = ReturnValue : &:r1_0, ~mu0_2 # 22| v1_2(Void) = UnmodeledUse : mu* -# 22| v1_3(Void) = ExitFunction : +# 22| v1_3(Void) = AliasedUse : ~mu0_2 +# 22| v1_4(Void) = ExitFunction : # 29| Block 2 # 29| v2_0(Void) = NoOp : @@ -1750,7 +1800,8 @@ stmts.cs: # 46| Block 1 # 46| v1_0(Void) = UnmodeledUse : mu* -# 46| v1_1(Void) = ExitFunction : +# 46| v1_1(Void) = AliasedUse : ~mu0_2 +# 46| v1_2(Void) = ExitFunction : # 46| Block 2 # 46| v2_0(Void) = Unwind : @@ -1816,7 +1867,8 @@ stmts.cs: # 69| Block 1 # 69| v1_0(Void) = ReturnVoid : # 69| v1_1(Void) = UnmodeledUse : mu* -# 69| v1_2(Void) = ExitFunction : +# 69| v1_2(Void) = AliasedUse : ~mu0_2 +# 69| v1_3(Void) = ExitFunction : # 72| Block 2 # 72| r2_0(glval) = VariableAddress[i] : @@ -1893,7 +1945,8 @@ stmts.cs: # 89| Block 1 # 89| v1_0(Void) = ReturnVoid : # 89| v1_1(Void) = UnmodeledUse : mu* -# 89| v1_2(Void) = ExitFunction : +# 89| v1_2(Void) = AliasedUse : ~mu0_2 +# 89| v1_3(Void) = ExitFunction : # 94| Block 2 # 94| r2_0(glval) = VariableAddress[x] : @@ -1933,7 +1986,8 @@ stmts.cs: # 108| mu0_18(Int32) = Store : &:r0_17, r0_16 # 99| v0_19(Void) = ReturnVoid : # 99| v0_20(Void) = UnmodeledUse : mu* -# 99| v0_21(Void) = ExitFunction : +# 99| v0_21(Void) = AliasedUse : ~mu0_2 +# 99| v0_22(Void) = ExitFunction : using.cs: # 7| System.Void UsingStmt.MyDisposable..ctor() @@ -1945,7 +1999,8 @@ using.cs: # 7| v0_4(Void) = NoOp : # 7| v0_5(Void) = ReturnVoid : # 7| v0_6(Void) = UnmodeledUse : mu* -# 7| v0_7(Void) = ExitFunction : +# 7| v0_7(Void) = AliasedUse : ~mu0_2 +# 7| v0_8(Void) = ExitFunction : # 8| System.Void UsingStmt.MyDisposable.DoSomething() # 8| Block 0 @@ -1956,7 +2011,8 @@ using.cs: # 8| v0_4(Void) = NoOp : # 8| v0_5(Void) = ReturnVoid : # 8| v0_6(Void) = UnmodeledUse : mu* -# 8| v0_7(Void) = ExitFunction : +# 8| v0_7(Void) = AliasedUse : ~mu0_2 +# 8| v0_8(Void) = ExitFunction : # 9| System.Void UsingStmt.MyDisposable.Dispose() # 9| Block 0 @@ -1967,7 +2023,8 @@ using.cs: # 9| v0_4(Void) = NoOp : # 9| v0_5(Void) = ReturnVoid : # 9| v0_6(Void) = UnmodeledUse : mu* -# 9| v0_7(Void) = ExitFunction : +# 9| v0_7(Void) = AliasedUse : ~mu0_2 +# 9| v0_8(Void) = ExitFunction : # 12| System.Void UsingStmt.Main() # 12| Block 0 @@ -2009,7 +2066,8 @@ using.cs: # 26| mu0_35(null) = ^CallSideEffect : ~mu0_2 # 12| v0_36(Void) = ReturnVoid : # 12| v0_37(Void) = UnmodeledUse : mu* -# 12| v0_38(Void) = ExitFunction : +# 12| v0_38(Void) = AliasedUse : ~mu0_2 +# 12| v0_39(Void) = ExitFunction : variables.cs: # 5| System.Void test_variables.f() @@ -2035,4 +2093,5 @@ variables.cs: # 10| mu0_18(Int32) = Store : &:r0_15, r0_17 # 5| v0_19(Void) = ReturnVoid : # 5| v0_20(Void) = UnmodeledUse : mu* -# 5| v0_21(Void) = ExitFunction : +# 5| v0_21(Void) = AliasedUse : ~mu0_2 +# 5| v0_22(Void) = ExitFunction : From 956c18f976f8065f52e60a59e443d71795583725 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Thu, 24 Oct 2019 13:54:09 -0700 Subject: [PATCH 2/5] C++/C#: Fix formatting --- cpp/ql/src/semmle/code/cpp/ir/implementation/Opcode.qll | 2 +- csharp/ql/src/semmle/code/csharp/ir/implementation/Opcode.qll | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/Opcode.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/Opcode.qll index 3b32aac811d..eb07be7f30c 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/Opcode.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/Opcode.qll @@ -397,7 +397,7 @@ module Opcode { class AliasedUse extends Opcode, TAliasedUse { final override string toString() { result = "AliasedUse" } } - + class Phi extends Opcode, TPhi { final override string toString() { result = "Phi" } } diff --git a/csharp/ql/src/semmle/code/csharp/ir/implementation/Opcode.qll b/csharp/ql/src/semmle/code/csharp/ir/implementation/Opcode.qll index 3b32aac811d..eb07be7f30c 100644 --- a/csharp/ql/src/semmle/code/csharp/ir/implementation/Opcode.qll +++ b/csharp/ql/src/semmle/code/csharp/ir/implementation/Opcode.qll @@ -397,7 +397,7 @@ module Opcode { class AliasedUse extends Opcode, TAliasedUse { final override string toString() { result = "AliasedUse" } } - + class Phi extends Opcode, TPhi { final override string toString() { result = "Phi" } } From 1223388ab6ba91fd4f2e063d7c3a253865d5049f Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Thu, 24 Oct 2019 13:54:21 -0700 Subject: [PATCH 3/5] C++: Fix test expectations --- .../test/library-tests/ir/ir/raw_ir.expected | 438 ++++++++++++------ .../GlobalValueNumbering/ir_gvn.expected | 38 +- 2 files changed, 317 insertions(+), 159 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 3bff2bff690..0977b2a38e0 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -19,7 +19,8 @@ bad_asts.cpp: # 17| v0_15(void) = NoOp : # 14| v0_16(void) = ReturnVoid : # 14| v0_17(void) = UnmodeledUse : mu* -# 14| v0_18(void) = ExitFunction : +# 14| v0_18(void) = AliasedUse : ~mu0_2 +# 14| v0_19(void) = ExitFunction : # 22| void Bad::Point::Point() # 22| Block 0 @@ -30,7 +31,8 @@ bad_asts.cpp: # 23| v0_4(void) = NoOp : # 22| v0_5(void) = ReturnVoid : # 22| v0_6(void) = UnmodeledUse : mu* -# 22| v0_7(void) = ExitFunction : +# 22| v0_7(void) = AliasedUse : ~mu0_2 +# 22| v0_8(void) = ExitFunction : # 26| void Bad::CallCopyConstructor(Bad::Point const&) # 26| Block 0 @@ -48,7 +50,8 @@ bad_asts.cpp: # 28| v0_11(void) = NoOp : # 26| v0_12(void) = ReturnVoid : # 26| v0_13(void) = UnmodeledUse : mu* -# 26| v0_14(void) = ExitFunction : +# 26| v0_14(void) = AliasedUse : ~mu0_2 +# 26| v0_15(void) = ExitFunction : # 30| void Bad::errorExpr() # 30| Block 0 @@ -68,7 +71,8 @@ bad_asts.cpp: # 34| v0_13(void) = NoOp : # 30| v0_14(void) = ReturnVoid : # 30| v0_15(void) = UnmodeledUse : mu* -# 30| v0_16(void) = ExitFunction : +# 30| v0_16(void) = AliasedUse : ~mu0_2 +# 30| v0_17(void) = ExitFunction : clang.cpp: # 5| int* globalIntAddress() @@ -82,7 +86,8 @@ clang.cpp: # 5| r0_6(glval) = VariableAddress[#return] : # 5| v0_7(void) = ReturnValue : &:r0_6, ~mu0_2 # 5| v0_8(void) = UnmodeledUse : mu* -# 5| v0_9(void) = ExitFunction : +# 5| v0_9(void) = AliasedUse : ~mu0_2 +# 5| v0_10(void) = ExitFunction : ir.cpp: # 1| void Constants() @@ -177,7 +182,8 @@ ir.cpp: # 41| v0_87(void) = NoOp : # 1| v0_88(void) = ReturnVoid : # 1| v0_89(void) = UnmodeledUse : mu* -# 1| v0_90(void) = ExitFunction : +# 1| v0_90(void) = AliasedUse : ~mu0_2 +# 1| v0_91(void) = ExitFunction : # 43| void Foo() # 43| Block 0 @@ -210,7 +216,8 @@ ir.cpp: # 48| v0_26(void) = NoOp : # 43| v0_27(void) = ReturnVoid : # 43| v0_28(void) = UnmodeledUse : mu* -# 43| v0_29(void) = ExitFunction : +# 43| v0_29(void) = AliasedUse : ~mu0_2 +# 43| v0_30(void) = ExitFunction : # 50| void IntegerOps(int, int) # 50| Block 0 @@ -383,7 +390,8 @@ ir.cpp: # 85| v0_166(void) = NoOp : # 50| v0_167(void) = ReturnVoid : # 50| v0_168(void) = UnmodeledUse : mu* -# 50| v0_169(void) = ExitFunction : +# 50| v0_169(void) = AliasedUse : ~mu0_2 +# 50| v0_170(void) = ExitFunction : # 87| void IntegerCompare(int, int) # 87| Block 0 @@ -441,7 +449,8 @@ ir.cpp: # 96| v0_51(void) = NoOp : # 87| v0_52(void) = ReturnVoid : # 87| v0_53(void) = UnmodeledUse : mu* -# 87| v0_54(void) = ExitFunction : +# 87| v0_54(void) = AliasedUse : ~mu0_2 +# 87| v0_55(void) = ExitFunction : # 98| void IntegerCrement(int) # 98| Block 0 @@ -483,7 +492,8 @@ ir.cpp: # 105| v0_35(void) = NoOp : # 98| v0_36(void) = ReturnVoid : # 98| v0_37(void) = UnmodeledUse : mu* -# 98| v0_38(void) = ExitFunction : +# 98| v0_38(void) = AliasedUse : ~mu0_2 +# 98| v0_39(void) = ExitFunction : # 107| void IntegerCrement_LValue(int) # 107| Block 0 @@ -511,7 +521,8 @@ ir.cpp: # 112| v0_21(void) = NoOp : # 107| v0_22(void) = ReturnVoid : # 107| v0_23(void) = UnmodeledUse : mu* -# 107| v0_24(void) = ExitFunction : +# 107| v0_24(void) = AliasedUse : ~mu0_2 +# 107| v0_25(void) = ExitFunction : # 114| void FloatOps(double, double) # 114| Block 0 @@ -593,7 +604,8 @@ ir.cpp: # 131| v0_75(void) = NoOp : # 114| v0_76(void) = ReturnVoid : # 114| v0_77(void) = UnmodeledUse : mu* -# 114| v0_78(void) = ExitFunction : +# 114| v0_78(void) = AliasedUse : ~mu0_2 +# 114| v0_79(void) = ExitFunction : # 133| void FloatCompare(double, double) # 133| Block 0 @@ -651,7 +663,8 @@ ir.cpp: # 142| v0_51(void) = NoOp : # 133| v0_52(void) = ReturnVoid : # 133| v0_53(void) = UnmodeledUse : mu* -# 133| v0_54(void) = ExitFunction : +# 133| v0_54(void) = AliasedUse : ~mu0_2 +# 133| v0_55(void) = ExitFunction : # 144| void FloatCrement(float) # 144| Block 0 @@ -693,7 +706,8 @@ ir.cpp: # 151| v0_35(void) = NoOp : # 144| v0_36(void) = ReturnVoid : # 144| v0_37(void) = UnmodeledUse : mu* -# 144| v0_38(void) = ExitFunction : +# 144| v0_38(void) = AliasedUse : ~mu0_2 +# 144| v0_39(void) = ExitFunction : # 153| void PointerOps(int*, int) # 153| Block 0 @@ -769,7 +783,8 @@ ir.cpp: # 169| v0_69(void) = NoOp : # 153| v0_70(void) = ReturnVoid : # 153| v0_71(void) = UnmodeledUse : mu* -# 153| v0_72(void) = ExitFunction : +# 153| v0_72(void) = AliasedUse : ~mu0_2 +# 153| v0_73(void) = ExitFunction : # 171| void ArrayAccess(int*, int) # 171| Block 0 @@ -851,7 +866,8 @@ ir.cpp: # 185| v0_75(void) = NoOp : # 171| v0_76(void) = ReturnVoid : # 171| v0_77(void) = UnmodeledUse : mu* -# 171| v0_78(void) = ExitFunction : +# 171| v0_78(void) = AliasedUse : ~mu0_2 +# 171| v0_79(void) = ExitFunction : # 187| void StringLiteral(int) # 187| Block 0 @@ -884,7 +900,8 @@ ir.cpp: # 191| v0_26(void) = NoOp : # 187| v0_27(void) = ReturnVoid : # 187| v0_28(void) = UnmodeledUse : mu* -# 187| v0_29(void) = ExitFunction : +# 187| v0_29(void) = AliasedUse : ~mu0_2 +# 187| v0_30(void) = ExitFunction : # 193| void PointerCompare(int*, int*) # 193| Block 0 @@ -942,7 +959,8 @@ ir.cpp: # 202| v0_51(void) = NoOp : # 193| v0_52(void) = ReturnVoid : # 193| v0_53(void) = UnmodeledUse : mu* -# 193| v0_54(void) = ExitFunction : +# 193| v0_54(void) = AliasedUse : ~mu0_2 +# 193| v0_55(void) = ExitFunction : # 204| void PointerCrement(int*) # 204| Block 0 @@ -984,7 +1002,8 @@ ir.cpp: # 211| v0_35(void) = NoOp : # 204| v0_36(void) = ReturnVoid : # 204| v0_37(void) = UnmodeledUse : mu* -# 204| v0_38(void) = ExitFunction : +# 204| v0_38(void) = AliasedUse : ~mu0_2 +# 204| v0_39(void) = ExitFunction : # 213| void CompoundAssignment() # 213| Block 0 @@ -1028,7 +1047,8 @@ ir.cpp: # 228| v0_37(void) = NoOp : # 213| v0_38(void) = ReturnVoid : # 213| v0_39(void) = UnmodeledUse : mu* -# 213| v0_40(void) = ExitFunction : +# 213| v0_40(void) = AliasedUse : ~mu0_2 +# 213| v0_41(void) = ExitFunction : # 230| void UninitializedVariables() # 230| Block 0 @@ -1044,7 +1064,8 @@ ir.cpp: # 233| v0_9(void) = NoOp : # 230| v0_10(void) = ReturnVoid : # 230| v0_11(void) = UnmodeledUse : mu* -# 230| v0_12(void) = ExitFunction : +# 230| v0_12(void) = AliasedUse : ~mu0_2 +# 230| v0_13(void) = ExitFunction : # 235| int Parameters(int, int) # 235| Block 0 @@ -1065,7 +1086,8 @@ ir.cpp: # 235| r0_14(glval) = VariableAddress[#return] : # 235| v0_15(void) = ReturnValue : &:r0_14, ~mu0_2 # 235| v0_16(void) = UnmodeledUse : mu* -# 235| v0_17(void) = ExitFunction : +# 235| v0_17(void) = AliasedUse : ~mu0_2 +# 235| v0_18(void) = ExitFunction : # 239| void IfStatements(bool, int, int) # 239| Block 0 @@ -1123,7 +1145,8 @@ ir.cpp: # 251| v6_0(void) = NoOp : # 239| v6_1(void) = ReturnVoid : # 239| v6_2(void) = UnmodeledUse : mu* -# 239| v6_3(void) = ExitFunction : +# 239| v6_3(void) = AliasedUse : ~mu0_2 +# 239| v6_4(void) = ExitFunction : # 240| Block 7 # 240| v7_0(void) = NoOp : @@ -1150,7 +1173,8 @@ ir.cpp: # 257| v2_0(void) = NoOp : # 253| v2_1(void) = ReturnVoid : # 253| v2_2(void) = UnmodeledUse : mu* -# 253| v2_3(void) = ExitFunction : +# 253| v2_3(void) = AliasedUse : ~mu0_2 +# 253| v2_4(void) = ExitFunction : # 254| Block 3 # 254| r3_0(glval) = VariableAddress[n] : @@ -1188,7 +1212,8 @@ ir.cpp: # 263| v2_0(void) = NoOp : # 259| v2_1(void) = ReturnVoid : # 259| v2_2(void) = UnmodeledUse : mu* -# 259| v2_3(void) = ExitFunction : +# 259| v2_3(void) = AliasedUse : ~mu0_2 +# 259| v2_4(void) = ExitFunction : # 265| void For_Empty() # 265| Block 0 @@ -1202,7 +1227,8 @@ ir.cpp: # 265| Block 1 # 265| v1_0(void) = ReturnVoid : # 265| v1_1(void) = UnmodeledUse : mu* -# 265| v1_2(void) = ExitFunction : +# 265| v1_2(void) = AliasedUse : ~mu0_2 +# 265| v1_3(void) = ExitFunction : # 268| Block 2 # 268| v2_0(void) = NoOp : @@ -1221,7 +1247,8 @@ ir.cpp: # 272| Block 1 # 272| v1_0(void) = ReturnVoid : # 272| v1_1(void) = UnmodeledUse : mu* -# 272| v1_2(void) = ExitFunction : +# 272| v1_2(void) = AliasedUse : ~mu0_2 +# 272| v1_3(void) = ExitFunction : # 274| Block 2 # 274| v2_0(void) = NoOp : @@ -1254,7 +1281,8 @@ ir.cpp: # 283| v3_0(void) = NoOp : # 278| v3_1(void) = ReturnVoid : # 278| v3_2(void) = UnmodeledUse : mu* -# 278| v3_3(void) = ExitFunction : +# 278| v3_3(void) = AliasedUse : ~mu0_2 +# 278| v3_4(void) = ExitFunction : # 285| void For_Update() # 285| Block 0 @@ -1269,7 +1297,8 @@ ir.cpp: # 285| Block 1 # 285| v1_0(void) = ReturnVoid : # 285| v1_1(void) = UnmodeledUse : mu* -# 285| v1_2(void) = ExitFunction : +# 285| v1_2(void) = AliasedUse : ~mu0_2 +# 285| v1_3(void) = ExitFunction : # 288| Block 2 # 288| v2_0(void) = NoOp : @@ -1307,7 +1336,8 @@ ir.cpp: # 296| v3_0(void) = NoOp : # 292| v3_1(void) = ReturnVoid : # 292| v3_2(void) = UnmodeledUse : mu* -# 292| v3_3(void) = ExitFunction : +# 292| v3_3(void) = AliasedUse : ~mu0_2 +# 292| v3_4(void) = ExitFunction : # 298| void For_InitUpdate() # 298| Block 0 @@ -1322,7 +1352,8 @@ ir.cpp: # 298| Block 1 # 298| v1_0(void) = ReturnVoid : # 298| v1_1(void) = UnmodeledUse : mu* -# 298| v1_2(void) = ExitFunction : +# 298| v1_2(void) = AliasedUse : ~mu0_2 +# 298| v1_3(void) = ExitFunction : # 300| Block 2 # 300| v2_0(void) = NoOp : @@ -1365,7 +1396,8 @@ ir.cpp: # 309| v3_0(void) = NoOp : # 304| v3_1(void) = ReturnVoid : # 304| v3_2(void) = UnmodeledUse : mu* -# 304| v3_3(void) = ExitFunction : +# 304| v3_3(void) = AliasedUse : ~mu0_2 +# 304| v3_4(void) = ExitFunction : # 311| void For_InitConditionUpdate() # 311| Block 0 @@ -1399,7 +1431,8 @@ ir.cpp: # 315| v3_0(void) = NoOp : # 311| v3_1(void) = ReturnVoid : # 311| v3_2(void) = UnmodeledUse : mu* -# 311| v3_3(void) = ExitFunction : +# 311| v3_3(void) = AliasedUse : ~mu0_2 +# 311| v3_4(void) = ExitFunction : # 317| void For_Break() # 317| Block 0 @@ -1446,7 +1479,8 @@ ir.cpp: # 323| v5_1(void) = NoOp : # 317| v5_2(void) = ReturnVoid : # 317| v5_3(void) = UnmodeledUse : mu* -# 317| v5_4(void) = ExitFunction : +# 317| v5_4(void) = AliasedUse : ~mu0_2 +# 317| v5_5(void) = ExitFunction : # 325| void For_Continue_Update() # 325| Block 0 @@ -1493,7 +1527,8 @@ ir.cpp: # 331| v5_0(void) = NoOp : # 325| v5_1(void) = ReturnVoid : # 325| v5_2(void) = UnmodeledUse : mu* -# 325| v5_3(void) = ExitFunction : +# 325| v5_3(void) = AliasedUse : ~mu0_2 +# 325| v5_4(void) = ExitFunction : # 333| void For_Continue_NoUpdate() # 333| Block 0 @@ -1535,7 +1570,8 @@ ir.cpp: # 339| v5_0(void) = NoOp : # 333| v5_1(void) = ReturnVoid : # 333| v5_2(void) = UnmodeledUse : mu* -# 333| v5_3(void) = ExitFunction : +# 333| v5_3(void) = AliasedUse : ~mu0_2 +# 333| v5_4(void) = ExitFunction : # 341| int Dereference(int*) # 341| Block 0 @@ -1556,7 +1592,8 @@ ir.cpp: # 341| r0_14(glval) = VariableAddress[#return] : # 341| v0_15(void) = ReturnValue : &:r0_14, ~mu0_2 # 341| v0_16(void) = UnmodeledUse : mu* -# 341| v0_17(void) = ExitFunction : +# 341| v0_17(void) = AliasedUse : ~mu0_2 +# 341| v0_18(void) = ExitFunction : # 348| int* AddressOf() # 348| Block 0 @@ -1569,7 +1606,8 @@ ir.cpp: # 348| r0_6(glval) = VariableAddress[#return] : # 348| v0_7(void) = ReturnValue : &:r0_6, ~mu0_2 # 348| v0_8(void) = UnmodeledUse : mu* -# 348| v0_9(void) = ExitFunction : +# 348| v0_9(void) = AliasedUse : ~mu0_2 +# 348| v0_10(void) = ExitFunction : # 352| void Break(int) # 352| Block 0 @@ -1606,7 +1644,8 @@ ir.cpp: # 358| v4_1(void) = NoOp : # 352| v4_2(void) = ReturnVoid : # 352| v4_3(void) = UnmodeledUse : mu* -# 352| v4_4(void) = ExitFunction : +# 352| v4_4(void) = AliasedUse : ~mu0_2 +# 352| v4_5(void) = ExitFunction : # 353| Block 5 # 353| r5_0(glval) = VariableAddress[n] : @@ -1661,7 +1700,8 @@ ir.cpp: # 367| v5_0(void) = NoOp : # 360| v5_1(void) = ReturnVoid : # 360| v5_2(void) = UnmodeledUse : mu* -# 360| v5_3(void) = ExitFunction : +# 360| v5_3(void) = AliasedUse : ~mu0_2 +# 360| v5_4(void) = ExitFunction : # 372| void Call() # 372| Block 0 @@ -1674,7 +1714,8 @@ ir.cpp: # 374| v0_6(void) = NoOp : # 372| v0_7(void) = ReturnVoid : # 372| v0_8(void) = UnmodeledUse : mu* -# 372| v0_9(void) = ExitFunction : +# 372| v0_9(void) = AliasedUse : ~mu0_2 +# 372| v0_10(void) = ExitFunction : # 376| int CallAdd(int, int) # 376| Block 0 @@ -1697,7 +1738,8 @@ ir.cpp: # 376| r0_16(glval) = VariableAddress[#return] : # 376| v0_17(void) = ReturnValue : &:r0_16, ~mu0_2 # 376| v0_18(void) = UnmodeledUse : mu* -# 376| v0_19(void) = ExitFunction : +# 376| v0_19(void) = AliasedUse : ~mu0_2 +# 376| v0_20(void) = ExitFunction : # 380| int Comma(int, int) # 380| Block 0 @@ -1723,7 +1765,8 @@ ir.cpp: # 380| r0_19(glval) = VariableAddress[#return] : # 380| v0_20(void) = ReturnValue : &:r0_19, ~mu0_2 # 380| v0_21(void) = UnmodeledUse : mu* -# 380| v0_22(void) = ExitFunction : +# 380| v0_22(void) = AliasedUse : ~mu0_2 +# 380| v0_23(void) = ExitFunction : # 384| void Switch(int) # 384| Block 0 @@ -1804,7 +1847,8 @@ ir.cpp: # 410| v9_1(void) = NoOp : # 384| v9_2(void) = ReturnVoid : # 384| v9_3(void) = UnmodeledUse : mu* -# 384| v9_4(void) = ExitFunction : +# 384| v9_4(void) = AliasedUse : ~mu0_2 +# 384| v9_5(void) = ExitFunction : # 422| Point ReturnStruct(Point) # 422| Block 0 @@ -1820,7 +1864,8 @@ ir.cpp: # 422| r0_9(glval) = VariableAddress[#return] : # 422| v0_10(void) = ReturnValue : &:r0_9, ~mu0_2 # 422| v0_11(void) = UnmodeledUse : mu* -# 422| v0_12(void) = ExitFunction : +# 422| v0_12(void) = AliasedUse : ~mu0_2 +# 422| v0_13(void) = ExitFunction : # 426| void FieldAccess() # 426| Block 0 @@ -1846,7 +1891,8 @@ ir.cpp: # 431| v0_19(void) = NoOp : # 426| v0_20(void) = ReturnVoid : # 426| v0_21(void) = UnmodeledUse : mu* -# 426| v0_22(void) = ExitFunction : +# 426| v0_22(void) = AliasedUse : ~mu0_2 +# 426| v0_23(void) = ExitFunction : # 433| void LogicalOr(bool, bool) # 433| Block 0 @@ -1908,7 +1954,8 @@ ir.cpp: # 445| v7_0(void) = NoOp : # 433| v7_1(void) = ReturnVoid : # 433| v7_2(void) = UnmodeledUse : mu* -# 433| v7_3(void) = ExitFunction : +# 433| v7_3(void) = AliasedUse : ~mu0_2 +# 433| v7_4(void) = ExitFunction : # 447| void LogicalAnd(bool, bool) # 447| Block 0 @@ -1970,7 +2017,8 @@ ir.cpp: # 459| v7_0(void) = NoOp : # 447| v7_1(void) = ReturnVoid : # 447| v7_2(void) = UnmodeledUse : mu* -# 447| v7_3(void) = ExitFunction : +# 447| v7_3(void) = AliasedUse : ~mu0_2 +# 447| v7_4(void) = ExitFunction : # 461| void LogicalNot(bool, bool) # 461| Block 0 @@ -2025,7 +2073,8 @@ ir.cpp: # 473| v6_0(void) = NoOp : # 461| v6_1(void) = ReturnVoid : # 461| v6_2(void) = UnmodeledUse : mu* -# 461| v6_3(void) = ExitFunction : +# 461| v6_3(void) = AliasedUse : ~mu0_2 +# 461| v6_4(void) = ExitFunction : # 475| void ConditionValues(bool, bool) # 475| Block 0 @@ -2096,7 +2145,8 @@ ir.cpp: # 480| v7_5(void) = NoOp : # 475| v7_6(void) = ReturnVoid : # 475| v7_7(void) = UnmodeledUse : mu* -# 475| v7_8(void) = ExitFunction : +# 475| v7_8(void) = AliasedUse : ~mu0_2 +# 475| v7_9(void) = ExitFunction : # 479| Block 8 # 479| r8_0(glval) = VariableAddress[#temp479:11] : @@ -2173,7 +2223,8 @@ ir.cpp: # 484| v3_3(void) = NoOp : # 482| v3_4(void) = ReturnVoid : # 482| v3_5(void) = UnmodeledUse : mu* -# 482| v3_6(void) = ExitFunction : +# 482| v3_6(void) = AliasedUse : ~mu0_2 +# 482| v3_7(void) = ExitFunction : # 486| void Conditional_LValue(bool) # 486| Block 0 @@ -2200,7 +2251,8 @@ ir.cpp: # 490| v1_3(void) = NoOp : # 486| v1_4(void) = ReturnVoid : # 486| v1_5(void) = UnmodeledUse : mu* -# 486| v1_6(void) = ExitFunction : +# 486| v1_6(void) = AliasedUse : ~mu0_2 +# 486| v1_7(void) = ExitFunction : # 489| Block 2 # 489| r2_0(glval) = VariableAddress[x] : @@ -2231,7 +2283,8 @@ ir.cpp: # 494| v1_0(void) = NoOp : # 492| v1_1(void) = ReturnVoid : # 492| v1_2(void) = UnmodeledUse : mu* -# 492| v1_3(void) = ExitFunction : +# 492| v1_3(void) = AliasedUse : ~mu0_2 +# 492| v1_4(void) = ExitFunction : # 493| Block 2 # 493| r2_0(glval) = FunctionAddress[VoidFunc] : @@ -2265,7 +2318,8 @@ ir.cpp: # 501| v0_15(void) = NoOp : # 496| v0_16(void) = ReturnVoid : # 496| v0_17(void) = UnmodeledUse : mu* -# 496| v0_18(void) = ExitFunction : +# 496| v0_18(void) = AliasedUse : ~mu0_2 +# 496| v0_19(void) = ExitFunction : # 503| void InitList(int, float) # 503| Block 0 @@ -2313,7 +2367,8 @@ ir.cpp: # 510| v0_41(void) = NoOp : # 503| v0_42(void) = ReturnVoid : # 503| v0_43(void) = UnmodeledUse : mu* -# 503| v0_44(void) = ExitFunction : +# 503| v0_44(void) = AliasedUse : ~mu0_2 +# 503| v0_45(void) = ExitFunction : # 512| void NestedInitList(int, float) # 512| Block 0 @@ -2390,7 +2445,8 @@ ir.cpp: # 517| v0_70(void) = NoOp : # 512| v0_71(void) = ReturnVoid : # 512| v0_72(void) = UnmodeledUse : mu* -# 512| v0_73(void) = ExitFunction : +# 512| v0_73(void) = AliasedUse : ~mu0_2 +# 512| v0_74(void) = ExitFunction : # 519| void ArrayInit(int, float) # 519| Block 0 @@ -2438,7 +2494,8 @@ ir.cpp: # 523| v0_41(void) = NoOp : # 519| v0_42(void) = ReturnVoid : # 519| v0_43(void) = UnmodeledUse : mu* -# 519| v0_44(void) = ExitFunction : +# 519| v0_44(void) = AliasedUse : ~mu0_2 +# 519| v0_45(void) = ExitFunction : # 530| void UnionInit(int, float) # 530| Block 0 @@ -2459,7 +2516,8 @@ ir.cpp: # 533| v0_14(void) = NoOp : # 530| v0_15(void) = ReturnVoid : # 530| v0_16(void) = UnmodeledUse : mu* -# 530| v0_17(void) = ExitFunction : +# 530| v0_17(void) = AliasedUse : ~mu0_2 +# 530| v0_18(void) = ExitFunction : # 535| void EarlyReturn(int, int) # 535| Block 0 @@ -2482,7 +2540,8 @@ ir.cpp: # 535| Block 1 # 535| v1_0(void) = ReturnVoid : # 535| v1_1(void) = UnmodeledUse : mu* -# 535| v1_2(void) = ExitFunction : +# 535| v1_2(void) = AliasedUse : ~mu0_2 +# 535| v1_3(void) = ExitFunction : # 537| Block 2 # 537| v2_0(void) = NoOp : @@ -2518,7 +2577,8 @@ ir.cpp: # 543| r1_0(glval) = VariableAddress[#return] : # 543| v1_1(void) = ReturnValue : &:r1_0, ~mu0_2 # 543| v1_2(void) = UnmodeledUse : mu* -# 543| v1_3(void) = ExitFunction : +# 543| v1_3(void) = AliasedUse : ~mu0_2 +# 543| v1_4(void) = ExitFunction : # 545| Block 2 # 545| r2_0(glval) = VariableAddress[#return] : @@ -2554,7 +2614,8 @@ ir.cpp: # 551| r0_12(glval) = VariableAddress[#return] : # 551| v0_13(void) = ReturnValue : &:r0_12, ~mu0_2 # 551| v0_14(void) = UnmodeledUse : mu* -# 551| v0_15(void) = ExitFunction : +# 551| v0_15(void) = AliasedUse : ~mu0_2 +# 551| v0_16(void) = ExitFunction : # 560| int EnumSwitch(E) # 560| Block 0 @@ -2575,7 +2636,8 @@ ir.cpp: # 560| r1_0(glval) = VariableAddress[#return] : # 560| v1_1(void) = ReturnValue : &:r1_0, ~mu0_2 # 560| v1_2(void) = UnmodeledUse : mu* -# 560| v1_3(void) = ExitFunction : +# 560| v1_3(void) = AliasedUse : ~mu0_2 +# 560| v1_4(void) = ExitFunction : # 564| Block 2 # 564| v2_0(void) = NoOp : @@ -2660,7 +2722,8 @@ ir.cpp: # 580| v0_57(void) = NoOp : # 571| v0_58(void) = ReturnVoid : # 571| v0_59(void) = UnmodeledUse : mu* -# 571| v0_60(void) = ExitFunction : +# 571| v0_60(void) = AliasedUse : ~mu0_2 +# 571| v0_61(void) = ExitFunction : # 584| void VarArgs() # 584| Block 0 @@ -2682,7 +2745,8 @@ ir.cpp: # 586| v0_15(void) = NoOp : # 584| v0_16(void) = ReturnVoid : # 584| v0_17(void) = UnmodeledUse : mu* -# 584| v0_18(void) = ExitFunction : +# 584| v0_18(void) = AliasedUse : ~mu0_2 +# 584| v0_19(void) = ExitFunction : # 590| void SetFuncPtr() # 590| Block 0 @@ -2704,7 +2768,8 @@ ir.cpp: # 595| v0_15(void) = NoOp : # 590| v0_16(void) = ReturnVoid : # 590| v0_17(void) = UnmodeledUse : mu* -# 590| v0_18(void) = ExitFunction : +# 590| v0_18(void) = AliasedUse : ~mu0_2 +# 590| v0_19(void) = ExitFunction : # 615| void DeclareObject() # 615| Block 0 @@ -2739,7 +2804,8 @@ ir.cpp: # 620| v0_28(void) = NoOp : # 615| v0_29(void) = ReturnVoid : # 615| v0_30(void) = UnmodeledUse : mu* -# 615| v0_31(void) = ExitFunction : +# 615| v0_31(void) = AliasedUse : ~mu0_2 +# 615| v0_32(void) = ExitFunction : # 622| void CallMethods(String&, String*, String) # 622| Block 0 @@ -2778,7 +2844,8 @@ ir.cpp: # 626| v0_32(void) = NoOp : # 622| v0_33(void) = ReturnVoid : # 622| v0_34(void) = UnmodeledUse : mu* -# 622| v0_35(void) = ExitFunction : +# 622| v0_35(void) = AliasedUse : ~mu0_2 +# 622| v0_36(void) = ExitFunction : # 630| int C::StaticMemberFunction(int) # 630| Block 0 @@ -2794,7 +2861,8 @@ ir.cpp: # 630| r0_9(glval) = VariableAddress[#return] : # 630| v0_10(void) = ReturnValue : &:r0_9, ~mu0_2 # 630| v0_11(void) = UnmodeledUse : mu* -# 630| v0_12(void) = ExitFunction : +# 630| v0_12(void) = AliasedUse : ~mu0_2 +# 630| v0_13(void) = ExitFunction : # 634| int C::InstanceMemberFunction(int) # 634| Block 0 @@ -2811,7 +2879,8 @@ ir.cpp: # 634| r0_10(glval) = VariableAddress[#return] : # 634| v0_11(void) = ReturnValue : &:r0_10, ~mu0_2 # 634| v0_12(void) = UnmodeledUse : mu* -# 634| v0_13(void) = ExitFunction : +# 634| v0_13(void) = AliasedUse : ~mu0_2 +# 634| v0_14(void) = ExitFunction : # 638| int C::VirtualMemberFunction(int) # 638| Block 0 @@ -2828,7 +2897,8 @@ ir.cpp: # 638| r0_10(glval) = VariableAddress[#return] : # 638| v0_11(void) = ReturnValue : &:r0_10, ~mu0_2 # 638| v0_12(void) = UnmodeledUse : mu* -# 638| v0_13(void) = ExitFunction : +# 638| v0_13(void) = AliasedUse : ~mu0_2 +# 638| v0_14(void) = ExitFunction : # 642| void C::FieldAccess() # 642| Block 0 @@ -2868,7 +2938,8 @@ ir.cpp: # 650| v0_33(void) = NoOp : # 642| v0_34(void) = ReturnVoid : # 642| v0_35(void) = UnmodeledUse : mu* -# 642| v0_36(void) = ExitFunction : +# 642| v0_36(void) = AliasedUse : ~mu0_2 +# 642| v0_37(void) = ExitFunction : # 652| void C::MethodCalls() # 652| Block 0 @@ -2900,7 +2971,8 @@ ir.cpp: # 656| v0_25(void) = NoOp : # 652| v0_26(void) = ReturnVoid : # 652| v0_27(void) = UnmodeledUse : mu* -# 652| v0_28(void) = ExitFunction : +# 652| v0_28(void) = AliasedUse : ~mu0_2 +# 652| v0_29(void) = ExitFunction : # 658| void C::C() # 658| Block 0 @@ -2932,7 +3004,8 @@ ir.cpp: # 664| v0_25(void) = NoOp : # 658| v0_26(void) = ReturnVoid : # 658| v0_27(void) = UnmodeledUse : mu* -# 658| v0_28(void) = ExitFunction : +# 658| v0_28(void) = AliasedUse : ~mu0_2 +# 658| v0_29(void) = ExitFunction : # 675| int DerefReference(int&) # 675| Block 0 @@ -2949,7 +3022,8 @@ ir.cpp: # 675| r0_10(glval) = VariableAddress[#return] : # 675| v0_11(void) = ReturnValue : &:r0_10, ~mu0_2 # 675| v0_12(void) = UnmodeledUse : mu* -# 675| v0_13(void) = ExitFunction : +# 675| v0_13(void) = AliasedUse : ~mu0_2 +# 675| v0_14(void) = ExitFunction : # 679| int& TakeReference() # 679| Block 0 @@ -2962,7 +3036,8 @@ ir.cpp: # 679| r0_6(glval) = VariableAddress[#return] : # 679| v0_7(void) = ReturnValue : &:r0_6, ~mu0_2 # 679| v0_8(void) = UnmodeledUse : mu* -# 679| v0_9(void) = ExitFunction : +# 679| v0_9(void) = AliasedUse : ~mu0_2 +# 679| v0_10(void) = ExitFunction : # 685| void InitReference(int) # 685| Block 0 @@ -2987,7 +3062,8 @@ ir.cpp: # 689| v0_18(void) = NoOp : # 685| v0_19(void) = ReturnVoid : # 685| v0_20(void) = UnmodeledUse : mu* -# 685| v0_21(void) = ExitFunction : +# 685| v0_21(void) = AliasedUse : ~mu0_2 +# 685| v0_22(void) = ExitFunction : # 691| void ArrayReferences() # 691| Block 0 @@ -3010,7 +3086,8 @@ ir.cpp: # 695| v0_16(void) = NoOp : # 691| v0_17(void) = ReturnVoid : # 691| v0_18(void) = UnmodeledUse : mu* -# 691| v0_19(void) = ExitFunction : +# 691| v0_19(void) = AliasedUse : ~mu0_2 +# 691| v0_20(void) = ExitFunction : # 697| void FunctionReferences() # 697| Block 0 @@ -3032,7 +3109,8 @@ ir.cpp: # 701| v0_15(void) = NoOp : # 697| v0_16(void) = ReturnVoid : # 697| v0_17(void) = UnmodeledUse : mu* -# 697| v0_18(void) = ExitFunction : +# 697| v0_18(void) = AliasedUse : ~mu0_2 +# 697| v0_19(void) = ExitFunction : # 704| int min(int, int) # 704| Block 0 @@ -3074,7 +3152,8 @@ ir.cpp: # 704| r3_3(glval) = VariableAddress[#return] : # 704| v3_4(void) = ReturnValue : &:r3_3, ~mu0_2 # 704| v3_5(void) = UnmodeledUse : mu* -# 704| v3_6(void) = ExitFunction : +# 704| v3_6(void) = AliasedUse : ~mu0_2 +# 704| v3_7(void) = ExitFunction : # 708| int CallMin(int, int) # 708| Block 0 @@ -3097,7 +3176,8 @@ ir.cpp: # 708| r0_16(glval) = VariableAddress[#return] : # 708| v0_17(void) = ReturnValue : &:r0_16, ~mu0_2 # 708| v0_18(void) = UnmodeledUse : mu* -# 708| v0_19(void) = ExitFunction : +# 708| v0_19(void) = AliasedUse : ~mu0_2 +# 708| v0_20(void) = ExitFunction : # 715| long Outer::Func(void*, char) # 715| Block 0 @@ -3114,7 +3194,8 @@ ir.cpp: # 715| r0_10(glval) = VariableAddress[#return] : # 715| v0_11(void) = ReturnValue : &:r0_10, ~mu0_2 # 715| v0_12(void) = UnmodeledUse : mu* -# 715| v0_13(void) = ExitFunction : +# 715| v0_13(void) = AliasedUse : ~mu0_2 +# 715| v0_14(void) = ExitFunction : # 720| double CallNestedTemplateFunc() # 720| Block 0 @@ -3134,7 +3215,8 @@ ir.cpp: # 720| r0_13(glval) = VariableAddress[#return] : # 720| v0_14(void) = ReturnValue : &:r0_13, ~mu0_2 # 720| v0_15(void) = UnmodeledUse : mu* -# 720| v0_16(void) = ExitFunction : +# 720| v0_16(void) = AliasedUse : ~mu0_2 +# 720| v0_17(void) = ExitFunction : # 724| void TryCatch(bool) # 724| Block 0 @@ -3154,7 +3236,8 @@ ir.cpp: # 724| Block 1 # 724| v1_0(void) = UnmodeledUse : mu* -# 724| v1_1(void) = ExitFunction : +# 724| v1_1(void) = AliasedUse : ~mu0_2 +# 724| v1_2(void) = ExitFunction : # 724| Block 2 # 724| v2_0(void) = Unwind : @@ -3278,7 +3361,8 @@ ir.cpp: # 745| r0_21(glval) = VariableAddress[#return] : # 745| v0_22(void) = ReturnValue : &:r0_21, ~mu0_2 # 745| v0_23(void) = UnmodeledUse : mu* -# 745| v0_24(void) = ExitFunction : +# 745| v0_24(void) = AliasedUse : ~mu0_2 +# 745| v0_25(void) = ExitFunction : # 745| void Base::Base(Base const&) # 745| Block 0 @@ -3295,7 +3379,8 @@ ir.cpp: # 745| v0_10(void) = NoOp : # 745| v0_11(void) = ReturnVoid : # 745| v0_12(void) = UnmodeledUse : mu* -# 745| v0_13(void) = ExitFunction : +# 745| v0_13(void) = AliasedUse : ~mu0_2 +# 745| v0_14(void) = ExitFunction : # 748| void Base::Base() # 748| Block 0 @@ -3310,7 +3395,8 @@ ir.cpp: # 749| v0_8(void) = NoOp : # 748| v0_9(void) = ReturnVoid : # 748| v0_10(void) = UnmodeledUse : mu* -# 748| v0_11(void) = ExitFunction : +# 748| v0_11(void) = AliasedUse : ~mu0_2 +# 748| v0_12(void) = ExitFunction : # 750| void Base::~Base() # 750| Block 0 @@ -3325,7 +3411,8 @@ ir.cpp: # 751| mu0_8(unknown) = ^CallSideEffect : ~mu0_2 # 750| v0_9(void) = ReturnVoid : # 750| v0_10(void) = UnmodeledUse : mu* -# 750| v0_11(void) = ExitFunction : +# 750| v0_11(void) = AliasedUse : ~mu0_2 +# 750| v0_12(void) = ExitFunction : # 754| Middle& Middle::operator=(Middle const&) # 754| Block 0 @@ -3365,7 +3452,8 @@ ir.cpp: # 754| r0_33(glval) = VariableAddress[#return] : # 754| v0_34(void) = ReturnValue : &:r0_33, ~mu0_2 # 754| v0_35(void) = UnmodeledUse : mu* -# 754| v0_36(void) = ExitFunction : +# 754| v0_36(void) = AliasedUse : ~mu0_2 +# 754| v0_37(void) = ExitFunction : # 757| void Middle::Middle() # 757| Block 0 @@ -3384,7 +3472,8 @@ ir.cpp: # 758| v0_12(void) = NoOp : # 757| v0_13(void) = ReturnVoid : # 757| v0_14(void) = UnmodeledUse : mu* -# 757| v0_15(void) = ExitFunction : +# 757| v0_15(void) = AliasedUse : ~mu0_2 +# 757| v0_16(void) = ExitFunction : # 759| void Middle::~Middle() # 759| Block 0 @@ -3403,7 +3492,8 @@ ir.cpp: # 760| mu0_12(unknown) = ^CallSideEffect : ~mu0_2 # 759| v0_13(void) = ReturnVoid : # 759| v0_14(void) = UnmodeledUse : mu* -# 759| v0_15(void) = ExitFunction : +# 759| v0_15(void) = AliasedUse : ~mu0_2 +# 759| v0_16(void) = ExitFunction : # 763| Derived& Derived::operator=(Derived const&) # 763| Block 0 @@ -3443,7 +3533,8 @@ ir.cpp: # 763| r0_33(glval) = VariableAddress[#return] : # 763| v0_34(void) = ReturnValue : &:r0_33, ~mu0_2 # 763| v0_35(void) = UnmodeledUse : mu* -# 763| v0_36(void) = ExitFunction : +# 763| v0_36(void) = AliasedUse : ~mu0_2 +# 763| v0_37(void) = ExitFunction : # 766| void Derived::Derived() # 766| Block 0 @@ -3462,7 +3553,8 @@ ir.cpp: # 767| v0_12(void) = NoOp : # 766| v0_13(void) = ReturnVoid : # 766| v0_14(void) = UnmodeledUse : mu* -# 766| v0_15(void) = ExitFunction : +# 766| v0_15(void) = AliasedUse : ~mu0_2 +# 766| v0_16(void) = ExitFunction : # 768| void Derived::~Derived() # 768| Block 0 @@ -3481,7 +3573,8 @@ ir.cpp: # 769| mu0_12(unknown) = ^CallSideEffect : ~mu0_2 # 768| v0_13(void) = ReturnVoid : # 768| v0_14(void) = UnmodeledUse : mu* -# 768| v0_15(void) = ExitFunction : +# 768| v0_15(void) = AliasedUse : ~mu0_2 +# 768| v0_16(void) = ExitFunction : # 775| void MiddleVB1::MiddleVB1() # 775| Block 0 @@ -3500,7 +3593,8 @@ ir.cpp: # 776| v0_12(void) = NoOp : # 775| v0_13(void) = ReturnVoid : # 775| v0_14(void) = UnmodeledUse : mu* -# 775| v0_15(void) = ExitFunction : +# 775| v0_15(void) = AliasedUse : ~mu0_2 +# 775| v0_16(void) = ExitFunction : # 777| void MiddleVB1::~MiddleVB1() # 777| Block 0 @@ -3519,7 +3613,8 @@ ir.cpp: # 778| mu0_12(unknown) = ^CallSideEffect : ~mu0_2 # 777| v0_13(void) = ReturnVoid : # 777| v0_14(void) = UnmodeledUse : mu* -# 777| v0_15(void) = ExitFunction : +# 777| v0_15(void) = AliasedUse : ~mu0_2 +# 777| v0_16(void) = ExitFunction : # 784| void MiddleVB2::MiddleVB2() # 784| Block 0 @@ -3538,7 +3633,8 @@ ir.cpp: # 785| v0_12(void) = NoOp : # 784| v0_13(void) = ReturnVoid : # 784| v0_14(void) = UnmodeledUse : mu* -# 784| v0_15(void) = ExitFunction : +# 784| v0_15(void) = AliasedUse : ~mu0_2 +# 784| v0_16(void) = ExitFunction : # 786| void MiddleVB2::~MiddleVB2() # 786| Block 0 @@ -3557,7 +3653,8 @@ ir.cpp: # 787| mu0_12(unknown) = ^CallSideEffect : ~mu0_2 # 786| v0_13(void) = ReturnVoid : # 786| v0_14(void) = UnmodeledUse : mu* -# 786| v0_15(void) = ExitFunction : +# 786| v0_15(void) = AliasedUse : ~mu0_2 +# 786| v0_16(void) = ExitFunction : # 793| void DerivedVB::DerivedVB() # 793| Block 0 @@ -3584,7 +3681,8 @@ ir.cpp: # 794| v0_20(void) = NoOp : # 793| v0_21(void) = ReturnVoid : # 793| v0_22(void) = UnmodeledUse : mu* -# 793| v0_23(void) = ExitFunction : +# 793| v0_23(void) = AliasedUse : ~mu0_2 +# 793| v0_24(void) = ExitFunction : # 795| void DerivedVB::~DerivedVB() # 795| Block 0 @@ -3611,7 +3709,8 @@ ir.cpp: # 796| mu0_20(unknown) = ^CallSideEffect : ~mu0_2 # 795| v0_21(void) = ReturnVoid : # 795| v0_22(void) = UnmodeledUse : mu* -# 795| v0_23(void) = ExitFunction : +# 795| v0_23(void) = AliasedUse : ~mu0_2 +# 795| v0_24(void) = ExitFunction : # 799| void HierarchyConversions() # 799| Block 0 @@ -3866,7 +3965,8 @@ ir.cpp: # 840| v0_248(void) = NoOp : # 799| v0_249(void) = ReturnVoid : # 799| v0_250(void) = UnmodeledUse : mu* -# 799| v0_251(void) = ExitFunction : +# 799| v0_251(void) = AliasedUse : ~mu0_2 +# 799| v0_252(void) = ExitFunction : # 842| void PolymorphicBase::PolymorphicBase() # 842| Block 0 @@ -3877,7 +3977,8 @@ ir.cpp: # 842| v0_4(void) = NoOp : # 842| v0_5(void) = ReturnVoid : # 842| v0_6(void) = UnmodeledUse : mu* -# 842| v0_7(void) = ExitFunction : +# 842| v0_7(void) = AliasedUse : ~mu0_2 +# 842| v0_8(void) = ExitFunction : # 846| void PolymorphicDerived::PolymorphicDerived() # 846| Block 0 @@ -3892,7 +3993,8 @@ ir.cpp: # 846| v0_8(void) = NoOp : # 846| v0_9(void) = ReturnVoid : # 846| v0_10(void) = UnmodeledUse : mu* -# 846| v0_11(void) = ExitFunction : +# 846| v0_11(void) = AliasedUse : ~mu0_2 +# 846| v0_12(void) = ExitFunction : # 846| void PolymorphicDerived::~PolymorphicDerived() # 846| Block 0 @@ -3907,7 +4009,8 @@ ir.cpp: # 846| mu0_8(unknown) = ^CallSideEffect : ~mu0_2 # 846| v0_9(void) = ReturnVoid : # 846| v0_10(void) = UnmodeledUse : mu* -# 846| v0_11(void) = ExitFunction : +# 846| v0_11(void) = AliasedUse : ~mu0_2 +# 846| v0_12(void) = ExitFunction : # 849| void DynamicCast() # 849| Block 0 @@ -3959,7 +4062,8 @@ ir.cpp: # 865| v0_45(void) = NoOp : # 849| v0_46(void) = ReturnVoid : # 849| v0_47(void) = UnmodeledUse : mu* -# 849| v0_48(void) = ExitFunction : +# 849| v0_48(void) = AliasedUse : ~mu0_2 +# 849| v0_49(void) = ExitFunction : # 867| void String::String() # 867| Block 0 @@ -3977,7 +4081,8 @@ ir.cpp: # 869| v0_11(void) = NoOp : # 867| v0_12(void) = ReturnVoid : # 867| v0_13(void) = UnmodeledUse : mu* -# 867| v0_14(void) = ExitFunction : +# 867| v0_14(void) = AliasedUse : ~mu0_2 +# 867| v0_15(void) = ExitFunction : # 871| void ArrayConversions() # 871| Block 0 @@ -4024,7 +4129,8 @@ ir.cpp: # 881| v0_40(void) = NoOp : # 871| v0_41(void) = ReturnVoid : # 871| v0_42(void) = UnmodeledUse : mu* -# 871| v0_43(void) = ExitFunction : +# 871| v0_43(void) = AliasedUse : ~mu0_2 +# 871| v0_44(void) = ExitFunction : # 883| void FuncPtrConversions(int(*)(int), void*) # 883| Block 0 @@ -4048,7 +4154,8 @@ ir.cpp: # 886| v0_17(void) = NoOp : # 883| v0_18(void) = ReturnVoid : # 883| v0_19(void) = UnmodeledUse : mu* -# 883| v0_20(void) = ExitFunction : +# 883| v0_20(void) = AliasedUse : ~mu0_2 +# 883| v0_21(void) = ExitFunction : # 888| void VarArgUsage(int) # 888| Block 0 @@ -4092,7 +4199,8 @@ ir.cpp: # 898| v0_37(void) = NoOp : # 888| v0_38(void) = ReturnVoid : # 888| v0_39(void) = UnmodeledUse : mu* -# 888| v0_40(void) = ExitFunction : +# 888| v0_40(void) = AliasedUse : ~mu0_2 +# 888| v0_41(void) = ExitFunction : # 900| void CastToVoid(int) # 900| Block 0 @@ -4106,7 +4214,8 @@ ir.cpp: # 902| v0_7(void) = NoOp : # 900| v0_8(void) = ReturnVoid : # 900| v0_9(void) = UnmodeledUse : mu* -# 900| v0_10(void) = ExitFunction : +# 900| v0_10(void) = AliasedUse : ~mu0_2 +# 900| v0_11(void) = ExitFunction : # 904| void ConstantConditions(int) # 904| Block 0 @@ -4131,7 +4240,8 @@ ir.cpp: # 907| v1_3(void) = NoOp : # 904| v1_4(void) = ReturnVoid : # 904| v1_5(void) = UnmodeledUse : mu* -# 904| v1_6(void) = ExitFunction : +# 904| v1_6(void) = AliasedUse : ~mu0_2 +# 904| v1_7(void) = ExitFunction : # 906| Block 2 # 906| r2_0(glval) = VariableAddress[x] : @@ -4209,7 +4319,8 @@ ir.cpp: # 948| v0_57(void) = NoOp : # 940| v0_58(void) = ReturnVoid : # 940| v0_59(void) = UnmodeledUse : mu* -# 940| v0_60(void) = ExitFunction : +# 940| v0_60(void) = AliasedUse : ~mu0_2 +# 940| v0_61(void) = ExitFunction : # 950| void OperatorNewArray(int) # 950| Block 0 @@ -4289,7 +4400,8 @@ ir.cpp: # 959| v0_73(void) = NoOp : # 950| v0_74(void) = ReturnVoid : # 950| v0_75(void) = UnmodeledUse : mu* -# 950| v0_76(void) = ExitFunction : +# 950| v0_76(void) = AliasedUse : ~mu0_2 +# 950| v0_77(void) = ExitFunction : # 961| int designatedInit() # 961| Block 0 @@ -4328,7 +4440,8 @@ ir.cpp: # 961| r0_32(glval) = VariableAddress[#return] : # 961| v0_33(void) = ReturnValue : &:r0_32, ~mu0_2 # 961| v0_34(void) = UnmodeledUse : mu* -# 961| v0_35(void) = ExitFunction : +# 961| v0_35(void) = AliasedUse : ~mu0_2 +# 961| v0_36(void) = ExitFunction : # 966| void IfStmtWithDeclaration(int, int) # 966| Block 0 @@ -4403,7 +4516,8 @@ ir.cpp: # 976| v6_0(void) = NoOp : # 966| v6_1(void) = ReturnVoid : # 966| v6_2(void) = UnmodeledUse : mu* -# 966| v6_3(void) = ExitFunction : +# 966| v6_3(void) = AliasedUse : ~mu0_2 +# 966| v6_4(void) = ExitFunction : # 978| void WhileStmtWithDeclaration(int, int) # 978| Block 0 @@ -4460,7 +4574,8 @@ ir.cpp: # 985| v6_0(void) = NoOp : # 978| v6_1(void) = ReturnVoid : # 978| v6_2(void) = UnmodeledUse : mu* -# 978| v6_3(void) = ExitFunction : +# 978| v6_3(void) = AliasedUse : ~mu0_2 +# 978| v6_4(void) = ExitFunction : # 979| Block 7 # 979| r7_0(glval) = VariableAddress[b] : @@ -4501,7 +4616,8 @@ ir.cpp: # 987| r0_20(glval) = VariableAddress[#return] : # 987| v0_21(void) = ReturnValue : &:r0_20, ~mu0_2 # 987| v0_22(void) = UnmodeledUse : mu* -# 987| v0_23(void) = ExitFunction : +# 987| v0_23(void) = AliasedUse : ~mu0_2 +# 987| v0_24(void) = ExitFunction : # 991| int ExprStmt(int, int, int) # 991| Block 0 @@ -4552,7 +4668,8 @@ ir.cpp: # 991| r3_9(glval) = VariableAddress[#return] : # 991| v3_10(void) = ReturnValue : &:r3_9, ~mu0_2 # 991| v3_11(void) = UnmodeledUse : mu* -# 991| v3_12(void) = ExitFunction : +# 991| v3_12(void) = AliasedUse : ~mu0_2 +# 991| v3_13(void) = ExitFunction : # 1006| void OperatorDelete() # 1006| Block 0 @@ -4572,7 +4689,8 @@ ir.cpp: # 1012| v0_13(void) = NoOp : # 1006| v0_14(void) = ReturnVoid : # 1006| v0_15(void) = UnmodeledUse : mu* -# 1006| v0_16(void) = ExitFunction : +# 1006| v0_16(void) = AliasedUse : ~mu0_2 +# 1006| v0_17(void) = ExitFunction : # 1015| void OperatorDeleteArray() # 1015| Block 0 @@ -4592,7 +4710,8 @@ ir.cpp: # 1021| v0_13(void) = NoOp : # 1015| v0_14(void) = ReturnVoid : # 1015| v0_15(void) = UnmodeledUse : mu* -# 1015| v0_16(void) = ExitFunction : +# 1015| v0_16(void) = AliasedUse : ~mu0_2 +# 1015| v0_17(void) = ExitFunction : # 1025| void EmptyStructInit() # 1025| Block 0 @@ -4604,7 +4723,8 @@ ir.cpp: # 1027| v0_5(void) = NoOp : # 1025| v0_6(void) = ReturnVoid : # 1025| v0_7(void) = UnmodeledUse : mu* -# 1025| v0_8(void) = ExitFunction : +# 1025| v0_8(void) = AliasedUse : ~mu0_2 +# 1025| v0_9(void) = ExitFunction : # 1029| void (lambda [] type at line 1029, col. 12)::(constructor)((lambda [] type at line 1029, col. 12)&&) # 1029| Block 0 @@ -4617,7 +4737,8 @@ ir.cpp: # 1029| v0_6(void) = NoOp : # 1029| v0_7(void) = ReturnVoid : # 1029| v0_8(void) = UnmodeledUse : mu* -# 1029| v0_9(void) = ExitFunction : +# 1029| v0_9(void) = AliasedUse : ~mu0_2 +# 1029| v0_10(void) = ExitFunction : # 1029| void (lambda [] type at line 1029, col. 12)::operator()() const # 1029| Block 0 @@ -4628,7 +4749,8 @@ ir.cpp: # 1029| v0_4(void) = NoOp : # 1029| v0_5(void) = ReturnVoid : # 1029| v0_6(void) = UnmodeledUse : mu* -# 1029| v0_7(void) = ExitFunction : +# 1029| v0_7(void) = AliasedUse : ~mu0_2 +# 1029| v0_8(void) = ExitFunction : # 1029| void(* (lambda [] type at line 1029, col. 12)::operator void (*)()() const)() # 1029| Block 0 @@ -4642,7 +4764,8 @@ ir.cpp: # 1029| r0_7(glval<..(*)(..)>) = VariableAddress[#return] : # 1029| v0_8(void) = ReturnValue : &:r0_7, ~mu0_2 # 1029| v0_9(void) = UnmodeledUse : mu* -# 1029| v0_10(void) = ExitFunction : +# 1029| v0_10(void) = AliasedUse : ~mu0_2 +# 1029| v0_11(void) = ExitFunction : # 1031| void Lambda(int, String const&) # 1031| Block 0 @@ -4802,7 +4925,8 @@ ir.cpp: # 1047| v0_153(void) = NoOp : # 1031| v0_154(void) = ReturnVoid : # 1031| v0_155(void) = UnmodeledUse : mu* -# 1031| v0_156(void) = ExitFunction : +# 1031| v0_156(void) = AliasedUse : ~mu0_2 +# 1031| v0_157(void) = ExitFunction : # 1032| void (void Lambda(int, String const&))::(lambda [] type at line 1032, col. 23)::(constructor)((void Lambda(int, String const&))::(lambda [] type at line 1032, col. 23)&&) # 1032| Block 0 @@ -4815,7 +4939,8 @@ ir.cpp: # 1032| v0_6(void) = NoOp : # 1032| v0_7(void) = ReturnVoid : # 1032| v0_8(void) = UnmodeledUse : mu* -# 1032| v0_9(void) = ExitFunction : +# 1032| v0_9(void) = AliasedUse : ~mu0_2 +# 1032| v0_10(void) = ExitFunction : # 1032| char (void Lambda(int, String const&))::(lambda [] type at line 1032, col. 23)::operator()(float) const # 1032| Block 0 @@ -4831,7 +4956,8 @@ ir.cpp: # 1032| r0_9(glval) = VariableAddress[#return] : # 1032| v0_10(void) = ReturnValue : &:r0_9, ~mu0_2 # 1032| v0_11(void) = UnmodeledUse : mu* -# 1032| v0_12(void) = ExitFunction : +# 1032| v0_12(void) = AliasedUse : ~mu0_2 +# 1032| v0_13(void) = ExitFunction : # 1032| char(* (void Lambda(int, String const&))::(lambda [] type at line 1032, col. 23)::operator char (*)(float)() const)(float) # 1032| Block 0 @@ -4845,7 +4971,8 @@ ir.cpp: # 1032| r0_7(glval<..(*)(..)>) = VariableAddress[#return] : # 1032| v0_8(void) = ReturnValue : &:r0_7, ~mu0_2 # 1032| v0_9(void) = UnmodeledUse : mu* -# 1032| v0_10(void) = ExitFunction : +# 1032| v0_10(void) = AliasedUse : ~mu0_2 +# 1032| v0_11(void) = ExitFunction : # 1034| char (void Lambda(int, String const&))::(lambda [] type at line 1034, col. 21)::operator()(float) const # 1034| Block 0 @@ -4874,7 +5001,8 @@ ir.cpp: # 1034| r0_22(glval) = VariableAddress[#return] : # 1034| v0_23(void) = ReturnValue : &:r0_22, ~mu0_2 # 1034| v0_24(void) = UnmodeledUse : mu* -# 1034| v0_25(void) = ExitFunction : +# 1034| v0_25(void) = AliasedUse : ~mu0_2 +# 1034| v0_26(void) = ExitFunction : # 1036| void (void Lambda(int, String const&))::(lambda [] type at line 1036, col. 21)::~() # 1036| Block 0 @@ -4889,7 +5017,8 @@ ir.cpp: # 1036| mu0_8(unknown) = ^CallSideEffect : ~mu0_2 # 1036| v0_9(void) = ReturnVoid : # 1036| v0_10(void) = UnmodeledUse : mu* -# 1036| v0_11(void) = ExitFunction : +# 1036| v0_11(void) = AliasedUse : ~mu0_2 +# 1036| v0_12(void) = ExitFunction : # 1036| char (void Lambda(int, String const&))::(lambda [] type at line 1036, col. 21)::operator()(float) const # 1036| Block 0 @@ -4916,7 +5045,8 @@ ir.cpp: # 1036| r0_20(glval) = VariableAddress[#return] : # 1036| v0_21(void) = ReturnValue : &:r0_20, ~mu0_2 # 1036| v0_22(void) = UnmodeledUse : mu* -# 1036| v0_23(void) = ExitFunction : +# 1036| v0_23(void) = AliasedUse : ~mu0_2 +# 1036| v0_24(void) = ExitFunction : # 1038| char (void Lambda(int, String const&))::(lambda [] type at line 1038, col. 30)::operator()(float) const # 1038| Block 0 @@ -4942,7 +5072,8 @@ ir.cpp: # 1038| r0_19(glval) = VariableAddress[#return] : # 1038| v0_20(void) = ReturnValue : &:r0_19, ~mu0_2 # 1038| v0_21(void) = UnmodeledUse : mu* -# 1038| v0_22(void) = ExitFunction : +# 1038| v0_22(void) = AliasedUse : ~mu0_2 +# 1038| v0_23(void) = ExitFunction : # 1040| void (void Lambda(int, String const&))::(lambda [] type at line 1040, col. 30)::(constructor)((void Lambda(int, String const&))::(lambda [] type at line 1040, col. 30)&&) # 1040| Block 0 @@ -4959,7 +5090,8 @@ ir.cpp: # 1040| v0_10(void) = NoOp : # 1040| v0_11(void) = ReturnVoid : # 1040| v0_12(void) = UnmodeledUse : mu* -# 1040| v0_13(void) = ExitFunction : +# 1040| v0_13(void) = AliasedUse : ~mu0_2 +# 1040| v0_14(void) = ExitFunction : # 1040| void (void Lambda(int, String const&))::(lambda [] type at line 1040, col. 30)::~() # 1040| Block 0 @@ -4974,7 +5106,8 @@ ir.cpp: # 1040| mu0_8(unknown) = ^CallSideEffect : ~mu0_2 # 1040| v0_9(void) = ReturnVoid : # 1040| v0_10(void) = UnmodeledUse : mu* -# 1040| v0_11(void) = ExitFunction : +# 1040| v0_11(void) = AliasedUse : ~mu0_2 +# 1040| v0_12(void) = ExitFunction : # 1040| char (void Lambda(int, String const&))::(lambda [] type at line 1040, col. 30)::operator()(float) const # 1040| Block 0 @@ -4999,7 +5132,8 @@ ir.cpp: # 1040| r0_18(glval) = VariableAddress[#return] : # 1040| v0_19(void) = ReturnValue : &:r0_18, ~mu0_2 # 1040| v0_20(void) = UnmodeledUse : mu* -# 1040| v0_21(void) = ExitFunction : +# 1040| v0_21(void) = AliasedUse : ~mu0_2 +# 1040| v0_22(void) = ExitFunction : # 1042| char (void Lambda(int, String const&))::(lambda [] type at line 1042, col. 32)::operator()(float) const # 1042| Block 0 @@ -5027,7 +5161,8 @@ ir.cpp: # 1042| r0_21(glval) = VariableAddress[#return] : # 1042| v0_22(void) = ReturnValue : &:r0_21, ~mu0_2 # 1042| v0_23(void) = UnmodeledUse : mu* -# 1042| v0_24(void) = ExitFunction : +# 1042| v0_24(void) = AliasedUse : ~mu0_2 +# 1042| v0_25(void) = ExitFunction : # 1045| char (void Lambda(int, String const&))::(lambda [] type at line 1045, col. 23)::operator()(float) const # 1045| Block 0 @@ -5064,7 +5199,8 @@ ir.cpp: # 1045| r0_30(glval) = VariableAddress[#return] : # 1045| v0_31(void) = ReturnValue : &:r0_30, ~mu0_2 # 1045| v0_32(void) = UnmodeledUse : mu* -# 1045| v0_33(void) = ExitFunction : +# 1045| v0_33(void) = AliasedUse : ~mu0_2 +# 1045| v0_34(void) = ExitFunction : # 1068| void RangeBasedFor(vector const&) # 1068| Block 0 @@ -5126,7 +5262,8 @@ ir.cpp: # 1080| v3_1(void) = NoOp : # 1068| v3_2(void) = ReturnVoid : # 1068| v3_3(void) = UnmodeledUse : mu* -# 1068| v3_4(void) = ExitFunction : +# 1068| v3_4(void) = AliasedUse : ~mu0_2 +# 1068| v3_5(void) = ExitFunction : #-----| Block 4 #-----| r4_0(glval) = VariableAddress[(__begin)] : @@ -5238,7 +5375,8 @@ ir.cpp: # 1099| r0_10(glval) = VariableAddress[#return] : # 1099| v0_11(void) = ReturnValue : &:r0_10, ~mu0_2 # 1099| v0_12(void) = UnmodeledUse : mu* -# 1099| v0_13(void) = ExitFunction : +# 1099| v0_13(void) = AliasedUse : ~mu0_2 +# 1099| v0_14(void) = ExitFunction : # 1104| void AsmStmtWithOutputs(unsigned int&, unsigned int&, unsigned int&, unsigned int&) # 1104| Block 0 @@ -5261,7 +5399,8 @@ ir.cpp: # 1111| v0_16(void) = NoOp : # 1104| v0_17(void) = ReturnVoid : # 1104| v0_18(void) = UnmodeledUse : mu* -# 1104| v0_19(void) = ExitFunction : +# 1104| v0_19(void) = AliasedUse : ~mu0_2 +# 1104| v0_20(void) = ExitFunction : # 1113| void ExternDeclarations() # 1113| Block 0 @@ -5277,7 +5416,8 @@ ir.cpp: # 1120| v0_9(void) = NoOp : # 1113| v0_10(void) = ReturnVoid : # 1113| v0_11(void) = UnmodeledUse : mu* -# 1113| v0_12(void) = ExitFunction : +# 1113| v0_12(void) = AliasedUse : ~mu0_2 +# 1113| v0_13(void) = ExitFunction : # 1128| void ExternDeclarationsInMacro() # 1128| Block 0 @@ -5311,7 +5451,8 @@ ir.cpp: # 1131| v3_1(void) = NoOp : # 1128| v3_2(void) = ReturnVoid : # 1128| v3_3(void) = UnmodeledUse : mu* -# 1128| v3_4(void) = ExitFunction : +# 1128| v3_4(void) = AliasedUse : ~mu0_2 +# 1128| v3_5(void) = ExitFunction : # 1133| void TryCatchNoCatchAny(bool) # 1133| Block 0 @@ -5331,7 +5472,8 @@ ir.cpp: # 1133| Block 1 # 1133| v1_0(void) = UnmodeledUse : mu* -# 1133| v1_1(void) = ExitFunction : +# 1133| v1_1(void) = AliasedUse : ~mu0_2 +# 1133| v1_2(void) = ExitFunction : # 1133| Block 2 # 1133| v2_0(void) = Unwind : @@ -5484,7 +5626,8 @@ ir.cpp: # 1159| v0_55(void) = NoOp : # 1153| v0_56(void) = ReturnVoid : # 1153| v0_57(void) = UnmodeledUse : mu* -# 1153| v0_58(void) = ExitFunction : +# 1153| v0_58(void) = AliasedUse : ~mu0_2 +# 1153| v0_59(void) = ExitFunction : # 1163| int ModeledCallTarget(int) # 1163| Block 0 @@ -5511,7 +5654,8 @@ ir.cpp: # 1163| r0_20(glval) = VariableAddress[#return] : # 1163| v0_21(void) = ReturnValue : &:r0_20, ~mu0_2 # 1163| v0_22(void) = UnmodeledUse : mu* -# 1163| v0_23(void) = ExitFunction : +# 1163| v0_23(void) = AliasedUse : ~mu0_2 +# 1163| v0_24(void) = ExitFunction : perf-regression.cpp: # 6| void Big::Big() @@ -5528,7 +5672,8 @@ perf-regression.cpp: # 6| v0_9(void) = NoOp : # 6| v0_10(void) = ReturnVoid : # 6| v0_11(void) = UnmodeledUse : mu* -# 6| v0_12(void) = ExitFunction : +# 6| v0_12(void) = AliasedUse : ~mu0_2 +# 6| v0_13(void) = ExitFunction : # 9| int main() # 9| Block 0 @@ -5551,4 +5696,5 @@ perf-regression.cpp: # 9| r0_16(glval) = VariableAddress[#return] : # 9| v0_17(void) = ReturnValue : &:r0_16, ~mu0_2 # 9| v0_18(void) = UnmodeledUse : mu* -# 9| v0_19(void) = ExitFunction : +# 9| v0_19(void) = AliasedUse : ~mu0_2 +# 9| v0_20(void) = ExitFunction : diff --git a/cpp/ql/test/library-tests/valuenumbering/GlobalValueNumbering/ir_gvn.expected b/cpp/ql/test/library-tests/valuenumbering/GlobalValueNumbering/ir_gvn.expected index 8be4cf4e2c1..73cfa4f83a7 100644 --- a/cpp/ql/test/library-tests/valuenumbering/GlobalValueNumbering/ir_gvn.expected +++ b/cpp/ql/test/library-tests/valuenumbering/GlobalValueNumbering/ir_gvn.expected @@ -67,7 +67,8 @@ test.cpp: # 1| valnum = unique # 1| v0_33(void) = ReturnValue : &:r0_32 # 1| v0_34(void) = UnmodeledUse : mu* -# 1| v0_35(void) = ExitFunction : +# 1| v0_35(void) = AliasedUse : ~m0_1 +# 1| v0_36(void) = ExitFunction : # 12| int test01(int, int) # 12| Block 0 @@ -149,7 +150,8 @@ test.cpp: # 12| valnum = unique # 12| v0_39(void) = ReturnValue : &:r0_38 # 12| v0_40(void) = UnmodeledUse : mu* -# 12| v0_41(void) = ExitFunction : +# 12| v0_41(void) = AliasedUse : ~m0_1 +# 12| v0_42(void) = ExitFunction : # 25| int test02(int, int) # 25| Block 0 @@ -238,7 +240,8 @@ test.cpp: # 25| valnum = unique # 25| v0_43(void) = ReturnValue : &:r0_42 # 25| v0_44(void) = UnmodeledUse : mu* -# 25| v0_45(void) = ExitFunction : +# 25| v0_45(void) = AliasedUse : ~m0_26 +# 25| v0_46(void) = ExitFunction : # 39| int test03(int, int, int*) # 39| Block 0 @@ -334,7 +337,8 @@ test.cpp: # 39| valnum = unique # 39| v0_46(void) = ReturnValue : &:r0_45 # 39| v0_47(void) = UnmodeledUse : mu* -# 39| v0_48(void) = ExitFunction : +# 39| v0_48(void) = AliasedUse : ~m0_29 +# 39| v0_49(void) = ExitFunction : # 49| unsigned int my_strspn(char const*, char const*) # 49| Block 0 @@ -496,7 +500,8 @@ test.cpp: # 49| valnum = r9_1 # 49| v9_6(void) = ReturnValue : &:r9_5, m9_4 # 49| v9_7(void) = UnmodeledUse : mu* -# 49| v9_8(void) = ExitFunction : +# 49| v9_8(void) = AliasedUse : ~m0_1 +# 49| v9_9(void) = ExitFunction : # 75| void test04(two_values*) # 75| Block 0 @@ -575,10 +580,13 @@ test.cpp: #-----| Goto -> Block 2 # 82| Block 2 -# 82| v2_0(void) = NoOp : -# 75| v2_1(void) = ReturnVoid : -# 75| v2_2(void) = UnmodeledUse : mu* -# 75| v2_3(void) = ExitFunction : +# 82| m2_0(unknown) = Phi : from 0:~m0_9, from 1:~m1_3 +# 82| valnum = unique +# 82| v2_1(void) = NoOp : +# 75| v2_2(void) = ReturnVoid : +# 75| v2_3(void) = UnmodeledUse : mu* +# 75| v2_4(void) = AliasedUse : ~m2_0 +# 75| v2_5(void) = ExitFunction : # 84| void test05(int, int, void*) # 84| Block 0 @@ -651,7 +659,8 @@ test.cpp: # 89| v3_5(void) = NoOp : # 84| v3_6(void) = ReturnVoid : # 84| v3_7(void) = UnmodeledUse : mu* -# 84| v3_8(void) = ExitFunction : +# 84| v3_8(void) = AliasedUse : ~m0_1 +# 84| v3_9(void) = ExitFunction : # 91| int regression_test00() # 91| Block 0 @@ -682,7 +691,8 @@ test.cpp: # 91| valnum = r0_8 # 91| v0_13(void) = ReturnValue : &:r0_12, m0_11 # 91| v0_14(void) = UnmodeledUse : mu* -# 91| v0_15(void) = ExitFunction : +# 91| v0_15(void) = AliasedUse : ~m0_1 +# 91| v0_16(void) = ExitFunction : # 104| int inheritanceConversions(Derived*) # 104| Block 0 @@ -743,7 +753,8 @@ test.cpp: # 104| valnum = r0_23 # 104| v0_28(void) = ReturnValue : &:r0_27, m0_26 # 104| v0_29(void) = UnmodeledUse : mu* -# 104| v0_30(void) = ExitFunction : +# 104| v0_30(void) = AliasedUse : ~m0_1 +# 104| v0_31(void) = ExitFunction : # 112| void test06() # 112| Block 0 @@ -763,4 +774,5 @@ test.cpp: # 117| v0_7(void) = NoOp : # 112| v0_8(void) = ReturnVoid : # 112| v0_9(void) = UnmodeledUse : mu* -# 112| v0_10(void) = ExitFunction : +# 112| v0_10(void) = AliasedUse : ~m0_1 +# 112| v0_11(void) = ExitFunction : From 56cbd0c152dade9273b8522775bc9c035825c8e7 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Fri, 25 Oct 2019 13:10:39 -0700 Subject: [PATCH 4/5] C++/C#: Make `AliasedUse` access only non-local memory The `AliasedUse` instruction is supposed to represent future uses of aliased memory after the function returns. Since local variables from that function are no longer allocated after the function returns, the `AliasedUse` instruction should access only the set of aliased locations that does not include locals from the current stack frame. --- .../ir/implementation/MemoryAccessKind.qll | 9 +++++ .../ir/implementation/aliased_ssa/Operand.qll | 2 +- .../aliased_ssa/internal/AliasedSSA.qll | 39 +++++++++++++++++++ .../cpp/ir/implementation/raw/Operand.qll | 2 +- .../implementation/unaliased_ssa/Operand.qll | 2 +- .../ir/ssa/aliased_ssa_ir.expected | 8 ++-- .../ir/implementation/MemoryAccessKind.qll | 9 +++++ .../csharp/ir/implementation/raw/Operand.qll | 2 +- .../implementation/unaliased_ssa/Operand.qll | 2 +- 9 files changed, 66 insertions(+), 9 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/MemoryAccessKind.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/MemoryAccessKind.qll index d4f1599d78e..a71608ee855 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/MemoryAccessKind.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/MemoryAccessKind.qll @@ -5,6 +5,7 @@ private newtype TMemoryAccessKind = TBufferMayMemoryAccess() or TEscapedMemoryAccess() or TEscapedMayMemoryAccess() or + TNonLocalMayMemoryAccess() or TPhiMemoryAccess() or TUnmodeledMemoryAccess() or TChiTotalMemoryAccess() or @@ -80,6 +81,14 @@ class EscapedMayMemoryAccess extends MemoryAccessKind, TEscapedMayMemoryAccess { override string toString() { result = "escaped(may)" } } +/** + * The operand or result may access all memory whose address has escaped, other than data on the + * stack frame of the current function. + */ +class NonLocalMayMemoryAccess extends MemoryAccessKind, TNonLocalMayMemoryAccess { + override string toString() { result = "nonlocal(may)" } +} + /** * The operand is a Phi operand, which accesses the same memory as its * definition. diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll index b869e09f5dd..d764e4d4fb7 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll @@ -389,7 +389,7 @@ class SideEffectOperand extends TypedOperand { override MemoryAccessKind getMemoryAccess() { useInstr instanceof AliasedUseInstruction and - result instanceof EscapedMayMemoryAccess + result instanceof NonLocalMayMemoryAccess or useInstr instanceof CallSideEffectInstruction and result instanceof EscapedMayMemoryAccess diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll index 95ddffb2274..6bd4bcc42d5 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll @@ -35,6 +35,7 @@ private newtype TMemoryLocation = hasOperandMemoryAccess(_, var, type, startBitOffset, endBitOffset) } or TUnknownMemoryLocation(IRFunction irFunc) or + TUnknownNonLocalMemoryLocation(IRFunction irFunc) or TUnknownVirtualVariable(IRFunction irFunc) /** @@ -133,6 +134,24 @@ class UnknownMemoryLocation extends TUnknownMemoryLocation, MemoryLocation { final override string getUniqueId() { result = "{Unknown}" } } +/** + * An access to memory that is not known to be confined to a specific `IRVariable`, but is known to + * not access memory on the current function's stack frame. + */ +class UnknownNonLocalMemoryLocation extends TUnknownNonLocalMemoryLocation, MemoryLocation { + IRFunction irFunc; + + UnknownNonLocalMemoryLocation() { this = TUnknownNonLocalMemoryLocation(irFunc) } + + final override string toString() { result = "{UnknownNonLocal}" } + + final override VirtualVariable getVirtualVariable() { result = TUnknownVirtualVariable(irFunc) } + + final override Type getType() { result instanceof UnknownType } + + final override string getUniqueId() { result = "{UnknownNonLocal}" } +} + /** * An access to all aliased memory. */ @@ -163,6 +182,13 @@ Overlap getOverlap(MemoryLocation def, MemoryLocation use) { def instanceof UnknownMemoryLocation and result instanceof MayPartiallyOverlap or + // An UnknownNonLocalMemoryLocation may partially overlap any location within the same virtual + // variable, except a local variable. + def.getVirtualVariable() = use.getVirtualVariable() and + def instanceof UnknownNonLocalMemoryLocation and + result instanceof MayPartiallyOverlap and + not use.(VariableMemoryLocation).getVariable() instanceof IRAutomaticVariable + or exists(VariableMemoryLocation defVariableLocation | defVariableLocation = def and ( @@ -171,6 +197,13 @@ Overlap getOverlap(MemoryLocation def, MemoryLocation use) { (use instanceof UnknownMemoryLocation or use instanceof UnknownVirtualVariable) and result instanceof MayPartiallyOverlap or + // A VariableMemoryLocation that is not a local variable may partially overlap an unknown + // non-local location within the same virtual variable. + def.getVirtualVariable() = use.getVirtualVariable() and + use instanceof UnknownNonLocalMemoryLocation and + result instanceof MayPartiallyOverlap and + not defVariableLocation.getVariable() instanceof IRAutomaticVariable + or // A VariableMemoryLocation overlaps another location within the same variable based on the relationship // of the two offset intervals. exists(Overlap intervalOverlap | @@ -296,6 +329,9 @@ MemoryLocation getResultMemoryLocation(Instruction instr) { or kind instanceof EscapedMayMemoryAccess and result = TUnknownMemoryLocation(instr.getEnclosingIRFunction()) + or + kind instanceof NonLocalMayMemoryAccess and + result = TUnknownNonLocalMemoryLocation(instr.getEnclosingIRFunction()) ) ) } @@ -320,6 +356,9 @@ MemoryLocation getOperandMemoryLocation(MemoryOperand operand) { or kind instanceof EscapedMayMemoryAccess and result = TUnknownMemoryLocation(operand.getEnclosingIRFunction()) + or + kind instanceof NonLocalMayMemoryAccess and + result = TUnknownNonLocalMemoryLocation(operand.getEnclosingIRFunction()) ) ) } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Operand.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Operand.qll index b869e09f5dd..d764e4d4fb7 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Operand.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Operand.qll @@ -389,7 +389,7 @@ class SideEffectOperand extends TypedOperand { override MemoryAccessKind getMemoryAccess() { useInstr instanceof AliasedUseInstruction and - result instanceof EscapedMayMemoryAccess + result instanceof NonLocalMayMemoryAccess or useInstr instanceof CallSideEffectInstruction and result instanceof EscapedMayMemoryAccess diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll index b869e09f5dd..d764e4d4fb7 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll @@ -389,7 +389,7 @@ class SideEffectOperand extends TypedOperand { override MemoryAccessKind getMemoryAccess() { useInstr instanceof AliasedUseInstruction and - result instanceof EscapedMayMemoryAccess + result instanceof NonLocalMayMemoryAccess or useInstr instanceof CallSideEffectInstruction and result instanceof EscapedMayMemoryAccess diff --git a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected index 6bbf4f54131..b72ff6ec7ed 100644 --- a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected +++ b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected @@ -340,7 +340,7 @@ ssa.cpp: # 98| v0_19(void) = NoOp : # 95| v0_20(void) = ReturnVoid : # 95| v0_21(void) = UnmodeledUse : mu* -# 95| v0_22(void) = AliasedUse : ~m0_18 +# 95| v0_22(void) = AliasedUse : ~m0_15 # 95| v0_23(void) = ExitFunction : # 100| void MustTotallyOverlap(Point) @@ -396,7 +396,7 @@ ssa.cpp: # 109| v0_25(void) = NoOp : # 105| v0_26(void) = ReturnVoid : # 105| v0_27(void) = UnmodeledUse : mu* -# 105| v0_28(void) = AliasedUse : ~m0_24 +# 105| v0_28(void) = AliasedUse : ~m0_21 # 105| v0_29(void) = ExitFunction : # 111| void MayPartiallyOverlap(int, int) @@ -468,7 +468,7 @@ ssa.cpp: # 120| v0_33(void) = NoOp : # 116| v0_34(void) = ReturnVoid : # 116| v0_35(void) = UnmodeledUse : mu* -# 116| v0_36(void) = AliasedUse : ~m0_32 +# 116| v0_36(void) = AliasedUse : ~m0_29 # 116| v0_37(void) = ExitFunction : # 122| void MergeMustExactlyOverlap(bool, int, int) @@ -865,5 +865,5 @@ ssa.cpp: # 207| r0_23(glval) = VariableAddress[#return] : # 207| v0_24(void) = ReturnValue : &:r0_23, m0_22 # 207| v0_25(void) = UnmodeledUse : mu* -# 207| v0_26(void) = AliasedUse : ~m0_18 +# 207| v0_26(void) = AliasedUse : ~m0_1 # 207| v0_27(void) = ExitFunction : diff --git a/csharp/ql/src/semmle/code/csharp/ir/implementation/MemoryAccessKind.qll b/csharp/ql/src/semmle/code/csharp/ir/implementation/MemoryAccessKind.qll index d4f1599d78e..a71608ee855 100644 --- a/csharp/ql/src/semmle/code/csharp/ir/implementation/MemoryAccessKind.qll +++ b/csharp/ql/src/semmle/code/csharp/ir/implementation/MemoryAccessKind.qll @@ -5,6 +5,7 @@ private newtype TMemoryAccessKind = TBufferMayMemoryAccess() or TEscapedMemoryAccess() or TEscapedMayMemoryAccess() or + TNonLocalMayMemoryAccess() or TPhiMemoryAccess() or TUnmodeledMemoryAccess() or TChiTotalMemoryAccess() or @@ -80,6 +81,14 @@ class EscapedMayMemoryAccess extends MemoryAccessKind, TEscapedMayMemoryAccess { override string toString() { result = "escaped(may)" } } +/** + * The operand or result may access all memory whose address has escaped, other than data on the + * stack frame of the current function. + */ +class NonLocalMayMemoryAccess extends MemoryAccessKind, TNonLocalMayMemoryAccess { + override string toString() { result = "nonlocal(may)" } +} + /** * The operand is a Phi operand, which accesses the same memory as its * definition. diff --git a/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/Operand.qll b/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/Operand.qll index b869e09f5dd..d764e4d4fb7 100644 --- a/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/Operand.qll +++ b/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/Operand.qll @@ -389,7 +389,7 @@ class SideEffectOperand extends TypedOperand { override MemoryAccessKind getMemoryAccess() { useInstr instanceof AliasedUseInstruction and - result instanceof EscapedMayMemoryAccess + result instanceof NonLocalMayMemoryAccess or useInstr instanceof CallSideEffectInstruction and result instanceof EscapedMayMemoryAccess diff --git a/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/Operand.qll b/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/Operand.qll index b869e09f5dd..d764e4d4fb7 100644 --- a/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/Operand.qll +++ b/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/Operand.qll @@ -389,7 +389,7 @@ class SideEffectOperand extends TypedOperand { override MemoryAccessKind getMemoryAccess() { useInstr instanceof AliasedUseInstruction and - result instanceof EscapedMayMemoryAccess + result instanceof NonLocalMayMemoryAccess or useInstr instanceof CallSideEffectInstruction and result instanceof EscapedMayMemoryAccess From cc5a6892934ddaa286b5ca8561f20487b9a9f697 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Fri, 25 Oct 2019 14:11:34 -0700 Subject: [PATCH 5/5] C++/C#: Fix up after merge from master --- .../aliased_ssa/internal/AliasedSSA.qll | 4 +- .../raw/internal/TranslatedFunction.qll | 3 +- .../test/library-tests/ir/ir/raw_ir.expected | 438 ++++++++++++------ .../ir/ssa/aliased_ssa_ir.expected | 63 ++- .../ir/ssa/unaliased_ssa_ir.expected | 63 ++- .../syntax-zoo/raw_sanity.expected | 79 ---- .../raw/internal/TranslatedFunction.qll | 3 +- .../test/library-tests/ir/ir/raw_ir.expected | 177 ++++--- 8 files changed, 499 insertions(+), 331 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll index 1d9ad711a3a..955d422cf9a 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll @@ -176,7 +176,9 @@ class UnknownNonLocalMemoryLocation extends TUnknownNonLocalMemoryLocation, Memo final override VirtualVariable getVirtualVariable() { result = TUnknownVirtualVariable(irFunc) } - final override Type getType() { result instanceof UnknownType } + final override Language::LanguageType getType() { + result = any(IRUnknownType type).getCanonicalLanguageType() + } final override string getUniqueId() { result = "{UnknownNonLocal}" } } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll index 8647cb783cc..5b437f45c54 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll @@ -172,8 +172,7 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { or tag = AliasedUseTag() and opcode instanceof Opcode::AliasedUse and - resultType instanceof VoidType and - isGLValue = false + resultType = getVoidType() or tag = ExitFunctionTag() and opcode instanceof Opcode::ExitFunction and diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 318685e932d..00e15d6649f 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -19,7 +19,8 @@ bad_asts.cpp: # 17| v0_15(void) = NoOp : # 14| v0_16(void) = ReturnVoid : # 14| v0_17(void) = UnmodeledUse : mu* -# 14| v0_18(void) = ExitFunction : +# 14| v0_18(void) = AliasedUse : ~mu0_2 +# 14| v0_19(void) = ExitFunction : # 22| void Bad::Point::Point() # 22| Block 0 @@ -30,7 +31,8 @@ bad_asts.cpp: # 23| v0_4(void) = NoOp : # 22| v0_5(void) = ReturnVoid : # 22| v0_6(void) = UnmodeledUse : mu* -# 22| v0_7(void) = ExitFunction : +# 22| v0_7(void) = AliasedUse : ~mu0_2 +# 22| v0_8(void) = ExitFunction : # 26| void Bad::CallCopyConstructor(Bad::Point const&) # 26| Block 0 @@ -48,7 +50,8 @@ bad_asts.cpp: # 28| v0_11(void) = NoOp : # 26| v0_12(void) = ReturnVoid : # 26| v0_13(void) = UnmodeledUse : mu* -# 26| v0_14(void) = ExitFunction : +# 26| v0_14(void) = AliasedUse : ~mu0_2 +# 26| v0_15(void) = ExitFunction : # 30| void Bad::errorExpr() # 30| Block 0 @@ -68,7 +71,8 @@ bad_asts.cpp: # 34| v0_13(void) = NoOp : # 30| v0_14(void) = ReturnVoid : # 30| v0_15(void) = UnmodeledUse : mu* -# 30| v0_16(void) = ExitFunction : +# 30| v0_16(void) = AliasedUse : ~mu0_2 +# 30| v0_17(void) = ExitFunction : clang.cpp: # 5| int* globalIntAddress() @@ -82,7 +86,8 @@ clang.cpp: # 5| r0_6(glval) = VariableAddress[#return] : # 5| v0_7(void) = ReturnValue : &:r0_6, ~mu0_2 # 5| v0_8(void) = UnmodeledUse : mu* -# 5| v0_9(void) = ExitFunction : +# 5| v0_9(void) = AliasedUse : ~mu0_2 +# 5| v0_10(void) = ExitFunction : ir.cpp: # 1| void Constants() @@ -177,7 +182,8 @@ ir.cpp: # 41| v0_87(void) = NoOp : # 1| v0_88(void) = ReturnVoid : # 1| v0_89(void) = UnmodeledUse : mu* -# 1| v0_90(void) = ExitFunction : +# 1| v0_90(void) = AliasedUse : ~mu0_2 +# 1| v0_91(void) = ExitFunction : # 43| void Foo() # 43| Block 0 @@ -210,7 +216,8 @@ ir.cpp: # 48| v0_26(void) = NoOp : # 43| v0_27(void) = ReturnVoid : # 43| v0_28(void) = UnmodeledUse : mu* -# 43| v0_29(void) = ExitFunction : +# 43| v0_29(void) = AliasedUse : ~mu0_2 +# 43| v0_30(void) = ExitFunction : # 50| void IntegerOps(int, int) # 50| Block 0 @@ -383,7 +390,8 @@ ir.cpp: # 85| v0_166(void) = NoOp : # 50| v0_167(void) = ReturnVoid : # 50| v0_168(void) = UnmodeledUse : mu* -# 50| v0_169(void) = ExitFunction : +# 50| v0_169(void) = AliasedUse : ~mu0_2 +# 50| v0_170(void) = ExitFunction : # 87| void IntegerCompare(int, int) # 87| Block 0 @@ -441,7 +449,8 @@ ir.cpp: # 96| v0_51(void) = NoOp : # 87| v0_52(void) = ReturnVoid : # 87| v0_53(void) = UnmodeledUse : mu* -# 87| v0_54(void) = ExitFunction : +# 87| v0_54(void) = AliasedUse : ~mu0_2 +# 87| v0_55(void) = ExitFunction : # 98| void IntegerCrement(int) # 98| Block 0 @@ -483,7 +492,8 @@ ir.cpp: # 105| v0_35(void) = NoOp : # 98| v0_36(void) = ReturnVoid : # 98| v0_37(void) = UnmodeledUse : mu* -# 98| v0_38(void) = ExitFunction : +# 98| v0_38(void) = AliasedUse : ~mu0_2 +# 98| v0_39(void) = ExitFunction : # 107| void IntegerCrement_LValue(int) # 107| Block 0 @@ -511,7 +521,8 @@ ir.cpp: # 112| v0_21(void) = NoOp : # 107| v0_22(void) = ReturnVoid : # 107| v0_23(void) = UnmodeledUse : mu* -# 107| v0_24(void) = ExitFunction : +# 107| v0_24(void) = AliasedUse : ~mu0_2 +# 107| v0_25(void) = ExitFunction : # 114| void FloatOps(double, double) # 114| Block 0 @@ -593,7 +604,8 @@ ir.cpp: # 131| v0_75(void) = NoOp : # 114| v0_76(void) = ReturnVoid : # 114| v0_77(void) = UnmodeledUse : mu* -# 114| v0_78(void) = ExitFunction : +# 114| v0_78(void) = AliasedUse : ~mu0_2 +# 114| v0_79(void) = ExitFunction : # 133| void FloatCompare(double, double) # 133| Block 0 @@ -651,7 +663,8 @@ ir.cpp: # 142| v0_51(void) = NoOp : # 133| v0_52(void) = ReturnVoid : # 133| v0_53(void) = UnmodeledUse : mu* -# 133| v0_54(void) = ExitFunction : +# 133| v0_54(void) = AliasedUse : ~mu0_2 +# 133| v0_55(void) = ExitFunction : # 144| void FloatCrement(float) # 144| Block 0 @@ -693,7 +706,8 @@ ir.cpp: # 151| v0_35(void) = NoOp : # 144| v0_36(void) = ReturnVoid : # 144| v0_37(void) = UnmodeledUse : mu* -# 144| v0_38(void) = ExitFunction : +# 144| v0_38(void) = AliasedUse : ~mu0_2 +# 144| v0_39(void) = ExitFunction : # 153| void PointerOps(int*, int) # 153| Block 0 @@ -769,7 +783,8 @@ ir.cpp: # 169| v0_69(void) = NoOp : # 153| v0_70(void) = ReturnVoid : # 153| v0_71(void) = UnmodeledUse : mu* -# 153| v0_72(void) = ExitFunction : +# 153| v0_72(void) = AliasedUse : ~mu0_2 +# 153| v0_73(void) = ExitFunction : # 171| void ArrayAccess(int*, int) # 171| Block 0 @@ -851,7 +866,8 @@ ir.cpp: # 185| v0_75(void) = NoOp : # 171| v0_76(void) = ReturnVoid : # 171| v0_77(void) = UnmodeledUse : mu* -# 171| v0_78(void) = ExitFunction : +# 171| v0_78(void) = AliasedUse : ~mu0_2 +# 171| v0_79(void) = ExitFunction : # 187| void StringLiteral(int) # 187| Block 0 @@ -884,7 +900,8 @@ ir.cpp: # 191| v0_26(void) = NoOp : # 187| v0_27(void) = ReturnVoid : # 187| v0_28(void) = UnmodeledUse : mu* -# 187| v0_29(void) = ExitFunction : +# 187| v0_29(void) = AliasedUse : ~mu0_2 +# 187| v0_30(void) = ExitFunction : # 193| void PointerCompare(int*, int*) # 193| Block 0 @@ -942,7 +959,8 @@ ir.cpp: # 202| v0_51(void) = NoOp : # 193| v0_52(void) = ReturnVoid : # 193| v0_53(void) = UnmodeledUse : mu* -# 193| v0_54(void) = ExitFunction : +# 193| v0_54(void) = AliasedUse : ~mu0_2 +# 193| v0_55(void) = ExitFunction : # 204| void PointerCrement(int*) # 204| Block 0 @@ -984,7 +1002,8 @@ ir.cpp: # 211| v0_35(void) = NoOp : # 204| v0_36(void) = ReturnVoid : # 204| v0_37(void) = UnmodeledUse : mu* -# 204| v0_38(void) = ExitFunction : +# 204| v0_38(void) = AliasedUse : ~mu0_2 +# 204| v0_39(void) = ExitFunction : # 213| void CompoundAssignment() # 213| Block 0 @@ -1028,7 +1047,8 @@ ir.cpp: # 228| v0_37(void) = NoOp : # 213| v0_38(void) = ReturnVoid : # 213| v0_39(void) = UnmodeledUse : mu* -# 213| v0_40(void) = ExitFunction : +# 213| v0_40(void) = AliasedUse : ~mu0_2 +# 213| v0_41(void) = ExitFunction : # 230| void UninitializedVariables() # 230| Block 0 @@ -1044,7 +1064,8 @@ ir.cpp: # 233| v0_9(void) = NoOp : # 230| v0_10(void) = ReturnVoid : # 230| v0_11(void) = UnmodeledUse : mu* -# 230| v0_12(void) = ExitFunction : +# 230| v0_12(void) = AliasedUse : ~mu0_2 +# 230| v0_13(void) = ExitFunction : # 235| int Parameters(int, int) # 235| Block 0 @@ -1065,7 +1086,8 @@ ir.cpp: # 235| r0_14(glval) = VariableAddress[#return] : # 235| v0_15(void) = ReturnValue : &:r0_14, ~mu0_2 # 235| v0_16(void) = UnmodeledUse : mu* -# 235| v0_17(void) = ExitFunction : +# 235| v0_17(void) = AliasedUse : ~mu0_2 +# 235| v0_18(void) = ExitFunction : # 239| void IfStatements(bool, int, int) # 239| Block 0 @@ -1123,7 +1145,8 @@ ir.cpp: # 251| v6_0(void) = NoOp : # 239| v6_1(void) = ReturnVoid : # 239| v6_2(void) = UnmodeledUse : mu* -# 239| v6_3(void) = ExitFunction : +# 239| v6_3(void) = AliasedUse : ~mu0_2 +# 239| v6_4(void) = ExitFunction : # 240| Block 7 # 240| v7_0(void) = NoOp : @@ -1150,7 +1173,8 @@ ir.cpp: # 257| v2_0(void) = NoOp : # 253| v2_1(void) = ReturnVoid : # 253| v2_2(void) = UnmodeledUse : mu* -# 253| v2_3(void) = ExitFunction : +# 253| v2_3(void) = AliasedUse : ~mu0_2 +# 253| v2_4(void) = ExitFunction : # 254| Block 3 # 254| r3_0(glval) = VariableAddress[n] : @@ -1188,7 +1212,8 @@ ir.cpp: # 263| v2_0(void) = NoOp : # 259| v2_1(void) = ReturnVoid : # 259| v2_2(void) = UnmodeledUse : mu* -# 259| v2_3(void) = ExitFunction : +# 259| v2_3(void) = AliasedUse : ~mu0_2 +# 259| v2_4(void) = ExitFunction : # 265| void For_Empty() # 265| Block 0 @@ -1202,7 +1227,8 @@ ir.cpp: # 265| Block 1 # 265| v1_0(void) = ReturnVoid : # 265| v1_1(void) = UnmodeledUse : mu* -# 265| v1_2(void) = ExitFunction : +# 265| v1_2(void) = AliasedUse : ~mu0_2 +# 265| v1_3(void) = ExitFunction : # 268| Block 2 # 268| v2_0(void) = NoOp : @@ -1221,7 +1247,8 @@ ir.cpp: # 272| Block 1 # 272| v1_0(void) = ReturnVoid : # 272| v1_1(void) = UnmodeledUse : mu* -# 272| v1_2(void) = ExitFunction : +# 272| v1_2(void) = AliasedUse : ~mu0_2 +# 272| v1_3(void) = ExitFunction : # 274| Block 2 # 274| v2_0(void) = NoOp : @@ -1254,7 +1281,8 @@ ir.cpp: # 283| v3_0(void) = NoOp : # 278| v3_1(void) = ReturnVoid : # 278| v3_2(void) = UnmodeledUse : mu* -# 278| v3_3(void) = ExitFunction : +# 278| v3_3(void) = AliasedUse : ~mu0_2 +# 278| v3_4(void) = ExitFunction : # 285| void For_Update() # 285| Block 0 @@ -1269,7 +1297,8 @@ ir.cpp: # 285| Block 1 # 285| v1_0(void) = ReturnVoid : # 285| v1_1(void) = UnmodeledUse : mu* -# 285| v1_2(void) = ExitFunction : +# 285| v1_2(void) = AliasedUse : ~mu0_2 +# 285| v1_3(void) = ExitFunction : # 288| Block 2 # 288| v2_0(void) = NoOp : @@ -1307,7 +1336,8 @@ ir.cpp: # 296| v3_0(void) = NoOp : # 292| v3_1(void) = ReturnVoid : # 292| v3_2(void) = UnmodeledUse : mu* -# 292| v3_3(void) = ExitFunction : +# 292| v3_3(void) = AliasedUse : ~mu0_2 +# 292| v3_4(void) = ExitFunction : # 298| void For_InitUpdate() # 298| Block 0 @@ -1322,7 +1352,8 @@ ir.cpp: # 298| Block 1 # 298| v1_0(void) = ReturnVoid : # 298| v1_1(void) = UnmodeledUse : mu* -# 298| v1_2(void) = ExitFunction : +# 298| v1_2(void) = AliasedUse : ~mu0_2 +# 298| v1_3(void) = ExitFunction : # 300| Block 2 # 300| v2_0(void) = NoOp : @@ -1365,7 +1396,8 @@ ir.cpp: # 309| v3_0(void) = NoOp : # 304| v3_1(void) = ReturnVoid : # 304| v3_2(void) = UnmodeledUse : mu* -# 304| v3_3(void) = ExitFunction : +# 304| v3_3(void) = AliasedUse : ~mu0_2 +# 304| v3_4(void) = ExitFunction : # 311| void For_InitConditionUpdate() # 311| Block 0 @@ -1399,7 +1431,8 @@ ir.cpp: # 315| v3_0(void) = NoOp : # 311| v3_1(void) = ReturnVoid : # 311| v3_2(void) = UnmodeledUse : mu* -# 311| v3_3(void) = ExitFunction : +# 311| v3_3(void) = AliasedUse : ~mu0_2 +# 311| v3_4(void) = ExitFunction : # 317| void For_Break() # 317| Block 0 @@ -1446,7 +1479,8 @@ ir.cpp: # 323| v5_1(void) = NoOp : # 317| v5_2(void) = ReturnVoid : # 317| v5_3(void) = UnmodeledUse : mu* -# 317| v5_4(void) = ExitFunction : +# 317| v5_4(void) = AliasedUse : ~mu0_2 +# 317| v5_5(void) = ExitFunction : # 325| void For_Continue_Update() # 325| Block 0 @@ -1493,7 +1527,8 @@ ir.cpp: # 331| v5_0(void) = NoOp : # 325| v5_1(void) = ReturnVoid : # 325| v5_2(void) = UnmodeledUse : mu* -# 325| v5_3(void) = ExitFunction : +# 325| v5_3(void) = AliasedUse : ~mu0_2 +# 325| v5_4(void) = ExitFunction : # 333| void For_Continue_NoUpdate() # 333| Block 0 @@ -1535,7 +1570,8 @@ ir.cpp: # 339| v5_0(void) = NoOp : # 333| v5_1(void) = ReturnVoid : # 333| v5_2(void) = UnmodeledUse : mu* -# 333| v5_3(void) = ExitFunction : +# 333| v5_3(void) = AliasedUse : ~mu0_2 +# 333| v5_4(void) = ExitFunction : # 341| int Dereference(int*) # 341| Block 0 @@ -1556,7 +1592,8 @@ ir.cpp: # 341| r0_14(glval) = VariableAddress[#return] : # 341| v0_15(void) = ReturnValue : &:r0_14, ~mu0_2 # 341| v0_16(void) = UnmodeledUse : mu* -# 341| v0_17(void) = ExitFunction : +# 341| v0_17(void) = AliasedUse : ~mu0_2 +# 341| v0_18(void) = ExitFunction : # 348| int* AddressOf() # 348| Block 0 @@ -1569,7 +1606,8 @@ ir.cpp: # 348| r0_6(glval) = VariableAddress[#return] : # 348| v0_7(void) = ReturnValue : &:r0_6, ~mu0_2 # 348| v0_8(void) = UnmodeledUse : mu* -# 348| v0_9(void) = ExitFunction : +# 348| v0_9(void) = AliasedUse : ~mu0_2 +# 348| v0_10(void) = ExitFunction : # 352| void Break(int) # 352| Block 0 @@ -1606,7 +1644,8 @@ ir.cpp: # 358| v4_1(void) = NoOp : # 352| v4_2(void) = ReturnVoid : # 352| v4_3(void) = UnmodeledUse : mu* -# 352| v4_4(void) = ExitFunction : +# 352| v4_4(void) = AliasedUse : ~mu0_2 +# 352| v4_5(void) = ExitFunction : # 353| Block 5 # 353| r5_0(glval) = VariableAddress[n] : @@ -1661,7 +1700,8 @@ ir.cpp: # 367| v5_0(void) = NoOp : # 360| v5_1(void) = ReturnVoid : # 360| v5_2(void) = UnmodeledUse : mu* -# 360| v5_3(void) = ExitFunction : +# 360| v5_3(void) = AliasedUse : ~mu0_2 +# 360| v5_4(void) = ExitFunction : # 372| void Call() # 372| Block 0 @@ -1674,7 +1714,8 @@ ir.cpp: # 374| v0_6(void) = NoOp : # 372| v0_7(void) = ReturnVoid : # 372| v0_8(void) = UnmodeledUse : mu* -# 372| v0_9(void) = ExitFunction : +# 372| v0_9(void) = AliasedUse : ~mu0_2 +# 372| v0_10(void) = ExitFunction : # 376| int CallAdd(int, int) # 376| Block 0 @@ -1697,7 +1738,8 @@ ir.cpp: # 376| r0_16(glval) = VariableAddress[#return] : # 376| v0_17(void) = ReturnValue : &:r0_16, ~mu0_2 # 376| v0_18(void) = UnmodeledUse : mu* -# 376| v0_19(void) = ExitFunction : +# 376| v0_19(void) = AliasedUse : ~mu0_2 +# 376| v0_20(void) = ExitFunction : # 380| int Comma(int, int) # 380| Block 0 @@ -1723,7 +1765,8 @@ ir.cpp: # 380| r0_19(glval) = VariableAddress[#return] : # 380| v0_20(void) = ReturnValue : &:r0_19, ~mu0_2 # 380| v0_21(void) = UnmodeledUse : mu* -# 380| v0_22(void) = ExitFunction : +# 380| v0_22(void) = AliasedUse : ~mu0_2 +# 380| v0_23(void) = ExitFunction : # 384| void Switch(int) # 384| Block 0 @@ -1804,7 +1847,8 @@ ir.cpp: # 410| v9_1(void) = NoOp : # 384| v9_2(void) = ReturnVoid : # 384| v9_3(void) = UnmodeledUse : mu* -# 384| v9_4(void) = ExitFunction : +# 384| v9_4(void) = AliasedUse : ~mu0_2 +# 384| v9_5(void) = ExitFunction : # 422| Point ReturnStruct(Point) # 422| Block 0 @@ -1820,7 +1864,8 @@ ir.cpp: # 422| r0_9(glval) = VariableAddress[#return] : # 422| v0_10(void) = ReturnValue : &:r0_9, ~mu0_2 # 422| v0_11(void) = UnmodeledUse : mu* -# 422| v0_12(void) = ExitFunction : +# 422| v0_12(void) = AliasedUse : ~mu0_2 +# 422| v0_13(void) = ExitFunction : # 426| void FieldAccess() # 426| Block 0 @@ -1846,7 +1891,8 @@ ir.cpp: # 431| v0_19(void) = NoOp : # 426| v0_20(void) = ReturnVoid : # 426| v0_21(void) = UnmodeledUse : mu* -# 426| v0_22(void) = ExitFunction : +# 426| v0_22(void) = AliasedUse : ~mu0_2 +# 426| v0_23(void) = ExitFunction : # 433| void LogicalOr(bool, bool) # 433| Block 0 @@ -1908,7 +1954,8 @@ ir.cpp: # 445| v7_0(void) = NoOp : # 433| v7_1(void) = ReturnVoid : # 433| v7_2(void) = UnmodeledUse : mu* -# 433| v7_3(void) = ExitFunction : +# 433| v7_3(void) = AliasedUse : ~mu0_2 +# 433| v7_4(void) = ExitFunction : # 447| void LogicalAnd(bool, bool) # 447| Block 0 @@ -1970,7 +2017,8 @@ ir.cpp: # 459| v7_0(void) = NoOp : # 447| v7_1(void) = ReturnVoid : # 447| v7_2(void) = UnmodeledUse : mu* -# 447| v7_3(void) = ExitFunction : +# 447| v7_3(void) = AliasedUse : ~mu0_2 +# 447| v7_4(void) = ExitFunction : # 461| void LogicalNot(bool, bool) # 461| Block 0 @@ -2025,7 +2073,8 @@ ir.cpp: # 473| v6_0(void) = NoOp : # 461| v6_1(void) = ReturnVoid : # 461| v6_2(void) = UnmodeledUse : mu* -# 461| v6_3(void) = ExitFunction : +# 461| v6_3(void) = AliasedUse : ~mu0_2 +# 461| v6_4(void) = ExitFunction : # 475| void ConditionValues(bool, bool) # 475| Block 0 @@ -2096,7 +2145,8 @@ ir.cpp: # 480| v7_5(void) = NoOp : # 475| v7_6(void) = ReturnVoid : # 475| v7_7(void) = UnmodeledUse : mu* -# 475| v7_8(void) = ExitFunction : +# 475| v7_8(void) = AliasedUse : ~mu0_2 +# 475| v7_9(void) = ExitFunction : # 479| Block 8 # 479| r8_0(glval) = VariableAddress[#temp479:11] : @@ -2173,7 +2223,8 @@ ir.cpp: # 484| v3_3(void) = NoOp : # 482| v3_4(void) = ReturnVoid : # 482| v3_5(void) = UnmodeledUse : mu* -# 482| v3_6(void) = ExitFunction : +# 482| v3_6(void) = AliasedUse : ~mu0_2 +# 482| v3_7(void) = ExitFunction : # 486| void Conditional_LValue(bool) # 486| Block 0 @@ -2200,7 +2251,8 @@ ir.cpp: # 490| v1_3(void) = NoOp : # 486| v1_4(void) = ReturnVoid : # 486| v1_5(void) = UnmodeledUse : mu* -# 486| v1_6(void) = ExitFunction : +# 486| v1_6(void) = AliasedUse : ~mu0_2 +# 486| v1_7(void) = ExitFunction : # 489| Block 2 # 489| r2_0(glval) = VariableAddress[x] : @@ -2231,7 +2283,8 @@ ir.cpp: # 494| v1_0(void) = NoOp : # 492| v1_1(void) = ReturnVoid : # 492| v1_2(void) = UnmodeledUse : mu* -# 492| v1_3(void) = ExitFunction : +# 492| v1_3(void) = AliasedUse : ~mu0_2 +# 492| v1_4(void) = ExitFunction : # 493| Block 2 # 493| r2_0(glval) = FunctionAddress[VoidFunc] : @@ -2265,7 +2318,8 @@ ir.cpp: # 501| v0_15(void) = NoOp : # 496| v0_16(void) = ReturnVoid : # 496| v0_17(void) = UnmodeledUse : mu* -# 496| v0_18(void) = ExitFunction : +# 496| v0_18(void) = AliasedUse : ~mu0_2 +# 496| v0_19(void) = ExitFunction : # 503| void InitList(int, float) # 503| Block 0 @@ -2313,7 +2367,8 @@ ir.cpp: # 510| v0_41(void) = NoOp : # 503| v0_42(void) = ReturnVoid : # 503| v0_43(void) = UnmodeledUse : mu* -# 503| v0_44(void) = ExitFunction : +# 503| v0_44(void) = AliasedUse : ~mu0_2 +# 503| v0_45(void) = ExitFunction : # 512| void NestedInitList(int, float) # 512| Block 0 @@ -2390,7 +2445,8 @@ ir.cpp: # 517| v0_70(void) = NoOp : # 512| v0_71(void) = ReturnVoid : # 512| v0_72(void) = UnmodeledUse : mu* -# 512| v0_73(void) = ExitFunction : +# 512| v0_73(void) = AliasedUse : ~mu0_2 +# 512| v0_74(void) = ExitFunction : # 519| void ArrayInit(int, float) # 519| Block 0 @@ -2438,7 +2494,8 @@ ir.cpp: # 523| v0_41(void) = NoOp : # 519| v0_42(void) = ReturnVoid : # 519| v0_43(void) = UnmodeledUse : mu* -# 519| v0_44(void) = ExitFunction : +# 519| v0_44(void) = AliasedUse : ~mu0_2 +# 519| v0_45(void) = ExitFunction : # 530| void UnionInit(int, float) # 530| Block 0 @@ -2459,7 +2516,8 @@ ir.cpp: # 533| v0_14(void) = NoOp : # 530| v0_15(void) = ReturnVoid : # 530| v0_16(void) = UnmodeledUse : mu* -# 530| v0_17(void) = ExitFunction : +# 530| v0_17(void) = AliasedUse : ~mu0_2 +# 530| v0_18(void) = ExitFunction : # 535| void EarlyReturn(int, int) # 535| Block 0 @@ -2482,7 +2540,8 @@ ir.cpp: # 535| Block 1 # 535| v1_0(void) = ReturnVoid : # 535| v1_1(void) = UnmodeledUse : mu* -# 535| v1_2(void) = ExitFunction : +# 535| v1_2(void) = AliasedUse : ~mu0_2 +# 535| v1_3(void) = ExitFunction : # 537| Block 2 # 537| v2_0(void) = NoOp : @@ -2518,7 +2577,8 @@ ir.cpp: # 543| r1_0(glval) = VariableAddress[#return] : # 543| v1_1(void) = ReturnValue : &:r1_0, ~mu0_2 # 543| v1_2(void) = UnmodeledUse : mu* -# 543| v1_3(void) = ExitFunction : +# 543| v1_3(void) = AliasedUse : ~mu0_2 +# 543| v1_4(void) = ExitFunction : # 545| Block 2 # 545| r2_0(glval) = VariableAddress[#return] : @@ -2554,7 +2614,8 @@ ir.cpp: # 551| r0_12(glval) = VariableAddress[#return] : # 551| v0_13(void) = ReturnValue : &:r0_12, ~mu0_2 # 551| v0_14(void) = UnmodeledUse : mu* -# 551| v0_15(void) = ExitFunction : +# 551| v0_15(void) = AliasedUse : ~mu0_2 +# 551| v0_16(void) = ExitFunction : # 560| int EnumSwitch(E) # 560| Block 0 @@ -2575,7 +2636,8 @@ ir.cpp: # 560| r1_0(glval) = VariableAddress[#return] : # 560| v1_1(void) = ReturnValue : &:r1_0, ~mu0_2 # 560| v1_2(void) = UnmodeledUse : mu* -# 560| v1_3(void) = ExitFunction : +# 560| v1_3(void) = AliasedUse : ~mu0_2 +# 560| v1_4(void) = ExitFunction : # 564| Block 2 # 564| v2_0(void) = NoOp : @@ -2660,7 +2722,8 @@ ir.cpp: # 580| v0_57(void) = NoOp : # 571| v0_58(void) = ReturnVoid : # 571| v0_59(void) = UnmodeledUse : mu* -# 571| v0_60(void) = ExitFunction : +# 571| v0_60(void) = AliasedUse : ~mu0_2 +# 571| v0_61(void) = ExitFunction : # 584| void VarArgs() # 584| Block 0 @@ -2682,7 +2745,8 @@ ir.cpp: # 586| v0_15(void) = NoOp : # 584| v0_16(void) = ReturnVoid : # 584| v0_17(void) = UnmodeledUse : mu* -# 584| v0_18(void) = ExitFunction : +# 584| v0_18(void) = AliasedUse : ~mu0_2 +# 584| v0_19(void) = ExitFunction : # 590| void SetFuncPtr() # 590| Block 0 @@ -2704,7 +2768,8 @@ ir.cpp: # 595| v0_15(void) = NoOp : # 590| v0_16(void) = ReturnVoid : # 590| v0_17(void) = UnmodeledUse : mu* -# 590| v0_18(void) = ExitFunction : +# 590| v0_18(void) = AliasedUse : ~mu0_2 +# 590| v0_19(void) = ExitFunction : # 615| void DeclareObject() # 615| Block 0 @@ -2739,7 +2804,8 @@ ir.cpp: # 620| v0_28(void) = NoOp : # 615| v0_29(void) = ReturnVoid : # 615| v0_30(void) = UnmodeledUse : mu* -# 615| v0_31(void) = ExitFunction : +# 615| v0_31(void) = AliasedUse : ~mu0_2 +# 615| v0_32(void) = ExitFunction : # 622| void CallMethods(String&, String*, String) # 622| Block 0 @@ -2778,7 +2844,8 @@ ir.cpp: # 626| v0_32(void) = NoOp : # 622| v0_33(void) = ReturnVoid : # 622| v0_34(void) = UnmodeledUse : mu* -# 622| v0_35(void) = ExitFunction : +# 622| v0_35(void) = AliasedUse : ~mu0_2 +# 622| v0_36(void) = ExitFunction : # 630| int C::StaticMemberFunction(int) # 630| Block 0 @@ -2794,7 +2861,8 @@ ir.cpp: # 630| r0_9(glval) = VariableAddress[#return] : # 630| v0_10(void) = ReturnValue : &:r0_9, ~mu0_2 # 630| v0_11(void) = UnmodeledUse : mu* -# 630| v0_12(void) = ExitFunction : +# 630| v0_12(void) = AliasedUse : ~mu0_2 +# 630| v0_13(void) = ExitFunction : # 634| int C::InstanceMemberFunction(int) # 634| Block 0 @@ -2811,7 +2879,8 @@ ir.cpp: # 634| r0_10(glval) = VariableAddress[#return] : # 634| v0_11(void) = ReturnValue : &:r0_10, ~mu0_2 # 634| v0_12(void) = UnmodeledUse : mu* -# 634| v0_13(void) = ExitFunction : +# 634| v0_13(void) = AliasedUse : ~mu0_2 +# 634| v0_14(void) = ExitFunction : # 638| int C::VirtualMemberFunction(int) # 638| Block 0 @@ -2828,7 +2897,8 @@ ir.cpp: # 638| r0_10(glval) = VariableAddress[#return] : # 638| v0_11(void) = ReturnValue : &:r0_10, ~mu0_2 # 638| v0_12(void) = UnmodeledUse : mu* -# 638| v0_13(void) = ExitFunction : +# 638| v0_13(void) = AliasedUse : ~mu0_2 +# 638| v0_14(void) = ExitFunction : # 642| void C::FieldAccess() # 642| Block 0 @@ -2868,7 +2938,8 @@ ir.cpp: # 650| v0_33(void) = NoOp : # 642| v0_34(void) = ReturnVoid : # 642| v0_35(void) = UnmodeledUse : mu* -# 642| v0_36(void) = ExitFunction : +# 642| v0_36(void) = AliasedUse : ~mu0_2 +# 642| v0_37(void) = ExitFunction : # 652| void C::MethodCalls() # 652| Block 0 @@ -2900,7 +2971,8 @@ ir.cpp: # 656| v0_25(void) = NoOp : # 652| v0_26(void) = ReturnVoid : # 652| v0_27(void) = UnmodeledUse : mu* -# 652| v0_28(void) = ExitFunction : +# 652| v0_28(void) = AliasedUse : ~mu0_2 +# 652| v0_29(void) = ExitFunction : # 658| void C::C() # 658| Block 0 @@ -2932,7 +3004,8 @@ ir.cpp: # 664| v0_25(void) = NoOp : # 658| v0_26(void) = ReturnVoid : # 658| v0_27(void) = UnmodeledUse : mu* -# 658| v0_28(void) = ExitFunction : +# 658| v0_28(void) = AliasedUse : ~mu0_2 +# 658| v0_29(void) = ExitFunction : # 675| int DerefReference(int&) # 675| Block 0 @@ -2949,7 +3022,8 @@ ir.cpp: # 675| r0_10(glval) = VariableAddress[#return] : # 675| v0_11(void) = ReturnValue : &:r0_10, ~mu0_2 # 675| v0_12(void) = UnmodeledUse : mu* -# 675| v0_13(void) = ExitFunction : +# 675| v0_13(void) = AliasedUse : ~mu0_2 +# 675| v0_14(void) = ExitFunction : # 679| int& TakeReference() # 679| Block 0 @@ -2962,7 +3036,8 @@ ir.cpp: # 679| r0_6(glval) = VariableAddress[#return] : # 679| v0_7(void) = ReturnValue : &:r0_6, ~mu0_2 # 679| v0_8(void) = UnmodeledUse : mu* -# 679| v0_9(void) = ExitFunction : +# 679| v0_9(void) = AliasedUse : ~mu0_2 +# 679| v0_10(void) = ExitFunction : # 685| void InitReference(int) # 685| Block 0 @@ -2987,7 +3062,8 @@ ir.cpp: # 689| v0_18(void) = NoOp : # 685| v0_19(void) = ReturnVoid : # 685| v0_20(void) = UnmodeledUse : mu* -# 685| v0_21(void) = ExitFunction : +# 685| v0_21(void) = AliasedUse : ~mu0_2 +# 685| v0_22(void) = ExitFunction : # 691| void ArrayReferences() # 691| Block 0 @@ -3010,7 +3086,8 @@ ir.cpp: # 695| v0_16(void) = NoOp : # 691| v0_17(void) = ReturnVoid : # 691| v0_18(void) = UnmodeledUse : mu* -# 691| v0_19(void) = ExitFunction : +# 691| v0_19(void) = AliasedUse : ~mu0_2 +# 691| v0_20(void) = ExitFunction : # 697| void FunctionReferences() # 697| Block 0 @@ -3032,7 +3109,8 @@ ir.cpp: # 701| v0_15(void) = NoOp : # 697| v0_16(void) = ReturnVoid : # 697| v0_17(void) = UnmodeledUse : mu* -# 697| v0_18(void) = ExitFunction : +# 697| v0_18(void) = AliasedUse : ~mu0_2 +# 697| v0_19(void) = ExitFunction : # 704| int min(int, int) # 704| Block 0 @@ -3074,7 +3152,8 @@ ir.cpp: # 704| r3_3(glval) = VariableAddress[#return] : # 704| v3_4(void) = ReturnValue : &:r3_3, ~mu0_2 # 704| v3_5(void) = UnmodeledUse : mu* -# 704| v3_6(void) = ExitFunction : +# 704| v3_6(void) = AliasedUse : ~mu0_2 +# 704| v3_7(void) = ExitFunction : # 708| int CallMin(int, int) # 708| Block 0 @@ -3097,7 +3176,8 @@ ir.cpp: # 708| r0_16(glval) = VariableAddress[#return] : # 708| v0_17(void) = ReturnValue : &:r0_16, ~mu0_2 # 708| v0_18(void) = UnmodeledUse : mu* -# 708| v0_19(void) = ExitFunction : +# 708| v0_19(void) = AliasedUse : ~mu0_2 +# 708| v0_20(void) = ExitFunction : # 715| long Outer::Func(void*, char) # 715| Block 0 @@ -3114,7 +3194,8 @@ ir.cpp: # 715| r0_10(glval) = VariableAddress[#return] : # 715| v0_11(void) = ReturnValue : &:r0_10, ~mu0_2 # 715| v0_12(void) = UnmodeledUse : mu* -# 715| v0_13(void) = ExitFunction : +# 715| v0_13(void) = AliasedUse : ~mu0_2 +# 715| v0_14(void) = ExitFunction : # 720| double CallNestedTemplateFunc() # 720| Block 0 @@ -3134,7 +3215,8 @@ ir.cpp: # 720| r0_13(glval) = VariableAddress[#return] : # 720| v0_14(void) = ReturnValue : &:r0_13, ~mu0_2 # 720| v0_15(void) = UnmodeledUse : mu* -# 720| v0_16(void) = ExitFunction : +# 720| v0_16(void) = AliasedUse : ~mu0_2 +# 720| v0_17(void) = ExitFunction : # 724| void TryCatch(bool) # 724| Block 0 @@ -3154,7 +3236,8 @@ ir.cpp: # 724| Block 1 # 724| v1_0(void) = UnmodeledUse : mu* -# 724| v1_1(void) = ExitFunction : +# 724| v1_1(void) = AliasedUse : ~mu0_2 +# 724| v1_2(void) = ExitFunction : # 724| Block 2 # 724| v2_0(void) = Unwind : @@ -3278,7 +3361,8 @@ ir.cpp: # 745| r0_21(glval) = VariableAddress[#return] : # 745| v0_22(void) = ReturnValue : &:r0_21, ~mu0_2 # 745| v0_23(void) = UnmodeledUse : mu* -# 745| v0_24(void) = ExitFunction : +# 745| v0_24(void) = AliasedUse : ~mu0_2 +# 745| v0_25(void) = ExitFunction : # 745| void Base::Base(Base const&) # 745| Block 0 @@ -3295,7 +3379,8 @@ ir.cpp: # 745| v0_10(void) = NoOp : # 745| v0_11(void) = ReturnVoid : # 745| v0_12(void) = UnmodeledUse : mu* -# 745| v0_13(void) = ExitFunction : +# 745| v0_13(void) = AliasedUse : ~mu0_2 +# 745| v0_14(void) = ExitFunction : # 748| void Base::Base() # 748| Block 0 @@ -3310,7 +3395,8 @@ ir.cpp: # 749| v0_8(void) = NoOp : # 748| v0_9(void) = ReturnVoid : # 748| v0_10(void) = UnmodeledUse : mu* -# 748| v0_11(void) = ExitFunction : +# 748| v0_11(void) = AliasedUse : ~mu0_2 +# 748| v0_12(void) = ExitFunction : # 750| void Base::~Base() # 750| Block 0 @@ -3325,7 +3411,8 @@ ir.cpp: # 751| mu0_8(unknown) = ^CallSideEffect : ~mu0_2 # 750| v0_9(void) = ReturnVoid : # 750| v0_10(void) = UnmodeledUse : mu* -# 750| v0_11(void) = ExitFunction : +# 750| v0_11(void) = AliasedUse : ~mu0_2 +# 750| v0_12(void) = ExitFunction : # 754| Middle& Middle::operator=(Middle const&) # 754| Block 0 @@ -3365,7 +3452,8 @@ ir.cpp: # 754| r0_33(glval) = VariableAddress[#return] : # 754| v0_34(void) = ReturnValue : &:r0_33, ~mu0_2 # 754| v0_35(void) = UnmodeledUse : mu* -# 754| v0_36(void) = ExitFunction : +# 754| v0_36(void) = AliasedUse : ~mu0_2 +# 754| v0_37(void) = ExitFunction : # 757| void Middle::Middle() # 757| Block 0 @@ -3384,7 +3472,8 @@ ir.cpp: # 758| v0_12(void) = NoOp : # 757| v0_13(void) = ReturnVoid : # 757| v0_14(void) = UnmodeledUse : mu* -# 757| v0_15(void) = ExitFunction : +# 757| v0_15(void) = AliasedUse : ~mu0_2 +# 757| v0_16(void) = ExitFunction : # 759| void Middle::~Middle() # 759| Block 0 @@ -3403,7 +3492,8 @@ ir.cpp: # 760| mu0_12(unknown) = ^CallSideEffect : ~mu0_2 # 759| v0_13(void) = ReturnVoid : # 759| v0_14(void) = UnmodeledUse : mu* -# 759| v0_15(void) = ExitFunction : +# 759| v0_15(void) = AliasedUse : ~mu0_2 +# 759| v0_16(void) = ExitFunction : # 763| Derived& Derived::operator=(Derived const&) # 763| Block 0 @@ -3443,7 +3533,8 @@ ir.cpp: # 763| r0_33(glval) = VariableAddress[#return] : # 763| v0_34(void) = ReturnValue : &:r0_33, ~mu0_2 # 763| v0_35(void) = UnmodeledUse : mu* -# 763| v0_36(void) = ExitFunction : +# 763| v0_36(void) = AliasedUse : ~mu0_2 +# 763| v0_37(void) = ExitFunction : # 766| void Derived::Derived() # 766| Block 0 @@ -3462,7 +3553,8 @@ ir.cpp: # 767| v0_12(void) = NoOp : # 766| v0_13(void) = ReturnVoid : # 766| v0_14(void) = UnmodeledUse : mu* -# 766| v0_15(void) = ExitFunction : +# 766| v0_15(void) = AliasedUse : ~mu0_2 +# 766| v0_16(void) = ExitFunction : # 768| void Derived::~Derived() # 768| Block 0 @@ -3481,7 +3573,8 @@ ir.cpp: # 769| mu0_12(unknown) = ^CallSideEffect : ~mu0_2 # 768| v0_13(void) = ReturnVoid : # 768| v0_14(void) = UnmodeledUse : mu* -# 768| v0_15(void) = ExitFunction : +# 768| v0_15(void) = AliasedUse : ~mu0_2 +# 768| v0_16(void) = ExitFunction : # 775| void MiddleVB1::MiddleVB1() # 775| Block 0 @@ -3500,7 +3593,8 @@ ir.cpp: # 776| v0_12(void) = NoOp : # 775| v0_13(void) = ReturnVoid : # 775| v0_14(void) = UnmodeledUse : mu* -# 775| v0_15(void) = ExitFunction : +# 775| v0_15(void) = AliasedUse : ~mu0_2 +# 775| v0_16(void) = ExitFunction : # 777| void MiddleVB1::~MiddleVB1() # 777| Block 0 @@ -3519,7 +3613,8 @@ ir.cpp: # 778| mu0_12(unknown) = ^CallSideEffect : ~mu0_2 # 777| v0_13(void) = ReturnVoid : # 777| v0_14(void) = UnmodeledUse : mu* -# 777| v0_15(void) = ExitFunction : +# 777| v0_15(void) = AliasedUse : ~mu0_2 +# 777| v0_16(void) = ExitFunction : # 784| void MiddleVB2::MiddleVB2() # 784| Block 0 @@ -3538,7 +3633,8 @@ ir.cpp: # 785| v0_12(void) = NoOp : # 784| v0_13(void) = ReturnVoid : # 784| v0_14(void) = UnmodeledUse : mu* -# 784| v0_15(void) = ExitFunction : +# 784| v0_15(void) = AliasedUse : ~mu0_2 +# 784| v0_16(void) = ExitFunction : # 786| void MiddleVB2::~MiddleVB2() # 786| Block 0 @@ -3557,7 +3653,8 @@ ir.cpp: # 787| mu0_12(unknown) = ^CallSideEffect : ~mu0_2 # 786| v0_13(void) = ReturnVoid : # 786| v0_14(void) = UnmodeledUse : mu* -# 786| v0_15(void) = ExitFunction : +# 786| v0_15(void) = AliasedUse : ~mu0_2 +# 786| v0_16(void) = ExitFunction : # 793| void DerivedVB::DerivedVB() # 793| Block 0 @@ -3584,7 +3681,8 @@ ir.cpp: # 794| v0_20(void) = NoOp : # 793| v0_21(void) = ReturnVoid : # 793| v0_22(void) = UnmodeledUse : mu* -# 793| v0_23(void) = ExitFunction : +# 793| v0_23(void) = AliasedUse : ~mu0_2 +# 793| v0_24(void) = ExitFunction : # 795| void DerivedVB::~DerivedVB() # 795| Block 0 @@ -3611,7 +3709,8 @@ ir.cpp: # 796| mu0_20(unknown) = ^CallSideEffect : ~mu0_2 # 795| v0_21(void) = ReturnVoid : # 795| v0_22(void) = UnmodeledUse : mu* -# 795| v0_23(void) = ExitFunction : +# 795| v0_23(void) = AliasedUse : ~mu0_2 +# 795| v0_24(void) = ExitFunction : # 799| void HierarchyConversions() # 799| Block 0 @@ -3866,7 +3965,8 @@ ir.cpp: # 840| v0_248(void) = NoOp : # 799| v0_249(void) = ReturnVoid : # 799| v0_250(void) = UnmodeledUse : mu* -# 799| v0_251(void) = ExitFunction : +# 799| v0_251(void) = AliasedUse : ~mu0_2 +# 799| v0_252(void) = ExitFunction : # 842| void PolymorphicBase::PolymorphicBase() # 842| Block 0 @@ -3877,7 +3977,8 @@ ir.cpp: # 842| v0_4(void) = NoOp : # 842| v0_5(void) = ReturnVoid : # 842| v0_6(void) = UnmodeledUse : mu* -# 842| v0_7(void) = ExitFunction : +# 842| v0_7(void) = AliasedUse : ~mu0_2 +# 842| v0_8(void) = ExitFunction : # 846| void PolymorphicDerived::PolymorphicDerived() # 846| Block 0 @@ -3892,7 +3993,8 @@ ir.cpp: # 846| v0_8(void) = NoOp : # 846| v0_9(void) = ReturnVoid : # 846| v0_10(void) = UnmodeledUse : mu* -# 846| v0_11(void) = ExitFunction : +# 846| v0_11(void) = AliasedUse : ~mu0_2 +# 846| v0_12(void) = ExitFunction : # 846| void PolymorphicDerived::~PolymorphicDerived() # 846| Block 0 @@ -3907,7 +4009,8 @@ ir.cpp: # 846| mu0_8(unknown) = ^CallSideEffect : ~mu0_2 # 846| v0_9(void) = ReturnVoid : # 846| v0_10(void) = UnmodeledUse : mu* -# 846| v0_11(void) = ExitFunction : +# 846| v0_11(void) = AliasedUse : ~mu0_2 +# 846| v0_12(void) = ExitFunction : # 849| void DynamicCast() # 849| Block 0 @@ -3959,7 +4062,8 @@ ir.cpp: # 865| v0_45(void) = NoOp : # 849| v0_46(void) = ReturnVoid : # 849| v0_47(void) = UnmodeledUse : mu* -# 849| v0_48(void) = ExitFunction : +# 849| v0_48(void) = AliasedUse : ~mu0_2 +# 849| v0_49(void) = ExitFunction : # 867| void String::String() # 867| Block 0 @@ -3977,7 +4081,8 @@ ir.cpp: # 869| v0_11(void) = NoOp : # 867| v0_12(void) = ReturnVoid : # 867| v0_13(void) = UnmodeledUse : mu* -# 867| v0_14(void) = ExitFunction : +# 867| v0_14(void) = AliasedUse : ~mu0_2 +# 867| v0_15(void) = ExitFunction : # 871| void ArrayConversions() # 871| Block 0 @@ -4024,7 +4129,8 @@ ir.cpp: # 881| v0_40(void) = NoOp : # 871| v0_41(void) = ReturnVoid : # 871| v0_42(void) = UnmodeledUse : mu* -# 871| v0_43(void) = ExitFunction : +# 871| v0_43(void) = AliasedUse : ~mu0_2 +# 871| v0_44(void) = ExitFunction : # 883| void FuncPtrConversions(int(*)(int), void*) # 883| Block 0 @@ -4048,7 +4154,8 @@ ir.cpp: # 886| v0_17(void) = NoOp : # 883| v0_18(void) = ReturnVoid : # 883| v0_19(void) = UnmodeledUse : mu* -# 883| v0_20(void) = ExitFunction : +# 883| v0_20(void) = AliasedUse : ~mu0_2 +# 883| v0_21(void) = ExitFunction : # 888| void VarArgUsage(int) # 888| Block 0 @@ -4092,7 +4199,8 @@ ir.cpp: # 898| v0_37(void) = NoOp : # 888| v0_38(void) = ReturnVoid : # 888| v0_39(void) = UnmodeledUse : mu* -# 888| v0_40(void) = ExitFunction : +# 888| v0_40(void) = AliasedUse : ~mu0_2 +# 888| v0_41(void) = ExitFunction : # 900| void CastToVoid(int) # 900| Block 0 @@ -4106,7 +4214,8 @@ ir.cpp: # 902| v0_7(void) = NoOp : # 900| v0_8(void) = ReturnVoid : # 900| v0_9(void) = UnmodeledUse : mu* -# 900| v0_10(void) = ExitFunction : +# 900| v0_10(void) = AliasedUse : ~mu0_2 +# 900| v0_11(void) = ExitFunction : # 904| void ConstantConditions(int) # 904| Block 0 @@ -4131,7 +4240,8 @@ ir.cpp: # 907| v1_3(void) = NoOp : # 904| v1_4(void) = ReturnVoid : # 904| v1_5(void) = UnmodeledUse : mu* -# 904| v1_6(void) = ExitFunction : +# 904| v1_6(void) = AliasedUse : ~mu0_2 +# 904| v1_7(void) = ExitFunction : # 906| Block 2 # 906| r2_0(glval) = VariableAddress[x] : @@ -4209,7 +4319,8 @@ ir.cpp: # 948| v0_57(void) = NoOp : # 940| v0_58(void) = ReturnVoid : # 940| v0_59(void) = UnmodeledUse : mu* -# 940| v0_60(void) = ExitFunction : +# 940| v0_60(void) = AliasedUse : ~mu0_2 +# 940| v0_61(void) = ExitFunction : # 950| void OperatorNewArray(int) # 950| Block 0 @@ -4289,7 +4400,8 @@ ir.cpp: # 959| v0_73(void) = NoOp : # 950| v0_74(void) = ReturnVoid : # 950| v0_75(void) = UnmodeledUse : mu* -# 950| v0_76(void) = ExitFunction : +# 950| v0_76(void) = AliasedUse : ~mu0_2 +# 950| v0_77(void) = ExitFunction : # 961| int designatedInit() # 961| Block 0 @@ -4328,7 +4440,8 @@ ir.cpp: # 961| r0_32(glval) = VariableAddress[#return] : # 961| v0_33(void) = ReturnValue : &:r0_32, ~mu0_2 # 961| v0_34(void) = UnmodeledUse : mu* -# 961| v0_35(void) = ExitFunction : +# 961| v0_35(void) = AliasedUse : ~mu0_2 +# 961| v0_36(void) = ExitFunction : # 966| void IfStmtWithDeclaration(int, int) # 966| Block 0 @@ -4403,7 +4516,8 @@ ir.cpp: # 976| v6_0(void) = NoOp : # 966| v6_1(void) = ReturnVoid : # 966| v6_2(void) = UnmodeledUse : mu* -# 966| v6_3(void) = ExitFunction : +# 966| v6_3(void) = AliasedUse : ~mu0_2 +# 966| v6_4(void) = ExitFunction : # 978| void WhileStmtWithDeclaration(int, int) # 978| Block 0 @@ -4460,7 +4574,8 @@ ir.cpp: # 985| v6_0(void) = NoOp : # 978| v6_1(void) = ReturnVoid : # 978| v6_2(void) = UnmodeledUse : mu* -# 978| v6_3(void) = ExitFunction : +# 978| v6_3(void) = AliasedUse : ~mu0_2 +# 978| v6_4(void) = ExitFunction : # 979| Block 7 # 979| r7_0(glval) = VariableAddress[b] : @@ -4501,7 +4616,8 @@ ir.cpp: # 987| r0_20(glval) = VariableAddress[#return] : # 987| v0_21(void) = ReturnValue : &:r0_20, ~mu0_2 # 987| v0_22(void) = UnmodeledUse : mu* -# 987| v0_23(void) = ExitFunction : +# 987| v0_23(void) = AliasedUse : ~mu0_2 +# 987| v0_24(void) = ExitFunction : # 991| int ExprStmt(int, int, int) # 991| Block 0 @@ -4552,7 +4668,8 @@ ir.cpp: # 991| r3_9(glval) = VariableAddress[#return] : # 991| v3_10(void) = ReturnValue : &:r3_9, ~mu0_2 # 991| v3_11(void) = UnmodeledUse : mu* -# 991| v3_12(void) = ExitFunction : +# 991| v3_12(void) = AliasedUse : ~mu0_2 +# 991| v3_13(void) = ExitFunction : # 1006| void OperatorDelete() # 1006| Block 0 @@ -4572,7 +4689,8 @@ ir.cpp: # 1012| v0_13(void) = NoOp : # 1006| v0_14(void) = ReturnVoid : # 1006| v0_15(void) = UnmodeledUse : mu* -# 1006| v0_16(void) = ExitFunction : +# 1006| v0_16(void) = AliasedUse : ~mu0_2 +# 1006| v0_17(void) = ExitFunction : # 1015| void OperatorDeleteArray() # 1015| Block 0 @@ -4592,7 +4710,8 @@ ir.cpp: # 1021| v0_13(void) = NoOp : # 1015| v0_14(void) = ReturnVoid : # 1015| v0_15(void) = UnmodeledUse : mu* -# 1015| v0_16(void) = ExitFunction : +# 1015| v0_16(void) = AliasedUse : ~mu0_2 +# 1015| v0_17(void) = ExitFunction : # 1025| void EmptyStructInit() # 1025| Block 0 @@ -4604,7 +4723,8 @@ ir.cpp: # 1027| v0_5(void) = NoOp : # 1025| v0_6(void) = ReturnVoid : # 1025| v0_7(void) = UnmodeledUse : mu* -# 1025| v0_8(void) = ExitFunction : +# 1025| v0_8(void) = AliasedUse : ~mu0_2 +# 1025| v0_9(void) = ExitFunction : # 1029| void (lambda [] type at line 1029, col. 12)::(constructor)((lambda [] type at line 1029, col. 12)&&) # 1029| Block 0 @@ -4617,7 +4737,8 @@ ir.cpp: # 1029| v0_6(void) = NoOp : # 1029| v0_7(void) = ReturnVoid : # 1029| v0_8(void) = UnmodeledUse : mu* -# 1029| v0_9(void) = ExitFunction : +# 1029| v0_9(void) = AliasedUse : ~mu0_2 +# 1029| v0_10(void) = ExitFunction : # 1029| void (lambda [] type at line 1029, col. 12)::operator()() const # 1029| Block 0 @@ -4628,7 +4749,8 @@ ir.cpp: # 1029| v0_4(void) = NoOp : # 1029| v0_5(void) = ReturnVoid : # 1029| v0_6(void) = UnmodeledUse : mu* -# 1029| v0_7(void) = ExitFunction : +# 1029| v0_7(void) = AliasedUse : ~mu0_2 +# 1029| v0_8(void) = ExitFunction : # 1029| void(* (lambda [] type at line 1029, col. 12)::operator void (*)()() const)() # 1029| Block 0 @@ -4642,7 +4764,8 @@ ir.cpp: # 1029| r0_7(glval<..(*)(..)>) = VariableAddress[#return] : # 1029| v0_8(void) = ReturnValue : &:r0_7, ~mu0_2 # 1029| v0_9(void) = UnmodeledUse : mu* -# 1029| v0_10(void) = ExitFunction : +# 1029| v0_10(void) = AliasedUse : ~mu0_2 +# 1029| v0_11(void) = ExitFunction : # 1031| void Lambda(int, String const&) # 1031| Block 0 @@ -4802,7 +4925,8 @@ ir.cpp: # 1047| v0_153(void) = NoOp : # 1031| v0_154(void) = ReturnVoid : # 1031| v0_155(void) = UnmodeledUse : mu* -# 1031| v0_156(void) = ExitFunction : +# 1031| v0_156(void) = AliasedUse : ~mu0_2 +# 1031| v0_157(void) = ExitFunction : # 1032| void (void Lambda(int, String const&))::(lambda [] type at line 1032, col. 23)::(constructor)((void Lambda(int, String const&))::(lambda [] type at line 1032, col. 23)&&) # 1032| Block 0 @@ -4815,7 +4939,8 @@ ir.cpp: # 1032| v0_6(void) = NoOp : # 1032| v0_7(void) = ReturnVoid : # 1032| v0_8(void) = UnmodeledUse : mu* -# 1032| v0_9(void) = ExitFunction : +# 1032| v0_9(void) = AliasedUse : ~mu0_2 +# 1032| v0_10(void) = ExitFunction : # 1032| char (void Lambda(int, String const&))::(lambda [] type at line 1032, col. 23)::operator()(float) const # 1032| Block 0 @@ -4831,7 +4956,8 @@ ir.cpp: # 1032| r0_9(glval) = VariableAddress[#return] : # 1032| v0_10(void) = ReturnValue : &:r0_9, ~mu0_2 # 1032| v0_11(void) = UnmodeledUse : mu* -# 1032| v0_12(void) = ExitFunction : +# 1032| v0_12(void) = AliasedUse : ~mu0_2 +# 1032| v0_13(void) = ExitFunction : # 1032| char(* (void Lambda(int, String const&))::(lambda [] type at line 1032, col. 23)::operator char (*)(float)() const)(float) # 1032| Block 0 @@ -4845,7 +4971,8 @@ ir.cpp: # 1032| r0_7(glval<..(*)(..)>) = VariableAddress[#return] : # 1032| v0_8(void) = ReturnValue : &:r0_7, ~mu0_2 # 1032| v0_9(void) = UnmodeledUse : mu* -# 1032| v0_10(void) = ExitFunction : +# 1032| v0_10(void) = AliasedUse : ~mu0_2 +# 1032| v0_11(void) = ExitFunction : # 1034| char (void Lambda(int, String const&))::(lambda [] type at line 1034, col. 21)::operator()(float) const # 1034| Block 0 @@ -4874,7 +5001,8 @@ ir.cpp: # 1034| r0_22(glval) = VariableAddress[#return] : # 1034| v0_23(void) = ReturnValue : &:r0_22, ~mu0_2 # 1034| v0_24(void) = UnmodeledUse : mu* -# 1034| v0_25(void) = ExitFunction : +# 1034| v0_25(void) = AliasedUse : ~mu0_2 +# 1034| v0_26(void) = ExitFunction : # 1036| void (void Lambda(int, String const&))::(lambda [] type at line 1036, col. 21)::~() # 1036| Block 0 @@ -4889,7 +5017,8 @@ ir.cpp: # 1036| mu0_8(unknown) = ^CallSideEffect : ~mu0_2 # 1036| v0_9(void) = ReturnVoid : # 1036| v0_10(void) = UnmodeledUse : mu* -# 1036| v0_11(void) = ExitFunction : +# 1036| v0_11(void) = AliasedUse : ~mu0_2 +# 1036| v0_12(void) = ExitFunction : # 1036| char (void Lambda(int, String const&))::(lambda [] type at line 1036, col. 21)::operator()(float) const # 1036| Block 0 @@ -4916,7 +5045,8 @@ ir.cpp: # 1036| r0_20(glval) = VariableAddress[#return] : # 1036| v0_21(void) = ReturnValue : &:r0_20, ~mu0_2 # 1036| v0_22(void) = UnmodeledUse : mu* -# 1036| v0_23(void) = ExitFunction : +# 1036| v0_23(void) = AliasedUse : ~mu0_2 +# 1036| v0_24(void) = ExitFunction : # 1038| char (void Lambda(int, String const&))::(lambda [] type at line 1038, col. 30)::operator()(float) const # 1038| Block 0 @@ -4942,7 +5072,8 @@ ir.cpp: # 1038| r0_19(glval) = VariableAddress[#return] : # 1038| v0_20(void) = ReturnValue : &:r0_19, ~mu0_2 # 1038| v0_21(void) = UnmodeledUse : mu* -# 1038| v0_22(void) = ExitFunction : +# 1038| v0_22(void) = AliasedUse : ~mu0_2 +# 1038| v0_23(void) = ExitFunction : # 1040| void (void Lambda(int, String const&))::(lambda [] type at line 1040, col. 30)::(constructor)((void Lambda(int, String const&))::(lambda [] type at line 1040, col. 30)&&) # 1040| Block 0 @@ -4959,7 +5090,8 @@ ir.cpp: # 1040| v0_10(void) = NoOp : # 1040| v0_11(void) = ReturnVoid : # 1040| v0_12(void) = UnmodeledUse : mu* -# 1040| v0_13(void) = ExitFunction : +# 1040| v0_13(void) = AliasedUse : ~mu0_2 +# 1040| v0_14(void) = ExitFunction : # 1040| void (void Lambda(int, String const&))::(lambda [] type at line 1040, col. 30)::~() # 1040| Block 0 @@ -4974,7 +5106,8 @@ ir.cpp: # 1040| mu0_8(unknown) = ^CallSideEffect : ~mu0_2 # 1040| v0_9(void) = ReturnVoid : # 1040| v0_10(void) = UnmodeledUse : mu* -# 1040| v0_11(void) = ExitFunction : +# 1040| v0_11(void) = AliasedUse : ~mu0_2 +# 1040| v0_12(void) = ExitFunction : # 1040| char (void Lambda(int, String const&))::(lambda [] type at line 1040, col. 30)::operator()(float) const # 1040| Block 0 @@ -4999,7 +5132,8 @@ ir.cpp: # 1040| r0_18(glval) = VariableAddress[#return] : # 1040| v0_19(void) = ReturnValue : &:r0_18, ~mu0_2 # 1040| v0_20(void) = UnmodeledUse : mu* -# 1040| v0_21(void) = ExitFunction : +# 1040| v0_21(void) = AliasedUse : ~mu0_2 +# 1040| v0_22(void) = ExitFunction : # 1042| char (void Lambda(int, String const&))::(lambda [] type at line 1042, col. 32)::operator()(float) const # 1042| Block 0 @@ -5027,7 +5161,8 @@ ir.cpp: # 1042| r0_21(glval) = VariableAddress[#return] : # 1042| v0_22(void) = ReturnValue : &:r0_21, ~mu0_2 # 1042| v0_23(void) = UnmodeledUse : mu* -# 1042| v0_24(void) = ExitFunction : +# 1042| v0_24(void) = AliasedUse : ~mu0_2 +# 1042| v0_25(void) = ExitFunction : # 1045| char (void Lambda(int, String const&))::(lambda [] type at line 1045, col. 23)::operator()(float) const # 1045| Block 0 @@ -5064,7 +5199,8 @@ ir.cpp: # 1045| r0_30(glval) = VariableAddress[#return] : # 1045| v0_31(void) = ReturnValue : &:r0_30, ~mu0_2 # 1045| v0_32(void) = UnmodeledUse : mu* -# 1045| v0_33(void) = ExitFunction : +# 1045| v0_33(void) = AliasedUse : ~mu0_2 +# 1045| v0_34(void) = ExitFunction : # 1068| void RangeBasedFor(vector const&) # 1068| Block 0 @@ -5126,7 +5262,8 @@ ir.cpp: # 1080| v3_1(void) = NoOp : # 1068| v3_2(void) = ReturnVoid : # 1068| v3_3(void) = UnmodeledUse : mu* -# 1068| v3_4(void) = ExitFunction : +# 1068| v3_4(void) = AliasedUse : ~mu0_2 +# 1068| v3_5(void) = ExitFunction : #-----| Block 4 #-----| r4_0(glval) = VariableAddress[(__begin)] : @@ -5238,7 +5375,8 @@ ir.cpp: # 1099| r0_10(glval) = VariableAddress[#return] : # 1099| v0_11(void) = ReturnValue : &:r0_10, ~mu0_2 # 1099| v0_12(void) = UnmodeledUse : mu* -# 1099| v0_13(void) = ExitFunction : +# 1099| v0_13(void) = AliasedUse : ~mu0_2 +# 1099| v0_14(void) = ExitFunction : # 1104| void AsmStmtWithOutputs(unsigned int&, unsigned int, unsigned int&, unsigned int) # 1104| Block 0 @@ -5265,7 +5403,8 @@ ir.cpp: # 1111| v0_20(void) = NoOp : # 1104| v0_21(void) = ReturnVoid : # 1104| v0_22(void) = UnmodeledUse : mu* -# 1104| v0_23(void) = ExitFunction : +# 1104| v0_23(void) = AliasedUse : ~mu0_2 +# 1104| v0_24(void) = ExitFunction : # 1113| void ExternDeclarations() # 1113| Block 0 @@ -5281,7 +5420,8 @@ ir.cpp: # 1120| v0_9(void) = NoOp : # 1113| v0_10(void) = ReturnVoid : # 1113| v0_11(void) = UnmodeledUse : mu* -# 1113| v0_12(void) = ExitFunction : +# 1113| v0_12(void) = AliasedUse : ~mu0_2 +# 1113| v0_13(void) = ExitFunction : # 1128| void ExternDeclarationsInMacro() # 1128| Block 0 @@ -5315,7 +5455,8 @@ ir.cpp: # 1131| v3_1(void) = NoOp : # 1128| v3_2(void) = ReturnVoid : # 1128| v3_3(void) = UnmodeledUse : mu* -# 1128| v3_4(void) = ExitFunction : +# 1128| v3_4(void) = AliasedUse : ~mu0_2 +# 1128| v3_5(void) = ExitFunction : # 1133| void TryCatchNoCatchAny(bool) # 1133| Block 0 @@ -5335,7 +5476,8 @@ ir.cpp: # 1133| Block 1 # 1133| v1_0(void) = UnmodeledUse : mu* -# 1133| v1_1(void) = ExitFunction : +# 1133| v1_1(void) = AliasedUse : ~mu0_2 +# 1133| v1_2(void) = ExitFunction : # 1133| Block 2 # 1133| v2_0(void) = Unwind : @@ -5488,7 +5630,8 @@ ir.cpp: # 1159| v0_55(void) = NoOp : # 1153| v0_56(void) = ReturnVoid : # 1153| v0_57(void) = UnmodeledUse : mu* -# 1153| v0_58(void) = ExitFunction : +# 1153| v0_58(void) = AliasedUse : ~mu0_2 +# 1153| v0_59(void) = ExitFunction : # 1163| int ModeledCallTarget(int) # 1163| Block 0 @@ -5515,7 +5658,8 @@ ir.cpp: # 1163| r0_20(glval) = VariableAddress[#return] : # 1163| v0_21(void) = ReturnValue : &:r0_20, ~mu0_2 # 1163| v0_22(void) = UnmodeledUse : mu* -# 1163| v0_23(void) = ExitFunction : +# 1163| v0_23(void) = AliasedUse : ~mu0_2 +# 1163| v0_24(void) = ExitFunction : perf-regression.cpp: # 6| void Big::Big() @@ -5532,7 +5676,8 @@ perf-regression.cpp: # 6| v0_9(void) = NoOp : # 6| v0_10(void) = ReturnVoid : # 6| v0_11(void) = UnmodeledUse : mu* -# 6| v0_12(void) = ExitFunction : +# 6| v0_12(void) = AliasedUse : ~mu0_2 +# 6| v0_13(void) = ExitFunction : # 9| int main() # 9| Block 0 @@ -5555,4 +5700,5 @@ perf-regression.cpp: # 9| r0_16(glval) = VariableAddress[#return] : # 9| v0_17(void) = ReturnValue : &:r0_16, ~mu0_2 # 9| v0_18(void) = UnmodeledUse : mu* -# 9| v0_19(void) = ExitFunction : +# 9| v0_19(void) = AliasedUse : ~mu0_2 +# 9| v0_20(void) = ExitFunction : diff --git a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected index 32151262797..426362bcd09 100644 --- a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected +++ b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected @@ -84,7 +84,8 @@ ssa.cpp: # 13| r6_12(glval) = VariableAddress[#return] : # 13| v6_13(void) = ReturnValue : &:r6_12, m6_11 # 13| v6_14(void) = UnmodeledUse : mu* -# 13| v6_15(void) = ExitFunction : +# 13| v6_15(void) = AliasedUse : ~m6_0 +# 13| v6_16(void) = ExitFunction : # 31| int UnreachableViaGoto() # 31| Block 0 @@ -99,7 +100,8 @@ ssa.cpp: # 31| r0_8(glval) = VariableAddress[#return] : # 31| v0_9(void) = ReturnValue : &:r0_8, m0_7 # 31| v0_10(void) = UnmodeledUse : mu* -# 31| v0_11(void) = ExitFunction : +# 31| v0_11(void) = AliasedUse : ~m0_1 +# 31| v0_12(void) = ExitFunction : # 38| int UnreachableIf(bool) # 38| Block 0 @@ -125,7 +127,8 @@ ssa.cpp: # 38| r1_1(glval) = VariableAddress[#return] : # 38| v1_2(void) = ReturnValue : &:r1_1, m1_0 # 38| v1_3(void) = UnmodeledUse : mu* -# 38| v1_4(void) = ExitFunction : +# 38| v1_4(void) = AliasedUse : ~m0_1 +# 38| v1_5(void) = ExitFunction : # 42| Block 2 # 42| r2_0(glval) = VariableAddress[x] : @@ -188,7 +191,8 @@ ssa.cpp: # 59| r1_4(glval) = VariableAddress[#return] : # 59| v1_5(void) = ReturnValue : &:r1_4, m1_3 # 59| v1_6(void) = UnmodeledUse : mu* -# 59| v1_7(void) = ExitFunction : +# 59| v1_7(void) = AliasedUse : ~m0_1 +# 59| v1_8(void) = ExitFunction : # 59| Block 2 # 59| v2_0(void) = Unreached : @@ -219,7 +223,8 @@ ssa.cpp: # 71| v2_0(void) = NoOp : # 68| v2_1(void) = ReturnVoid : # 68| v2_2(void) = UnmodeledUse : mu* -# 68| v2_3(void) = ExitFunction : +# 68| v2_3(void) = AliasedUse : ~m3_0 +# 68| v2_4(void) = ExitFunction : # 69| Block 3 # 69| m3_0(unknown) = Phi : from 0:~m0_1, from 1:~m1_7 @@ -291,7 +296,8 @@ ssa.cpp: # 89| v3_14(void) = NoOp : # 75| v3_15(void) = ReturnVoid : # 75| v3_16(void) = UnmodeledUse : mu* -# 75| v3_17(void) = ExitFunction : +# 75| v3_17(void) = AliasedUse : ~m0_1 +# 75| v3_18(void) = ExitFunction : # 91| void MustExactlyOverlap(Point) # 91| Block 0 @@ -307,7 +313,8 @@ ssa.cpp: # 93| v0_9(void) = NoOp : # 91| v0_10(void) = ReturnVoid : # 91| v0_11(void) = UnmodeledUse : mu* -# 91| v0_12(void) = ExitFunction : +# 91| v0_12(void) = AliasedUse : ~m0_1 +# 91| v0_13(void) = ExitFunction : # 95| void MustExactlyOverlapEscaped(Point) # 95| Block 0 @@ -333,7 +340,8 @@ ssa.cpp: # 98| v0_19(void) = NoOp : # 95| v0_20(void) = ReturnVoid : # 95| v0_21(void) = UnmodeledUse : mu* -# 95| v0_22(void) = ExitFunction : +# 95| v0_22(void) = AliasedUse : ~m0_15 +# 95| v0_23(void) = ExitFunction : # 100| void MustTotallyOverlap(Point) # 100| Block 0 @@ -355,7 +363,8 @@ ssa.cpp: # 103| v0_15(void) = NoOp : # 100| v0_16(void) = ReturnVoid : # 100| v0_17(void) = UnmodeledUse : mu* -# 100| v0_18(void) = ExitFunction : +# 100| v0_18(void) = AliasedUse : ~m0_1 +# 100| v0_19(void) = ExitFunction : # 105| void MustTotallyOverlapEscaped(Point) # 105| Block 0 @@ -387,7 +396,8 @@ ssa.cpp: # 109| v0_25(void) = NoOp : # 105| v0_26(void) = ReturnVoid : # 105| v0_27(void) = UnmodeledUse : mu* -# 105| v0_28(void) = ExitFunction : +# 105| v0_28(void) = AliasedUse : ~m0_21 +# 105| v0_29(void) = ExitFunction : # 111| void MayPartiallyOverlap(int, int) # 111| Block 0 @@ -417,7 +427,8 @@ ssa.cpp: # 114| v0_23(void) = NoOp : # 111| v0_24(void) = ReturnVoid : # 111| v0_25(void) = UnmodeledUse : mu* -# 111| v0_26(void) = ExitFunction : +# 111| v0_26(void) = AliasedUse : ~m0_1 +# 111| v0_27(void) = ExitFunction : # 116| void MayPartiallyOverlapEscaped(int, int) # 116| Block 0 @@ -457,7 +468,8 @@ ssa.cpp: # 120| v0_33(void) = NoOp : # 116| v0_34(void) = ReturnVoid : # 116| v0_35(void) = UnmodeledUse : mu* -# 116| v0_36(void) = ExitFunction : +# 116| v0_36(void) = AliasedUse : ~m0_29 +# 116| v0_37(void) = ExitFunction : # 122| void MergeMustExactlyOverlap(bool, int, int) # 122| Block 0 @@ -519,7 +531,8 @@ ssa.cpp: # 132| v3_11(void) = NoOp : # 122| v3_12(void) = ReturnVoid : # 122| v3_13(void) = UnmodeledUse : mu* -# 122| v3_14(void) = ExitFunction : +# 122| v3_14(void) = AliasedUse : ~m0_1 +# 122| v3_15(void) = ExitFunction : # 134| void MergeMustExactlyWithMustTotallyOverlap(bool, Point, int) # 134| Block 0 @@ -575,7 +588,8 @@ ssa.cpp: # 143| v3_7(void) = NoOp : # 134| v3_8(void) = ReturnVoid : # 134| v3_9(void) = UnmodeledUse : mu* -# 134| v3_10(void) = ExitFunction : +# 134| v3_10(void) = AliasedUse : ~m0_1 +# 134| v3_11(void) = ExitFunction : # 145| void MergeMustExactlyWithMayPartiallyOverlap(bool, Point, int) # 145| Block 0 @@ -629,7 +643,8 @@ ssa.cpp: # 154| v3_5(void) = NoOp : # 145| v3_6(void) = ReturnVoid : # 145| v3_7(void) = UnmodeledUse : mu* -# 145| v3_8(void) = ExitFunction : +# 145| v3_8(void) = AliasedUse : ~m0_1 +# 145| v3_9(void) = ExitFunction : # 156| void MergeMustTotallyOverlapWithMayPartiallyOverlap(bool, Rect, int) # 156| Block 0 @@ -685,7 +700,8 @@ ssa.cpp: # 165| v3_6(void) = NoOp : # 156| v3_7(void) = ReturnVoid : # 156| v3_8(void) = UnmodeledUse : mu* -# 156| v3_9(void) = ExitFunction : +# 156| v3_9(void) = AliasedUse : ~m0_1 +# 156| v3_10(void) = ExitFunction : # 171| void WrapperStruct(Wrapper) # 171| Block 0 @@ -719,7 +735,8 @@ ssa.cpp: # 177| v0_27(void) = NoOp : # 171| v0_28(void) = ReturnVoid : # 171| v0_29(void) = UnmodeledUse : mu* -# 171| v0_30(void) = ExitFunction : +# 171| v0_30(void) = AliasedUse : ~m0_1 +# 171| v0_31(void) = ExitFunction : # 179| int AsmStmt(int*) # 179| Block 0 @@ -738,7 +755,8 @@ ssa.cpp: # 179| r0_12(glval) = VariableAddress[#return] : # 179| v0_13(void) = ReturnValue : &:r0_12, m0_11 # 179| v0_14(void) = UnmodeledUse : mu* -# 179| v0_15(void) = ExitFunction : +# 179| v0_15(void) = AliasedUse : ~m0_6 +# 179| v0_16(void) = ExitFunction : # 184| void AsmStmtWithOutputs(unsigned int&, unsigned int&, unsigned int&, unsigned int&) # 184| Block 0 @@ -768,7 +786,8 @@ ssa.cpp: # 192| v0_23(void) = NoOp : # 184| v0_24(void) = ReturnVoid : # 184| v0_25(void) = UnmodeledUse : mu* -# 184| v0_26(void) = ExitFunction : +# 184| v0_26(void) = AliasedUse : ~m0_22 +# 184| v0_27(void) = ExitFunction : # 198| int PureFunctions(char*, char*, int) # 198| Block 0 @@ -817,7 +836,8 @@ ssa.cpp: # 198| r0_42(glval) = VariableAddress[#return] : # 198| v0_43(void) = ReturnValue : &:r0_42, m0_41 # 198| v0_44(void) = UnmodeledUse : mu* -# 198| v0_45(void) = ExitFunction : +# 198| v0_45(void) = AliasedUse : ~m0_1 +# 198| v0_46(void) = ExitFunction : # 207| int ModeledCallTarget(int) # 207| Block 0 @@ -847,4 +867,5 @@ ssa.cpp: # 207| r0_23(glval) = VariableAddress[#return] : # 207| v0_24(void) = ReturnValue : &:r0_23, m0_22 # 207| v0_25(void) = UnmodeledUse : mu* -# 207| v0_26(void) = ExitFunction : +# 207| v0_26(void) = AliasedUse : ~m0_1 +# 207| v0_27(void) = ExitFunction : diff --git a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected index f439bf6dc52..1be5ed8bac5 100644 --- a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected +++ b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ir.expected @@ -78,7 +78,8 @@ ssa.cpp: # 13| r6_11(glval) = VariableAddress[#return] : # 13| v6_12(void) = ReturnValue : &:r6_11, m6_10 # 13| v6_13(void) = UnmodeledUse : mu* -# 13| v6_14(void) = ExitFunction : +# 13| v6_14(void) = AliasedUse : ~mu0_2 +# 13| v6_15(void) = ExitFunction : # 31| int UnreachableViaGoto() # 31| Block 0 @@ -93,7 +94,8 @@ ssa.cpp: # 31| r0_8(glval) = VariableAddress[#return] : # 31| v0_9(void) = ReturnValue : &:r0_8, m0_7 # 31| v0_10(void) = UnmodeledUse : mu* -# 31| v0_11(void) = ExitFunction : +# 31| v0_11(void) = AliasedUse : ~mu0_2 +# 31| v0_12(void) = ExitFunction : # 38| int UnreachableIf(bool) # 38| Block 0 @@ -119,7 +121,8 @@ ssa.cpp: # 38| r1_1(glval) = VariableAddress[#return] : # 38| v1_2(void) = ReturnValue : &:r1_1, m1_0 # 38| v1_3(void) = UnmodeledUse : mu* -# 38| v1_4(void) = ExitFunction : +# 38| v1_4(void) = AliasedUse : ~mu0_2 +# 38| v1_5(void) = ExitFunction : # 42| Block 2 # 42| r2_0(glval) = VariableAddress[x] : @@ -191,7 +194,8 @@ ssa.cpp: # 59| r1_4(glval) = VariableAddress[#return] : # 59| v1_5(void) = ReturnValue : &:r1_4, m1_3 # 59| v1_6(void) = UnmodeledUse : mu* -# 59| v1_7(void) = ExitFunction : +# 59| v1_7(void) = AliasedUse : ~mu0_2 +# 59| v1_8(void) = ExitFunction : # 59| Block 2 # 59| v2_0(void) = Unreached : @@ -221,7 +225,8 @@ ssa.cpp: # 71| v2_0(void) = NoOp : # 68| v2_1(void) = ReturnVoid : # 68| v2_2(void) = UnmodeledUse : mu* -# 68| v2_3(void) = ExitFunction : +# 68| v2_3(void) = AliasedUse : ~mu0_2 +# 68| v2_4(void) = ExitFunction : # 69| Block 3 # 69| m3_0(int) = Phi : from 0:m0_4, from 1:m3_6 @@ -292,7 +297,8 @@ ssa.cpp: # 89| v3_14(void) = NoOp : # 75| v3_15(void) = ReturnVoid : # 75| v3_16(void) = UnmodeledUse : mu* -# 75| v3_17(void) = ExitFunction : +# 75| v3_17(void) = AliasedUse : ~mu0_2 +# 75| v3_18(void) = ExitFunction : # 91| void MustExactlyOverlap(Point) # 91| Block 0 @@ -308,7 +314,8 @@ ssa.cpp: # 93| v0_9(void) = NoOp : # 91| v0_10(void) = ReturnVoid : # 91| v0_11(void) = UnmodeledUse : mu* -# 91| v0_12(void) = ExitFunction : +# 91| v0_12(void) = AliasedUse : ~mu0_2 +# 91| v0_13(void) = ExitFunction : # 95| void MustExactlyOverlapEscaped(Point) # 95| Block 0 @@ -331,7 +338,8 @@ ssa.cpp: # 98| v0_16(void) = NoOp : # 95| v0_17(void) = ReturnVoid : # 95| v0_18(void) = UnmodeledUse : mu* -# 95| v0_19(void) = ExitFunction : +# 95| v0_19(void) = AliasedUse : ~mu0_2 +# 95| v0_20(void) = ExitFunction : # 100| void MustTotallyOverlap(Point) # 100| Block 0 @@ -353,7 +361,8 @@ ssa.cpp: # 103| v0_15(void) = NoOp : # 100| v0_16(void) = ReturnVoid : # 100| v0_17(void) = UnmodeledUse : mu* -# 100| v0_18(void) = ExitFunction : +# 100| v0_18(void) = AliasedUse : ~mu0_2 +# 100| v0_19(void) = ExitFunction : # 105| void MustTotallyOverlapEscaped(Point) # 105| Block 0 @@ -382,7 +391,8 @@ ssa.cpp: # 109| v0_22(void) = NoOp : # 105| v0_23(void) = ReturnVoid : # 105| v0_24(void) = UnmodeledUse : mu* -# 105| v0_25(void) = ExitFunction : +# 105| v0_25(void) = AliasedUse : ~mu0_2 +# 105| v0_26(void) = ExitFunction : # 111| void MayPartiallyOverlap(int, int) # 111| Block 0 @@ -410,7 +420,8 @@ ssa.cpp: # 114| v0_21(void) = NoOp : # 111| v0_22(void) = ReturnVoid : # 111| v0_23(void) = UnmodeledUse : mu* -# 111| v0_24(void) = ExitFunction : +# 111| v0_24(void) = AliasedUse : ~mu0_2 +# 111| v0_25(void) = ExitFunction : # 116| void MayPartiallyOverlapEscaped(int, int) # 116| Block 0 @@ -445,7 +456,8 @@ ssa.cpp: # 120| v0_28(void) = NoOp : # 116| v0_29(void) = ReturnVoid : # 116| v0_30(void) = UnmodeledUse : mu* -# 116| v0_31(void) = ExitFunction : +# 116| v0_31(void) = AliasedUse : ~mu0_2 +# 116| v0_32(void) = ExitFunction : # 122| void MergeMustExactlyOverlap(bool, int, int) # 122| Block 0 @@ -501,7 +513,8 @@ ssa.cpp: # 132| v3_9(void) = NoOp : # 122| v3_10(void) = ReturnVoid : # 122| v3_11(void) = UnmodeledUse : mu* -# 122| v3_12(void) = ExitFunction : +# 122| v3_12(void) = AliasedUse : ~mu0_2 +# 122| v3_13(void) = ExitFunction : # 134| void MergeMustExactlyWithMustTotallyOverlap(bool, Point, int) # 134| Block 0 @@ -552,7 +565,8 @@ ssa.cpp: # 143| v3_5(void) = NoOp : # 134| v3_6(void) = ReturnVoid : # 134| v3_7(void) = UnmodeledUse : mu* -# 134| v3_8(void) = ExitFunction : +# 134| v3_8(void) = AliasedUse : ~mu0_2 +# 134| v3_9(void) = ExitFunction : # 145| void MergeMustExactlyWithMayPartiallyOverlap(bool, Point, int) # 145| Block 0 @@ -602,7 +616,8 @@ ssa.cpp: # 154| v3_4(void) = NoOp : # 145| v3_5(void) = ReturnVoid : # 145| v3_6(void) = UnmodeledUse : mu* -# 145| v3_7(void) = ExitFunction : +# 145| v3_7(void) = AliasedUse : ~mu0_2 +# 145| v3_8(void) = ExitFunction : # 156| void MergeMustTotallyOverlapWithMayPartiallyOverlap(bool, Rect, int) # 156| Block 0 @@ -654,7 +669,8 @@ ssa.cpp: # 165| v3_5(void) = NoOp : # 156| v3_6(void) = ReturnVoid : # 156| v3_7(void) = UnmodeledUse : mu* -# 156| v3_8(void) = ExitFunction : +# 156| v3_8(void) = AliasedUse : ~mu0_2 +# 156| v3_9(void) = ExitFunction : # 171| void WrapperStruct(Wrapper) # 171| Block 0 @@ -688,7 +704,8 @@ ssa.cpp: # 177| v0_27(void) = NoOp : # 171| v0_28(void) = ReturnVoid : # 171| v0_29(void) = UnmodeledUse : mu* -# 171| v0_30(void) = ExitFunction : +# 171| v0_30(void) = AliasedUse : ~mu0_2 +# 171| v0_31(void) = ExitFunction : # 179| int AsmStmt(int*) # 179| Block 0 @@ -706,7 +723,8 @@ ssa.cpp: # 179| r0_11(glval) = VariableAddress[#return] : # 179| v0_12(void) = ReturnValue : &:r0_11, m0_10 # 179| v0_13(void) = UnmodeledUse : mu* -# 179| v0_14(void) = ExitFunction : +# 179| v0_14(void) = AliasedUse : ~mu0_2 +# 179| v0_15(void) = ExitFunction : # 184| void AsmStmtWithOutputs(unsigned int&, unsigned int&, unsigned int&, unsigned int&) # 184| Block 0 @@ -735,7 +753,8 @@ ssa.cpp: # 192| v0_22(void) = NoOp : # 184| v0_23(void) = ReturnVoid : # 184| v0_24(void) = UnmodeledUse : mu* -# 184| v0_25(void) = ExitFunction : +# 184| v0_25(void) = AliasedUse : ~mu0_2 +# 184| v0_26(void) = ExitFunction : # 198| int PureFunctions(char*, char*, int) # 198| Block 0 @@ -784,7 +803,8 @@ ssa.cpp: # 198| r0_42(glval) = VariableAddress[#return] : # 198| v0_43(void) = ReturnValue : &:r0_42, m0_41 # 198| v0_44(void) = UnmodeledUse : mu* -# 198| v0_45(void) = ExitFunction : +# 198| v0_45(void) = AliasedUse : ~mu0_2 +# 198| v0_46(void) = ExitFunction : # 207| int ModeledCallTarget(int) # 207| Block 0 @@ -811,4 +831,5 @@ ssa.cpp: # 207| r0_20(glval) = VariableAddress[#return] : # 207| v0_21(void) = ReturnValue : &:r0_20, m0_19 # 207| v0_22(void) = UnmodeledUse : mu* -# 207| v0_23(void) = ExitFunction : +# 207| v0_23(void) = AliasedUse : ~mu0_2 +# 207| v0_24(void) = ExitFunction : diff --git a/cpp/ql/test/library-tests/syntax-zoo/raw_sanity.expected b/cpp/ql/test/library-tests/syntax-zoo/raw_sanity.expected index 1be417e381c..e9dc12e62bf 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/raw_sanity.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/raw_sanity.expected @@ -610,89 +610,10 @@ lostReachability | range_analysis.c:371:37:371:39 | Constant: 500 | backEdgeCountMismatch useNotDominatedByDefinition -| VacuousDestructorCall.cpp:4:3:4:3 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | IR: CallDestructor | void CallDestructor(int, int*) | -| condition_decls.cpp:16:15:16:15 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | condition_decls.cpp:15:6:15:17 | IR: if_decl_bind | void if_decl_bind(int) | -| condition_decls.cpp:16:15:16:16 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:15:6:15:17 | IR: if_decl_bind | void if_decl_bind(int) | -| condition_decls.cpp:16:15:16:16 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | condition_decls.cpp:15:6:15:17 | IR: if_decl_bind | void if_decl_bind(int) | -| condition_decls.cpp:17:5:17:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:15:6:15:17 | IR: if_decl_bind | void if_decl_bind(int) | -| condition_decls.cpp:17:11:17:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:15:6:15:17 | IR: if_decl_bind | void if_decl_bind(int) | -| condition_decls.cpp:20:5:20:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:15:6:15:17 | IR: if_decl_bind | void if_decl_bind(int) | -| condition_decls.cpp:20:11:20:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:15:6:15:17 | IR: if_decl_bind | void if_decl_bind(int) | -| condition_decls.cpp:26:19:26:19 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) | -| condition_decls.cpp:26:19:26:20 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) | -| condition_decls.cpp:26:19:26:20 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) | -| condition_decls.cpp:28:5:28:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) | -| condition_decls.cpp:28:11:28:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) | -| condition_decls.cpp:31:5:31:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) | -| condition_decls.cpp:31:11:31:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) | -| condition_decls.cpp:34:5:34:18 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) | -| condition_decls.cpp:34:9:34:13 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) | -| condition_decls.cpp:41:18:41:18 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | condition_decls.cpp:40:6:40:20 | IR: while_decl_bind | void while_decl_bind(int) | -| condition_decls.cpp:41:18:41:19 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:40:6:40:20 | IR: while_decl_bind | void while_decl_bind(int) | -| condition_decls.cpp:41:18:41:19 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | condition_decls.cpp:40:6:40:20 | IR: while_decl_bind | void while_decl_bind(int) | -| condition_decls.cpp:42:5:42:7 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:40:6:40:20 | IR: while_decl_bind | void while_decl_bind(int) | -| condition_decls.cpp:44:3:44:5 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:40:6:40:20 | IR: while_decl_bind | void while_decl_bind(int) | -| condition_decls.cpp:48:48:48:48 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | condition_decls.cpp:47:6:47:18 | IR: for_decl_bind | void for_decl_bind(int) | -| condition_decls.cpp:48:48:48:49 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:47:6:47:18 | IR: for_decl_bind | void for_decl_bind(int) | -| condition_decls.cpp:48:48:48:49 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | condition_decls.cpp:47:6:47:18 | IR: for_decl_bind | void for_decl_bind(int) | -| condition_decls.cpp:48:56:48:61 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:47:6:47:18 | IR: for_decl_bind | void for_decl_bind(int) | -| condition_decls.cpp:49:5:49:7 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:47:6:47:18 | IR: for_decl_bind | void for_decl_bind(int) | -| condition_decls.cpp:51:3:51:5 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:47:6:47:18 | IR: for_decl_bind | void for_decl_bind(int) | -| cpp11.cpp:28:21:28:21 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | cpp11.cpp:27:7:27:14 | IR: getFirst | int range_based_for_11::getFirst() | -| file://:0:0:0:0 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | cpp11.cpp:27:7:27:14 | IR: getFirst | int range_based_for_11::getFirst() | -| misc.c:68:16:68:16 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:70:13:70:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:72:11:72:11 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:82:5:82:12 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:83:5:83:12 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:83:14:83:14 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:83:17:83:17 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:84:6:84:13 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:84:6:84:13 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:84:16:84:16 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:84:19:84:19 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:85:9:85:13 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:86:9:86:9 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:87:10:87:10 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:88:9:88:9 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:88:9:88:17 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) | -| misc.c:171:15:171:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:168:6:168:8 | IR: vla | void vla() | -| misc.c:173:19:173:24 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | misc.c:168:6:168:8 | IR: vla | void vla() | -| misc.c:174:17:174:22 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | misc.c:168:6:168:8 | IR: vla | void vla() | -| misc.c:174:30:174:35 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | misc.c:168:6:168:8 | IR: vla | void vla() | -| misc.c:219:5:219:26 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:219:5:219:26 | IR: assign_designated_init | int assign_designated_init(someStruct*) | -| misc.c:220:4:220:5 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:219:5:219:26 | IR: assign_designated_init | int assign_designated_init(someStruct*) | -| ms_try_except.cpp:9:19:9:19 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | ms_try_except.cpp:2:6:2:18 | IR: ms_try_except | void ms_try_except(int) | -| ms_try_except.cpp:19:17:19:17 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | ms_try_except.cpp:2:6:2:18 | IR: ms_try_except | void ms_try_except(int) | -| ms_try_mix.cpp:14:16:14:19 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:10:6:10:18 | IR: ms_except_mix | void ms_except_mix(int) | -| ms_try_mix.cpp:15:13:15:14 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:10:6:10:18 | IR: ms_except_mix | void ms_except_mix(int) | -| ms_try_mix.cpp:16:13:16:19 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:10:6:10:18 | IR: ms_except_mix | void ms_except_mix(int) | -| ms_try_mix.cpp:18:16:18:19 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:10:6:10:18 | IR: ms_except_mix | void ms_except_mix(int) | -| ms_try_mix.cpp:21:16:21:19 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:10:6:10:18 | IR: ms_except_mix | void ms_except_mix(int) | -| ms_try_mix.cpp:24:12:24:15 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:10:6:10:18 | IR: ms_except_mix | void ms_except_mix(int) | -| ms_try_mix.cpp:31:16:31:19 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:27:6:27:19 | IR: ms_finally_mix | void ms_finally_mix(int) | -| ms_try_mix.cpp:32:13:32:14 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:27:6:27:19 | IR: ms_finally_mix | void ms_finally_mix(int) | -| ms_try_mix.cpp:33:13:33:19 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:27:6:27:19 | IR: ms_finally_mix | void ms_finally_mix(int) | -| ms_try_mix.cpp:35:16:35:19 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:27:6:27:19 | IR: ms_finally_mix | void ms_finally_mix(int) | -| ms_try_mix.cpp:38:16:38:19 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:27:6:27:19 | IR: ms_finally_mix | void ms_finally_mix(int) | -| ms_try_mix.cpp:41:12:41:15 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:27:6:27:19 | IR: ms_finally_mix | void ms_finally_mix(int) | -| ms_try_mix.cpp:51:5:51:11 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:47:6:47:28 | IR: ms_empty_finally_at_end | void ms_empty_finally_at_end() | | pointer_to_member.cpp:36:11:36:30 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | pointer_to_member.cpp:32:6:32:14 | IR: pmIsConst | void pmIsConst() | | pointer_to_member.cpp:36:13:36:19 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | pointer_to_member.cpp:32:6:32:14 | IR: pmIsConst | void pmIsConst() | | pointer_to_member.cpp:36:22:36:28 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | pointer_to_member.cpp:32:6:32:14 | IR: pmIsConst | void pmIsConst() | -| stmt_expr.cpp:30:20:30:21 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | stmt_expr.cpp:21:6:21:6 | IR: g | void stmtexpr::g(int) | -| stmt_expr.cpp:31:16:31:18 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | stmt_expr.cpp:21:6:21:6 | IR: g | void stmtexpr::g(int) | | try_catch.cpp:21:13:21:24 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | try_catch.cpp:19:6:19:23 | IR: throw_from_nonstmt | void throw_from_nonstmt(int) | -| vla.c:3:5:3:8 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | vla.c:3:5:3:8 | IR: main | int main(int, char**) | -| vla.c:5:16:5:19 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | vla.c:3:5:3:8 | IR: main | int main(int, char**) | -| vla.c:5:22:5:25 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | vla.c:3:5:3:8 | IR: main | int main(int, char**) | -| vla.c:5:27:5:30 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | vla.c:3:5:3:8 | IR: main | int main(int, char**) | -| vla.c:5:27:5:33 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | vla.c:3:5:3:8 | IR: main | int main(int, char**) | -| vla.c:12:37:12:42 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | vla.c:11:6:11:16 | IR: vla_typedef | void vla_typedef() | -| vla.c:12:55:12:60 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | vla.c:11:6:11:16 | IR: vla_typedef | void vla_typedef() | -| vla.c:14:40:14:45 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | vla.c:11:6:11:16 | IR: vla_typedef | void vla_typedef() | -| vla.c:14:58:14:63 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | vla.c:11:6:11:16 | IR: vla_typedef | void vla_typedef() | -| vla.c:14:74:14:79 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | vla.c:11:6:11:16 | IR: vla_typedef | void vla_typedef() | missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/internal/TranslatedFunction.qll b/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/internal/TranslatedFunction.qll index ea38d7b9273..9d63f7060e9 100644 --- a/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/internal/TranslatedFunction.qll +++ b/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/internal/TranslatedFunction.qll @@ -177,8 +177,7 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { or tag = AliasedUseTag() and opcode instanceof Opcode::AliasedUse and - resultType instanceof VoidType and - isLValue = false + resultType = getVoidType() or tag = ExitFunctionTag() and opcode instanceof Opcode::ExitFunction and diff --git a/csharp/ql/test/library-tests/ir/ir/raw_ir.expected b/csharp/ql/test/library-tests/ir/ir/raw_ir.expected index 9cac1b9d31e..5e3701a4c5a 100644 --- a/csharp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/csharp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -53,7 +53,8 @@ array.cs: # 10| mu0_49(Int32) = Store : &:r0_48, r0_43 # 2| v0_50(Void) = ReturnVoid : # 2| v0_51(Void) = UnmodeledUse : mu* -# 2| v0_52(Void) = ExitFunction : +# 2| v0_52(Void) = AliasedUse : ~mu0_2 +# 2| v0_53(Void) = ExitFunction : # 13| System.Void ArrayTest.twod_and_init_acc() # 13| Block 0 @@ -144,7 +145,8 @@ array.cs: # 20| mu0_84(Int32) = Store : &:r0_83, r0_76 # 13| v0_85(Void) = ReturnVoid : # 13| v0_86(Void) = UnmodeledUse : mu* -# 13| v0_87(Void) = ExitFunction : +# 13| v0_87(Void) = AliasedUse : ~mu0_2 +# 13| v0_88(Void) = ExitFunction : assignop.cs: # 4| System.Void AssignOp.Main() @@ -215,7 +217,8 @@ assignop.cs: # 17| mu0_63(Int32) = Store : &:r0_60, r0_62 # 4| v0_64(Void) = ReturnVoid : # 4| v0_65(Void) = UnmodeledUse : mu* -# 4| v0_66(Void) = ExitFunction : +# 4| v0_66(Void) = AliasedUse : ~mu0_2 +# 4| v0_67(Void) = ExitFunction : casts.cs: # 11| System.Void Casts.Main() @@ -241,7 +244,8 @@ casts.cs: # 15| mu0_18(Casts_B) = Store : &:r0_14, r0_17 # 11| v0_19(Void) = ReturnVoid : # 11| v0_20(Void) = UnmodeledUse : mu* -# 11| v0_21(Void) = ExitFunction : +# 11| v0_21(Void) = AliasedUse : ~mu0_2 +# 11| v0_22(Void) = ExitFunction : collections.cs: # 11| System.Void Collections.Main() @@ -285,7 +289,8 @@ collections.cs: # 13| mu0_36(Dictionary) = Store : &:r0_3, r0_4 # 11| v0_37(Void) = ReturnVoid : # 11| v0_38(Void) = UnmodeledUse : mu* -# 11| v0_39(Void) = ExitFunction : +# 11| v0_39(Void) = AliasedUse : ~mu0_2 +# 11| v0_40(Void) = ExitFunction : constructor_init.cs: # 5| System.Void BaseClass..ctor() @@ -297,7 +302,8 @@ constructor_init.cs: # 6| v0_4(Void) = NoOp : # 5| v0_5(Void) = ReturnVoid : # 5| v0_6(Void) = UnmodeledUse : mu* -# 5| v0_7(Void) = ExitFunction : +# 5| v0_7(Void) = AliasedUse : ~mu0_2 +# 5| v0_8(Void) = ExitFunction : # 9| System.Void BaseClass..ctor(System.Int32) # 9| Block 0 @@ -314,7 +320,8 @@ constructor_init.cs: # 11| mu0_10(Int32) = Store : &:r0_9, r0_7 # 9| v0_11(Void) = ReturnVoid : # 9| v0_12(Void) = UnmodeledUse : mu* -# 9| v0_13(Void) = ExitFunction : +# 9| v0_13(Void) = AliasedUse : ~mu0_2 +# 9| v0_14(Void) = ExitFunction : # 17| System.Void DerivedClass..ctor() # 17| Block 0 @@ -329,7 +336,8 @@ constructor_init.cs: # 18| v0_8(Void) = NoOp : # 17| v0_9(Void) = ReturnVoid : # 17| v0_10(Void) = UnmodeledUse : mu* -# 17| v0_11(Void) = ExitFunction : +# 17| v0_11(Void) = AliasedUse : ~mu0_2 +# 17| v0_12(Void) = ExitFunction : # 21| System.Void DerivedClass..ctor(System.Int32) # 21| Block 0 @@ -348,7 +356,8 @@ constructor_init.cs: # 22| v0_12(Void) = NoOp : # 21| v0_13(Void) = ReturnVoid : # 21| v0_14(Void) = UnmodeledUse : mu* -# 21| v0_15(Void) = ExitFunction : +# 21| v0_15(Void) = AliasedUse : ~mu0_2 +# 21| v0_16(Void) = ExitFunction : # 25| System.Void DerivedClass..ctor(System.Int32,System.Int32) # 25| Block 0 @@ -368,7 +377,8 @@ constructor_init.cs: # 26| v0_13(Void) = NoOp : # 25| v0_14(Void) = ReturnVoid : # 25| v0_15(Void) = UnmodeledUse : mu* -# 25| v0_16(Void) = ExitFunction : +# 25| v0_16(Void) = AliasedUse : ~mu0_2 +# 25| v0_17(Void) = ExitFunction : # 29| System.Void DerivedClass.Main() # 29| Block 0 @@ -398,7 +408,8 @@ constructor_init.cs: # 33| mu0_23(DerivedClass) = Store : &:r0_16, r0_17 # 29| v0_24(Void) = ReturnVoid : # 29| v0_25(Void) = UnmodeledUse : mu* -# 29| v0_26(Void) = ExitFunction : +# 29| v0_26(Void) = AliasedUse : ~mu0_2 +# 29| v0_27(Void) = ExitFunction : crement.cs: # 3| System.Void CrementOpsTest.Main() @@ -439,7 +450,8 @@ crement.cs: # 9| mu0_33(Int32) = Store : &:r0_32, r0_28 # 3| v0_34(Void) = ReturnVoid : # 3| v0_35(Void) = UnmodeledUse : mu* -# 3| v0_36(Void) = ExitFunction : +# 3| v0_36(Void) = AliasedUse : ~mu0_2 +# 3| v0_37(Void) = ExitFunction : delegates.cs: # 6| System.Int32 Delegates.returns(System.Int32) @@ -456,7 +468,8 @@ delegates.cs: # 6| r0_9(glval) = VariableAddress[#return] : # 6| v0_10(Void) = ReturnValue : &:r0_9, ~mu0_2 # 6| v0_11(Void) = UnmodeledUse : mu* -# 6| v0_12(Void) = ExitFunction : +# 6| v0_12(Void) = AliasedUse : ~mu0_2 +# 6| v0_13(Void) = ExitFunction : # 11| System.Void Delegates.Main() # 11| Block 0 @@ -478,7 +491,8 @@ delegates.cs: # 13| mu0_15() = ^CallSideEffect : ~mu0_2 # 11| v0_16(Void) = ReturnVoid : # 11| v0_17(Void) = UnmodeledUse : mu* -# 11| v0_18(Void) = ExitFunction : +# 11| v0_18(Void) = AliasedUse : ~mu0_2 +# 11| v0_19(Void) = ExitFunction : events.cs: # 8| System.Void Events..ctor() @@ -497,7 +511,8 @@ events.cs: # 10| mu0_11(MyDel) = Store : &:r0_10, r0_4 # 8| v0_12(Void) = ReturnVoid : # 8| v0_13(Void) = UnmodeledUse : mu* -# 8| v0_14(Void) = ExitFunction : +# 8| v0_14(Void) = AliasedUse : ~mu0_2 +# 8| v0_15(Void) = ExitFunction : # 13| System.Void Events.AddEvent() # 13| Block 0 @@ -514,7 +529,8 @@ events.cs: # 15| mu0_10() = ^CallSideEffect : ~mu0_2 # 13| v0_11(Void) = ReturnVoid : # 13| v0_12(Void) = UnmodeledUse : mu* -# 13| v0_13(Void) = ExitFunction : +# 13| v0_13(Void) = AliasedUse : ~mu0_2 +# 13| v0_14(Void) = ExitFunction : # 18| System.Void Events.RemoveEvent() # 18| Block 0 @@ -531,7 +547,8 @@ events.cs: # 20| mu0_10() = ^CallSideEffect : ~mu0_2 # 18| v0_11(Void) = ReturnVoid : # 18| v0_12(Void) = UnmodeledUse : mu* -# 18| v0_13(Void) = ExitFunction : +# 18| v0_13(Void) = AliasedUse : ~mu0_2 +# 18| v0_14(Void) = ExitFunction : # 23| System.String Events.Fun(System.String) # 23| Block 0 @@ -548,7 +565,8 @@ events.cs: # 23| r0_10(glval) = VariableAddress[#return] : # 23| v0_11(Void) = ReturnValue : &:r0_10, ~mu0_2 # 23| v0_12(Void) = UnmodeledUse : mu* -# 23| v0_13(Void) = ExitFunction : +# 23| v0_13(Void) = AliasedUse : ~mu0_2 +# 23| v0_14(Void) = ExitFunction : # 28| System.Void Events.Main(System.String[]) # 28| Block 0 @@ -583,7 +601,8 @@ events.cs: # 33| mu0_28() = ^CallSideEffect : ~mu0_2 # 28| v0_29(Void) = ReturnVoid : # 28| v0_30(Void) = UnmodeledUse : mu* -# 28| v0_31(Void) = ExitFunction : +# 28| v0_31(Void) = AliasedUse : ~mu0_2 +# 28| v0_32(Void) = ExitFunction : foreach.cs: # 4| System.Void ForEach.Main() @@ -662,7 +681,8 @@ foreach.cs: # 7| mu3_4() = ^CallSideEffect : ~mu0_2 # 4| v3_5(Void) = ReturnVoid : # 4| v3_6(Void) = UnmodeledUse : mu* -# 4| v3_7(Void) = ExitFunction : +# 4| v3_7(Void) = AliasedUse : ~mu0_2 +# 4| v3_8(Void) = ExitFunction : func_with_param_call.cs: # 5| System.Int32 test_call_with_param.f(System.Int32,System.Int32) @@ -684,7 +704,8 @@ func_with_param_call.cs: # 5| r0_14(glval) = VariableAddress[#return] : # 5| v0_15(Void) = ReturnValue : &:r0_14, ~mu0_2 # 5| v0_16(Void) = UnmodeledUse : mu* -# 5| v0_17(Void) = ExitFunction : +# 5| v0_17(Void) = AliasedUse : ~mu0_2 +# 5| v0_18(Void) = ExitFunction : # 10| System.Int32 test_call_with_param.g() # 10| Block 0 @@ -701,7 +722,8 @@ func_with_param_call.cs: # 10| r0_10(glval) = VariableAddress[#return] : # 10| v0_11(Void) = ReturnValue : &:r0_10, ~mu0_2 # 10| v0_12(Void) = UnmodeledUse : mu* -# 10| v0_13(Void) = ExitFunction : +# 10| v0_13(Void) = AliasedUse : ~mu0_2 +# 10| v0_14(Void) = ExitFunction : indexers.cs: # 8| System.String Indexers.MyClass.get_Item(System.Int32) @@ -724,7 +746,8 @@ indexers.cs: # 8| r0_15(glval) = VariableAddress[#return] : # 8| v0_16(Void) = ReturnValue : &:r0_15, ~mu0_2 # 8| v0_17(Void) = UnmodeledUse : mu* -# 8| v0_18(Void) = ExitFunction : +# 8| v0_18(Void) = AliasedUse : ~mu0_2 +# 8| v0_19(Void) = ExitFunction : # 12| System.Void Indexers.MyClass.set_Item(System.Int32,System.String) # 12| Block 0 @@ -747,7 +770,8 @@ indexers.cs: # 14| mu0_16(String) = Store : &:r0_15, r0_9 # 12| v0_17(Void) = ReturnVoid : # 12| v0_18(Void) = UnmodeledUse : mu* -# 12| v0_19(Void) = ExitFunction : +# 12| v0_19(Void) = AliasedUse : ~mu0_2 +# 12| v0_20(Void) = ExitFunction : # 19| System.Void Indexers.Main() # 19| Block 0 @@ -788,7 +812,8 @@ indexers.cs: # 24| mu0_34() = ^CallSideEffect : ~mu0_2 # 19| v0_35(Void) = ReturnVoid : # 19| v0_36(Void) = UnmodeledUse : mu* -# 19| v0_37(Void) = ExitFunction : +# 19| v0_37(Void) = AliasedUse : ~mu0_2 +# 19| v0_38(Void) = ExitFunction : inheritance_polymorphism.cs: # 3| System.Int32 A.function() @@ -803,7 +828,8 @@ inheritance_polymorphism.cs: # 3| r0_7(glval) = VariableAddress[#return] : # 3| v0_8(Void) = ReturnValue : &:r0_7, ~mu0_2 # 3| v0_9(Void) = UnmodeledUse : mu* -# 3| v0_10(Void) = ExitFunction : +# 3| v0_10(Void) = AliasedUse : ~mu0_2 +# 3| v0_11(Void) = ExitFunction : # 15| System.Int32 C.function() # 15| Block 0 @@ -817,7 +843,8 @@ inheritance_polymorphism.cs: # 15| r0_7(glval) = VariableAddress[#return] : # 15| v0_8(Void) = ReturnValue : &:r0_7, ~mu0_2 # 15| v0_9(Void) = UnmodeledUse : mu* -# 15| v0_10(Void) = ExitFunction : +# 15| v0_10(Void) = AliasedUse : ~mu0_2 +# 15| v0_11(Void) = ExitFunction : # 23| System.Void Program.Main() # 23| Block 0 @@ -861,7 +888,8 @@ inheritance_polymorphism.cs: # 34| mu0_37() = ^CallSideEffect : ~mu0_2 # 23| v0_38(Void) = ReturnVoid : # 23| v0_39(Void) = UnmodeledUse : mu* -# 23| v0_40(Void) = ExitFunction : +# 23| v0_40(Void) = AliasedUse : ~mu0_2 +# 23| v0_41(Void) = ExitFunction : inoutref.cs: # 11| System.Void InOutRef.set(MyClass,MyClass) @@ -880,7 +908,8 @@ inoutref.cs: # 13| mu0_11(MyClass) = Store : &:r0_10, r0_8 # 11| v0_12(Void) = ReturnVoid : # 11| v0_13(Void) = UnmodeledUse : mu* -# 11| v0_14(Void) = ExitFunction : +# 11| v0_14(Void) = AliasedUse : ~mu0_2 +# 11| v0_15(Void) = ExitFunction : # 16| System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass) # 16| Block 0 @@ -939,7 +968,8 @@ inoutref.cs: # 26| mu0_52() = ^CallSideEffect : ~mu0_2 # 16| v0_53(Void) = ReturnVoid : # 16| v0_54(Void) = UnmodeledUse : mu* -# 16| v0_55(Void) = ExitFunction : +# 16| v0_55(Void) = AliasedUse : ~mu0_2 +# 16| v0_56(Void) = ExitFunction : # 29| System.Void InOutRef.Main() # 29| Block 0 @@ -977,7 +1007,8 @@ inoutref.cs: # 36| mu0_31(Int32) = Store : &:r0_27, r0_30 # 29| v0_32(Void) = ReturnVoid : # 29| v0_33(Void) = UnmodeledUse : mu* -# 29| v0_34(Void) = ExitFunction : +# 29| v0_34(Void) = AliasedUse : ~mu0_2 +# 29| v0_35(Void) = ExitFunction : isexpr.cs: # 8| System.Void IsExpr.Main() @@ -1008,7 +1039,8 @@ isexpr.cs: # 8| Block 1 # 8| v1_0(Void) = ReturnVoid : # 8| v1_1(Void) = UnmodeledUse : mu* -# 8| v1_2(Void) = ExitFunction : +# 8| v1_2(Void) = AliasedUse : ~mu0_2 +# 8| v1_3(Void) = ExitFunction : # 13| Block 2 # 13| v2_0(Void) = ConditionalBranch : r0_18 @@ -1214,7 +1246,8 @@ jumps.cs: # 38| mu22_4() = ^CallSideEffect : ~mu0_2 # 5| v22_5(Void) = ReturnVoid : # 5| v22_6(Void) = UnmodeledUse : mu* -# 5| v22_7(Void) = ExitFunction : +# 5| v22_7(Void) = AliasedUse : ~mu0_2 +# 5| v22_8(Void) = ExitFunction : lock.cs: # 5| System.Void LockTest.A() @@ -1258,7 +1291,8 @@ lock.cs: # 5| Block 1 # 5| v1_0(Void) = ReturnVoid : # 5| v1_1(Void) = UnmodeledUse : mu* -# 5| v1_2(Void) = ExitFunction : +# 5| v1_2(Void) = AliasedUse : ~mu0_2 +# 5| v1_3(Void) = ExitFunction : # 8| Block 2 # 8| r2_0() = FunctionAddress[Exit] : @@ -1278,7 +1312,8 @@ obj_creation.cs: # 8| v0_4(Void) = NoOp : # 7| v0_5(Void) = ReturnVoid : # 7| v0_6(Void) = UnmodeledUse : mu* -# 7| v0_7(Void) = ExitFunction : +# 7| v0_7(Void) = AliasedUse : ~mu0_2 +# 7| v0_8(Void) = ExitFunction : # 11| System.Void ObjCreation.MyClass..ctor(System.Int32) # 11| Block 0 @@ -1295,7 +1330,8 @@ obj_creation.cs: # 13| mu0_10(Int32) = Store : &:r0_9, r0_7 # 11| v0_11(Void) = ReturnVoid : # 11| v0_12(Void) = UnmodeledUse : mu* -# 11| v0_13(Void) = ExitFunction : +# 11| v0_13(Void) = AliasedUse : ~mu0_2 +# 11| v0_14(Void) = ExitFunction : # 17| System.Void ObjCreation.SomeFun(ObjCreation.MyClass) # 17| Block 0 @@ -1307,7 +1343,8 @@ obj_creation.cs: # 18| v0_5(Void) = NoOp : # 17| v0_6(Void) = ReturnVoid : # 17| v0_7(Void) = UnmodeledUse : mu* -# 17| v0_8(Void) = ExitFunction : +# 17| v0_8(Void) = AliasedUse : ~mu0_2 +# 17| v0_9(Void) = ExitFunction : # 21| System.Void ObjCreation.Main() # 21| Block 0 @@ -1346,7 +1383,8 @@ obj_creation.cs: # 27| mu0_32() = ^CallSideEffect : ~mu0_2 # 21| v0_33(Void) = ReturnVoid : # 21| v0_34(Void) = UnmodeledUse : mu* -# 21| v0_35(Void) = ExitFunction : +# 21| v0_35(Void) = AliasedUse : ~mu0_2 +# 21| v0_36(Void) = ExitFunction : pointers.cs: # 3| System.Void Pointers.addone(System.Int32[]) @@ -1380,7 +1418,8 @@ pointers.cs: # 3| Block 1 # 3| v1_0(Void) = ReturnVoid : # 3| v1_1(Void) = UnmodeledUse : mu* -# 3| v1_2(Void) = ExitFunction : +# 3| v1_2(Void) = AliasedUse : ~mu0_2 +# 3| v1_3(Void) = ExitFunction : # 9| Block 2 # 9| r2_0(glval) = VariableAddress[i] : @@ -1475,7 +1514,8 @@ pointers.cs: # 40| mu0_61() = ^CallSideEffect : ~mu0_2 # 25| v0_62(Void) = ReturnVoid : # 25| v0_63(Void) = UnmodeledUse : mu* -# 25| v0_64(Void) = ExitFunction : +# 25| v0_64(Void) = AliasedUse : ~mu0_2 +# 25| v0_65(Void) = ExitFunction : prop.cs: # 7| System.Int32 PropClass.get_Prop() @@ -1493,7 +1533,8 @@ prop.cs: # 7| r0_10(glval) = VariableAddress[#return] : # 7| v0_11(Void) = ReturnValue : &:r0_10, ~mu0_2 # 7| v0_12(Void) = UnmodeledUse : mu* -# 7| v0_13(Void) = ExitFunction : +# 7| v0_13(Void) = AliasedUse : ~mu0_2 +# 7| v0_14(Void) = ExitFunction : # 12| System.Void PropClass.set_Prop(System.Int32) # 12| Block 0 @@ -1509,7 +1550,8 @@ prop.cs: # 14| mu0_9(Int32) = Store : &:r0_8, r0_7 # 12| v0_10(Void) = ReturnVoid : # 12| v0_11(Void) = UnmodeledUse : mu* -# 12| v0_12(Void) = ExitFunction : +# 12| v0_12(Void) = AliasedUse : ~mu0_2 +# 12| v0_13(Void) = ExitFunction : # 18| System.Int32 PropClass.func() # 18| Block 0 @@ -1523,7 +1565,8 @@ prop.cs: # 18| r0_7(glval) = VariableAddress[#return] : # 18| v0_8(Void) = ReturnValue : &:r0_7, ~mu0_2 # 18| v0_9(Void) = UnmodeledUse : mu* -# 18| v0_10(Void) = ExitFunction : +# 18| v0_10(Void) = AliasedUse : ~mu0_2 +# 18| v0_11(Void) = ExitFunction : # 26| System.Void Prog.Main() # 26| Block 0 @@ -1551,7 +1594,8 @@ prop.cs: # 30| mu0_21(Int32) = Store : &:r0_15, r0_19 # 26| v0_22(Void) = ReturnVoid : # 26| v0_23(Void) = UnmodeledUse : mu* -# 26| v0_24(Void) = ExitFunction : +# 26| v0_24(Void) = AliasedUse : ~mu0_2 +# 26| v0_25(Void) = ExitFunction : simple_call.cs: # 5| System.Int32 test_simple_call.f() @@ -1565,7 +1609,8 @@ simple_call.cs: # 5| r0_6(glval) = VariableAddress[#return] : # 5| v0_7(Void) = ReturnValue : &:r0_6, ~mu0_2 # 5| v0_8(Void) = UnmodeledUse : mu* -# 5| v0_9(Void) = ExitFunction : +# 5| v0_9(Void) = AliasedUse : ~mu0_2 +# 5| v0_10(Void) = ExitFunction : # 10| System.Int32 test_simple_call.g() # 10| Block 0 @@ -1581,7 +1626,8 @@ simple_call.cs: # 10| r0_9(glval) = VariableAddress[#return] : # 10| v0_10(Void) = ReturnValue : &:r0_9, ~mu0_2 # 10| v0_11(Void) = UnmodeledUse : mu* -# 10| v0_12(Void) = ExitFunction : +# 10| v0_12(Void) = AliasedUse : ~mu0_2 +# 10| v0_13(Void) = ExitFunction : simple_function.cs: # 5| System.Int32 test_simple_function.f() @@ -1595,7 +1641,8 @@ simple_function.cs: # 5| r0_6(glval) = VariableAddress[#return] : # 5| v0_7(Void) = ReturnValue : &:r0_6, ~mu0_2 # 5| v0_8(Void) = UnmodeledUse : mu* -# 5| v0_9(Void) = ExitFunction : +# 5| v0_9(Void) = AliasedUse : ~mu0_2 +# 5| v0_10(Void) = ExitFunction : stmts.cs: # 5| System.Int32 test_stmts.ifStmt(System.Int32) @@ -1617,7 +1664,8 @@ stmts.cs: # 5| r1_0(glval) = VariableAddress[#return] : # 5| v1_1(Void) = ReturnValue : &:r1_0, ~mu0_2 # 5| v1_2(Void) = UnmodeledUse : mu* -# 5| v1_3(Void) = ExitFunction : +# 5| v1_3(Void) = AliasedUse : ~mu0_2 +# 5| v1_4(Void) = ExitFunction : # 10| Block 2 # 10| r2_0(glval) = VariableAddress[#return] : @@ -1646,7 +1694,8 @@ stmts.cs: # 13| Block 1 # 13| v1_0(Void) = ReturnVoid : # 13| v1_1(Void) = UnmodeledUse : mu* -# 13| v1_2(Void) = ExitFunction : +# 13| v1_2(Void) = AliasedUse : ~mu0_2 +# 13| v1_3(Void) = ExitFunction : # 16| Block 2 # 16| r2_0(glval) = VariableAddress[i] : @@ -1693,7 +1742,8 @@ stmts.cs: # 22| r1_0(glval) = VariableAddress[#return] : # 22| v1_1(Void) = ReturnValue : &:r1_0, ~mu0_2 # 22| v1_2(Void) = UnmodeledUse : mu* -# 22| v1_3(Void) = ExitFunction : +# 22| v1_3(Void) = AliasedUse : ~mu0_2 +# 22| v1_4(Void) = ExitFunction : # 29| Block 2 # 29| v2_0(Void) = NoOp : @@ -1750,7 +1800,8 @@ stmts.cs: # 46| Block 1 # 46| v1_0(Void) = UnmodeledUse : mu* -# 46| v1_1(Void) = ExitFunction : +# 46| v1_1(Void) = AliasedUse : ~mu0_2 +# 46| v1_2(Void) = ExitFunction : # 46| Block 2 # 46| v2_0(Void) = Unwind : @@ -1816,7 +1867,8 @@ stmts.cs: # 69| Block 1 # 69| v1_0(Void) = ReturnVoid : # 69| v1_1(Void) = UnmodeledUse : mu* -# 69| v1_2(Void) = ExitFunction : +# 69| v1_2(Void) = AliasedUse : ~mu0_2 +# 69| v1_3(Void) = ExitFunction : # 72| Block 2 # 72| r2_0(glval) = VariableAddress[i] : @@ -1893,7 +1945,8 @@ stmts.cs: # 89| Block 1 # 89| v1_0(Void) = ReturnVoid : # 89| v1_1(Void) = UnmodeledUse : mu* -# 89| v1_2(Void) = ExitFunction : +# 89| v1_2(Void) = AliasedUse : ~mu0_2 +# 89| v1_3(Void) = ExitFunction : # 94| Block 2 # 94| r2_0(glval) = VariableAddress[x] : @@ -1933,7 +1986,8 @@ stmts.cs: # 108| mu0_18(Int32) = Store : &:r0_17, r0_16 # 99| v0_19(Void) = ReturnVoid : # 99| v0_20(Void) = UnmodeledUse : mu* -# 99| v0_21(Void) = ExitFunction : +# 99| v0_21(Void) = AliasedUse : ~mu0_2 +# 99| v0_22(Void) = ExitFunction : using.cs: # 7| System.Void UsingStmt.MyDisposable..ctor() @@ -1945,7 +1999,8 @@ using.cs: # 7| v0_4(Void) = NoOp : # 7| v0_5(Void) = ReturnVoid : # 7| v0_6(Void) = UnmodeledUse : mu* -# 7| v0_7(Void) = ExitFunction : +# 7| v0_7(Void) = AliasedUse : ~mu0_2 +# 7| v0_8(Void) = ExitFunction : # 8| System.Void UsingStmt.MyDisposable.DoSomething() # 8| Block 0 @@ -1956,7 +2011,8 @@ using.cs: # 8| v0_4(Void) = NoOp : # 8| v0_5(Void) = ReturnVoid : # 8| v0_6(Void) = UnmodeledUse : mu* -# 8| v0_7(Void) = ExitFunction : +# 8| v0_7(Void) = AliasedUse : ~mu0_2 +# 8| v0_8(Void) = ExitFunction : # 9| System.Void UsingStmt.MyDisposable.Dispose() # 9| Block 0 @@ -1967,7 +2023,8 @@ using.cs: # 9| v0_4(Void) = NoOp : # 9| v0_5(Void) = ReturnVoid : # 9| v0_6(Void) = UnmodeledUse : mu* -# 9| v0_7(Void) = ExitFunction : +# 9| v0_7(Void) = AliasedUse : ~mu0_2 +# 9| v0_8(Void) = ExitFunction : # 12| System.Void UsingStmt.Main() # 12| Block 0 @@ -2009,7 +2066,8 @@ using.cs: # 26| mu0_35() = ^CallSideEffect : ~mu0_2 # 12| v0_36(Void) = ReturnVoid : # 12| v0_37(Void) = UnmodeledUse : mu* -# 12| v0_38(Void) = ExitFunction : +# 12| v0_38(Void) = AliasedUse : ~mu0_2 +# 12| v0_39(Void) = ExitFunction : variables.cs: # 5| System.Void test_variables.f() @@ -2035,4 +2093,5 @@ variables.cs: # 10| mu0_18(Int32) = Store : &:r0_15, r0_17 # 5| v0_19(Void) = ReturnVoid : # 5| v0_20(Void) = UnmodeledUse : mu* -# 5| v0_21(Void) = ExitFunction : +# 5| v0_21(Void) = AliasedUse : ~mu0_2 +# 5| v0_22(Void) = ExitFunction :