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 0e4f800bb1bf..edbec38d5b93 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/Opcode.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/Opcode.qll @@ -3,11 +3,13 @@ private newtype TOpcode = TUninitialized() or TError() or TInitializeParameter() or + TInitializeIndirection() or TInitializeThis() or TEnterFunction() or TExitFunction() or TReturnValue() or TReturnVoid() or + TReturnIndirection() or TCopyValue() or TLoad() or TStore() or @@ -180,6 +182,10 @@ module Opcode { final override string toString() { result = "InitializeParameter" } } + class InitializeIndirection extends MemoryAccessOpcode, TInitializeIndirection { + final override string toString() { result = "InitializeIndirection" } + } + class InitializeThis extends Opcode, TInitializeThis { final override string toString() { result = "InitializeThis" } } @@ -200,6 +206,10 @@ module Opcode { final override string toString() { result = "ReturnVoid" } } + class ReturnIndirection extends MemoryAccessOpcode, TReturnIndirection { + final override string toString() { result = "ReturnIndirection" } + } + class CopyValue extends UnaryOpcode, CopyOpcode, TCopyValue { final override string toString() { result = "CopyValue" } } 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 241de4406e84..b4e4e7c060c2 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 @@ -51,6 +51,7 @@ module InstructionSanity { opcode instanceof ReadSideEffectOpcode or opcode instanceof Opcode::InlineAsm or opcode instanceof Opcode::CallSideEffect or + opcode instanceof Opcode::ReturnIndirection or opcode instanceof Opcode::AliasedUse ) and tag instanceof SideEffectOperandTag @@ -713,6 +714,14 @@ class InitializeParameterInstruction extends VariableInstruction { final override MemoryAccessKind getResultMemoryAccess() { result instanceof IndirectMemoryAccess } } +class InitializeIndirectionInstruction extends VariableInstruction { + InitializeIndirectionInstruction() { getOpcode() instanceof Opcode::InitializeIndirection } + + final Language::Parameter getParameter() { result = var.(IRUserVariable).getVariable() } + + final override MemoryAccessKind getResultMemoryAccess() { result instanceof IndirectMemoryAccess } +} + /** * An instruction that initializes the `this` pointer parameter of the enclosing function. */ @@ -773,6 +782,18 @@ class ReturnValueInstruction extends ReturnInstruction { final Instruction getReturnValue() { result = getReturnValueOperand().getDef() } } +class ReturnIndirectionInstruction extends Instruction { + ReturnIndirectionInstruction() { getOpcode() instanceof Opcode::ReturnIndirection } + + final SideEffectOperand getSideEffectOperand() { result = getAnOperand() } + + final Instruction getSideEffect() { result = getSideEffectOperand().getDef() } + + final AddressOperand getSourceAddressOperand() { result = getAnOperand() } + + final Instruction getSourceAddress() { result = getSourceAddressOperand().getDef() } +} + class CopyInstruction extends Instruction { CopyInstruction() { getOpcode() instanceof CopyOpcode } 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 eaa9f20e66b4..e0e517620168 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 @@ -410,6 +410,9 @@ class SideEffectOperand extends TypedOperand { or useInstr instanceof BufferMayWriteSideEffectInstruction and result instanceof BufferMemoryAccess + or + useInstr instanceof ReturnIndirectionInstruction and + result instanceof BufferMemoryAccess } final override predicate hasMayMemoryAccess() { diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysis.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysis.qll index bc67acc1be20..18e449294f86 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysis.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysis.qll @@ -49,6 +49,7 @@ private predicate operandEscapesDomain(Operand operand) { not isArgumentForParameter(_, operand, _) and not isOnlyEscapesViaReturnArgument(operand) and not operand.getUse() instanceof ReturnValueInstruction and + not operand.getUse() instanceof ReturnIndirectionInstruction and not operand instanceof PhiInputOperand } 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 241de4406e84..b4e4e7c060c2 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 @@ -51,6 +51,7 @@ module InstructionSanity { opcode instanceof ReadSideEffectOpcode or opcode instanceof Opcode::InlineAsm or opcode instanceof Opcode::CallSideEffect or + opcode instanceof Opcode::ReturnIndirection or opcode instanceof Opcode::AliasedUse ) and tag instanceof SideEffectOperandTag @@ -713,6 +714,14 @@ class InitializeParameterInstruction extends VariableInstruction { final override MemoryAccessKind getResultMemoryAccess() { result instanceof IndirectMemoryAccess } } +class InitializeIndirectionInstruction extends VariableInstruction { + InitializeIndirectionInstruction() { getOpcode() instanceof Opcode::InitializeIndirection } + + final Language::Parameter getParameter() { result = var.(IRUserVariable).getVariable() } + + final override MemoryAccessKind getResultMemoryAccess() { result instanceof IndirectMemoryAccess } +} + /** * An instruction that initializes the `this` pointer parameter of the enclosing function. */ @@ -773,6 +782,18 @@ class ReturnValueInstruction extends ReturnInstruction { final Instruction getReturnValue() { result = getReturnValueOperand().getDef() } } +class ReturnIndirectionInstruction extends Instruction { + ReturnIndirectionInstruction() { getOpcode() instanceof Opcode::ReturnIndirection } + + final SideEffectOperand getSideEffectOperand() { result = getAnOperand() } + + final Instruction getSideEffect() { result = getSideEffectOperand().getDef() } + + final AddressOperand getSourceAddressOperand() { result = getAnOperand() } + + final Instruction getSourceAddress() { result = getSourceAddressOperand().getDef() } +} + class CopyInstruction extends Instruction { CopyInstruction() { getOpcode() instanceof CopyOpcode } 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 eaa9f20e66b4..e0e517620168 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 @@ -410,6 +410,9 @@ class SideEffectOperand extends TypedOperand { or useInstr instanceof BufferMayWriteSideEffectInstruction and result instanceof BufferMemoryAccess + or + useInstr instanceof ReturnIndirectionInstruction and + result instanceof BufferMemoryAccess } final override predicate hasMayMemoryAccess() { 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 7b0d33546cf8..0a809be2dfa2 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 @@ -6,6 +6,8 @@ newtype TInstructionTag = InitializerVariableAddressTag() or InitializerLoadStringTag() or InitializerStoreTag() or + InitializerIndirectAddressTag() or + InitializerIndirectStoreTag() or ZeroPadStringConstantTag() or ZeroPadStringElementIndexTag() or ZeroPadStringElementAddressTag() or @@ -80,6 +82,10 @@ string getInstructionTagId(TInstructionTag tag) { or tag = InitializerUninitializedTag() and result = "InitUninit" or + tag = InitializerIndirectAddressTag() and result = "InitIndirectAddr" + or + tag = InitializerIndirectStoreTag() and result = "InitIndirectStore" + or tag = ZeroPadStringConstantTag() and result = "ZeroPadConst" or tag = ZeroPadStringElementIndexTag() and result = "ZeroPadElemIndex" diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll index 023ed92fa3a5..6fa8ca3feffe 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll @@ -355,6 +355,16 @@ newtype TTranslatedElement = translateFunction(func) ) } or + TTranslatedReadEffects(Function func) { translateFunction(func) } or + // The read side effects in a function's return block + TTranslatedReadEffect(Parameter param) { + translateFunction(param.getFunction()) and + exists(Type t | t = param.getUnspecifiedType() | + t instanceof ArrayType or + t instanceof PointerType or + t instanceof ReferenceType + ) + } or // A local declaration TTranslatedDeclarationEntry(DeclarationEntry entry) { exists(DeclStmt declStmt | 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 5b437f45c546..88e5c6bef9fb 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 @@ -35,6 +35,8 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { final override Function getFunction() { result = func } final override TranslatedElement getChild(int id) { + id = -4 and result = getReadEffects() + or id = -3 and result = getConstructorInitList() or id = -2 and result = getBody() @@ -54,6 +56,8 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { final private TranslatedStmt getBody() { result = getTranslatedStmt(func.getEntryPoint()) } + final private TranslatedReadEffects getReadEffects() { result = getTranslatedReadEffects(func) } + final private TranslatedParameter getParameter(int index) { result = getTranslatedParameter(func.getParameter(index)) } @@ -117,12 +121,13 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction { child = getBody() and result = getReturnSuccessorInstruction() or - ( - child = getDestructorDestructionList() and - if hasReturnValue() - then result = getInstruction(ReturnValueAddressTag()) - else result = getInstruction(ReturnTag()) - ) + child = getDestructorDestructionList() and + result = getReadEffects().getFirstInstruction() + or + child = getReadEffects() and + if hasReturnValue() + then result = getInstruction(ReturnValueAddressTag()) + else result = getInstruction(ReturnTag()) } final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { @@ -339,6 +344,14 @@ class TranslatedParameter extends TranslatedElement, TTranslatedParameter { result = getInstruction(InitializerStoreTag()) or tag = InitializerStoreTag() and + if hasIndirection() + then result = getInstruction(InitializerIndirectAddressTag()) + else result = getParent().getChildSuccessor(this) + or + tag = InitializerIndirectAddressTag() and + result = getInstruction(InitializerIndirectStoreTag()) + or + tag = InitializerIndirectStoreTag() and result = getParent().getChildSuccessor(this) ) } @@ -353,12 +366,23 @@ class TranslatedParameter extends TranslatedElement, TTranslatedParameter { tag = InitializerStoreTag() and opcode instanceof Opcode::InitializeParameter and resultType = getTypeForPRValue(getVariableType(param)) + or + hasIndirection() and + tag = InitializerIndirectAddressTag() and + opcode instanceof Opcode::Load and + resultType = getTypeForPRValue(getVariableType(param)) + or + hasIndirection() and + tag = InitializerIndirectStoreTag() and + opcode instanceof Opcode::InitializeIndirection and + resultType = getUnknownType() } final override IRVariable getInstructionVariable(InstructionTag tag) { ( tag = InitializerStoreTag() or - tag = InitializerVariableAddressTag() + tag = InitializerVariableAddressTag() or + tag = InitializerIndirectStoreTag() ) and result = getIRUserVariable(getFunction(), param) } @@ -369,6 +393,28 @@ class TranslatedParameter extends TranslatedElement, TTranslatedParameter { operandTag instanceof AddressOperandTag and result = getInstruction(InitializerVariableAddressTag()) ) + or + // this feels a little strange, but I think it's the best we can do + tag = InitializerIndirectAddressTag() and + ( + operandTag instanceof AddressOperandTag and + result = getInstruction(InitializerVariableAddressTag()) + or + operandTag instanceof LoadOperandTag and + result = getInstruction(InitializerStoreTag()) + ) + or + tag = InitializerIndirectStoreTag() and + operandTag instanceof AddressOperandTag and + result = getInstruction(InitializerIndirectAddressTag()) + } + + predicate hasIndirection() { + exists(Type t | t = param.getUnspecifiedType() | + t instanceof ArrayType or + t instanceof PointerType or + t instanceof ReferenceType + ) } } @@ -490,3 +536,96 @@ class TranslatedDestructorDestructionList extends TranslatedElement, ) } } + +TranslatedReadEffects getTranslatedReadEffects(Function func) { result.getAST() = func } + +class TranslatedReadEffects extends TranslatedElement, TTranslatedReadEffects { + Function func; + + TranslatedReadEffects() { this = TTranslatedReadEffects(func) } + + override Locatable getAST() { result = func } + + override Function getFunction() { result = func } + + override string toString() { result = "read effects: " + func.toString() } + + override TranslatedElement getChild(int id) { + result = getTranslatedReadEffect(func.getParameter(id)) + } + + override Instruction getFirstInstruction() { + if exists(getAChild()) + then + result = min(TranslatedReadEffect child, int id | child = getChild(id) | child order by id) + .getFirstInstruction() + else result = getParent().getChildSuccessor(this) + } + + override Instruction getChildSuccessor(TranslatedElement child) { + exists(int id | child = getChild(id) | + if exists(TranslatedReadEffect child2, int id2 | id2 > id and child2 = getChild(id2)) + then + result = min(TranslatedReadEffect child2, int id2 | + child2 = getChild(id2) and id2 > id + | + child2 order by id2 + ).getFirstInstruction() + else result = getParent().getChildSuccessor(this) + ) + } + + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { + none() + } + + override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } +} + +private TranslatedReadEffect getTranslatedReadEffect(Parameter param) { result.getAST() = param } + +class TranslatedReadEffect extends TranslatedElement, TTranslatedReadEffect { + Parameter param; + + TranslatedReadEffect() { this = TTranslatedReadEffect(param) } + + override Locatable getAST() { result = param } + + override string toString() { result = "read effect: " + param.toString() } + + override TranslatedElement getChild(int id) { none() } + + override Instruction getChildSuccessor(TranslatedElement child) { none() } + + override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind edge) { + tag = OnlyInstructionTag() and + edge = gotoEdge() and + result = getParent().getChildSuccessor(this) + } + + override Instruction getFirstInstruction() { result = getInstruction(OnlyInstructionTag()) } + + override Function getFunction() { result = param.getFunction() } + + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { + opcode instanceof Opcode::ReturnIndirection and + tag = OnlyInstructionTag() and + resultType = getVoidType() + } + + final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) { + tag = OnlyInstructionTag() and + operandTag = sideEffectOperand() and + result = getTranslatedFunction(getFunction()).getUnmodeledDefinitionInstruction() + or + tag = OnlyInstructionTag() and + operandTag = addressOperand() and + result = getTranslatedParameter(param).getInstruction(InitializerIndirectAddressTag()) + } + + final override CppType getInstructionOperandType(InstructionTag tag, TypedOperandTag operandTag) { + tag = OnlyInstructionTag() and + operandTag = sideEffectOperand() and + result = getUnknownType() + } +} 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 241de4406e84..b4e4e7c060c2 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 @@ -51,6 +51,7 @@ module InstructionSanity { opcode instanceof ReadSideEffectOpcode or opcode instanceof Opcode::InlineAsm or opcode instanceof Opcode::CallSideEffect or + opcode instanceof Opcode::ReturnIndirection or opcode instanceof Opcode::AliasedUse ) and tag instanceof SideEffectOperandTag @@ -713,6 +714,14 @@ class InitializeParameterInstruction extends VariableInstruction { final override MemoryAccessKind getResultMemoryAccess() { result instanceof IndirectMemoryAccess } } +class InitializeIndirectionInstruction extends VariableInstruction { + InitializeIndirectionInstruction() { getOpcode() instanceof Opcode::InitializeIndirection } + + final Language::Parameter getParameter() { result = var.(IRUserVariable).getVariable() } + + final override MemoryAccessKind getResultMemoryAccess() { result instanceof IndirectMemoryAccess } +} + /** * An instruction that initializes the `this` pointer parameter of the enclosing function. */ @@ -773,6 +782,18 @@ class ReturnValueInstruction extends ReturnInstruction { final Instruction getReturnValue() { result = getReturnValueOperand().getDef() } } +class ReturnIndirectionInstruction extends Instruction { + ReturnIndirectionInstruction() { getOpcode() instanceof Opcode::ReturnIndirection } + + final SideEffectOperand getSideEffectOperand() { result = getAnOperand() } + + final Instruction getSideEffect() { result = getSideEffectOperand().getDef() } + + final AddressOperand getSourceAddressOperand() { result = getAnOperand() } + + final Instruction getSourceAddress() { result = getSourceAddressOperand().getDef() } +} + class CopyInstruction extends Instruction { CopyInstruction() { getOpcode() instanceof CopyOpcode } 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 eaa9f20e66b4..e0e517620168 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 @@ -410,6 +410,9 @@ class SideEffectOperand extends TypedOperand { or useInstr instanceof BufferMayWriteSideEffectInstruction and result instanceof BufferMemoryAccess + or + useInstr instanceof ReturnIndirectionInstruction and + result instanceof BufferMemoryAccess } final override predicate hasMayMemoryAccess() { diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysis.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysis.qll index bc67acc1be20..18e449294f86 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysis.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysis.qll @@ -49,6 +49,7 @@ private predicate operandEscapesDomain(Operand operand) { not isArgumentForParameter(_, operand, _) and not isOnlyEscapesViaReturnArgument(operand) and not operand.getUse() instanceof ReturnValueInstruction and + not operand.getUse() instanceof ReturnIndirectionInstruction and not operand instanceof PhiInputOperand } diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_diff.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_diff.expected index 9b8be3abd1e9..d0961962f290 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_diff.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_diff.expected @@ -1,6 +1,7 @@ | BarrierGuard.cpp:60:11:60:16 | BarrierGuard.cpp:62:14:62:14 | AST only | | BarrierGuard.cpp:60:11:60:16 | BarrierGuard.cpp:64:14:64:14 | AST only | | BarrierGuard.cpp:60:11:60:16 | BarrierGuard.cpp:66:14:66:14 | AST only | +| clang.cpp:12:9:12:20 | clang.cpp:18:8:18:19 | AST only | | clang.cpp:12:9:12:20 | clang.cpp:22:8:22:20 | AST only | | clang.cpp:28:27:28:32 | clang.cpp:29:27:29:28 | AST only | | clang.cpp:28:27:28:32 | clang.cpp:30:27:30:34 | AST only | diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_ir.expected b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_ir.expected index 00a819948bc3..d956ef872e3e 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_ir.expected +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/test_ir.expected @@ -7,8 +7,6 @@ | BarrierGuard.cpp:55:13:55:13 | x | BarrierGuard.cpp:49:10:49:15 | call to source | | acrossLinkTargets.cpp:12:8:12:8 | (int)... | acrossLinkTargets.cpp:19:27:19:32 | call to source | | acrossLinkTargets.cpp:12:8:12:8 | x | acrossLinkTargets.cpp:19:27:19:32 | call to source | -| clang.cpp:18:8:18:19 | (const int *)... | clang.cpp:12:9:12:20 | sourceArray1 | -| clang.cpp:18:8:18:19 | sourceArray1 | clang.cpp:12:9:12:20 | sourceArray1 | | clang.cpp:37:10:37:11 | m2 | clang.cpp:34:32:34:37 | call to source | | clang.cpp:41:18:41:19 | m2 | clang.cpp:39:42:39:47 | call to source | | clang.cpp:45:17:45:18 | m2 | clang.cpp:43:35:43:40 | call to source | 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 28021c12e2d2..3e60fb5d60a3 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -9,8 +9,8 @@ bad_asts.cpp: # 9| mu9_6(int) = InitializeParameter[y] : &:r9_5 # 10| r10_1(glval) = VariableAddress[#return] : # 10| r10_2(int) = Constant[6] : -#-----| r0_27(S *) = CopyValue : r9_4 -# 10| r10_3(glval) = FieldAddress[x] : r0_27 +#-----| r0_29(S *) = CopyValue : r9_4 +# 10| r10_3(glval) = FieldAddress[x] : r0_29 # 10| r10_4(int) = Load : &:r10_3, ~mu9_3 # 10| r10_5(int) = Add : r10_2, r10_4 # 10| r10_6(glval) = VariableAddress[y] : @@ -60,23 +60,26 @@ bad_asts.cpp: # 26| void Bad::CallCopyConstructor(Bad::Point const&) # 26| Block 0 -# 26| v26_1(void) = EnterFunction : -# 26| mu26_2(unknown) = AliasedDefinition : -# 26| mu26_3(unknown) = UnmodeledDefinition : -# 26| r26_4(glval) = VariableAddress[a] : -# 26| mu26_5(Point &) = InitializeParameter[a] : &:r26_4 -# 27| r27_1(glval) = VariableAddress[b] : -# 27| r27_2(glval) = VariableAddress[a] : -# 27| r27_3(Point &) = Load : &:r27_2, ~mu26_3 -# 27| r27_4(glval) = CopyValue : r27_3 -# 27| r27_5(glval) = Convert : r27_4 -# 27| r27_6(Point) = Load : &:r27_5, ~mu26_3 -# 27| mu27_7(Point) = Store : &:r27_1, r27_6 -# 28| v28_1(void) = NoOp : -# 26| v26_6(void) = ReturnVoid : -# 26| v26_7(void) = UnmodeledUse : mu* -# 26| v26_8(void) = AliasedUse : ~mu26_3 -# 26| v26_9(void) = ExitFunction : +# 26| v26_1(void) = EnterFunction : +# 26| mu26_2(unknown) = AliasedDefinition : +# 26| mu26_3(unknown) = UnmodeledDefinition : +# 26| r26_4(glval) = VariableAddress[a] : +# 26| mu26_5(Point &) = InitializeParameter[a] : &:r26_4 +# 26| r26_6(Point &) = Load : &:r26_4, ~mu26_5 +# 26| mu26_7(unknown) = InitializeIndirection[a] : &:r26_6 +# 27| r27_1(glval) = VariableAddress[b] : +# 27| r27_2(glval) = VariableAddress[a] : +# 27| r27_3(Point &) = Load : &:r27_2, ~mu26_3 +# 27| r27_4(glval) = CopyValue : r27_3 +# 27| r27_5(glval) = Convert : r27_4 +# 27| r27_6(Point) = Load : &:r27_5, ~mu26_3 +# 27| mu27_7(Point) = Store : &:r27_1, r27_6 +# 28| v28_1(void) = NoOp : +# 26| v26_8(void) = ReturnIndirection : &:r26_6, ~mu26_3 +# 26| v26_9(void) = ReturnVoid : +# 26| v26_10(void) = UnmodeledUse : mu* +# 26| v26_11(void) = AliasedUse : ~mu26_3 +# 26| v26_12(void) = ExitFunction : # 30| void Bad::errorExpr() # 30| Block 0 @@ -89,10 +92,10 @@ bad_asts.cpp: # 32| r32_1(glval) = VariableAddress[x] : # 32| r32_2(error) = Error : # 32| mu32_3(int) = Store : &:r32_1, r32_2 -#-----| r0_36(glval) = Error : -#-----| r0_43(error) = Load : &:r0_36, ~mu30_3 +#-----| r0_40(glval) = Error : +#-----| r0_48(error) = Load : &:r0_40, ~mu30_3 # 33| r33_1(glval) = VariableAddress[x] : -# 33| mu33_2(int) = Store : &:r33_1, r0_43 +# 33| mu33_2(int) = Store : &:r33_1, r0_48 # 34| v34_1(void) = NoOp : # 30| v30_4(void) = ReturnVoid : # 30| v30_5(void) = UnmodeledUse : mu* @@ -741,163 +744,169 @@ ir.cpp: # 153| void PointerOps(int*, int) # 153| Block 0 -# 153| v153_1(void) = EnterFunction : -# 153| mu153_2(unknown) = AliasedDefinition : -# 153| mu153_3(unknown) = UnmodeledDefinition : -# 153| r153_4(glval) = VariableAddress[p] : -# 153| mu153_5(int *) = InitializeParameter[p] : &:r153_4 -# 153| r153_6(glval) = VariableAddress[i] : -# 153| mu153_7(int) = InitializeParameter[i] : &:r153_6 -# 154| r154_1(glval) = VariableAddress[q] : -# 154| mu154_2(int *) = Uninitialized[q] : &:r154_1 -# 155| r155_1(glval) = VariableAddress[b] : -# 155| mu155_2(bool) = Uninitialized[b] : &:r155_1 -# 157| r157_1(glval) = VariableAddress[p] : -# 157| r157_2(int *) = Load : &:r157_1, ~mu153_3 -# 157| r157_3(glval) = VariableAddress[i] : -# 157| r157_4(int) = Load : &:r157_3, ~mu153_3 -# 157| r157_5(int *) = PointerAdd[4] : r157_2, r157_4 -# 157| r157_6(glval) = VariableAddress[q] : -# 157| mu157_7(int *) = Store : &:r157_6, r157_5 -# 158| r158_1(glval) = VariableAddress[i] : -# 158| r158_2(int) = Load : &:r158_1, ~mu153_3 -# 158| r158_3(glval) = VariableAddress[p] : -# 158| r158_4(int *) = Load : &:r158_3, ~mu153_3 -# 158| r158_5(int *) = PointerAdd[4] : r158_4, r158_2 -# 158| r158_6(glval) = VariableAddress[q] : -# 158| mu158_7(int *) = Store : &:r158_6, r158_5 -# 159| r159_1(glval) = VariableAddress[p] : -# 159| r159_2(int *) = Load : &:r159_1, ~mu153_3 -# 159| r159_3(glval) = VariableAddress[i] : -# 159| r159_4(int) = Load : &:r159_3, ~mu153_3 -# 159| r159_5(int *) = PointerSub[4] : r159_2, r159_4 -# 159| r159_6(glval) = VariableAddress[q] : -# 159| mu159_7(int *) = Store : &:r159_6, r159_5 -# 160| r160_1(glval) = VariableAddress[p] : -# 160| r160_2(int *) = Load : &:r160_1, ~mu153_3 -# 160| r160_3(glval) = VariableAddress[q] : -# 160| r160_4(int *) = Load : &:r160_3, ~mu153_3 -# 160| r160_5(long) = PointerDiff[4] : r160_2, r160_4 -# 160| r160_6(int) = Convert : r160_5 -# 160| r160_7(glval) = VariableAddress[i] : -# 160| mu160_8(int) = Store : &:r160_7, r160_6 -# 162| r162_1(glval) = VariableAddress[p] : -# 162| r162_2(int *) = Load : &:r162_1, ~mu153_3 -# 162| r162_3(glval) = VariableAddress[q] : -# 162| mu162_4(int *) = Store : &:r162_3, r162_2 -# 164| r164_1(glval) = VariableAddress[i] : -# 164| r164_2(int) = Load : &:r164_1, ~mu153_3 -# 164| r164_3(glval) = VariableAddress[q] : -# 164| r164_4(int *) = Load : &:r164_3, ~mu153_3 -# 164| r164_5(int *) = PointerAdd[4] : r164_4, r164_2 -# 164| mu164_6(int *) = Store : &:r164_3, r164_5 -# 165| r165_1(glval) = VariableAddress[i] : -# 165| r165_2(int) = Load : &:r165_1, ~mu153_3 -# 165| r165_3(glval) = VariableAddress[q] : -# 165| r165_4(int *) = Load : &:r165_3, ~mu153_3 -# 165| r165_5(int *) = PointerSub[4] : r165_4, r165_2 -# 165| mu165_6(int *) = Store : &:r165_3, r165_5 -# 167| r167_1(glval) = VariableAddress[p] : -# 167| r167_2(int *) = Load : &:r167_1, ~mu153_3 -# 167| r167_3(int *) = Constant[0] : -# 167| r167_4(bool) = CompareNE : r167_2, r167_3 -# 167| r167_5(glval) = VariableAddress[b] : -# 167| mu167_6(bool) = Store : &:r167_5, r167_4 -# 168| r168_1(glval) = VariableAddress[p] : -# 168| r168_2(int *) = Load : &:r168_1, ~mu153_3 -# 168| r168_3(int *) = Constant[0] : -# 168| r168_4(bool) = CompareNE : r168_2, r168_3 -# 168| r168_5(bool) = LogicalNot : r168_4 -# 168| r168_6(glval) = VariableAddress[b] : -# 168| mu168_7(bool) = Store : &:r168_6, r168_5 -# 169| v169_1(void) = NoOp : -# 153| v153_8(void) = ReturnVoid : -# 153| v153_9(void) = UnmodeledUse : mu* -# 153| v153_10(void) = AliasedUse : ~mu153_3 -# 153| v153_11(void) = ExitFunction : +# 153| v153_1(void) = EnterFunction : +# 153| mu153_2(unknown) = AliasedDefinition : +# 153| mu153_3(unknown) = UnmodeledDefinition : +# 153| r153_4(glval) = VariableAddress[p] : +# 153| mu153_5(int *) = InitializeParameter[p] : &:r153_4 +# 153| r153_6(int *) = Load : &:r153_4, ~mu153_5 +# 153| mu153_7(unknown) = InitializeIndirection[p] : &:r153_6 +# 153| r153_8(glval) = VariableAddress[i] : +# 153| mu153_9(int) = InitializeParameter[i] : &:r153_8 +# 154| r154_1(glval) = VariableAddress[q] : +# 154| mu154_2(int *) = Uninitialized[q] : &:r154_1 +# 155| r155_1(glval) = VariableAddress[b] : +# 155| mu155_2(bool) = Uninitialized[b] : &:r155_1 +# 157| r157_1(glval) = VariableAddress[p] : +# 157| r157_2(int *) = Load : &:r157_1, ~mu153_3 +# 157| r157_3(glval) = VariableAddress[i] : +# 157| r157_4(int) = Load : &:r157_3, ~mu153_3 +# 157| r157_5(int *) = PointerAdd[4] : r157_2, r157_4 +# 157| r157_6(glval) = VariableAddress[q] : +# 157| mu157_7(int *) = Store : &:r157_6, r157_5 +# 158| r158_1(glval) = VariableAddress[i] : +# 158| r158_2(int) = Load : &:r158_1, ~mu153_3 +# 158| r158_3(glval) = VariableAddress[p] : +# 158| r158_4(int *) = Load : &:r158_3, ~mu153_3 +# 158| r158_5(int *) = PointerAdd[4] : r158_4, r158_2 +# 158| r158_6(glval) = VariableAddress[q] : +# 158| mu158_7(int *) = Store : &:r158_6, r158_5 +# 159| r159_1(glval) = VariableAddress[p] : +# 159| r159_2(int *) = Load : &:r159_1, ~mu153_3 +# 159| r159_3(glval) = VariableAddress[i] : +# 159| r159_4(int) = Load : &:r159_3, ~mu153_3 +# 159| r159_5(int *) = PointerSub[4] : r159_2, r159_4 +# 159| r159_6(glval) = VariableAddress[q] : +# 159| mu159_7(int *) = Store : &:r159_6, r159_5 +# 160| r160_1(glval) = VariableAddress[p] : +# 160| r160_2(int *) = Load : &:r160_1, ~mu153_3 +# 160| r160_3(glval) = VariableAddress[q] : +# 160| r160_4(int *) = Load : &:r160_3, ~mu153_3 +# 160| r160_5(long) = PointerDiff[4] : r160_2, r160_4 +# 160| r160_6(int) = Convert : r160_5 +# 160| r160_7(glval) = VariableAddress[i] : +# 160| mu160_8(int) = Store : &:r160_7, r160_6 +# 162| r162_1(glval) = VariableAddress[p] : +# 162| r162_2(int *) = Load : &:r162_1, ~mu153_3 +# 162| r162_3(glval) = VariableAddress[q] : +# 162| mu162_4(int *) = Store : &:r162_3, r162_2 +# 164| r164_1(glval) = VariableAddress[i] : +# 164| r164_2(int) = Load : &:r164_1, ~mu153_3 +# 164| r164_3(glval) = VariableAddress[q] : +# 164| r164_4(int *) = Load : &:r164_3, ~mu153_3 +# 164| r164_5(int *) = PointerAdd[4] : r164_4, r164_2 +# 164| mu164_6(int *) = Store : &:r164_3, r164_5 +# 165| r165_1(glval) = VariableAddress[i] : +# 165| r165_2(int) = Load : &:r165_1, ~mu153_3 +# 165| r165_3(glval) = VariableAddress[q] : +# 165| r165_4(int *) = Load : &:r165_3, ~mu153_3 +# 165| r165_5(int *) = PointerSub[4] : r165_4, r165_2 +# 165| mu165_6(int *) = Store : &:r165_3, r165_5 +# 167| r167_1(glval) = VariableAddress[p] : +# 167| r167_2(int *) = Load : &:r167_1, ~mu153_3 +# 167| r167_3(int *) = Constant[0] : +# 167| r167_4(bool) = CompareNE : r167_2, r167_3 +# 167| r167_5(glval) = VariableAddress[b] : +# 167| mu167_6(bool) = Store : &:r167_5, r167_4 +# 168| r168_1(glval) = VariableAddress[p] : +# 168| r168_2(int *) = Load : &:r168_1, ~mu153_3 +# 168| r168_3(int *) = Constant[0] : +# 168| r168_4(bool) = CompareNE : r168_2, r168_3 +# 168| r168_5(bool) = LogicalNot : r168_4 +# 168| r168_6(glval) = VariableAddress[b] : +# 168| mu168_7(bool) = Store : &:r168_6, r168_5 +# 169| v169_1(void) = NoOp : +# 153| v153_10(void) = ReturnIndirection : &:r153_6, ~mu153_3 +# 153| v153_11(void) = ReturnVoid : +# 153| v153_12(void) = UnmodeledUse : mu* +# 153| v153_13(void) = AliasedUse : ~mu153_3 +# 153| v153_14(void) = ExitFunction : # 171| void ArrayAccess(int*, int) # 171| Block 0 -# 171| v171_1(void) = EnterFunction : -# 171| mu171_2(unknown) = AliasedDefinition : -# 171| mu171_3(unknown) = UnmodeledDefinition : -# 171| r171_4(glval) = VariableAddress[p] : -# 171| mu171_5(int *) = InitializeParameter[p] : &:r171_4 -# 171| r171_6(glval) = VariableAddress[i] : -# 171| mu171_7(int) = InitializeParameter[i] : &:r171_6 -# 172| r172_1(glval) = VariableAddress[x] : -# 172| mu172_2(int) = Uninitialized[x] : &:r172_1 -# 174| r174_1(glval) = VariableAddress[p] : -# 174| r174_2(int *) = Load : &:r174_1, ~mu171_3 -# 174| r174_3(glval) = VariableAddress[i] : -# 174| r174_4(int) = Load : &:r174_3, ~mu171_3 -# 174| r174_5(glval) = PointerAdd[4] : r174_2, r174_4 -# 174| r174_6(int) = Load : &:r174_5, ~mu171_3 -# 174| r174_7(glval) = VariableAddress[x] : -# 174| mu174_8(int) = Store : &:r174_7, r174_6 -# 175| r175_1(glval) = VariableAddress[p] : -# 175| r175_2(int *) = Load : &:r175_1, ~mu171_3 -# 175| r175_3(glval) = VariableAddress[i] : -# 175| r175_4(int) = Load : &:r175_3, ~mu171_3 -# 175| r175_5(glval) = PointerAdd[4] : r175_2, r175_4 -# 175| r175_6(int) = Load : &:r175_5, ~mu171_3 -# 175| r175_7(glval) = VariableAddress[x] : -# 175| mu175_8(int) = Store : &:r175_7, r175_6 -# 177| r177_1(glval) = VariableAddress[x] : -# 177| r177_2(int) = Load : &:r177_1, ~mu171_3 -# 177| r177_3(glval) = VariableAddress[p] : -# 177| r177_4(int *) = Load : &:r177_3, ~mu171_3 -# 177| r177_5(glval) = VariableAddress[i] : -# 177| r177_6(int) = Load : &:r177_5, ~mu171_3 -# 177| r177_7(glval) = PointerAdd[4] : r177_4, r177_6 -# 177| mu177_8(int) = Store : &:r177_7, r177_2 -# 178| r178_1(glval) = VariableAddress[x] : -# 178| r178_2(int) = Load : &:r178_1, ~mu171_3 -# 178| r178_3(glval) = VariableAddress[p] : -# 178| r178_4(int *) = Load : &:r178_3, ~mu171_3 -# 178| r178_5(glval) = VariableAddress[i] : -# 178| r178_6(int) = Load : &:r178_5, ~mu171_3 -# 178| r178_7(glval) = PointerAdd[4] : r178_4, r178_6 -# 178| mu178_8(int) = Store : &:r178_7, r178_2 -# 180| r180_1(glval) = VariableAddress[a] : -# 180| mu180_2(int[10]) = Uninitialized[a] : &:r180_1 -# 181| r181_1(glval) = VariableAddress[a] : -# 181| r181_2(int *) = Convert : r181_1 -# 181| r181_3(glval) = VariableAddress[i] : -# 181| r181_4(int) = Load : &:r181_3, ~mu171_3 -# 181| r181_5(glval) = PointerAdd[4] : r181_2, r181_4 -# 181| r181_6(int) = Load : &:r181_5, ~mu171_3 -# 181| r181_7(glval) = VariableAddress[x] : -# 181| mu181_8(int) = Store : &:r181_7, r181_6 -# 182| r182_1(glval) = VariableAddress[a] : -# 182| r182_2(int *) = Convert : r182_1 -# 182| r182_3(glval) = VariableAddress[i] : -# 182| r182_4(int) = Load : &:r182_3, ~mu171_3 -# 182| r182_5(glval) = PointerAdd[4] : r182_2, r182_4 -# 182| r182_6(int) = Load : &:r182_5, ~mu171_3 -# 182| r182_7(glval) = VariableAddress[x] : -# 182| mu182_8(int) = Store : &:r182_7, r182_6 -# 183| r183_1(glval) = VariableAddress[x] : -# 183| r183_2(int) = Load : &:r183_1, ~mu171_3 -# 183| r183_3(glval) = VariableAddress[a] : -# 183| r183_4(int *) = Convert : r183_3 -# 183| r183_5(glval) = VariableAddress[i] : -# 183| r183_6(int) = Load : &:r183_5, ~mu171_3 -# 183| r183_7(glval) = PointerAdd[4] : r183_4, r183_6 -# 183| mu183_8(int) = Store : &:r183_7, r183_2 -# 184| r184_1(glval) = VariableAddress[x] : -# 184| r184_2(int) = Load : &:r184_1, ~mu171_3 -# 184| r184_3(glval) = VariableAddress[a] : -# 184| r184_4(int *) = Convert : r184_3 -# 184| r184_5(glval) = VariableAddress[i] : -# 184| r184_6(int) = Load : &:r184_5, ~mu171_3 -# 184| r184_7(glval) = PointerAdd[4] : r184_4, r184_6 -# 184| mu184_8(int) = Store : &:r184_7, r184_2 -# 185| v185_1(void) = NoOp : -# 171| v171_8(void) = ReturnVoid : -# 171| v171_9(void) = UnmodeledUse : mu* -# 171| v171_10(void) = AliasedUse : ~mu171_3 -# 171| v171_11(void) = ExitFunction : +# 171| v171_1(void) = EnterFunction : +# 171| mu171_2(unknown) = AliasedDefinition : +# 171| mu171_3(unknown) = UnmodeledDefinition : +# 171| r171_4(glval) = VariableAddress[p] : +# 171| mu171_5(int *) = InitializeParameter[p] : &:r171_4 +# 171| r171_6(int *) = Load : &:r171_4, ~mu171_5 +# 171| mu171_7(unknown) = InitializeIndirection[p] : &:r171_6 +# 171| r171_8(glval) = VariableAddress[i] : +# 171| mu171_9(int) = InitializeParameter[i] : &:r171_8 +# 172| r172_1(glval) = VariableAddress[x] : +# 172| mu172_2(int) = Uninitialized[x] : &:r172_1 +# 174| r174_1(glval) = VariableAddress[p] : +# 174| r174_2(int *) = Load : &:r174_1, ~mu171_3 +# 174| r174_3(glval) = VariableAddress[i] : +# 174| r174_4(int) = Load : &:r174_3, ~mu171_3 +# 174| r174_5(glval) = PointerAdd[4] : r174_2, r174_4 +# 174| r174_6(int) = Load : &:r174_5, ~mu171_3 +# 174| r174_7(glval) = VariableAddress[x] : +# 174| mu174_8(int) = Store : &:r174_7, r174_6 +# 175| r175_1(glval) = VariableAddress[p] : +# 175| r175_2(int *) = Load : &:r175_1, ~mu171_3 +# 175| r175_3(glval) = VariableAddress[i] : +# 175| r175_4(int) = Load : &:r175_3, ~mu171_3 +# 175| r175_5(glval) = PointerAdd[4] : r175_2, r175_4 +# 175| r175_6(int) = Load : &:r175_5, ~mu171_3 +# 175| r175_7(glval) = VariableAddress[x] : +# 175| mu175_8(int) = Store : &:r175_7, r175_6 +# 177| r177_1(glval) = VariableAddress[x] : +# 177| r177_2(int) = Load : &:r177_1, ~mu171_3 +# 177| r177_3(glval) = VariableAddress[p] : +# 177| r177_4(int *) = Load : &:r177_3, ~mu171_3 +# 177| r177_5(glval) = VariableAddress[i] : +# 177| r177_6(int) = Load : &:r177_5, ~mu171_3 +# 177| r177_7(glval) = PointerAdd[4] : r177_4, r177_6 +# 177| mu177_8(int) = Store : &:r177_7, r177_2 +# 178| r178_1(glval) = VariableAddress[x] : +# 178| r178_2(int) = Load : &:r178_1, ~mu171_3 +# 178| r178_3(glval) = VariableAddress[p] : +# 178| r178_4(int *) = Load : &:r178_3, ~mu171_3 +# 178| r178_5(glval) = VariableAddress[i] : +# 178| r178_6(int) = Load : &:r178_5, ~mu171_3 +# 178| r178_7(glval) = PointerAdd[4] : r178_4, r178_6 +# 178| mu178_8(int) = Store : &:r178_7, r178_2 +# 180| r180_1(glval) = VariableAddress[a] : +# 180| mu180_2(int[10]) = Uninitialized[a] : &:r180_1 +# 181| r181_1(glval) = VariableAddress[a] : +# 181| r181_2(int *) = Convert : r181_1 +# 181| r181_3(glval) = VariableAddress[i] : +# 181| r181_4(int) = Load : &:r181_3, ~mu171_3 +# 181| r181_5(glval) = PointerAdd[4] : r181_2, r181_4 +# 181| r181_6(int) = Load : &:r181_5, ~mu171_3 +# 181| r181_7(glval) = VariableAddress[x] : +# 181| mu181_8(int) = Store : &:r181_7, r181_6 +# 182| r182_1(glval) = VariableAddress[a] : +# 182| r182_2(int *) = Convert : r182_1 +# 182| r182_3(glval) = VariableAddress[i] : +# 182| r182_4(int) = Load : &:r182_3, ~mu171_3 +# 182| r182_5(glval) = PointerAdd[4] : r182_2, r182_4 +# 182| r182_6(int) = Load : &:r182_5, ~mu171_3 +# 182| r182_7(glval) = VariableAddress[x] : +# 182| mu182_8(int) = Store : &:r182_7, r182_6 +# 183| r183_1(glval) = VariableAddress[x] : +# 183| r183_2(int) = Load : &:r183_1, ~mu171_3 +# 183| r183_3(glval) = VariableAddress[a] : +# 183| r183_4(int *) = Convert : r183_3 +# 183| r183_5(glval) = VariableAddress[i] : +# 183| r183_6(int) = Load : &:r183_5, ~mu171_3 +# 183| r183_7(glval) = PointerAdd[4] : r183_4, r183_6 +# 183| mu183_8(int) = Store : &:r183_7, r183_2 +# 184| r184_1(glval) = VariableAddress[x] : +# 184| r184_2(int) = Load : &:r184_1, ~mu171_3 +# 184| r184_3(glval) = VariableAddress[a] : +# 184| r184_4(int *) = Convert : r184_3 +# 184| r184_5(glval) = VariableAddress[i] : +# 184| r184_6(int) = Load : &:r184_5, ~mu171_3 +# 184| r184_7(glval) = PointerAdd[4] : r184_4, r184_6 +# 184| mu184_8(int) = Store : &:r184_7, r184_2 +# 185| v185_1(void) = NoOp : +# 171| v171_10(void) = ReturnIndirection : &:r171_6, ~mu171_3 +# 171| v171_11(void) = ReturnVoid : +# 171| v171_12(void) = UnmodeledUse : mu* +# 171| v171_13(void) = AliasedUse : ~mu171_3 +# 171| v171_14(void) = ExitFunction : # 187| void StringLiteral(int) # 187| Block 0 @@ -935,105 +944,114 @@ ir.cpp: # 193| void PointerCompare(int*, int*) # 193| Block 0 -# 193| v193_1(void) = EnterFunction : -# 193| mu193_2(unknown) = AliasedDefinition : -# 193| mu193_3(unknown) = UnmodeledDefinition : -# 193| r193_4(glval) = VariableAddress[p] : -# 193| mu193_5(int *) = InitializeParameter[p] : &:r193_4 -# 193| r193_6(glval) = VariableAddress[q] : -# 193| mu193_7(int *) = InitializeParameter[q] : &:r193_6 -# 194| r194_1(glval) = VariableAddress[b] : -# 194| mu194_2(bool) = Uninitialized[b] : &:r194_1 -# 196| r196_1(glval) = VariableAddress[p] : -# 196| r196_2(int *) = Load : &:r196_1, ~mu193_3 -# 196| r196_3(glval) = VariableAddress[q] : -# 196| r196_4(int *) = Load : &:r196_3, ~mu193_3 -# 196| r196_5(bool) = CompareEQ : r196_2, r196_4 -# 196| r196_6(glval) = VariableAddress[b] : -# 196| mu196_7(bool) = Store : &:r196_6, r196_5 -# 197| r197_1(glval) = VariableAddress[p] : -# 197| r197_2(int *) = Load : &:r197_1, ~mu193_3 -# 197| r197_3(glval) = VariableAddress[q] : -# 197| r197_4(int *) = Load : &:r197_3, ~mu193_3 -# 197| r197_5(bool) = CompareNE : r197_2, r197_4 -# 197| r197_6(glval) = VariableAddress[b] : -# 197| mu197_7(bool) = Store : &:r197_6, r197_5 -# 198| r198_1(glval) = VariableAddress[p] : -# 198| r198_2(int *) = Load : &:r198_1, ~mu193_3 -# 198| r198_3(glval) = VariableAddress[q] : -# 198| r198_4(int *) = Load : &:r198_3, ~mu193_3 -# 198| r198_5(bool) = CompareLT : r198_2, r198_4 -# 198| r198_6(glval) = VariableAddress[b] : -# 198| mu198_7(bool) = Store : &:r198_6, r198_5 -# 199| r199_1(glval) = VariableAddress[p] : -# 199| r199_2(int *) = Load : &:r199_1, ~mu193_3 -# 199| r199_3(glval) = VariableAddress[q] : -# 199| r199_4(int *) = Load : &:r199_3, ~mu193_3 -# 199| r199_5(bool) = CompareGT : r199_2, r199_4 -# 199| r199_6(glval) = VariableAddress[b] : -# 199| mu199_7(bool) = Store : &:r199_6, r199_5 -# 200| r200_1(glval) = VariableAddress[p] : -# 200| r200_2(int *) = Load : &:r200_1, ~mu193_3 -# 200| r200_3(glval) = VariableAddress[q] : -# 200| r200_4(int *) = Load : &:r200_3, ~mu193_3 -# 200| r200_5(bool) = CompareLE : r200_2, r200_4 -# 200| r200_6(glval) = VariableAddress[b] : -# 200| mu200_7(bool) = Store : &:r200_6, r200_5 -# 201| r201_1(glval) = VariableAddress[p] : -# 201| r201_2(int *) = Load : &:r201_1, ~mu193_3 -# 201| r201_3(glval) = VariableAddress[q] : -# 201| r201_4(int *) = Load : &:r201_3, ~mu193_3 -# 201| r201_5(bool) = CompareGE : r201_2, r201_4 -# 201| r201_6(glval) = VariableAddress[b] : -# 201| mu201_7(bool) = Store : &:r201_6, r201_5 -# 202| v202_1(void) = NoOp : -# 193| v193_8(void) = ReturnVoid : -# 193| v193_9(void) = UnmodeledUse : mu* -# 193| v193_10(void) = AliasedUse : ~mu193_3 -# 193| v193_11(void) = ExitFunction : +# 193| v193_1(void) = EnterFunction : +# 193| mu193_2(unknown) = AliasedDefinition : +# 193| mu193_3(unknown) = UnmodeledDefinition : +# 193| r193_4(glval) = VariableAddress[p] : +# 193| mu193_5(int *) = InitializeParameter[p] : &:r193_4 +# 193| r193_6(int *) = Load : &:r193_4, ~mu193_5 +# 193| mu193_7(unknown) = InitializeIndirection[p] : &:r193_6 +# 193| r193_8(glval) = VariableAddress[q] : +# 193| mu193_9(int *) = InitializeParameter[q] : &:r193_8 +# 193| r193_10(int *) = Load : &:r193_8, ~mu193_9 +# 193| mu193_11(unknown) = InitializeIndirection[q] : &:r193_10 +# 194| r194_1(glval) = VariableAddress[b] : +# 194| mu194_2(bool) = Uninitialized[b] : &:r194_1 +# 196| r196_1(glval) = VariableAddress[p] : +# 196| r196_2(int *) = Load : &:r196_1, ~mu193_3 +# 196| r196_3(glval) = VariableAddress[q] : +# 196| r196_4(int *) = Load : &:r196_3, ~mu193_3 +# 196| r196_5(bool) = CompareEQ : r196_2, r196_4 +# 196| r196_6(glval) = VariableAddress[b] : +# 196| mu196_7(bool) = Store : &:r196_6, r196_5 +# 197| r197_1(glval) = VariableAddress[p] : +# 197| r197_2(int *) = Load : &:r197_1, ~mu193_3 +# 197| r197_3(glval) = VariableAddress[q] : +# 197| r197_4(int *) = Load : &:r197_3, ~mu193_3 +# 197| r197_5(bool) = CompareNE : r197_2, r197_4 +# 197| r197_6(glval) = VariableAddress[b] : +# 197| mu197_7(bool) = Store : &:r197_6, r197_5 +# 198| r198_1(glval) = VariableAddress[p] : +# 198| r198_2(int *) = Load : &:r198_1, ~mu193_3 +# 198| r198_3(glval) = VariableAddress[q] : +# 198| r198_4(int *) = Load : &:r198_3, ~mu193_3 +# 198| r198_5(bool) = CompareLT : r198_2, r198_4 +# 198| r198_6(glval) = VariableAddress[b] : +# 198| mu198_7(bool) = Store : &:r198_6, r198_5 +# 199| r199_1(glval) = VariableAddress[p] : +# 199| r199_2(int *) = Load : &:r199_1, ~mu193_3 +# 199| r199_3(glval) = VariableAddress[q] : +# 199| r199_4(int *) = Load : &:r199_3, ~mu193_3 +# 199| r199_5(bool) = CompareGT : r199_2, r199_4 +# 199| r199_6(glval) = VariableAddress[b] : +# 199| mu199_7(bool) = Store : &:r199_6, r199_5 +# 200| r200_1(glval) = VariableAddress[p] : +# 200| r200_2(int *) = Load : &:r200_1, ~mu193_3 +# 200| r200_3(glval) = VariableAddress[q] : +# 200| r200_4(int *) = Load : &:r200_3, ~mu193_3 +# 200| r200_5(bool) = CompareLE : r200_2, r200_4 +# 200| r200_6(glval) = VariableAddress[b] : +# 200| mu200_7(bool) = Store : &:r200_6, r200_5 +# 201| r201_1(glval) = VariableAddress[p] : +# 201| r201_2(int *) = Load : &:r201_1, ~mu193_3 +# 201| r201_3(glval) = VariableAddress[q] : +# 201| r201_4(int *) = Load : &:r201_3, ~mu193_3 +# 201| r201_5(bool) = CompareGE : r201_2, r201_4 +# 201| r201_6(glval) = VariableAddress[b] : +# 201| mu201_7(bool) = Store : &:r201_6, r201_5 +# 202| v202_1(void) = NoOp : +# 193| v193_12(void) = ReturnIndirection : &:r193_6, ~mu193_3 +# 193| v193_13(void) = ReturnIndirection : &:r193_10, ~mu193_3 +# 193| v193_14(void) = ReturnVoid : +# 193| v193_15(void) = UnmodeledUse : mu* +# 193| v193_16(void) = AliasedUse : ~mu193_3 +# 193| v193_17(void) = ExitFunction : # 204| void PointerCrement(int*) # 204| Block 0 -# 204| v204_1(void) = EnterFunction : -# 204| mu204_2(unknown) = AliasedDefinition : -# 204| mu204_3(unknown) = UnmodeledDefinition : -# 204| r204_4(glval) = VariableAddress[p] : -# 204| mu204_5(int *) = InitializeParameter[p] : &:r204_4 -# 205| r205_1(glval) = VariableAddress[q] : -# 205| mu205_2(int *) = Uninitialized[q] : &:r205_1 -# 207| r207_1(glval) = VariableAddress[p] : -# 207| r207_2(int *) = Load : &:r207_1, ~mu204_3 -# 207| r207_3(int) = Constant[1] : -# 207| r207_4(int *) = PointerAdd[4] : r207_2, r207_3 -# 207| mu207_5(int *) = Store : &:r207_1, r207_4 -# 207| r207_6(glval) = VariableAddress[q] : -# 207| mu207_7(int *) = Store : &:r207_6, r207_4 -# 208| r208_1(glval) = VariableAddress[p] : -# 208| r208_2(int *) = Load : &:r208_1, ~mu204_3 -# 208| r208_3(int) = Constant[1] : -# 208| r208_4(int *) = PointerSub[4] : r208_2, r208_3 -# 208| mu208_5(int *) = Store : &:r208_1, r208_4 -# 208| r208_6(glval) = VariableAddress[q] : -# 208| mu208_7(int *) = Store : &:r208_6, r208_4 -# 209| r209_1(glval) = VariableAddress[p] : -# 209| r209_2(int *) = Load : &:r209_1, ~mu204_3 -# 209| r209_3(int) = Constant[1] : -# 209| r209_4(int *) = PointerAdd[4] : r209_2, r209_3 -# 209| mu209_5(int *) = Store : &:r209_1, r209_4 -# 209| r209_6(glval) = VariableAddress[q] : -# 209| mu209_7(int *) = Store : &:r209_6, r209_2 -# 210| r210_1(glval) = VariableAddress[p] : -# 210| r210_2(int *) = Load : &:r210_1, ~mu204_3 -# 210| r210_3(int) = Constant[1] : -# 210| r210_4(int *) = PointerSub[4] : r210_2, r210_3 -# 210| mu210_5(int *) = Store : &:r210_1, r210_4 -# 210| r210_6(glval) = VariableAddress[q] : -# 210| mu210_7(int *) = Store : &:r210_6, r210_2 -# 211| v211_1(void) = NoOp : -# 204| v204_6(void) = ReturnVoid : -# 204| v204_7(void) = UnmodeledUse : mu* -# 204| v204_8(void) = AliasedUse : ~mu204_3 -# 204| v204_9(void) = ExitFunction : +# 204| v204_1(void) = EnterFunction : +# 204| mu204_2(unknown) = AliasedDefinition : +# 204| mu204_3(unknown) = UnmodeledDefinition : +# 204| r204_4(glval) = VariableAddress[p] : +# 204| mu204_5(int *) = InitializeParameter[p] : &:r204_4 +# 204| r204_6(int *) = Load : &:r204_4, ~mu204_5 +# 204| mu204_7(unknown) = InitializeIndirection[p] : &:r204_6 +# 205| r205_1(glval) = VariableAddress[q] : +# 205| mu205_2(int *) = Uninitialized[q] : &:r205_1 +# 207| r207_1(glval) = VariableAddress[p] : +# 207| r207_2(int *) = Load : &:r207_1, ~mu204_3 +# 207| r207_3(int) = Constant[1] : +# 207| r207_4(int *) = PointerAdd[4] : r207_2, r207_3 +# 207| mu207_5(int *) = Store : &:r207_1, r207_4 +# 207| r207_6(glval) = VariableAddress[q] : +# 207| mu207_7(int *) = Store : &:r207_6, r207_4 +# 208| r208_1(glval) = VariableAddress[p] : +# 208| r208_2(int *) = Load : &:r208_1, ~mu204_3 +# 208| r208_3(int) = Constant[1] : +# 208| r208_4(int *) = PointerSub[4] : r208_2, r208_3 +# 208| mu208_5(int *) = Store : &:r208_1, r208_4 +# 208| r208_6(glval) = VariableAddress[q] : +# 208| mu208_7(int *) = Store : &:r208_6, r208_4 +# 209| r209_1(glval) = VariableAddress[p] : +# 209| r209_2(int *) = Load : &:r209_1, ~mu204_3 +# 209| r209_3(int) = Constant[1] : +# 209| r209_4(int *) = PointerAdd[4] : r209_2, r209_3 +# 209| mu209_5(int *) = Store : &:r209_1, r209_4 +# 209| r209_6(glval) = VariableAddress[q] : +# 209| mu209_7(int *) = Store : &:r209_6, r209_2 +# 210| r210_1(glval) = VariableAddress[p] : +# 210| r210_2(int *) = Load : &:r210_1, ~mu204_3 +# 210| r210_3(int) = Constant[1] : +# 210| r210_4(int *) = PointerSub[4] : r210_2, r210_3 +# 210| mu210_5(int *) = Store : &:r210_1, r210_4 +# 210| r210_6(glval) = VariableAddress[q] : +# 210| mu210_7(int *) = Store : &:r210_6, r210_2 +# 211| v211_1(void) = NoOp : +# 204| v204_8(void) = ReturnIndirection : &:r204_6, ~mu204_3 +# 204| v204_9(void) = ReturnVoid : +# 204| v204_10(void) = UnmodeledUse : mu* +# 204| v204_11(void) = AliasedUse : ~mu204_3 +# 204| v204_12(void) = ExitFunction : # 213| void CompoundAssignment() # 213| Block 0 @@ -1610,6 +1628,8 @@ ir.cpp: # 341| mu341_3(unknown) = UnmodeledDefinition : # 341| r341_4(glval) = VariableAddress[p] : # 341| mu341_5(int *) = InitializeParameter[p] : &:r341_4 +# 341| r341_6(int *) = Load : &:r341_4, ~mu341_5 +# 341| mu341_7(unknown) = InitializeIndirection[p] : &:r341_6 # 342| r342_1(int) = Constant[1] : # 342| r342_2(glval) = VariableAddress[p] : # 342| r342_3(int *) = Load : &:r342_2, ~mu341_3 @@ -1620,11 +1640,12 @@ ir.cpp: # 343| r343_3(int *) = Load : &:r343_2, ~mu341_3 # 343| r343_4(int) = Load : &:r343_3, ~mu341_3 # 343| mu343_5(int) = Store : &:r343_1, r343_4 -# 341| r341_6(glval) = VariableAddress[#return] : -# 341| v341_7(void) = ReturnValue : &:r341_6, ~mu341_3 -# 341| v341_8(void) = UnmodeledUse : mu* -# 341| v341_9(void) = AliasedUse : ~mu341_3 -# 341| v341_10(void) = ExitFunction : +# 341| v341_8(void) = ReturnIndirection : &:r341_6, ~mu341_3 +# 341| r341_9(glval) = VariableAddress[#return] : +# 341| v341_10(void) = ReturnValue : &:r341_9, ~mu341_3 +# 341| v341_11(void) = UnmodeledUse : mu* +# 341| v341_12(void) = AliasedUse : ~mu341_3 +# 341| v341_13(void) = ExitFunction : # 348| int* AddressOf() # 348| Block 0 @@ -2310,27 +2331,27 @@ ir.cpp: # 493| r493_1(glval) = VariableAddress[a] : # 493| r493_2(bool) = Load : &:r493_1, ~mu492_3 # 493| v493_3(void) = ConditionalBranch : r493_2 -#-----| False -> Block 3 -#-----| True -> Block 2 +#-----| False -> Block 1 +#-----| True -> Block 3 + +# 493| Block 1 +# 493| r493_4(glval) = FunctionAddress[VoidFunc] : +# 493| v493_5(void) = Call : func:r493_4 +# 493| mu493_6(unknown) = ^CallSideEffect : ~mu492_3 +#-----| Goto -> Block 2 -# 494| Block 1 +# 494| Block 2 # 494| v494_1(void) = NoOp : # 492| v492_6(void) = ReturnVoid : # 492| v492_7(void) = UnmodeledUse : mu* # 492| v492_8(void) = AliasedUse : ~mu492_3 # 492| v492_9(void) = ExitFunction : -# 493| Block 2 -# 493| r493_4(glval) = FunctionAddress[VoidFunc] : -# 493| v493_5(void) = Call : func:r493_4 -# 493| mu493_6(unknown) = ^CallSideEffect : ~mu492_3 -#-----| Goto -> Block 1 - # 493| Block 3 # 493| r493_7(glval) = FunctionAddress[VoidFunc] : # 493| v493_8(void) = Call : func:r493_7 # 493| mu493_9(unknown) = ^CallSideEffect : ~mu492_3 -#-----| Goto -> Block 1 +#-----| Goto -> Block 2 # 496| void Nullptr() # 496| Block 0 @@ -2856,10 +2877,14 @@ ir.cpp: # 622| mu622_3(unknown) = UnmodeledDefinition : # 622| r622_4(glval) = VariableAddress[r] : # 622| mu622_5(String &) = InitializeParameter[r] : &:r622_4 -# 622| r622_6(glval) = VariableAddress[p] : -# 622| mu622_7(String *) = InitializeParameter[p] : &:r622_6 -# 622| r622_8(glval) = VariableAddress[s] : -# 622| mu622_9(String) = InitializeParameter[s] : &:r622_8 +# 622| r622_6(String &) = Load : &:r622_4, ~mu622_5 +# 622| mu622_7(unknown) = InitializeIndirection[r] : &:r622_6 +# 622| r622_8(glval) = VariableAddress[p] : +# 622| mu622_9(String *) = InitializeParameter[p] : &:r622_8 +# 622| r622_10(String *) = Load : &:r622_8, ~mu622_9 +# 622| mu622_11(unknown) = InitializeIndirection[p] : &:r622_10 +# 622| r622_12(glval) = VariableAddress[s] : +# 622| mu622_13(String) = InitializeParameter[s] : &:r622_12 # 623| r623_1(glval) = VariableAddress[r] : # 623| r623_2(String &) = Load : &:r623_1, ~mu622_3 # 623| r623_3(glval) = CopyValue : r623_2 @@ -2885,10 +2910,12 @@ ir.cpp: # 625| v625_6(void) = ^BufferReadSideEffect[-1] : &:r625_2, ~mu622_3 # 625| mu625_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r625_2 # 626| v626_1(void) = NoOp : -# 622| v622_10(void) = ReturnVoid : -# 622| v622_11(void) = UnmodeledUse : mu* -# 622| v622_12(void) = AliasedUse : ~mu622_3 -# 622| v622_13(void) = ExitFunction : +# 622| v622_14(void) = ReturnIndirection : &:r622_6, ~mu622_3 +# 622| v622_15(void) = ReturnIndirection : &:r622_10, ~mu622_3 +# 622| v622_16(void) = ReturnVoid : +# 622| v622_17(void) = UnmodeledUse : mu* +# 622| v622_18(void) = AliasedUse : ~mu622_3 +# 622| v622_19(void) = ExitFunction : # 630| int C::StaticMemberFunction(int) # 630| Block 0 @@ -2975,8 +3002,8 @@ ir.cpp: # 648| r648_4(int) = Load : &:r648_3, ~mu642_3 # 648| r648_5(glval) = VariableAddress[x] : # 648| mu648_6(int) = Store : &:r648_5, r648_4 -#-----| r0_130(C *) = CopyValue : r642_4 -# 649| r649_1(glval) = FieldAddress[m_a] : r0_130 +#-----| r0_134(C *) = CopyValue : r642_4 +# 649| r649_1(glval) = FieldAddress[m_a] : r0_134 # 649| r649_2(int) = Load : &:r649_1, ~mu642_3 # 649| r649_3(glval) = VariableAddress[x] : # 649| mu649_4(int) = Store : &:r649_3, r649_2 @@ -3007,13 +3034,13 @@ ir.cpp: # 654| mu654_6(unknown) = ^CallSideEffect : ~mu652_3 # 654| v654_7(void) = ^BufferReadSideEffect[-1] : &:r654_2, ~mu652_3 # 654| mu654_8(C) = ^IndirectMayWriteSideEffect[-1] : &:r654_2 -#-----| r0_88(C *) = CopyValue : r652_4 +#-----| r0_90(C *) = CopyValue : r652_4 # 655| r655_1(glval) = FunctionAddress[InstanceMemberFunction] : # 655| r655_2(int) = Constant[2] : -# 655| r655_3(int) = Call : func:r655_1, this:r0_88, 0:r655_2 +# 655| r655_3(int) = Call : func:r655_1, this:r0_90, 0:r655_2 # 655| mu655_4(unknown) = ^CallSideEffect : ~mu652_3 -#-----| v0_110(void) = ^BufferReadSideEffect[-1] : &:r0_88, ~mu652_3 -#-----| mu0_116(C) = ^IndirectMayWriteSideEffect[-1] : &:r0_88 +#-----| v0_110(void) = ^BufferReadSideEffect[-1] : &:r0_90, ~mu652_3 +#-----| mu0_115(C) = ^IndirectMayWriteSideEffect[-1] : &:r0_90 # 656| v656_1(void) = NoOp : # 652| v652_5(void) = ReturnVoid : # 652| v652_6(void) = UnmodeledUse : mu* @@ -3062,16 +3089,19 @@ ir.cpp: # 675| mu675_3(unknown) = UnmodeledDefinition : # 675| r675_4(glval) = VariableAddress[r] : # 675| mu675_5(int &) = InitializeParameter[r] : &:r675_4 +# 675| r675_6(int &) = Load : &:r675_4, ~mu675_5 +# 675| mu675_7(unknown) = InitializeIndirection[r] : &:r675_6 # 676| r676_1(glval) = VariableAddress[#return] : # 676| r676_2(glval) = VariableAddress[r] : # 676| r676_3(int &) = Load : &:r676_2, ~mu675_3 # 676| r676_4(int) = Load : &:r676_3, ~mu675_3 # 676| mu676_5(int) = Store : &:r676_1, r676_4 -# 675| r675_6(glval) = VariableAddress[#return] : -# 675| v675_7(void) = ReturnValue : &:r675_6, ~mu675_3 -# 675| v675_8(void) = UnmodeledUse : mu* -# 675| v675_9(void) = AliasedUse : ~mu675_3 -# 675| v675_10(void) = ExitFunction : +# 675| v675_8(void) = ReturnIndirection : &:r675_6, ~mu675_3 +# 675| r675_9(glval) = VariableAddress[#return] : +# 675| v675_10(void) = ReturnValue : &:r675_9, ~mu675_3 +# 675| v675_11(void) = UnmodeledUse : mu* +# 675| v675_12(void) = AliasedUse : ~mu675_3 +# 675| v675_13(void) = ExitFunction : # 679| int& TakeReference() # 679| Block 0 @@ -3245,16 +3275,19 @@ ir.cpp: # 715| mu715_3(unknown) = UnmodeledDefinition : # 715| r715_4(glval) = VariableAddress[x] : # 715| mu715_5(void *) = InitializeParameter[x] : &:r715_4 -# 715| r715_6(glval) = VariableAddress[y] : -# 715| mu715_7(char) = InitializeParameter[y] : &:r715_6 +# 715| r715_6(void *) = Load : &:r715_4, ~mu715_5 +# 715| mu715_7(unknown) = InitializeIndirection[x] : &:r715_6 +# 715| r715_8(glval) = VariableAddress[y] : +# 715| mu715_9(char) = InitializeParameter[y] : &:r715_8 # 716| r716_1(glval) = VariableAddress[#return] : # 716| r716_2(long) = Constant[0] : # 716| mu716_3(long) = Store : &:r716_1, r716_2 -# 715| r715_8(glval) = VariableAddress[#return] : -# 715| v715_9(void) = ReturnValue : &:r715_8, ~mu715_3 -# 715| v715_10(void) = UnmodeledUse : mu* -# 715| v715_11(void) = AliasedUse : ~mu715_3 -# 715| v715_12(void) = ExitFunction : +# 715| v715_10(void) = ReturnIndirection : &:r715_6, ~mu715_3 +# 715| r715_11(glval) = VariableAddress[#return] : +# 715| v715_12(void) = ReturnValue : &:r715_11, ~mu715_3 +# 715| v715_13(void) = UnmodeledUse : mu* +# 715| v715_14(void) = AliasedUse : ~mu715_3 +# 715| v715_15(void) = ExitFunction : # 720| double CallNestedTemplateFunc() # 720| Block 0 @@ -3363,6 +3396,8 @@ ir.cpp: # 735| Block 10 # 735| r735_2(glval) = VariableAddress[s] : # 735| mu735_3(char *) = InitializeParameter[s] : &:r735_2 +# 735| r735_4(char *) = Load : &:r735_2, ~mu735_3 +# 735| mu735_5(unknown) = InitializeIndirection[s] : &:r735_4 # 736| r736_1(glval) = VariableAddress[#throw736:5] : # 736| r736_2(glval) = FunctionAddress[String] : # 736| r736_3(glval) = VariableAddress[s] : @@ -3381,9 +3416,11 @@ ir.cpp: #-----| Goto -> Block 12 # 738| Block 12 -# 738| r738_2(glval) = VariableAddress[e] : -# 738| mu738_3(String &) = InitializeParameter[e] : &:r738_2 -# 738| v738_4(void) = NoOp : +# 738| r738_2(glval) = VariableAddress[e] : +# 738| mu738_3(String &) = InitializeParameter[e] : &:r738_2 +# 738| r738_4(String &) = Load : &:r738_2, ~mu738_3 +# 738| mu738_5(unknown) = InitializeIndirection[e] : &:r738_4 +# 738| v738_6(void) = NoOp : #-----| Goto -> Block 14 # 740| Block 13 @@ -3404,27 +3441,30 @@ ir.cpp: # 745| r745_7(glval) = InitializeThis : #-----| r0_1(glval) = VariableAddress[p#0] : #-----| mu0_8(Base &) = InitializeParameter[p#0] : &:r0_1 -#-----| r0_13(Base *) = CopyValue : r745_7 -#-----| r0_17(glval) = FieldAddress[base_s] : r0_13 -#-----| r0_27(String *) = CopyValue : r0_17 +#-----| r0_13(Base &) = Load : &:r0_1, ~mu0_8 +#-----| mu0_18(unknown) = InitializeIndirection[p#0] : &:r0_13 +#-----| r0_29(Base *) = CopyValue : r745_7 +#-----| r0_40(glval) = FieldAddress[base_s] : r0_29 +#-----| r0_48(String *) = CopyValue : r0_40 # 745| r745_12(glval) = FunctionAddress[operator=] : -#-----| r0_43(glval) = VariableAddress[p#0] : -#-----| r0_47(Base &) = Load : &:r0_43, ~mu745_5 -#-----| r0_50(glval) = CopyValue : r0_47 -#-----| r0_56(glval) = FieldAddress[base_s] : r0_50 -#-----| r0_62(String &) = CopyValue : r0_56 -# 745| r745_19(String &) = Call : func:r745_12, this:r0_27, 0:r0_62 -# 745| mu745_21(unknown) = ^CallSideEffect : ~mu745_5 -#-----| v0_75(void) = ^BufferReadSideEffect[-1] : &:r0_27, ~mu745_5 -#-----| v0_80(void) = ^BufferReadSideEffect[0] : &:r0_62, ~mu745_5 -#-----| mu0_88(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_27 -#-----| mu0_94(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_62 -#-----| r0_97(glval) = CopyValue : r745_19 -#-----| r0_100(glval) = VariableAddress[#return] : -#-----| r0_104(Base *) = CopyValue : r745_7 -#-----| r0_110(glval) = CopyValue : r0_104 -#-----| r0_116(Base &) = CopyValue : r0_110 -#-----| mu0_121(Base &) = Store : &:r0_100, r0_116 +#-----| r0_52(glval) = VariableAddress[p#0] : +#-----| r0_57(Base &) = Load : &:r0_52, ~mu745_5 +#-----| r0_62(glval) = CopyValue : r0_57 +#-----| r0_69(glval) = FieldAddress[base_s] : r0_62 +#-----| r0_74(String &) = CopyValue : r0_69 +# 745| r745_18(String &) = Call : func:r745_12, this:r0_48, 0:r0_74 +# 745| mu745_20(unknown) = ^CallSideEffect : ~mu745_5 +#-----| v0_90(void) = ^BufferReadSideEffect[-1] : &:r0_48, ~mu745_5 +#-----| v0_94(void) = ^BufferReadSideEffect[0] : &:r0_74, ~mu745_5 +#-----| mu0_99(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_48 +#-----| mu0_103(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_74 +#-----| r0_106(glval) = CopyValue : r745_18 +#-----| r0_110(glval) = VariableAddress[#return] : +#-----| r0_115(Base *) = CopyValue : r745_7 +#-----| r0_121(glval) = CopyValue : r0_115 +#-----| r0_126(Base &) = CopyValue : r0_121 +#-----| mu0_130(Base &) = Store : &:r0_110, r0_126 +#-----| v0_131(void) = ReturnIndirection : &:r0_13, ~mu745_5 # 745| r745_22(glval) = VariableAddress[#return] : # 745| v745_23(void) = ReturnValue : &:r745_22, ~mu745_5 # 745| v745_24(void) = UnmodeledUse : mu* @@ -3439,16 +3479,19 @@ ir.cpp: # 745| r745_7(glval) = InitializeThis : #-----| r0_1(glval) = VariableAddress[p#0] : #-----| mu0_8(Base &) = InitializeParameter[p#0] : &:r0_1 +#-----| r0_13(Base &) = Load : &:r0_1, ~mu0_8 +#-----| mu0_18(unknown) = InitializeIndirection[p#0] : &:r0_13 # 745| r745_9(glval) = FieldAddress[base_s] : r745_7 # 745| r745_10(glval) = FunctionAddress[String] : # 745| v745_11(void) = Call : func:r745_10, this:r745_9 # 745| mu745_12(unknown) = ^CallSideEffect : ~mu745_5 # 745| mu745_14(String) = ^IndirectMayWriteSideEffect[-1] : &:r745_9 # 745| v745_15(void) = NoOp : +#-----| v0_62(void) = ReturnIndirection : &:r0_13, ~mu745_5 # 745| v745_16(void) = ReturnVoid : # 745| v745_17(void) = UnmodeledUse : mu* # 745| v745_18(void) = AliasedUse : ~mu745_5 -# 745| v745_19(void) = ExitFunction : +# 745| v745_20(void) = ExitFunction : # 748| void Base::Base() # 748| Block 0 @@ -3491,44 +3534,47 @@ ir.cpp: # 754| r754_4(glval) = InitializeThis : #-----| r0_1(glval) = VariableAddress[p#0] : #-----| mu0_8(Middle &) = InitializeParameter[p#0] : &:r0_1 -#-----| r0_13(Middle *) = CopyValue : r754_4 -#-----| r0_17(Base *) = ConvertToNonVirtualBase[Middle : Base] : r0_13 +#-----| r0_13(Middle &) = Load : &:r0_1, ~mu0_8 +#-----| mu0_18(unknown) = InitializeIndirection[p#0] : &:r0_13 +#-----| r0_29(Middle *) = CopyValue : r754_4 +#-----| r0_40(Base *) = ConvertToNonVirtualBase[Middle : Base] : r0_29 # 754| r754_5(glval) = FunctionAddress[operator=] : -#-----| r0_36(glval) = VariableAddress[p#0] : -#-----| r0_43(Middle &) = Load : &:r0_36, ~mu754_3 -#-----| r0_47(glval) = CopyValue : r0_43 -#-----| r0_50(Middle *) = CopyValue : r0_47 -#-----| r0_56(Base *) = ConvertToNonVirtualBase[Middle : Base] : r0_50 -#-----| r0_62(glval) = CopyValue : r0_56 -#-----| r0_68(Base &) = CopyValue : r0_62 -# 754| r754_6(Base &) = Call : func:r754_5, this:r0_17, 0:r0_68 +#-----| r0_50(glval) = VariableAddress[p#0] : +#-----| r0_52(Middle &) = Load : &:r0_50, ~mu754_3 +#-----| r0_57(glval) = CopyValue : r0_52 +#-----| r0_62(Middle *) = CopyValue : r0_57 +#-----| r0_69(Base *) = ConvertToNonVirtualBase[Middle : Base] : r0_62 +#-----| r0_74(glval) = CopyValue : r0_69 +#-----| r0_82(Base &) = CopyValue : r0_74 +# 754| r754_6(Base &) = Call : func:r754_5, this:r0_40, 0:r0_82 # 754| mu754_7(unknown) = ^CallSideEffect : ~mu754_3 -#-----| v0_80(void) = ^BufferReadSideEffect[-1] : &:r0_17, ~mu754_3 -#-----| v0_88(void) = ^BufferReadSideEffect[0] : &:r0_68, ~mu754_3 -#-----| mu0_94(Base) = ^IndirectMayWriteSideEffect[-1] : &:r0_17 -#-----| mu0_97(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_68 -#-----| r0_100(glval) = CopyValue : r754_6 -#-----| r0_104(Middle *) = CopyValue : r754_4 -#-----| r0_110(glval) = FieldAddress[middle_s] : r0_104 -#-----| r0_116(String *) = CopyValue : r0_110 +#-----| v0_94(void) = ^BufferReadSideEffect[-1] : &:r0_40, ~mu754_3 +#-----| v0_99(void) = ^BufferReadSideEffect[0] : &:r0_82, ~mu754_3 +#-----| mu0_103(Base) = ^IndirectMayWriteSideEffect[-1] : &:r0_40 +#-----| mu0_106(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_82 +#-----| r0_110(glval) = CopyValue : r754_6 +#-----| r0_115(Middle *) = CopyValue : r754_4 +#-----| r0_121(glval) = FieldAddress[middle_s] : r0_115 +#-----| r0_126(String *) = CopyValue : r0_121 # 754| r754_8(glval) = FunctionAddress[operator=] : -#-----| r0_122(glval) = VariableAddress[p#0] : -#-----| r0_124(Middle &) = Load : &:r0_122, ~mu754_3 -#-----| r0_127(glval) = CopyValue : r0_124 -#-----| r0_130(glval) = FieldAddress[middle_s] : r0_127 -#-----| r0_133(String &) = CopyValue : r0_130 -# 754| r754_9(String &) = Call : func:r754_8, this:r0_116, 0:r0_133 +#-----| r0_131(glval) = VariableAddress[p#0] : +#-----| r0_134(Middle &) = Load : &:r0_131, ~mu754_3 +#-----| r0_138(glval) = CopyValue : r0_134 +#-----| r0_141(glval) = FieldAddress[middle_s] : r0_138 +#-----| r0_143(String &) = CopyValue : r0_141 +# 754| r754_9(String &) = Call : func:r754_8, this:r0_126, 0:r0_143 # 754| mu754_10(unknown) = ^CallSideEffect : ~mu754_3 -#-----| v0_135(void) = ^BufferReadSideEffect[-1] : &:r0_116, ~mu754_3 -#-----| v0_137(void) = ^BufferReadSideEffect[0] : &:r0_133, ~mu754_3 -#-----| mu0_139(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_116 -#-----| mu0_141(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_133 -#-----| r0_143(glval) = CopyValue : r754_9 -#-----| r0_145(glval) = VariableAddress[#return] : -#-----| r0_147(Middle *) = CopyValue : r754_4 -#-----| r0_150(glval) = CopyValue : r0_147 -#-----| r0_153(Middle &) = CopyValue : r0_150 -#-----| mu0_157(Middle &) = Store : &:r0_145, r0_153 +#-----| v0_145(void) = ^BufferReadSideEffect[-1] : &:r0_126, ~mu754_3 +#-----| v0_147(void) = ^BufferReadSideEffect[0] : &:r0_143, ~mu754_3 +#-----| mu0_149(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_126 +#-----| mu0_151(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_143 +#-----| r0_153(glval) = CopyValue : r754_9 +#-----| r0_155(glval) = VariableAddress[#return] : +#-----| r0_157(Middle *) = CopyValue : r754_4 +#-----| r0_161(glval) = CopyValue : r0_157 +#-----| r0_164(Middle &) = CopyValue : r0_161 +#-----| mu0_167(Middle &) = Store : &:r0_155, r0_164 +#-----| v0_170(void) = ReturnIndirection : &:r0_13, ~mu754_3 # 754| r754_11(glval) = VariableAddress[#return] : # 754| v754_12(void) = ReturnValue : &:r754_11, ~mu754_3 # 754| v754_13(void) = UnmodeledUse : mu* @@ -3585,44 +3631,47 @@ ir.cpp: # 763| r763_4(glval) = InitializeThis : #-----| r0_1(glval) = VariableAddress[p#0] : #-----| mu0_8(Derived &) = InitializeParameter[p#0] : &:r0_1 -#-----| r0_13(Derived *) = CopyValue : r763_4 -#-----| r0_17(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r0_13 +#-----| r0_13(Derived &) = Load : &:r0_1, ~mu0_8 +#-----| mu0_18(unknown) = InitializeIndirection[p#0] : &:r0_13 +#-----| r0_29(Derived *) = CopyValue : r763_4 +#-----| r0_40(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r0_29 # 763| r763_5(glval) = FunctionAddress[operator=] : -#-----| r0_36(glval) = VariableAddress[p#0] : -#-----| r0_43(Derived &) = Load : &:r0_36, ~mu763_3 -#-----| r0_47(glval) = CopyValue : r0_43 -#-----| r0_50(Derived *) = CopyValue : r0_47 -#-----| r0_56(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r0_50 -#-----| r0_62(glval) = CopyValue : r0_56 -#-----| r0_68(Middle &) = CopyValue : r0_62 -# 763| r763_6(Middle &) = Call : func:r763_5, this:r0_17, 0:r0_68 +#-----| r0_50(glval) = VariableAddress[p#0] : +#-----| r0_52(Derived &) = Load : &:r0_50, ~mu763_3 +#-----| r0_57(glval) = CopyValue : r0_52 +#-----| r0_62(Derived *) = CopyValue : r0_57 +#-----| r0_69(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r0_62 +#-----| r0_74(glval) = CopyValue : r0_69 +#-----| r0_82(Middle &) = CopyValue : r0_74 +# 763| r763_6(Middle &) = Call : func:r763_5, this:r0_40, 0:r0_82 # 763| mu763_7(unknown) = ^CallSideEffect : ~mu763_3 -#-----| v0_80(void) = ^BufferReadSideEffect[-1] : &:r0_17, ~mu763_3 -#-----| v0_88(void) = ^BufferReadSideEffect[0] : &:r0_68, ~mu763_3 -#-----| mu0_94(Middle) = ^IndirectMayWriteSideEffect[-1] : &:r0_17 -#-----| mu0_97(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_68 -#-----| r0_100(glval) = CopyValue : r763_6 -#-----| r0_104(Derived *) = CopyValue : r763_4 -#-----| r0_110(glval) = FieldAddress[derived_s] : r0_104 -#-----| r0_116(String *) = CopyValue : r0_110 +#-----| v0_94(void) = ^BufferReadSideEffect[-1] : &:r0_40, ~mu763_3 +#-----| v0_99(void) = ^BufferReadSideEffect[0] : &:r0_82, ~mu763_3 +#-----| mu0_103(Middle) = ^IndirectMayWriteSideEffect[-1] : &:r0_40 +#-----| mu0_106(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_82 +#-----| r0_110(glval) = CopyValue : r763_6 +#-----| r0_115(Derived *) = CopyValue : r763_4 +#-----| r0_121(glval) = FieldAddress[derived_s] : r0_115 +#-----| r0_126(String *) = CopyValue : r0_121 # 763| r763_8(glval) = FunctionAddress[operator=] : -#-----| r0_122(glval) = VariableAddress[p#0] : -#-----| r0_124(Derived &) = Load : &:r0_122, ~mu763_3 -#-----| r0_127(glval) = CopyValue : r0_124 -#-----| r0_130(glval) = FieldAddress[derived_s] : r0_127 -#-----| r0_133(String &) = CopyValue : r0_130 -# 763| r763_9(String &) = Call : func:r763_8, this:r0_116, 0:r0_133 +#-----| r0_131(glval) = VariableAddress[p#0] : +#-----| r0_134(Derived &) = Load : &:r0_131, ~mu763_3 +#-----| r0_138(glval) = CopyValue : r0_134 +#-----| r0_141(glval) = FieldAddress[derived_s] : r0_138 +#-----| r0_143(String &) = CopyValue : r0_141 +# 763| r763_9(String &) = Call : func:r763_8, this:r0_126, 0:r0_143 # 763| mu763_10(unknown) = ^CallSideEffect : ~mu763_3 -#-----| v0_135(void) = ^BufferReadSideEffect[-1] : &:r0_116, ~mu763_3 -#-----| v0_137(void) = ^BufferReadSideEffect[0] : &:r0_133, ~mu763_3 -#-----| mu0_139(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_116 -#-----| mu0_141(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_133 -#-----| r0_143(glval) = CopyValue : r763_9 -#-----| r0_145(glval) = VariableAddress[#return] : -#-----| r0_147(Derived *) = CopyValue : r763_4 -#-----| r0_150(glval) = CopyValue : r0_147 -#-----| r0_153(Derived &) = CopyValue : r0_150 -#-----| mu0_157(Derived &) = Store : &:r0_145, r0_153 +#-----| v0_145(void) = ^BufferReadSideEffect[-1] : &:r0_126, ~mu763_3 +#-----| v0_147(void) = ^BufferReadSideEffect[0] : &:r0_143, ~mu763_3 +#-----| mu0_149(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_126 +#-----| mu0_151(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_143 +#-----| r0_153(glval) = CopyValue : r763_9 +#-----| r0_155(glval) = VariableAddress[#return] : +#-----| r0_157(Derived *) = CopyValue : r763_4 +#-----| r0_161(glval) = CopyValue : r0_157 +#-----| r0_164(Derived &) = CopyValue : r0_161 +#-----| mu0_167(Derived &) = Store : &:r0_155, r0_164 +#-----| v0_170(void) = ReturnIndirection : &:r0_13, ~mu763_3 # 763| r763_11(glval) = VariableAddress[#return] : # 763| v763_12(void) = ReturnValue : &:r763_11, ~mu763_3 # 763| v763_13(void) = UnmodeledUse : mu* @@ -4162,8 +4211,8 @@ ir.cpp: # 850| mu850_2(PolymorphicBase) = Uninitialized[b] : &:r850_1 #-----| r0_8(glval) = FunctionAddress[PolymorphicBase] : #-----| v0_13(void) = Call : func:r0_8, this:r850_1 -#-----| mu0_17(unknown) = ^CallSideEffect : ~mu849_3 -#-----| mu0_27(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r850_1 +#-----| mu0_18(unknown) = ^CallSideEffect : ~mu849_3 +#-----| mu0_29(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r850_1 # 851| r851_1(glval) = VariableAddress[d] : # 851| mu851_2(PolymorphicDerived) = Uninitialized[d] : &:r851_1 # 851| r851_3(glval) = FunctionAddress[PolymorphicDerived] : @@ -4297,6 +4346,8 @@ ir.cpp: # 883| mu883_5(..(*)(..)) = InitializeParameter[pfn] : &:r883_4 # 883| r883_6(glval) = VariableAddress[p] : # 883| mu883_7(void *) = InitializeParameter[p] : &:r883_6 +# 883| r883_8(void *) = Load : &:r883_6, ~mu883_7 +# 883| mu883_9(unknown) = InitializeIndirection[p] : &:r883_8 # 884| r884_1(glval<..(*)(..)>) = VariableAddress[pfn] : # 884| r884_2(..(*)(..)) = Load : &:r884_1, ~mu883_3 # 884| r884_3(void *) = Convert : r884_2 @@ -4308,10 +4359,11 @@ ir.cpp: # 885| r885_4(glval<..(*)(..)>) = VariableAddress[pfn] : # 885| mu885_5(..(*)(..)) = Store : &:r885_4, r885_3 # 886| v886_1(void) = NoOp : -# 883| v883_8(void) = ReturnVoid : -# 883| v883_9(void) = UnmodeledUse : mu* -# 883| v883_10(void) = AliasedUse : ~mu883_3 -# 883| v883_11(void) = ExitFunction : +# 883| v883_10(void) = ReturnIndirection : &:r883_8, ~mu883_3 +# 883| v883_11(void) = ReturnVoid : +# 883| v883_12(void) = UnmodeledUse : mu* +# 883| v883_13(void) = AliasedUse : ~mu883_3 +# 883| v883_14(void) = ExitFunction : # 888| void VarArgUsage(int) # 888| Block 0 @@ -4765,8 +4817,10 @@ ir.cpp: # 987| mu987_3(unknown) = UnmodeledDefinition : # 987| r987_4(glval) = VariableAddress[a] : # 987| mu987_5(int *) = InitializeParameter[a] : &:r987_4 -# 987| r987_6(glval<..(*)(..)>) = VariableAddress[fn] : -# 987| mu987_7(..(*)(..)) = InitializeParameter[fn] : &:r987_6 +# 987| r987_6(int *) = Load : &:r987_4, ~mu987_5 +# 987| mu987_7(unknown) = InitializeIndirection[a] : &:r987_6 +# 987| r987_8(glval<..(*)(..)>) = VariableAddress[fn] : +# 987| mu987_9(..(*)(..)) = InitializeParameter[fn] : &:r987_8 # 988| r988_1(glval) = VariableAddress[#return] : # 988| r988_2(glval) = VariableAddress[a] : # 988| r988_3(int *) = Load : &:r988_2, ~mu987_3 @@ -4780,11 +4834,12 @@ ir.cpp: # 988| mu988_11(unknown) = ^CallSideEffect : ~mu987_3 # 988| r988_12(int) = Add : r988_6, r988_10 # 988| mu988_13(int) = Store : &:r988_1, r988_12 -# 987| r987_8(glval) = VariableAddress[#return] : -# 987| v987_9(void) = ReturnValue : &:r987_8, ~mu987_3 -# 987| v987_10(void) = UnmodeledUse : mu* -# 987| v987_11(void) = AliasedUse : ~mu987_3 -# 987| v987_12(void) = ExitFunction : +# 987| v987_10(void) = ReturnIndirection : &:r987_6, ~mu987_3 +# 987| r987_11(glval) = VariableAddress[#return] : +# 987| v987_12(void) = ReturnValue : &:r987_11, ~mu987_3 +# 987| v987_13(void) = UnmodeledUse : mu* +# 987| v987_14(void) = AliasedUse : ~mu987_3 +# 987| v987_15(void) = ExitFunction : # 991| int ExprStmt(int, int, int) # 991| Block 0 @@ -4929,27 +4984,29 @@ ir.cpp: # 1031| mu1031_5(int) = InitializeParameter[x] : &:r1031_4 # 1031| r1031_6(glval) = VariableAddress[s] : # 1031| mu1031_7(String &) = InitializeParameter[s] : &:r1031_6 -# 1032| r1032_15(glval) = VariableAddress[lambda_empty] : -# 1032| r1032_18(glval) = VariableAddress[#temp1032:23] : -# 1032| mu1032_21(decltype([...](...){...})) = Uninitialized[#temp1032:23] : &:r1032_18 -# 1032| r1032_24(decltype([...](...){...})) = Load : &:r1032_18, ~mu1031_3 -# 1032| mu1032_27(decltype([...](...){...})) = Store : &:r1032_15, r1032_24 +# 1031| r1031_8(String &) = Load : &:r1031_6, ~mu1031_7 +# 1031| mu1031_9(unknown) = InitializeIndirection[s] : &:r1031_8 +# 1032| r1032_19(glval) = VariableAddress[lambda_empty] : +# 1032| r1032_22(glval) = VariableAddress[#temp1032:23] : +# 1032| mu1032_25(decltype([...](...){...})) = Uninitialized[#temp1032:23] : &:r1032_22 +# 1032| r1032_28(decltype([...](...){...})) = Load : &:r1032_22, ~mu1031_3 +# 1032| mu1032_30(decltype([...](...){...})) = Store : &:r1032_19, r1032_28 # 1033| r1033_1(char) = Constant[65] : -# 1034| r1034_11(glval) = VariableAddress[lambda_ref] : -# 1034| r1034_13(glval) = VariableAddress[#temp1034:20] : -# 1034| mu1034_15(decltype([...](...){...})) = Uninitialized[#temp1034:20] : &:r1034_13 -# 1034| r1034_17(glval) = FieldAddress[s] : r1034_13 -#-----| r0_75(glval) = VariableAddress[s] : -#-----| r0_80(String &) = Load : &:r0_75, ~mu1031_3 -# 1034| r1034_18(glval) = CopyValue : r0_80 -# 1034| r1034_20(String &) = CopyValue : r1034_18 -# 1034| mu1034_22(String &) = Store : &:r1034_17, r1034_20 -# 1034| r1034_24(glval) = FieldAddress[x] : r1034_13 -#-----| r0_104(glval) = VariableAddress[x] : -#-----| r0_110(int &) = CopyValue : r0_104 -#-----| mu0_116(int &) = Store : &:r1034_24, r0_110 -# 1034| r1034_29(decltype([...](...){...})) = Load : &:r1034_13, ~mu1031_3 -# 1034| mu1034_31(decltype([...](...){...})) = Store : &:r1034_11, r1034_29 +# 1034| r1034_13(glval) = VariableAddress[lambda_ref] : +# 1034| r1034_15(glval) = VariableAddress[#temp1034:20] : +# 1034| mu1034_16(decltype([...](...){...})) = Uninitialized[#temp1034:20] : &:r1034_15 +# 1034| r1034_17(glval) = FieldAddress[s] : r1034_15 +#-----| r0_90(glval) = VariableAddress[s] : +#-----| r0_94(String &) = Load : &:r0_90, ~mu1031_3 +# 1034| r1034_20(glval) = CopyValue : r0_94 +# 1034| r1034_22(String &) = CopyValue : r1034_20 +# 1034| mu1034_24(String &) = Store : &:r1034_17, r1034_22 +# 1034| r1034_26(glval) = FieldAddress[x] : r1034_15 +#-----| r0_115(glval) = VariableAddress[x] : +#-----| r0_121(int &) = CopyValue : r0_115 +#-----| mu0_126(int &) = Store : &:r1034_26, r0_121 +# 1034| r1034_31(decltype([...](...){...})) = Load : &:r1034_15, ~mu1031_3 +# 1034| mu1034_32(decltype([...](...){...})) = Store : &:r1034_13, r1034_31 # 1035| r1035_1(glval) = VariableAddress[lambda_ref] : # 1035| r1035_2(glval) = Convert : r1035_1 # 1035| r1035_3(glval) = FunctionAddress[operator()] : @@ -4962,14 +5019,14 @@ ir.cpp: # 1036| r1036_32(glval) = VariableAddress[#temp1036:20] : # 1036| mu1036_33(decltype([...](...){...})) = Uninitialized[#temp1036:20] : &:r1036_32 # 1036| r1036_34(glval) = FieldAddress[s] : r1036_32 -#-----| r0_147(glval) = FunctionAddress[String] : -#-----| v0_150(void) = Call : func:r0_147, this:r1036_34 -#-----| mu0_153(unknown) = ^CallSideEffect : ~mu1031_3 -#-----| mu0_157(String) = ^IndirectMayWriteSideEffect[-1] : &:r1036_34 +#-----| r0_157(glval) = FunctionAddress[String] : +#-----| v0_161(void) = Call : func:r0_157, this:r1036_34 +#-----| mu0_164(unknown) = ^CallSideEffect : ~mu1031_3 +#-----| mu0_167(String) = ^IndirectMayWriteSideEffect[-1] : &:r1036_34 # 1036| r1036_35(glval) = FieldAddress[x] : r1036_32 -#-----| r0_160(glval) = VariableAddress[x] : -#-----| r0_161(int) = Load : &:r0_160, ~mu1031_3 -#-----| mu0_162(int) = Store : &:r1036_35, r0_161 +#-----| r0_172(glval) = VariableAddress[x] : +#-----| r0_173(int) = Load : &:r0_172, ~mu1031_3 +#-----| mu0_174(int) = Store : &:r1036_35, r0_173 # 1036| r1036_36(decltype([...](...){...})) = Load : &:r1036_32, ~mu1031_3 # 1036| mu1036_37(decltype([...](...){...})) = Store : &:r1036_31, r1036_36 # 1037| r1037_1(glval) = VariableAddress[lambda_val] : @@ -5003,10 +5060,10 @@ ir.cpp: # 1040| r1040_33(glval) = VariableAddress[#temp1040:29] : # 1040| mu1040_34(decltype([...](...){...})) = Uninitialized[#temp1040:29] : &:r1040_33 # 1040| r1040_35(glval) = FieldAddress[s] : r1040_33 -#-----| r0_163(glval) = FunctionAddress[String] : -#-----| v0_164(void) = Call : func:r0_163, this:r1040_35 -#-----| mu0_165(unknown) = ^CallSideEffect : ~mu1031_3 -#-----| mu0_166(String) = ^IndirectMayWriteSideEffect[-1] : &:r1040_35 +#-----| r0_175(glval) = FunctionAddress[String] : +#-----| v0_176(void) = Call : func:r0_175, this:r1040_35 +#-----| mu0_177(unknown) = ^CallSideEffect : ~mu1031_3 +#-----| mu0_178(String) = ^IndirectMayWriteSideEffect[-1] : &:r1040_35 # 1040| r1040_36(decltype([...](...){...})) = Load : &:r1040_33, ~mu1031_3 # 1040| mu1040_37(decltype([...](...){...})) = Store : &:r1040_32, r1040_36 # 1041| r1041_1(glval) = VariableAddress[lambda_val_explicit] : @@ -5080,10 +5137,11 @@ ir.cpp: # 1046| v1046_7(void) = ^BufferReadSideEffect[-1] : &:r1046_2, ~mu1031_3 # 1046| mu1046_8(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1046_2 # 1047| v1047_1(void) = NoOp : -# 1031| v1031_8(void) = ReturnVoid : -# 1031| v1031_9(void) = UnmodeledUse : mu* -# 1031| v1031_10(void) = AliasedUse : ~mu1031_3 -# 1031| v1031_11(void) = ExitFunction : +# 1031| v1031_10(void) = ReturnIndirection : &:r1031_8, ~mu1031_3 +# 1031| v1031_11(void) = ReturnVoid : +# 1031| v1031_12(void) = UnmodeledUse : mu* +# 1031| v1031_13(void) = AliasedUse : ~mu1031_3 +# 1031| v1031_14(void) = ExitFunction : # 1032| char (void Lambda(int, String const&))::(lambda [] type at line 1032, col. 23)::operator()(float) const # 1032| Block 0 @@ -5095,12 +5153,12 @@ ir.cpp: # 1032| mu1032_11(float) = InitializeParameter[f] : &:r1032_9 # 1032| r1032_13(glval) = VariableAddress[#return] : # 1032| r1032_15(char) = Constant[65] : -# 1032| mu1032_18(char) = Store : &:r1032_13, r1032_15 -# 1032| r1032_21(glval) = VariableAddress[#return] : -# 1032| v1032_24(void) = ReturnValue : &:r1032_21, ~mu1032_5 -# 1032| v1032_27(void) = UnmodeledUse : mu* -# 1032| v1032_30(void) = AliasedUse : ~mu1032_5 -# 1032| v1032_31(void) = ExitFunction : +# 1032| mu1032_17(char) = Store : &:r1032_13, r1032_15 +# 1032| r1032_19(glval) = VariableAddress[#return] : +# 1032| v1032_22(void) = ReturnValue : &:r1032_19, ~mu1032_5 +# 1032| v1032_25(void) = UnmodeledUse : mu* +# 1032| v1032_28(void) = AliasedUse : ~mu1032_5 +# 1032| v1032_30(void) = ExitFunction : # 1032| char(* (void Lambda(int, String const&))::(lambda [] type at line 1032, col. 23)::operator char (*)(float)() const)(float) # 1032| Block 0 @@ -5112,10 +5170,10 @@ ir.cpp: # 1032| r1032_11(..(*)(..)) = FunctionAddress[_FUN] : # 1032| mu1032_13(..(*)(..)) = Store : &:r1032_9, r1032_11 # 1032| r1032_15(glval<..(*)(..)>) = VariableAddress[#return] : -# 1032| v1032_18(void) = ReturnValue : &:r1032_15, ~mu1032_5 -# 1032| v1032_21(void) = UnmodeledUse : mu* -# 1032| v1032_24(void) = AliasedUse : ~mu1032_5 -# 1032| v1032_27(void) = ExitFunction : +# 1032| v1032_17(void) = ReturnValue : &:r1032_15, ~mu1032_5 +# 1032| v1032_19(void) = UnmodeledUse : mu* +# 1032| v1032_22(void) = AliasedUse : ~mu1032_5 +# 1032| v1032_25(void) = ExitFunction : # 1034| char (void Lambda(int, String const&))::(lambda [] type at line 1034, col. 21)::operator()(float) const # 1034| Block 0 @@ -5126,27 +5184,27 @@ ir.cpp: # 1034| r1034_5(glval) = VariableAddress[f] : # 1034| mu1034_6(float) = InitializeParameter[f] : &:r1034_5 # 1034| r1034_7(glval) = VariableAddress[#return] : -#-----| r0_17(lambda [] type at line 1034, col. 21 *) = CopyValue : r1034_4 -#-----| r0_27(glval) = FieldAddress[s] : r0_17 -#-----| r0_36(String &) = Load : &:r0_27, ~mu1034_3 -# 1034| r1034_8(glval) = CopyValue : r0_36 +#-----| r0_18(lambda [] type at line 1034, col. 21 *) = CopyValue : r1034_4 +#-----| r0_29(glval) = FieldAddress[s] : r0_18 +#-----| r0_40(String &) = Load : &:r0_29, ~mu1034_3 +# 1034| r1034_8(glval) = CopyValue : r0_40 # 1034| r1034_9(glval) = FunctionAddress[c_str] : # 1034| r1034_10(char *) = Call : func:r1034_9, this:r1034_8 # 1034| mu1034_11(unknown) = ^CallSideEffect : ~mu1034_3 -# 1034| v1034_13(void) = ^BufferReadSideEffect[-1] : &:r1034_8, ~mu1034_3 -# 1034| mu1034_15(String) = ^IndirectMayWriteSideEffect[-1] : &:r1034_8 -#-----| r0_71(lambda [] type at line 1034, col. 21 *) = CopyValue : r1034_4 -#-----| r0_75(glval) = FieldAddress[x] : r0_71 -#-----| r0_80(int &) = Load : &:r0_75, ~mu1034_3 -# 1034| r1034_18(int) = Load : &:r0_80, ~mu1034_3 -# 1034| r1034_20(glval) = PointerAdd[1] : r1034_10, r1034_18 -# 1034| r1034_22(char) = Load : &:r1034_20, ~mu1034_3 -# 1034| mu1034_24(char) = Store : &:r1034_7, r1034_22 -# 1034| r1034_26(glval) = VariableAddress[#return] : -# 1034| v1034_27(void) = ReturnValue : &:r1034_26, ~mu1034_3 +# 1034| v1034_12(void) = ^BufferReadSideEffect[-1] : &:r1034_8, ~mu1034_3 +# 1034| mu1034_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r1034_8 +#-----| r0_74(lambda [] type at line 1034, col. 21 *) = CopyValue : r1034_4 +#-----| r0_82(glval) = FieldAddress[x] : r0_74 +#-----| r0_87(int &) = Load : &:r0_82, ~mu1034_3 +# 1034| r1034_18(int) = Load : &:r0_87, ~mu1034_3 +# 1034| r1034_19(glval) = PointerAdd[1] : r1034_10, r1034_18 +# 1034| r1034_20(char) = Load : &:r1034_19, ~mu1034_3 +# 1034| mu1034_22(char) = Store : &:r1034_7, r1034_20 +# 1034| r1034_24(glval) = VariableAddress[#return] : +# 1034| v1034_26(void) = ReturnValue : &:r1034_24, ~mu1034_3 # 1034| v1034_28(void) = UnmodeledUse : mu* # 1034| v1034_29(void) = AliasedUse : ~mu1034_3 -# 1034| v1034_31(void) = ExitFunction : +# 1034| v1034_30(void) = ExitFunction : # 1036| void (void Lambda(int, String const&))::(lambda [] type at line 1036, col. 21)::~() # 1036| Block 0 @@ -5173,17 +5231,17 @@ ir.cpp: # 1036| r1036_9(glval) = VariableAddress[f] : # 1036| mu1036_10(float) = InitializeParameter[f] : &:r1036_9 # 1036| r1036_12(glval) = VariableAddress[#return] : -#-----| r0_17(lambda [] type at line 1036, col. 21 *) = CopyValue : r1036_7 -#-----| r0_27(glval) = FieldAddress[s] : r0_17 +#-----| r0_18(lambda [] type at line 1036, col. 21 *) = CopyValue : r1036_7 +#-----| r0_29(glval) = FieldAddress[s] : r0_18 # 1036| r1036_16(glval) = FunctionAddress[c_str] : -# 1036| r1036_18(char *) = Call : func:r1036_16, this:r0_27 +# 1036| r1036_18(char *) = Call : func:r1036_16, this:r0_29 # 1036| mu1036_20(unknown) = ^CallSideEffect : ~mu1036_5 -#-----| v0_50(void) = ^BufferReadSideEffect[-1] : &:r0_27, ~mu1036_5 -#-----| mu0_56(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_27 +#-----| v0_52(void) = ^BufferReadSideEffect[-1] : &:r0_29, ~mu1036_5 +#-----| mu0_57(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_29 #-----| r0_62(lambda [] type at line 1036, col. 21 *) = CopyValue : r1036_7 -#-----| r0_68(glval) = FieldAddress[x] : r0_62 -#-----| r0_71(int) = Load : &:r0_68, ~mu1036_5 -# 1036| r1036_23(glval) = PointerAdd[1] : r1036_18, r0_71 +#-----| r0_69(glval) = FieldAddress[x] : r0_62 +#-----| r0_74(int) = Load : &:r0_69, ~mu1036_5 +# 1036| r1036_23(glval) = PointerAdd[1] : r1036_18, r0_74 # 1036| r1036_24(char) = Load : &:r1036_23, ~mu1036_5 # 1036| mu1036_25(char) = Store : &:r1036_12, r1036_24 # 1036| r1036_26(glval) = VariableAddress[#return] : @@ -5201,10 +5259,10 @@ ir.cpp: # 1038| r1038_5(glval) = VariableAddress[f] : # 1038| mu1038_6(float) = InitializeParameter[f] : &:r1038_5 # 1038| r1038_7(glval) = VariableAddress[#return] : -#-----| r0_17(lambda [] type at line 1038, col. 30 *) = CopyValue : r1038_4 -#-----| r0_27(glval) = FieldAddress[s] : r0_17 -#-----| r0_36(String &) = Load : &:r0_27, ~mu1038_3 -# 1038| r1038_8(glval) = CopyValue : r0_36 +#-----| r0_18(lambda [] type at line 1038, col. 30 *) = CopyValue : r1038_4 +#-----| r0_29(glval) = FieldAddress[s] : r0_18 +#-----| r0_40(String &) = Load : &:r0_29, ~mu1038_3 +# 1038| r1038_8(glval) = CopyValue : r0_40 # 1038| r1038_9(glval) = FunctionAddress[c_str] : # 1038| r1038_10(char *) = Call : func:r1038_9, this:r1038_8 # 1038| mu1038_11(unknown) = ^CallSideEffect : ~mu1038_3 @@ -5245,13 +5303,13 @@ ir.cpp: # 1040| r1040_9(glval) = VariableAddress[f] : # 1040| mu1040_10(float) = InitializeParameter[f] : &:r1040_9 # 1040| r1040_12(glval) = VariableAddress[#return] : -#-----| r0_17(lambda [] type at line 1040, col. 30 *) = CopyValue : r1040_7 -#-----| r0_27(glval) = FieldAddress[s] : r0_17 +#-----| r0_18(lambda [] type at line 1040, col. 30 *) = CopyValue : r1040_7 +#-----| r0_29(glval) = FieldAddress[s] : r0_18 # 1040| r1040_16(glval) = FunctionAddress[c_str] : -# 1040| r1040_18(char *) = Call : func:r1040_16, this:r0_27 +# 1040| r1040_18(char *) = Call : func:r1040_16, this:r0_29 # 1040| mu1040_20(unknown) = ^CallSideEffect : ~mu1040_5 -#-----| v0_50(void) = ^BufferReadSideEffect[-1] : &:r0_27, ~mu1040_5 -#-----| mu0_56(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_27 +#-----| v0_52(void) = ^BufferReadSideEffect[-1] : &:r0_29, ~mu1040_5 +#-----| mu0_57(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_29 # 1040| r1040_23(int) = Constant[0] : # 1040| r1040_24(glval) = PointerAdd[1] : r1040_18, r1040_23 # 1040| r1040_25(char) = Load : &:r1040_24, ~mu1040_5 @@ -5271,19 +5329,19 @@ ir.cpp: # 1042| r1042_5(glval) = VariableAddress[f] : # 1042| mu1042_6(float) = InitializeParameter[f] : &:r1042_5 # 1042| r1042_7(glval) = VariableAddress[#return] : -#-----| r0_17(lambda [] type at line 1042, col. 32 *) = CopyValue : r1042_4 -#-----| r0_27(glval) = FieldAddress[s] : r0_17 -#-----| r0_36(String &) = Load : &:r0_27, ~mu1042_3 -# 1042| r1042_8(glval) = CopyValue : r0_36 +#-----| r0_18(lambda [] type at line 1042, col. 32 *) = CopyValue : r1042_4 +#-----| r0_29(glval) = FieldAddress[s] : r0_18 +#-----| r0_40(String &) = Load : &:r0_29, ~mu1042_3 +# 1042| r1042_8(glval) = CopyValue : r0_40 # 1042| r1042_9(glval) = FunctionAddress[c_str] : # 1042| r1042_10(char *) = Call : func:r1042_9, this:r1042_8 # 1042| mu1042_11(unknown) = ^CallSideEffect : ~mu1042_3 # 1042| v1042_12(void) = ^BufferReadSideEffect[-1] : &:r1042_8, ~mu1042_3 # 1042| mu1042_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r1042_8 -#-----| r0_71(lambda [] type at line 1042, col. 32 *) = CopyValue : r1042_4 -#-----| r0_75(glval) = FieldAddress[x] : r0_71 -#-----| r0_80(int) = Load : &:r0_75, ~mu1042_3 -# 1042| r1042_14(glval) = PointerAdd[1] : r1042_10, r0_80 +#-----| r0_74(lambda [] type at line 1042, col. 32 *) = CopyValue : r1042_4 +#-----| r0_82(glval) = FieldAddress[x] : r0_74 +#-----| r0_87(int) = Load : &:r0_82, ~mu1042_3 +# 1042| r1042_14(glval) = PointerAdd[1] : r1042_10, r0_87 # 1042| r1042_15(char) = Load : &:r1042_14, ~mu1042_3 # 1042| mu1042_16(char) = Store : &:r1042_7, r1042_15 # 1042| r1042_17(glval) = VariableAddress[#return] : @@ -5301,24 +5359,24 @@ ir.cpp: # 1045| r1045_5(glval) = VariableAddress[f] : # 1045| mu1045_6(float) = InitializeParameter[f] : &:r1045_5 # 1045| r1045_7(glval) = VariableAddress[#return] : -#-----| r0_17(lambda [] type at line 1045, col. 23 *) = CopyValue : r1045_4 -#-----| r0_27(glval) = FieldAddress[s] : r0_17 -#-----| r0_36(String &) = Load : &:r0_27, ~mu1045_3 -# 1045| r1045_8(glval) = CopyValue : r0_36 +#-----| r0_18(lambda [] type at line 1045, col. 23 *) = CopyValue : r1045_4 +#-----| r0_29(glval) = FieldAddress[s] : r0_18 +#-----| r0_40(String &) = Load : &:r0_29, ~mu1045_3 +# 1045| r1045_8(glval) = CopyValue : r0_40 # 1045| r1045_9(glval) = FunctionAddress[c_str] : # 1045| r1045_10(char *) = Call : func:r1045_9, this:r1045_8 # 1045| mu1045_11(unknown) = ^CallSideEffect : ~mu1045_3 # 1045| v1045_12(void) = ^BufferReadSideEffect[-1] : &:r1045_8, ~mu1045_3 # 1045| mu1045_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r1045_8 -#-----| r0_71(lambda [] type at line 1045, col. 23 *) = CopyValue : r1045_4 -#-----| r0_75(glval) = FieldAddress[x] : r0_71 -#-----| r0_80(int) = Load : &:r0_75, ~mu1045_3 -#-----| r0_88(lambda [] type at line 1045, col. 23 *) = CopyValue : r1045_4 -# 1045| r1045_14(glval) = FieldAddress[i] : r0_88 +#-----| r0_74(lambda [] type at line 1045, col. 23 *) = CopyValue : r1045_4 +#-----| r0_82(glval) = FieldAddress[x] : r0_74 +#-----| r0_87(int) = Load : &:r0_82, ~mu1045_3 +#-----| r0_90(lambda [] type at line 1045, col. 23 *) = CopyValue : r1045_4 +# 1045| r1045_14(glval) = FieldAddress[i] : r0_90 # 1045| r1045_15(int) = Load : &:r1045_14, ~mu1045_3 -# 1045| r1045_16(int) = Add : r0_80, r1045_15 -#-----| r0_104(lambda [] type at line 1045, col. 23 *) = CopyValue : r1045_4 -# 1045| r1045_17(glval) = FieldAddress[j] : r0_104 +# 1045| r1045_16(int) = Add : r0_87, r1045_15 +#-----| r0_106(lambda [] type at line 1045, col. 23 *) = CopyValue : r1045_4 +# 1045| r1045_17(glval) = FieldAddress[j] : r0_106 # 1045| r1045_18(int &) = Load : &:r1045_17, ~mu1045_3 # 1045| r1045_19(int) = Load : &:r1045_18, ~mu1045_3 # 1045| r1045_20(int) = Sub : r1045_16, r1045_19 @@ -5338,6 +5396,8 @@ ir.cpp: # 1068| mu1068_3(unknown) = UnmodeledDefinition : # 1068| r1068_4(glval &>) = VariableAddress[v] : # 1068| mu1068_5(vector &) = InitializeParameter[v] : &:r1068_4 +# 1068| r1068_6(vector &) = Load : &:r1068_4, ~mu1068_5 +# 1068| mu1068_7(unknown) = InitializeIndirection[v] : &:r1068_6 # 1069| r1069_1(glval &>) = VariableAddress[(__range)] : # 1069| r1069_2(glval &>) = VariableAddress[v] : # 1069| r1069_3(vector &) = Load : &:r1069_2, ~mu1068_3 @@ -5345,60 +5405,60 @@ ir.cpp: # 1069| r1069_5(vector &) = CopyValue : r1069_4 # 1069| mu1069_6(vector &) = Store : &:r1069_1, r1069_5 # 1069| r1069_7(glval) = VariableAddress[(__begin)] : -#-----| r0_50(glval &>) = VariableAddress[(__range)] : -#-----| r0_56(vector &) = Load : &:r0_50, ~mu1068_3 -#-----| r0_62(glval>) = CopyValue : r0_56 +#-----| r0_62(glval &>) = VariableAddress[(__range)] : +#-----| r0_69(vector &) = Load : &:r0_62, ~mu1068_3 +#-----| r0_74(glval>) = CopyValue : r0_69 # 1069| r1069_8(glval) = FunctionAddress[begin] : -# 1069| r1069_9(iterator) = Call : func:r1069_8, this:r0_62 +# 1069| r1069_9(iterator) = Call : func:r1069_8, this:r0_74 # 1069| mu1069_10(unknown) = ^CallSideEffect : ~mu1068_3 -#-----| v0_80(void) = ^BufferReadSideEffect[-1] : &:r0_62, ~mu1068_3 -#-----| mu0_88(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_62 +#-----| v0_94(void) = ^BufferReadSideEffect[-1] : &:r0_74, ~mu1068_3 +#-----| mu0_99(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_74 # 1069| mu1069_11(iterator) = Store : &:r1069_7, r1069_9 # 1069| r1069_12(glval) = VariableAddress[(__end)] : -#-----| r0_100(glval &>) = VariableAddress[(__range)] : -#-----| r0_104(vector &) = Load : &:r0_100, ~mu1068_3 -#-----| r0_110(glval>) = CopyValue : r0_104 +#-----| r0_110(glval &>) = VariableAddress[(__range)] : +#-----| r0_115(vector &) = Load : &:r0_110, ~mu1068_3 +#-----| r0_121(glval>) = CopyValue : r0_115 # 1069| r1069_13(glval) = FunctionAddress[end] : -# 1069| r1069_14(iterator) = Call : func:r1069_13, this:r0_110 +# 1069| r1069_14(iterator) = Call : func:r1069_13, this:r0_121 # 1069| mu1069_15(unknown) = ^CallSideEffect : ~mu1068_3 -#-----| v0_124(void) = ^BufferReadSideEffect[-1] : &:r0_110, ~mu1068_3 -#-----| mu0_127(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_110 +#-----| v0_134(void) = ^BufferReadSideEffect[-1] : &:r0_121, ~mu1068_3 +#-----| mu0_138(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_121 # 1069| mu1069_16(iterator) = Store : &:r1069_12, r1069_14 #-----| Goto -> Block 6 #-----| Block 1 -#-----| r0_167(glval) = VariableAddress[(__begin)] : -#-----| r0_168(glval) = Convert : r0_167 +#-----| r0_179(glval) = VariableAddress[(__begin)] : +#-----| r0_180(glval) = Convert : r0_179 # 1075| r1075_1(glval) = FunctionAddress[operator!=] : -#-----| r0_169(glval) = VariableAddress[(__end)] : -#-----| r0_170(iterator) = Load : &:r0_169, ~mu1068_3 -# 1075| r1075_2(bool) = Call : func:r1075_1, this:r0_168, 0:r0_170 +#-----| r0_181(glval) = VariableAddress[(__end)] : +#-----| r0_182(iterator) = Load : &:r0_181, ~mu1068_3 +# 1075| r1075_2(bool) = Call : func:r1075_1, this:r0_180, 0:r0_182 # 1075| mu1075_3(unknown) = ^CallSideEffect : ~mu1068_3 -#-----| v0_171(void) = ^BufferReadSideEffect[-1] : &:r0_168, ~mu1068_3 -#-----| mu0_172(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_168 +#-----| v0_183(void) = ^BufferReadSideEffect[-1] : &:r0_180, ~mu1068_3 +#-----| mu0_184(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_180 # 1075| v1075_4(void) = ConditionalBranch : r1075_2 #-----| False -> Block 5 #-----| True -> Block 3 #-----| Block 2 -#-----| r0_173(glval) = VariableAddress[(__begin)] : +#-----| r0_185(glval) = VariableAddress[(__begin)] : # 1075| r1075_5(glval) = FunctionAddress[operator++] : -# 1075| r1075_6(iterator &) = Call : func:r1075_5, this:r0_173 +# 1075| r1075_6(iterator &) = Call : func:r1075_5, this:r0_185 # 1075| mu1075_7(unknown) = ^CallSideEffect : ~mu1068_3 -#-----| v0_174(void) = ^BufferReadSideEffect[-1] : &:r0_173, ~mu1068_3 -#-----| mu0_175(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_173 +#-----| v0_186(void) = ^BufferReadSideEffect[-1] : &:r0_185, ~mu1068_3 +#-----| mu0_187(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_185 # 1075| r1075_8(glval) = CopyValue : r1075_6 #-----| Goto (back edge) -> Block 1 # 1075| Block 3 # 1075| r1075_9(glval) = VariableAddress[e] : -#-----| r0_176(glval) = VariableAddress[(__begin)] : -#-----| r0_177(glval) = Convert : r0_176 +#-----| r0_188(glval) = VariableAddress[(__begin)] : +#-----| r0_189(glval) = Convert : r0_188 # 1075| r1075_10(glval) = FunctionAddress[operator*] : -# 1075| r1075_11(int &) = Call : func:r1075_10, this:r0_177 +# 1075| r1075_11(int &) = Call : func:r1075_10, this:r0_189 # 1075| mu1075_12(unknown) = ^CallSideEffect : ~mu1068_3 -#-----| v0_178(void) = ^BufferReadSideEffect[-1] : &:r0_177, ~mu1068_3 -#-----| mu0_179(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_177 +#-----| v0_190(void) = ^BufferReadSideEffect[-1] : &:r0_189, ~mu1068_3 +#-----| mu0_191(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_189 # 1075| r1075_13(glval) = CopyValue : r1075_11 # 1075| r1075_14(glval) = Convert : r1075_13 # 1075| r1075_15(int &) = CopyValue : r1075_14 @@ -5417,36 +5477,37 @@ ir.cpp: #-----| Goto -> Block 5 # 1079| Block 5 -# 1079| v1079_1(void) = NoOp : -# 1080| v1080_1(void) = NoOp : -# 1068| v1068_6(void) = ReturnVoid : -# 1068| v1068_7(void) = UnmodeledUse : mu* -# 1068| v1068_8(void) = AliasedUse : ~mu1068_3 -# 1068| v1068_9(void) = ExitFunction : +# 1079| v1079_1(void) = NoOp : +# 1080| v1080_1(void) = NoOp : +# 1068| v1068_8(void) = ReturnIndirection : &:r1068_6, ~mu1068_3 +# 1068| v1068_9(void) = ReturnVoid : +# 1068| v1068_10(void) = UnmodeledUse : mu* +# 1068| v1068_11(void) = AliasedUse : ~mu1068_3 +# 1068| v1068_12(void) = ExitFunction : #-----| Block 6 -#-----| r0_180(glval) = VariableAddress[(__begin)] : -#-----| r0_181(glval) = Convert : r0_180 +#-----| r0_192(glval) = VariableAddress[(__begin)] : +#-----| r0_193(glval) = Convert : r0_192 # 1069| r1069_17(glval) = FunctionAddress[operator!=] : -#-----| r0_182(glval) = VariableAddress[(__end)] : -#-----| r0_183(iterator) = Load : &:r0_182, ~mu1068_3 -# 1069| r1069_18(bool) = Call : func:r1069_17, this:r0_181, 0:r0_183 +#-----| r0_194(glval) = VariableAddress[(__end)] : +#-----| r0_195(iterator) = Load : &:r0_194, ~mu1068_3 +# 1069| r1069_18(bool) = Call : func:r1069_17, this:r0_193, 0:r0_195 # 1069| mu1069_19(unknown) = ^CallSideEffect : ~mu1068_3 -#-----| v0_184(void) = ^BufferReadSideEffect[-1] : &:r0_181, ~mu1068_3 -#-----| mu0_185(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_181 +#-----| v0_196(void) = ^BufferReadSideEffect[-1] : &:r0_193, ~mu1068_3 +#-----| mu0_197(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_193 # 1069| v1069_20(void) = ConditionalBranch : r1069_18 #-----| False -> Block 10 #-----| True -> Block 7 # 1069| Block 7 # 1069| r1069_21(glval) = VariableAddress[e] : -#-----| r0_186(glval) = VariableAddress[(__begin)] : -#-----| r0_187(glval) = Convert : r0_186 +#-----| r0_198(glval) = VariableAddress[(__begin)] : +#-----| r0_199(glval) = Convert : r0_198 # 1069| r1069_22(glval) = FunctionAddress[operator*] : -# 1069| r1069_23(int &) = Call : func:r1069_22, this:r0_187 +# 1069| r1069_23(int &) = Call : func:r1069_22, this:r0_199 # 1069| mu1069_24(unknown) = ^CallSideEffect : ~mu1068_3 -#-----| v0_188(void) = ^BufferReadSideEffect[-1] : &:r0_187, ~mu1068_3 -#-----| mu0_189(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_187 +#-----| v0_200(void) = ^BufferReadSideEffect[-1] : &:r0_199, ~mu1068_3 +#-----| mu0_201(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_199 # 1069| r1069_25(int) = Load : &:r1069_23, ~mu1068_3 # 1069| mu1069_26(int) = Store : &:r1069_21, r1069_25 # 1070| r1070_1(glval) = VariableAddress[e] : @@ -5463,12 +5524,12 @@ ir.cpp: # 1069| Block 9 # 1069| v1069_27(void) = NoOp : -#-----| r0_190(glval) = VariableAddress[(__begin)] : +#-----| r0_202(glval) = VariableAddress[(__begin)] : # 1069| r1069_28(glval) = FunctionAddress[operator++] : -# 1069| r1069_29(iterator &) = Call : func:r1069_28, this:r0_190 +# 1069| r1069_29(iterator &) = Call : func:r1069_28, this:r0_202 # 1069| mu1069_30(unknown) = ^CallSideEffect : ~mu1068_3 -#-----| v0_191(void) = ^BufferReadSideEffect[-1] : &:r0_190, ~mu1068_3 -#-----| mu0_192(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_190 +#-----| v0_203(void) = ^BufferReadSideEffect[-1] : &:r0_202, ~mu1068_3 +#-----| mu0_204(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_202 # 1069| r1069_31(glval) = CopyValue : r1069_29 #-----| Goto (back edge) -> Block 6 @@ -5480,24 +5541,24 @@ ir.cpp: # 1075| r1075_21(vector &) = CopyValue : r1075_20 # 1075| mu1075_22(vector &) = Store : &:r1075_17, r1075_21 # 1075| r1075_23(glval) = VariableAddress[(__begin)] : -#-----| r0_193(glval &>) = VariableAddress[(__range)] : -#-----| r0_194(vector &) = Load : &:r0_193, ~mu1068_3 -#-----| r0_195(glval>) = CopyValue : r0_194 +#-----| r0_205(glval &>) = VariableAddress[(__range)] : +#-----| r0_206(vector &) = Load : &:r0_205, ~mu1068_3 +#-----| r0_207(glval>) = CopyValue : r0_206 # 1075| r1075_24(glval) = FunctionAddress[begin] : -# 1075| r1075_25(iterator) = Call : func:r1075_24, this:r0_195 +# 1075| r1075_25(iterator) = Call : func:r1075_24, this:r0_207 # 1075| mu1075_26(unknown) = ^CallSideEffect : ~mu1068_3 -#-----| v0_196(void) = ^BufferReadSideEffect[-1] : &:r0_195, ~mu1068_3 -#-----| mu0_197(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_195 +#-----| v0_208(void) = ^BufferReadSideEffect[-1] : &:r0_207, ~mu1068_3 +#-----| mu0_209(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_207 # 1075| mu1075_27(iterator) = Store : &:r1075_23, r1075_25 # 1075| r1075_28(glval) = VariableAddress[(__end)] : -#-----| r0_198(glval &>) = VariableAddress[(__range)] : -#-----| r0_199(vector &) = Load : &:r0_198, ~mu1068_3 -#-----| r0_200(glval>) = CopyValue : r0_199 +#-----| r0_210(glval &>) = VariableAddress[(__range)] : +#-----| r0_211(vector &) = Load : &:r0_210, ~mu1068_3 +#-----| r0_212(glval>) = CopyValue : r0_211 # 1075| r1075_29(glval) = FunctionAddress[end] : -# 1075| r1075_30(iterator) = Call : func:r1075_29, this:r0_200 +# 1075| r1075_30(iterator) = Call : func:r1075_29, this:r0_212 # 1075| mu1075_31(unknown) = ^CallSideEffect : ~mu1068_3 -#-----| v0_201(void) = ^BufferReadSideEffect[-1] : &:r0_200, ~mu1068_3 -#-----| mu0_202(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_200 +#-----| v0_213(void) = ^BufferReadSideEffect[-1] : &:r0_212, ~mu1068_3 +#-----| mu0_214(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_212 # 1075| mu1075_32(iterator) = Store : &:r1075_28, r1075_30 #-----| Goto -> Block 1 @@ -5521,32 +5582,38 @@ ir.cpp: # 1104| void AsmStmtWithOutputs(unsigned int&, unsigned int, unsigned int&, unsigned int) # 1104| Block 0 -# 1104| v1104_1(void) = EnterFunction : -# 1104| mu1104_2(unknown) = AliasedDefinition : -# 1104| mu1104_3(unknown) = UnmodeledDefinition : -# 1104| r1104_4(glval) = VariableAddress[a] : -# 1104| mu1104_5(unsigned int &) = InitializeParameter[a] : &:r1104_4 -# 1104| r1104_6(glval) = VariableAddress[b] : -# 1104| mu1104_7(unsigned int) = InitializeParameter[b] : &:r1104_6 -# 1104| r1104_8(glval) = VariableAddress[c] : -# 1104| mu1104_9(unsigned int &) = InitializeParameter[c] : &:r1104_8 -# 1104| r1104_10(glval) = VariableAddress[d] : -# 1104| mu1104_11(unsigned int) = InitializeParameter[d] : &:r1104_10 -# 1109| r1109_1(glval) = VariableAddress[a] : -# 1109| r1109_2(unsigned int &) = Load : &:r1109_1, ~mu1104_3 -# 1109| r1109_3(glval) = CopyValue : r1109_2 -# 1109| r1109_4(glval) = VariableAddress[b] : -# 1109| r1109_5(glval) = VariableAddress[c] : -# 1109| r1109_6(unsigned int &) = Load : &:r1109_5, ~mu1104_3 -# 1109| r1109_7(unsigned int) = Load : &:r1109_6, ~mu1104_3 -# 1109| r1109_8(glval) = VariableAddress[d] : -# 1109| r1109_9(unsigned int) = Load : &:r1109_8, ~mu1104_3 -# 1106| mu1106_1(unknown) = InlineAsm : ~mu1104_3, 0:r1109_3, 1:r1109_4, 2:r1109_7, 3:r1109_9 -# 1111| v1111_1(void) = NoOp : -# 1104| v1104_12(void) = ReturnVoid : -# 1104| v1104_13(void) = UnmodeledUse : mu* -# 1104| v1104_14(void) = AliasedUse : ~mu1104_3 -# 1104| v1104_15(void) = ExitFunction : +# 1104| v1104_1(void) = EnterFunction : +# 1104| mu1104_2(unknown) = AliasedDefinition : +# 1104| mu1104_3(unknown) = UnmodeledDefinition : +# 1104| r1104_4(glval) = VariableAddress[a] : +# 1104| mu1104_5(unsigned int &) = InitializeParameter[a] : &:r1104_4 +# 1104| r1104_6(unsigned int &) = Load : &:r1104_4, ~mu1104_5 +# 1104| mu1104_7(unknown) = InitializeIndirection[a] : &:r1104_6 +# 1104| r1104_8(glval) = VariableAddress[b] : +# 1104| mu1104_9(unsigned int) = InitializeParameter[b] : &:r1104_8 +# 1104| r1104_10(glval) = VariableAddress[c] : +# 1104| mu1104_11(unsigned int &) = InitializeParameter[c] : &:r1104_10 +# 1104| r1104_12(unsigned int &) = Load : &:r1104_10, ~mu1104_11 +# 1104| mu1104_13(unknown) = InitializeIndirection[c] : &:r1104_12 +# 1104| r1104_14(glval) = VariableAddress[d] : +# 1104| mu1104_15(unsigned int) = InitializeParameter[d] : &:r1104_14 +# 1109| r1109_1(glval) = VariableAddress[a] : +# 1109| r1109_2(unsigned int &) = Load : &:r1109_1, ~mu1104_3 +# 1109| r1109_3(glval) = CopyValue : r1109_2 +# 1109| r1109_4(glval) = VariableAddress[b] : +# 1109| r1109_5(glval) = VariableAddress[c] : +# 1109| r1109_6(unsigned int &) = Load : &:r1109_5, ~mu1104_3 +# 1109| r1109_7(unsigned int) = Load : &:r1109_6, ~mu1104_3 +# 1109| r1109_8(glval) = VariableAddress[d] : +# 1109| r1109_9(unsigned int) = Load : &:r1109_8, ~mu1104_3 +# 1106| mu1106_1(unknown) = InlineAsm : ~mu1104_3, 0:r1109_3, 1:r1109_4, 2:r1109_7, 3:r1109_9 +# 1111| v1111_1(void) = NoOp : +# 1104| v1104_16(void) = ReturnIndirection : &:r1104_6, ~mu1104_3 +# 1104| v1104_17(void) = ReturnIndirection : &:r1104_12, ~mu1104_3 +# 1104| v1104_18(void) = ReturnVoid : +# 1104| v1104_19(void) = UnmodeledUse : mu* +# 1104| v1104_20(void) = AliasedUse : ~mu1104_3 +# 1104| v1104_21(void) = ExitFunction : # 1113| void ExternDeclarations() # 1113| Block 0 @@ -5686,6 +5753,8 @@ ir.cpp: # 1144| Block 10 # 1144| r1144_2(glval) = VariableAddress[s] : # 1144| mu1144_3(char *) = InitializeParameter[s] : &:r1144_2 +# 1144| r1144_4(char *) = Load : &:r1144_2, ~mu1144_3 +# 1144| mu1144_5(unknown) = InitializeIndirection[s] : &:r1144_4 # 1145| r1145_1(glval) = VariableAddress[#throw1145:5] : # 1145| r1145_2(glval) = FunctionAddress[String] : # 1145| r1145_3(glval) = VariableAddress[s] : @@ -5704,9 +5773,11 @@ ir.cpp: #-----| Goto -> Block 12 # 1147| Block 12 -# 1147| r1147_2(glval) = VariableAddress[e] : -# 1147| mu1147_3(String &) = InitializeParameter[e] : &:r1147_2 -# 1147| v1147_4(void) = NoOp : +# 1147| r1147_2(glval) = VariableAddress[e] : +# 1147| mu1147_3(String &) = InitializeParameter[e] : &:r1147_2 +# 1147| r1147_4(String &) = Load : &:r1147_2, ~mu1147_3 +# 1147| mu1147_5(unknown) = InitializeIndirection[e] : &:r1147_4 +# 1147| v1147_6(void) = NoOp : #-----| Goto -> Block 13 # 1149| Block 13 @@ -5758,11 +5829,11 @@ ir.cpp: # 1157| r1157_3(__attribute((vector_size(16UL))) int) = Load : &:r1157_2, ~mu1153_3 # 1157| r1157_4(glval<__attribute((vector_size(16UL))) int>) = VariableAddress[vi4] : # 1157| r1157_5(__attribute((vector_size(16UL))) int) = Load : &:r1157_4, ~mu1153_3 -#-----| r0_153(int) = Constant[3] : +#-----| r0_157(int) = Constant[3] : # 1157| r1157_6(int) = Constant[2] : # 1157| r1157_7(int) = Constant[1] : # 1157| r1157_8(int) = Constant[0] : -# 1157| r1157_9(__attribute((vector_size(16))) int) = BuiltIn[__builtin_shufflevector] : 0:r1157_3, 1:r1157_5, 2:r0_153, 3:r1157_6, 4:r1157_7, 5:r1157_8 +# 1157| r1157_9(__attribute((vector_size(16))) int) = BuiltIn[__builtin_shufflevector] : 0:r1157_3, 1:r1157_5, 2:r0_157, 3:r1157_6, 4:r1157_7, 5:r1157_8 # 1157| mu1157_10(__attribute((vector_size(16UL))) int) = Store : &:r1157_1, r1157_9 # 1158| r1158_1(glval<__attribute((vector_size(16UL))) int>) = VariableAddress[vi4] : # 1158| r1158_2(__attribute((vector_size(16UL))) int) = Load : &:r1158_1, ~mu1153_3 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 f832060de6e2..9a26d67c8477 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 @@ -6,12 +6,15 @@ ssa.cpp: # 13| mu13_3(unknown) = UnmodeledDefinition : # 13| r13_4(glval) = VariableAddress[p] : # 13| m13_5(Point *) = InitializeParameter[p] : &:r13_4 -# 13| r13_6(glval) = VariableAddress[which1] : -# 13| m13_7(bool) = InitializeParameter[which1] : &:r13_6 -# 13| r13_8(glval) = VariableAddress[which2] : -# 13| m13_9(bool) = InitializeParameter[which2] : &:r13_8 +# 13| r13_6(Point *) = Load : &:r13_4, m13_5 +# 13| m13_7(unknown) = InitializeIndirection[p] : &:r13_6 +# 13| m13_8(unknown) = Chi : total:m13_2, partial:m13_7 +# 13| r13_9(glval) = VariableAddress[which1] : +# 13| m13_10(bool) = InitializeParameter[which1] : &:r13_9 +# 13| r13_11(glval) = VariableAddress[which2] : +# 13| m13_12(bool) = InitializeParameter[which2] : &:r13_11 # 14| r14_1(glval) = VariableAddress[which1] : -# 14| r14_2(bool) = Load : &:r14_1, m13_7 +# 14| r14_2(bool) = Load : &:r14_1, m13_10 # 14| v14_3(void) = ConditionalBranch : r14_2 #-----| False -> Block 2 #-----| True -> Block 1 @@ -20,28 +23,28 @@ ssa.cpp: # 15| r15_1(glval) = VariableAddress[p] : # 15| r15_2(Point *) = Load : &:r15_1, m13_5 # 15| r15_3(glval) = FieldAddress[x] : r15_2 -# 15| r15_4(int) = Load : &:r15_3, ~m13_2 +# 15| r15_4(int) = Load : &:r15_3, ~m13_8 # 15| r15_5(int) = Constant[1] : # 15| r15_6(int) = Add : r15_4, r15_5 # 15| m15_7(int) = Store : &:r15_3, r15_6 -# 15| m15_8(unknown) = Chi : total:m13_2, partial:m15_7 +# 15| m15_8(unknown) = Chi : total:m13_8, partial:m15_7 #-----| Goto -> Block 3 # 18| Block 2 # 18| r18_1(glval) = VariableAddress[p] : # 18| r18_2(Point *) = Load : &:r18_1, m13_5 # 18| r18_3(glval) = FieldAddress[y] : r18_2 -# 18| r18_4(int) = Load : &:r18_3, ~m13_2 +# 18| r18_4(int) = Load : &:r18_3, ~m13_8 # 18| r18_5(int) = Constant[1] : # 18| r18_6(int) = Add : r18_4, r18_5 # 18| m18_7(int) = Store : &:r18_3, r18_6 -# 18| m18_8(unknown) = Chi : total:m13_2, partial:m18_7 +# 18| m18_8(unknown) = Chi : total:m13_8, partial:m18_7 #-----| Goto -> Block 3 # 21| Block 3 # 21| m21_1(unknown) = Phi : from 1:~m15_8, from 2:~m18_8 # 21| r21_2(glval) = VariableAddress[which2] : -# 21| r21_3(bool) = Load : &:r21_2, m13_9 +# 21| r21_3(bool) = Load : &:r21_2, m13_12 # 21| v21_4(void) = ConditionalBranch : r21_3 #-----| False -> Block 5 #-----| True -> Block 4 @@ -81,11 +84,12 @@ ssa.cpp: # 28| r28_10(int) = Load : &:r28_9, ~m28_1 # 28| r28_11(int) = Add : r28_6, r28_10 # 28| m28_12(int) = Store : &:r28_2, r28_11 -# 13| r13_10(glval) = VariableAddress[#return] : -# 13| v13_11(void) = ReturnValue : &:r13_10, m28_12 -# 13| v13_12(void) = UnmodeledUse : mu* -# 13| v13_13(void) = AliasedUse : ~m28_1 -# 13| v13_14(void) = ExitFunction : +# 13| v13_13(void) = ReturnIndirection : &:r13_6, ~m28_1 +# 13| r13_14(glval) = VariableAddress[#return] : +# 13| v13_15(void) = ReturnValue : &:r13_14, m28_12 +# 13| v13_16(void) = UnmodeledUse : mu* +# 13| v13_17(void) = AliasedUse : ~m28_1 +# 13| v13_18(void) = ExitFunction : # 31| int UnreachableViaGoto() # 31| Block 0 @@ -199,13 +203,16 @@ ssa.cpp: # 68| void chiNodeAtEndOfLoop(int, char*) # 68| Block 0 -# 68| v68_1(void) = EnterFunction : -# 68| m68_2(unknown) = AliasedDefinition : -# 68| mu68_3(unknown) = UnmodeledDefinition : -# 68| r68_4(glval) = VariableAddress[n] : -# 68| m68_5(int) = InitializeParameter[n] : &:r68_4 -# 68| r68_6(glval) = VariableAddress[p] : -# 68| m68_7(char *) = InitializeParameter[p] : &:r68_6 +# 68| v68_1(void) = EnterFunction : +# 68| m68_2(unknown) = AliasedDefinition : +# 68| mu68_3(unknown) = UnmodeledDefinition : +# 68| r68_4(glval) = VariableAddress[n] : +# 68| m68_5(int) = InitializeParameter[n] : &:r68_4 +# 68| r68_6(glval) = VariableAddress[p] : +# 68| m68_7(char *) = InitializeParameter[p] : &:r68_6 +# 68| r68_8(char *) = Load : &:r68_6, m68_7 +# 68| m68_9(unknown) = InitializeIndirection[p] : &:r68_8 +# 68| m68_10(unknown) = Chi : total:m68_2, partial:m68_9 #-----| Goto -> Block 3 # 70| Block 1 @@ -221,16 +228,17 @@ ssa.cpp: #-----| Goto (back edge) -> Block 3 # 71| Block 2 -# 71| v71_1(void) = NoOp : -# 68| v68_8(void) = ReturnVoid : -# 68| v68_9(void) = UnmodeledUse : mu* -# 68| v68_10(void) = AliasedUse : ~m69_3 -# 68| v68_11(void) = ExitFunction : +# 71| v71_1(void) = NoOp : +# 68| v68_11(void) = ReturnIndirection : &:r68_8, ~m69_3 +# 68| v68_12(void) = ReturnVoid : +# 68| v68_13(void) = UnmodeledUse : mu* +# 68| v68_14(void) = AliasedUse : ~m69_3 +# 68| v68_15(void) = ExitFunction : # 69| Block 3 # 69| m69_1(char *) = Phi : from 0:m68_7, from 1:m70_6 # 69| m69_2(int) = Phi : from 0:m68_5, from 1:m69_8 -# 69| m69_3(unknown) = Phi : from 0:~m68_2, from 1:~m70_9 +# 69| m69_3(unknown) = Phi : from 0:~m68_10, from 1:~m70_9 # 69| r69_4(glval) = VariableAddress[n] : # 69| r69_5(int) = Load : &:r69_4, m69_2 # 69| r69_6(int) = Constant[1] : @@ -749,101 +757,129 @@ ssa.cpp: # 179| mu179_3(unknown) = UnmodeledDefinition : # 179| r179_4(glval) = VariableAddress[p] : # 179| m179_5(int *) = InitializeParameter[p] : &:r179_4 +# 179| r179_6(int *) = Load : &:r179_4, m179_5 +# 179| m179_7(unknown) = InitializeIndirection[p] : &:r179_6 +# 179| m179_8(unknown) = Chi : total:m179_2, partial:m179_7 # 180| m180_1(unknown) = InlineAsm : ~mu179_3 -# 180| m180_2(unknown) = Chi : total:m179_2, partial:m180_1 +# 180| m180_2(unknown) = Chi : total:m179_8, partial:m180_1 # 181| r181_1(glval) = VariableAddress[#return] : # 181| r181_2(glval) = VariableAddress[p] : # 181| r181_3(int *) = Load : &:r181_2, m179_5 # 181| r181_4(int) = Load : &:r181_3, ~m180_2 # 181| m181_5(int) = Store : &:r181_1, r181_4 -# 179| r179_6(glval) = VariableAddress[#return] : -# 179| v179_7(void) = ReturnValue : &:r179_6, m181_5 -# 179| v179_8(void) = UnmodeledUse : mu* -# 179| v179_9(void) = AliasedUse : ~m180_2 -# 179| v179_10(void) = ExitFunction : +# 179| v179_9(void) = ReturnIndirection : &:r179_6, ~m180_2 +# 179| r179_10(glval) = VariableAddress[#return] : +# 179| v179_11(void) = ReturnValue : &:r179_10, m181_5 +# 179| v179_12(void) = UnmodeledUse : mu* +# 179| v179_13(void) = AliasedUse : ~m180_2 +# 179| v179_14(void) = ExitFunction : # 184| void AsmStmtWithOutputs(unsigned int&, unsigned int&, unsigned int&, unsigned int&) # 184| Block 0 -# 184| v184_1(void) = EnterFunction : -# 184| m184_2(unknown) = AliasedDefinition : -# 184| mu184_3(unknown) = UnmodeledDefinition : -# 184| r184_4(glval) = VariableAddress[a] : -# 184| m184_5(unsigned int &) = InitializeParameter[a] : &:r184_4 -# 184| r184_6(glval) = VariableAddress[b] : -# 184| m184_7(unsigned int &) = InitializeParameter[b] : &:r184_6 -# 184| r184_8(glval) = VariableAddress[c] : -# 184| m184_9(unsigned int &) = InitializeParameter[c] : &:r184_8 -# 184| r184_10(glval) = VariableAddress[d] : -# 184| m184_11(unsigned int &) = InitializeParameter[d] : &:r184_10 -# 189| r189_1(glval) = VariableAddress[a] : -# 189| r189_2(unsigned int &) = Load : &:r189_1, m184_5 -# 189| r189_3(glval) = CopyValue : r189_2 -# 189| r189_4(glval) = VariableAddress[b] : -# 189| r189_5(unsigned int &) = Load : &:r189_4, m184_7 -# 189| r189_6(glval) = CopyValue : r189_5 -# 190| r190_1(glval) = VariableAddress[c] : -# 190| r190_2(unsigned int &) = Load : &:r190_1, m184_9 -# 190| r190_3(unsigned int) = Load : &:r190_2, ~m184_2 -# 190| r190_4(glval) = VariableAddress[d] : -# 190| r190_5(unsigned int &) = Load : &:r190_4, m184_11 -# 190| r190_6(unsigned int) = Load : &:r190_5, ~m184_2 -# 186| m186_1(unknown) = InlineAsm : ~mu184_3, 0:r189_3, 1:r189_6, 2:r190_3, 3:r190_6 -# 186| m186_2(unknown) = Chi : total:m184_2, partial:m186_1 -# 192| v192_1(void) = NoOp : -# 184| v184_12(void) = ReturnVoid : -# 184| v184_13(void) = UnmodeledUse : mu* -# 184| v184_14(void) = AliasedUse : ~m186_2 -# 184| v184_15(void) = ExitFunction : +# 184| v184_1(void) = EnterFunction : +# 184| m184_2(unknown) = AliasedDefinition : +# 184| mu184_3(unknown) = UnmodeledDefinition : +# 184| r184_4(glval) = VariableAddress[a] : +# 184| m184_5(unsigned int &) = InitializeParameter[a] : &:r184_4 +# 184| r184_6(unsigned int &) = Load : &:r184_4, m184_5 +# 184| m184_7(unknown) = InitializeIndirection[a] : &:r184_6 +# 184| m184_8(unknown) = Chi : total:m184_2, partial:m184_7 +# 184| r184_9(glval) = VariableAddress[b] : +# 184| m184_10(unsigned int &) = InitializeParameter[b] : &:r184_9 +# 184| r184_11(unsigned int &) = Load : &:r184_9, m184_10 +# 184| m184_12(unknown) = InitializeIndirection[b] : &:r184_11 +# 184| m184_13(unknown) = Chi : total:m184_8, partial:m184_12 +# 184| r184_14(glval) = VariableAddress[c] : +# 184| m184_15(unsigned int &) = InitializeParameter[c] : &:r184_14 +# 184| r184_16(unsigned int &) = Load : &:r184_14, m184_15 +# 184| m184_17(unknown) = InitializeIndirection[c] : &:r184_16 +# 184| m184_18(unknown) = Chi : total:m184_13, partial:m184_17 +# 184| r184_19(glval) = VariableAddress[d] : +# 184| m184_20(unsigned int &) = InitializeParameter[d] : &:r184_19 +# 184| r184_21(unsigned int &) = Load : &:r184_19, m184_20 +# 184| m184_22(unknown) = InitializeIndirection[d] : &:r184_21 +# 184| m184_23(unknown) = Chi : total:m184_18, partial:m184_22 +# 189| r189_1(glval) = VariableAddress[a] : +# 189| r189_2(unsigned int &) = Load : &:r189_1, m184_5 +# 189| r189_3(glval) = CopyValue : r189_2 +# 189| r189_4(glval) = VariableAddress[b] : +# 189| r189_5(unsigned int &) = Load : &:r189_4, m184_10 +# 189| r189_6(glval) = CopyValue : r189_5 +# 190| r190_1(glval) = VariableAddress[c] : +# 190| r190_2(unsigned int &) = Load : &:r190_1, m184_15 +# 190| r190_3(unsigned int) = Load : &:r190_2, ~m184_23 +# 190| r190_4(glval) = VariableAddress[d] : +# 190| r190_5(unsigned int &) = Load : &:r190_4, m184_20 +# 190| r190_6(unsigned int) = Load : &:r190_5, ~m184_23 +# 186| m186_1(unknown) = InlineAsm : ~mu184_3, 0:r189_3, 1:r189_6, 2:r190_3, 3:r190_6 +# 186| m186_2(unknown) = Chi : total:m184_23, partial:m186_1 +# 192| v192_1(void) = NoOp : +# 184| v184_24(void) = ReturnIndirection : &:r184_6, ~m186_2 +# 184| v184_25(void) = ReturnIndirection : &:r184_11, ~m186_2 +# 184| v184_26(void) = ReturnIndirection : &:r184_16, ~m186_2 +# 184| v184_27(void) = ReturnIndirection : &:r184_21, ~m186_2 +# 184| v184_28(void) = ReturnVoid : +# 184| v184_29(void) = UnmodeledUse : mu* +# 184| v184_30(void) = AliasedUse : ~m186_2 +# 184| v184_31(void) = ExitFunction : # 198| int PureFunctions(char*, char*, int) # 198| Block 0 -# 198| v198_1(void) = EnterFunction : -# 198| m198_2(unknown) = AliasedDefinition : -# 198| mu198_3(unknown) = UnmodeledDefinition : -# 198| r198_4(glval) = VariableAddress[str1] : -# 198| m198_5(char *) = InitializeParameter[str1] : &:r198_4 -# 198| r198_6(glval) = VariableAddress[str2] : -# 198| m198_7(char *) = InitializeParameter[str2] : &:r198_6 -# 198| r198_8(glval) = VariableAddress[x] : -# 198| m198_9(int) = InitializeParameter[x] : &:r198_8 -# 199| r199_1(glval) = VariableAddress[ret] : -# 199| r199_2(glval) = FunctionAddress[strcmp] : -# 199| r199_3(glval) = VariableAddress[str1] : -# 199| r199_4(char *) = Load : &:r199_3, m198_5 -# 199| r199_5(char *) = Convert : r199_4 -# 199| r199_6(glval) = VariableAddress[str2] : -# 199| r199_7(char *) = Load : &:r199_6, m198_7 -# 199| r199_8(char *) = Convert : r199_7 -# 199| r199_9(int) = Call : func:r199_2, 0:r199_5, 1:r199_8 -# 199| v199_10(void) = ^CallReadSideEffect : ~m198_2 -# 199| m199_11(int) = Store : &:r199_1, r199_9 -# 200| r200_1(glval) = FunctionAddress[strlen] : -# 200| r200_2(glval) = VariableAddress[str1] : -# 200| r200_3(char *) = Load : &:r200_2, m198_5 -# 200| r200_4(char *) = Convert : r200_3 -# 200| r200_5(int) = Call : func:r200_1, 0:r200_4 -# 200| v200_6(void) = ^CallReadSideEffect : ~m198_2 -# 200| r200_7(glval) = VariableAddress[ret] : -# 200| r200_8(int) = Load : &:r200_7, m199_11 -# 200| r200_9(int) = Add : r200_8, r200_5 -# 200| m200_10(int) = Store : &:r200_7, r200_9 -# 201| r201_1(glval) = FunctionAddress[abs] : -# 201| r201_2(glval) = VariableAddress[x] : -# 201| r201_3(int) = Load : &:r201_2, m198_9 -# 201| r201_4(int) = Call : func:r201_1, 0:r201_3 -# 201| r201_5(glval) = VariableAddress[ret] : -# 201| r201_6(int) = Load : &:r201_5, m200_10 -# 201| r201_7(int) = Add : r201_6, r201_4 -# 201| m201_8(int) = Store : &:r201_5, r201_7 -# 202| r202_1(glval) = VariableAddress[#return] : -# 202| r202_2(glval) = VariableAddress[ret] : -# 202| r202_3(int) = Load : &:r202_2, m201_8 -# 202| m202_4(int) = Store : &:r202_1, r202_3 -# 198| r198_10(glval) = VariableAddress[#return] : -# 198| v198_11(void) = ReturnValue : &:r198_10, m202_4 -# 198| v198_12(void) = UnmodeledUse : mu* -# 198| v198_13(void) = AliasedUse : ~m198_2 -# 198| v198_14(void) = ExitFunction : +# 198| v198_1(void) = EnterFunction : +# 198| m198_2(unknown) = AliasedDefinition : +# 198| mu198_3(unknown) = UnmodeledDefinition : +# 198| r198_4(glval) = VariableAddress[str1] : +# 198| m198_5(char *) = InitializeParameter[str1] : &:r198_4 +# 198| r198_6(char *) = Load : &:r198_4, m198_5 +# 198| m198_7(unknown) = InitializeIndirection[str1] : &:r198_6 +# 198| m198_8(unknown) = Chi : total:m198_2, partial:m198_7 +# 198| r198_9(glval) = VariableAddress[str2] : +# 198| m198_10(char *) = InitializeParameter[str2] : &:r198_9 +# 198| r198_11(char *) = Load : &:r198_9, m198_10 +# 198| m198_12(unknown) = InitializeIndirection[str2] : &:r198_11 +# 198| m198_13(unknown) = Chi : total:m198_8, partial:m198_12 +# 198| r198_14(glval) = VariableAddress[x] : +# 198| m198_15(int) = InitializeParameter[x] : &:r198_14 +# 199| r199_1(glval) = VariableAddress[ret] : +# 199| r199_2(glval) = FunctionAddress[strcmp] : +# 199| r199_3(glval) = VariableAddress[str1] : +# 199| r199_4(char *) = Load : &:r199_3, m198_5 +# 199| r199_5(char *) = Convert : r199_4 +# 199| r199_6(glval) = VariableAddress[str2] : +# 199| r199_7(char *) = Load : &:r199_6, m198_10 +# 199| r199_8(char *) = Convert : r199_7 +# 199| r199_9(int) = Call : func:r199_2, 0:r199_5, 1:r199_8 +# 199| v199_10(void) = ^CallReadSideEffect : ~m198_13 +# 199| m199_11(int) = Store : &:r199_1, r199_9 +# 200| r200_1(glval) = FunctionAddress[strlen] : +# 200| r200_2(glval) = VariableAddress[str1] : +# 200| r200_3(char *) = Load : &:r200_2, m198_5 +# 200| r200_4(char *) = Convert : r200_3 +# 200| r200_5(int) = Call : func:r200_1, 0:r200_4 +# 200| v200_6(void) = ^CallReadSideEffect : ~m198_13 +# 200| r200_7(glval) = VariableAddress[ret] : +# 200| r200_8(int) = Load : &:r200_7, m199_11 +# 200| r200_9(int) = Add : r200_8, r200_5 +# 200| m200_10(int) = Store : &:r200_7, r200_9 +# 201| r201_1(glval) = FunctionAddress[abs] : +# 201| r201_2(glval) = VariableAddress[x] : +# 201| r201_3(int) = Load : &:r201_2, m198_15 +# 201| r201_4(int) = Call : func:r201_1, 0:r201_3 +# 201| r201_5(glval) = VariableAddress[ret] : +# 201| r201_6(int) = Load : &:r201_5, m200_10 +# 201| r201_7(int) = Add : r201_6, r201_4 +# 201| m201_8(int) = Store : &:r201_5, r201_7 +# 202| r202_1(glval) = VariableAddress[#return] : +# 202| r202_2(glval) = VariableAddress[ret] : +# 202| r202_3(int) = Load : &:r202_2, m201_8 +# 202| m202_4(int) = Store : &:r202_1, r202_3 +# 198| v198_16(void) = ReturnIndirection : &:r198_6, ~m198_13 +# 198| v198_17(void) = ReturnIndirection : &:r198_11, ~m198_13 +# 198| r198_18(glval) = VariableAddress[#return] : +# 198| v198_19(void) = ReturnValue : &:r198_18, m202_4 +# 198| v198_20(void) = UnmodeledUse : mu* +# 198| v198_21(void) = AliasedUse : ~m198_13 +# 198| v198_22(void) = ExitFunction : # 207| int ModeledCallTarget(int) # 207| Block 0 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 b44a576518a3..5ea397b91dcd 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 @@ -6,12 +6,14 @@ ssa.cpp: # 13| mu13_3(unknown) = UnmodeledDefinition : # 13| r13_4(glval) = VariableAddress[p] : # 13| m13_5(Point *) = InitializeParameter[p] : &:r13_4 -# 13| r13_6(glval) = VariableAddress[which1] : -# 13| m13_7(bool) = InitializeParameter[which1] : &:r13_6 -# 13| r13_8(glval) = VariableAddress[which2] : -# 13| m13_9(bool) = InitializeParameter[which2] : &:r13_8 +# 13| r13_6(Point *) = Load : &:r13_4, m13_5 +# 13| mu13_7(unknown) = InitializeIndirection[p] : &:r13_6 +# 13| r13_8(glval) = VariableAddress[which1] : +# 13| m13_9(bool) = InitializeParameter[which1] : &:r13_8 +# 13| r13_10(glval) = VariableAddress[which2] : +# 13| m13_11(bool) = InitializeParameter[which2] : &:r13_10 # 14| r14_1(glval) = VariableAddress[which1] : -# 14| r14_2(bool) = Load : &:r14_1, m13_7 +# 14| r14_2(bool) = Load : &:r14_1, m13_9 # 14| v14_3(void) = ConditionalBranch : r14_2 #-----| False -> Block 2 #-----| True -> Block 1 @@ -38,7 +40,7 @@ ssa.cpp: # 21| Block 3 # 21| r21_1(glval) = VariableAddress[which2] : -# 21| r21_2(bool) = Load : &:r21_1, m13_9 +# 21| r21_2(bool) = Load : &:r21_1, m13_11 # 21| v21_3(void) = ConditionalBranch : r21_2 #-----| False -> Block 5 #-----| True -> Block 4 @@ -75,11 +77,12 @@ ssa.cpp: # 28| r28_9(int) = Load : &:r28_8, ~mu13_3 # 28| r28_10(int) = Add : r28_5, r28_9 # 28| m28_11(int) = Store : &:r28_1, r28_10 -# 13| r13_10(glval) = VariableAddress[#return] : -# 13| v13_11(void) = ReturnValue : &:r13_10, m28_11 -# 13| v13_12(void) = UnmodeledUse : mu* -# 13| v13_13(void) = AliasedUse : ~mu13_3 -# 13| v13_14(void) = ExitFunction : +# 13| v13_12(void) = ReturnIndirection : &:r13_6, ~mu13_3 +# 13| r13_13(glval) = VariableAddress[#return] : +# 13| v13_14(void) = ReturnValue : &:r13_13, m28_11 +# 13| v13_15(void) = UnmodeledUse : mu* +# 13| v13_16(void) = AliasedUse : ~mu13_3 +# 13| v13_17(void) = ExitFunction : # 31| int UnreachableViaGoto() # 31| Block 0 @@ -202,13 +205,15 @@ ssa.cpp: # 68| void chiNodeAtEndOfLoop(int, char*) # 68| Block 0 -# 68| v68_1(void) = EnterFunction : -# 68| mu68_2(unknown) = AliasedDefinition : -# 68| mu68_3(unknown) = UnmodeledDefinition : -# 68| r68_4(glval) = VariableAddress[n] : -# 68| m68_5(int) = InitializeParameter[n] : &:r68_4 -# 68| r68_6(glval) = VariableAddress[p] : -# 68| m68_7(char *) = InitializeParameter[p] : &:r68_6 +# 68| v68_1(void) = EnterFunction : +# 68| mu68_2(unknown) = AliasedDefinition : +# 68| mu68_3(unknown) = UnmodeledDefinition : +# 68| r68_4(glval) = VariableAddress[n] : +# 68| m68_5(int) = InitializeParameter[n] : &:r68_4 +# 68| r68_6(glval) = VariableAddress[p] : +# 68| m68_7(char *) = InitializeParameter[p] : &:r68_6 +# 68| r68_8(char *) = Load : &:r68_6, m68_7 +# 68| mu68_9(unknown) = InitializeIndirection[p] : &:r68_8 #-----| Goto -> Block 3 # 70| Block 1 @@ -223,11 +228,12 @@ ssa.cpp: #-----| Goto (back edge) -> Block 3 # 71| Block 2 -# 71| v71_1(void) = NoOp : -# 68| v68_8(void) = ReturnVoid : -# 68| v68_9(void) = UnmodeledUse : mu* -# 68| v68_10(void) = AliasedUse : ~mu68_3 -# 68| v68_11(void) = ExitFunction : +# 71| v71_1(void) = NoOp : +# 68| v68_10(void) = ReturnIndirection : &:r68_8, ~mu68_3 +# 68| v68_11(void) = ReturnVoid : +# 68| v68_12(void) = UnmodeledUse : mu* +# 68| v68_13(void) = AliasedUse : ~mu68_3 +# 68| v68_14(void) = ExitFunction : # 69| Block 3 # 69| m69_1(char *) = Phi : from 0:m68_7, from 1:m70_6 @@ -718,99 +724,120 @@ ssa.cpp: # 179| mu179_3(unknown) = UnmodeledDefinition : # 179| r179_4(glval) = VariableAddress[p] : # 179| m179_5(int *) = InitializeParameter[p] : &:r179_4 +# 179| r179_6(int *) = Load : &:r179_4, m179_5 +# 179| mu179_7(unknown) = InitializeIndirection[p] : &:r179_6 # 180| mu180_1(unknown) = InlineAsm : ~mu179_3 # 181| r181_1(glval) = VariableAddress[#return] : # 181| r181_2(glval) = VariableAddress[p] : # 181| r181_3(int *) = Load : &:r181_2, m179_5 # 181| r181_4(int) = Load : &:r181_3, ~mu179_3 # 181| m181_5(int) = Store : &:r181_1, r181_4 -# 179| r179_6(glval) = VariableAddress[#return] : -# 179| v179_7(void) = ReturnValue : &:r179_6, m181_5 -# 179| v179_8(void) = UnmodeledUse : mu* -# 179| v179_9(void) = AliasedUse : ~mu179_3 -# 179| v179_10(void) = ExitFunction : +# 179| v179_8(void) = ReturnIndirection : &:r179_6, ~mu179_3 +# 179| r179_9(glval) = VariableAddress[#return] : +# 179| v179_10(void) = ReturnValue : &:r179_9, m181_5 +# 179| v179_11(void) = UnmodeledUse : mu* +# 179| v179_12(void) = AliasedUse : ~mu179_3 +# 179| v179_13(void) = ExitFunction : # 184| void AsmStmtWithOutputs(unsigned int&, unsigned int&, unsigned int&, unsigned int&) # 184| Block 0 -# 184| v184_1(void) = EnterFunction : -# 184| mu184_2(unknown) = AliasedDefinition : -# 184| mu184_3(unknown) = UnmodeledDefinition : -# 184| r184_4(glval) = VariableAddress[a] : -# 184| m184_5(unsigned int &) = InitializeParameter[a] : &:r184_4 -# 184| r184_6(glval) = VariableAddress[b] : -# 184| m184_7(unsigned int &) = InitializeParameter[b] : &:r184_6 -# 184| r184_8(glval) = VariableAddress[c] : -# 184| m184_9(unsigned int &) = InitializeParameter[c] : &:r184_8 -# 184| r184_10(glval) = VariableAddress[d] : -# 184| m184_11(unsigned int &) = InitializeParameter[d] : &:r184_10 -# 189| r189_1(glval) = VariableAddress[a] : -# 189| r189_2(unsigned int &) = Load : &:r189_1, m184_5 -# 189| r189_3(glval) = CopyValue : r189_2 -# 189| r189_4(glval) = VariableAddress[b] : -# 189| r189_5(unsigned int &) = Load : &:r189_4, m184_7 -# 189| r189_6(glval) = CopyValue : r189_5 -# 190| r190_1(glval) = VariableAddress[c] : -# 190| r190_2(unsigned int &) = Load : &:r190_1, m184_9 -# 190| r190_3(unsigned int) = Load : &:r190_2, ~mu184_3 -# 190| r190_4(glval) = VariableAddress[d] : -# 190| r190_5(unsigned int &) = Load : &:r190_4, m184_11 -# 190| r190_6(unsigned int) = Load : &:r190_5, ~mu184_3 -# 186| mu186_1(unknown) = InlineAsm : ~mu184_3, 0:r189_3, 1:r189_6, 2:r190_3, 3:r190_6 -# 192| v192_1(void) = NoOp : -# 184| v184_12(void) = ReturnVoid : -# 184| v184_13(void) = UnmodeledUse : mu* -# 184| v184_14(void) = AliasedUse : ~mu184_3 -# 184| v184_15(void) = ExitFunction : +# 184| v184_1(void) = EnterFunction : +# 184| mu184_2(unknown) = AliasedDefinition : +# 184| mu184_3(unknown) = UnmodeledDefinition : +# 184| r184_4(glval) = VariableAddress[a] : +# 184| m184_5(unsigned int &) = InitializeParameter[a] : &:r184_4 +# 184| r184_6(unsigned int &) = Load : &:r184_4, m184_5 +# 184| mu184_7(unknown) = InitializeIndirection[a] : &:r184_6 +# 184| r184_8(glval) = VariableAddress[b] : +# 184| m184_9(unsigned int &) = InitializeParameter[b] : &:r184_8 +# 184| r184_10(unsigned int &) = Load : &:r184_8, m184_9 +# 184| mu184_11(unknown) = InitializeIndirection[b] : &:r184_10 +# 184| r184_12(glval) = VariableAddress[c] : +# 184| m184_13(unsigned int &) = InitializeParameter[c] : &:r184_12 +# 184| r184_14(unsigned int &) = Load : &:r184_12, m184_13 +# 184| mu184_15(unknown) = InitializeIndirection[c] : &:r184_14 +# 184| r184_16(glval) = VariableAddress[d] : +# 184| m184_17(unsigned int &) = InitializeParameter[d] : &:r184_16 +# 184| r184_18(unsigned int &) = Load : &:r184_16, m184_17 +# 184| mu184_19(unknown) = InitializeIndirection[d] : &:r184_18 +# 189| r189_1(glval) = VariableAddress[a] : +# 189| r189_2(unsigned int &) = Load : &:r189_1, m184_5 +# 189| r189_3(glval) = CopyValue : r189_2 +# 189| r189_4(glval) = VariableAddress[b] : +# 189| r189_5(unsigned int &) = Load : &:r189_4, m184_9 +# 189| r189_6(glval) = CopyValue : r189_5 +# 190| r190_1(glval) = VariableAddress[c] : +# 190| r190_2(unsigned int &) = Load : &:r190_1, m184_13 +# 190| r190_3(unsigned int) = Load : &:r190_2, ~mu184_3 +# 190| r190_4(glval) = VariableAddress[d] : +# 190| r190_5(unsigned int &) = Load : &:r190_4, m184_17 +# 190| r190_6(unsigned int) = Load : &:r190_5, ~mu184_3 +# 186| mu186_1(unknown) = InlineAsm : ~mu184_3, 0:r189_3, 1:r189_6, 2:r190_3, 3:r190_6 +# 192| v192_1(void) = NoOp : +# 184| v184_20(void) = ReturnIndirection : &:r184_6, ~mu184_3 +# 184| v184_21(void) = ReturnIndirection : &:r184_10, ~mu184_3 +# 184| v184_22(void) = ReturnIndirection : &:r184_14, ~mu184_3 +# 184| v184_23(void) = ReturnIndirection : &:r184_18, ~mu184_3 +# 184| v184_24(void) = ReturnVoid : +# 184| v184_25(void) = UnmodeledUse : mu* +# 184| v184_26(void) = AliasedUse : ~mu184_3 +# 184| v184_27(void) = ExitFunction : # 198| int PureFunctions(char*, char*, int) # 198| Block 0 -# 198| v198_1(void) = EnterFunction : -# 198| mu198_2(unknown) = AliasedDefinition : -# 198| mu198_3(unknown) = UnmodeledDefinition : -# 198| r198_4(glval) = VariableAddress[str1] : -# 198| m198_5(char *) = InitializeParameter[str1] : &:r198_4 -# 198| r198_6(glval) = VariableAddress[str2] : -# 198| m198_7(char *) = InitializeParameter[str2] : &:r198_6 -# 198| r198_8(glval) = VariableAddress[x] : -# 198| m198_9(int) = InitializeParameter[x] : &:r198_8 -# 199| r199_1(glval) = VariableAddress[ret] : -# 199| r199_2(glval) = FunctionAddress[strcmp] : -# 199| r199_3(glval) = VariableAddress[str1] : -# 199| r199_4(char *) = Load : &:r199_3, m198_5 -# 199| r199_5(char *) = Convert : r199_4 -# 199| r199_6(glval) = VariableAddress[str2] : -# 199| r199_7(char *) = Load : &:r199_6, m198_7 -# 199| r199_8(char *) = Convert : r199_7 -# 199| r199_9(int) = Call : func:r199_2, 0:r199_5, 1:r199_8 -# 199| v199_10(void) = ^CallReadSideEffect : ~mu198_3 -# 199| m199_11(int) = Store : &:r199_1, r199_9 -# 200| r200_1(glval) = FunctionAddress[strlen] : -# 200| r200_2(glval) = VariableAddress[str1] : -# 200| r200_3(char *) = Load : &:r200_2, m198_5 -# 200| r200_4(char *) = Convert : r200_3 -# 200| r200_5(int) = Call : func:r200_1, 0:r200_4 -# 200| v200_6(void) = ^CallReadSideEffect : ~mu198_3 -# 200| r200_7(glval) = VariableAddress[ret] : -# 200| r200_8(int) = Load : &:r200_7, m199_11 -# 200| r200_9(int) = Add : r200_8, r200_5 -# 200| m200_10(int) = Store : &:r200_7, r200_9 -# 201| r201_1(glval) = FunctionAddress[abs] : -# 201| r201_2(glval) = VariableAddress[x] : -# 201| r201_3(int) = Load : &:r201_2, m198_9 -# 201| r201_4(int) = Call : func:r201_1, 0:r201_3 -# 201| r201_5(glval) = VariableAddress[ret] : -# 201| r201_6(int) = Load : &:r201_5, m200_10 -# 201| r201_7(int) = Add : r201_6, r201_4 -# 201| m201_8(int) = Store : &:r201_5, r201_7 -# 202| r202_1(glval) = VariableAddress[#return] : -# 202| r202_2(glval) = VariableAddress[ret] : -# 202| r202_3(int) = Load : &:r202_2, m201_8 -# 202| m202_4(int) = Store : &:r202_1, r202_3 -# 198| r198_10(glval) = VariableAddress[#return] : -# 198| v198_11(void) = ReturnValue : &:r198_10, m202_4 -# 198| v198_12(void) = UnmodeledUse : mu* -# 198| v198_13(void) = AliasedUse : ~mu198_3 -# 198| v198_14(void) = ExitFunction : +# 198| v198_1(void) = EnterFunction : +# 198| mu198_2(unknown) = AliasedDefinition : +# 198| mu198_3(unknown) = UnmodeledDefinition : +# 198| r198_4(glval) = VariableAddress[str1] : +# 198| m198_5(char *) = InitializeParameter[str1] : &:r198_4 +# 198| r198_6(char *) = Load : &:r198_4, m198_5 +# 198| mu198_7(unknown) = InitializeIndirection[str1] : &:r198_6 +# 198| r198_8(glval) = VariableAddress[str2] : +# 198| m198_9(char *) = InitializeParameter[str2] : &:r198_8 +# 198| r198_10(char *) = Load : &:r198_8, m198_9 +# 198| mu198_11(unknown) = InitializeIndirection[str2] : &:r198_10 +# 198| r198_12(glval) = VariableAddress[x] : +# 198| m198_13(int) = InitializeParameter[x] : &:r198_12 +# 199| r199_1(glval) = VariableAddress[ret] : +# 199| r199_2(glval) = FunctionAddress[strcmp] : +# 199| r199_3(glval) = VariableAddress[str1] : +# 199| r199_4(char *) = Load : &:r199_3, m198_5 +# 199| r199_5(char *) = Convert : r199_4 +# 199| r199_6(glval) = VariableAddress[str2] : +# 199| r199_7(char *) = Load : &:r199_6, m198_9 +# 199| r199_8(char *) = Convert : r199_7 +# 199| r199_9(int) = Call : func:r199_2, 0:r199_5, 1:r199_8 +# 199| v199_10(void) = ^CallReadSideEffect : ~mu198_3 +# 199| m199_11(int) = Store : &:r199_1, r199_9 +# 200| r200_1(glval) = FunctionAddress[strlen] : +# 200| r200_2(glval) = VariableAddress[str1] : +# 200| r200_3(char *) = Load : &:r200_2, m198_5 +# 200| r200_4(char *) = Convert : r200_3 +# 200| r200_5(int) = Call : func:r200_1, 0:r200_4 +# 200| v200_6(void) = ^CallReadSideEffect : ~mu198_3 +# 200| r200_7(glval) = VariableAddress[ret] : +# 200| r200_8(int) = Load : &:r200_7, m199_11 +# 200| r200_9(int) = Add : r200_8, r200_5 +# 200| m200_10(int) = Store : &:r200_7, r200_9 +# 201| r201_1(glval) = FunctionAddress[abs] : +# 201| r201_2(glval) = VariableAddress[x] : +# 201| r201_3(int) = Load : &:r201_2, m198_13 +# 201| r201_4(int) = Call : func:r201_1, 0:r201_3 +# 201| r201_5(glval) = VariableAddress[ret] : +# 201| r201_6(int) = Load : &:r201_5, m200_10 +# 201| r201_7(int) = Add : r201_6, r201_4 +# 201| m201_8(int) = Store : &:r201_5, r201_7 +# 202| r202_1(glval) = VariableAddress[#return] : +# 202| r202_2(glval) = VariableAddress[ret] : +# 202| r202_3(int) = Load : &:r202_2, m201_8 +# 202| m202_4(int) = Store : &:r202_1, r202_3 +# 198| v198_14(void) = ReturnIndirection : &:r198_6, ~mu198_3 +# 198| v198_15(void) = ReturnIndirection : &:r198_10, ~mu198_3 +# 198| r198_16(glval) = VariableAddress[#return] : +# 198| v198_17(void) = ReturnValue : &:r198_16, m202_4 +# 198| v198_18(void) = UnmodeledUse : mu* +# 198| v198_19(void) = AliasedUse : ~mu198_3 +# 198| v198_20(void) = ExitFunction : # 207| int ModeledCallTarget(int) # 207| Block 0 diff --git a/cpp/ql/test/library-tests/rangeanalysis/signanalysis/SignAnalysis.expected b/cpp/ql/test/library-tests/rangeanalysis/signanalysis/SignAnalysis.expected index 0c8f9c1cff14..c8a276b1f632 100644 --- a/cpp/ql/test/library-tests/rangeanalysis/signanalysis/SignAnalysis.expected +++ b/cpp/ql/test/library-tests/rangeanalysis/signanalysis/SignAnalysis.expected @@ -131,7 +131,7 @@ | test.c:93:12:93:12 | Store: x | positive strictlyPositive | | test.c:95:10:95:10 | Constant: 1 | positive strictlyPositive | | test.c:95:10:95:10 | Store: 1 | positive strictlyPositive | -| test.c:98:5:98:10 | Phi: test11 | positive | +| test.c:98:18:98:18 | Phi: p | positive | | test.c:102:6:102:8 | Constant: ... ++ | positive strictlyPositive | | test.c:104:12:104:14 | Constant: 58 | positive strictlyPositive | | test.c:107:8:107:10 | Constant: ... ++ | positive strictlyPositive | diff --git a/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_sanity.expected b/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_sanity.expected index 3f5dd1f75e72..2fad91f5f854 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_sanity.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_sanity.expected @@ -36,14 +36,14 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| VacuousDestructorCall.cpp:2:29:2:29 | InitializeParameter: y | +| VacuousDestructorCall.cpp:2:29:2:29 | Chi: y | | condition_decls.cpp:16:19:16:20 | Chi: call to BoxedInt | | condition_decls.cpp:26:23:26:24 | Chi: call to BoxedInt | | condition_decls.cpp:41:22:41:23 | Chi: call to BoxedInt | | condition_decls.cpp:48:52:48:53 | Chi: call to BoxedInt | | cpp17.cpp:15:11:15:21 | Convert: (void *)... | | misc.c:171:10:171:13 | Uninitialized: definition of str2 | -| misc.c:219:47:219:48 | InitializeParameter: sp | +| misc.c:219:47:219:48 | Chi: sp | | ms_try_except.cpp:3:9:3:9 | Uninitialized: definition of x | | ms_try_mix.cpp:11:12:11:15 | Chi: call to C | | ms_try_mix.cpp:28:12:28:15 | Chi: call to C | 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 7fee1b8f6622..966813efe968 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/raw_sanity.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/raw_sanity.expected @@ -51,7 +51,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| VacuousDestructorCall.cpp:2:29:2:29 | InitializeParameter: y | +| VacuousDestructorCall.cpp:2:29:2:29 | InitializeIndirection: y | | VacuousDestructorCall.cpp:3:3:3:3 | VariableAddress: x | | VacuousDestructorCall.cpp:4:3:4:3 | Load: y | | condition_decls.cpp:16:19:16:20 | IndirectMayWriteSideEffect: call to BoxedInt | @@ -70,7 +70,7 @@ instructionWithoutSuccessor | misc.c:174:17:174:22 | CallSideEffect: call to getInt | | misc.c:174:30:174:35 | CallSideEffect: call to getInt | | misc.c:174:55:174:60 | Store: (char ****)... | -| misc.c:219:47:219:48 | InitializeParameter: sp | +| misc.c:219:47:219:48 | InitializeIndirection: sp | | misc.c:221:10:221:10 | Store: 1 | | misc.c:222:10:222:10 | Store: 2 | | ms_try_except.cpp:3:9:3:9 | Uninitialized: definition of x | @@ -638,10 +638,13 @@ lostReachability | range_analysis.c:371:37:371:39 | Constant: 500 | backEdgeCountMismatch useNotDominatedByDefinition +| VacuousDestructorCall.cpp:2:29:2:29 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | IR: CallDestructor | void CallDestructor(int, int*) | +| misc.c:219:47:219:48 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | misc.c:219:5:219:26 | IR: assign_designated_init | int assign_designated_init(someStruct*) | | 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() | | 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:27:3:30 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | vla.c:3:5:3:8 | IR: main | int main(int, char**) | missingCanonicalLanguageType multipleCanonicalLanguageTypes missingIRType diff --git a/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_sanity.expected b/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_sanity.expected index 3ed49d2a3cdb..c7897f98817b 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_sanity.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_sanity.expected @@ -44,14 +44,14 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| VacuousDestructorCall.cpp:2:29:2:29 | InitializeParameter: y | +| VacuousDestructorCall.cpp:2:29:2:29 | InitializeIndirection: y | | condition_decls.cpp:16:19:16:20 | IndirectMayWriteSideEffect: call to BoxedInt | | condition_decls.cpp:26:23:26:24 | IndirectMayWriteSideEffect: call to BoxedInt | | condition_decls.cpp:41:22:41:23 | IndirectMayWriteSideEffect: call to BoxedInt | | condition_decls.cpp:48:52:48:53 | IndirectMayWriteSideEffect: call to BoxedInt | | cpp17.cpp:15:11:15:21 | Convert: (void *)... | | misc.c:171:10:171:13 | Uninitialized: definition of str2 | -| misc.c:219:47:219:48 | InitializeParameter: sp | +| misc.c:219:47:219:48 | InitializeIndirection: sp | | ms_try_except.cpp:3:9:3:9 | Uninitialized: definition of x | | ms_try_mix.cpp:11:12:11:15 | IndirectMayWriteSideEffect: call to C | | ms_try_mix.cpp:28:12:28:15 | IndirectMayWriteSideEffect: call to C | 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 f7286de36cda..38386b9c2fdf 100644 --- a/cpp/ql/test/library-tests/valuenumbering/GlobalValueNumbering/ir_gvn.expected +++ b/cpp/ql/test/library-tests/valuenumbering/GlobalValueNumbering/ir_gvn.expected @@ -262,6 +262,12 @@ test.cpp: # 39| valnum = r39_8 # 39| m39_9(int *) = InitializeParameter[p2] : &:r39_8 # 39| valnum = m39_9 +# 39| r39_10(int *) = Load : &:r39_8, m39_9 +# 39| valnum = m39_9 +# 39| m39_11(unknown) = InitializeIndirection[p2] : &:r39_10 +# 39| valnum = unique +# 39| m39_12(unknown) = Chi : total:m39_2, partial:m39_11 +# 39| valnum = unique # 40| r40_1(glval) = VariableAddress[x] : # 40| valnum = r40_1 # 40| m40_2(int) = Uninitialized[x] : &:r40_1 @@ -286,7 +292,7 @@ test.cpp: # 43| valnum = r43_5 # 43| r43_6(glval) = VariableAddress[global03] : # 43| valnum = r43_6 -# 43| r43_7(int) = Load : &:r43_6, ~m39_2 +# 43| r43_7(int) = Load : &:r43_6, ~m39_12 # 43| valnum = unique # 43| r43_8(int) = Add : r43_5, r43_7 # 43| valnum = r43_8 @@ -304,7 +310,7 @@ test.cpp: # 44| valnum = m39_9 # 44| m44_5(int) = Store : &:r44_4, r44_1 # 44| valnum = r44_1 -# 44| m44_6(unknown) = Chi : total:m39_2, partial:m44_5 +# 44| m44_6(unknown) = Chi : total:m39_12, partial:m44_5 # 44| valnum = unique # 45| r45_1(glval) = VariableAddress[p0] : # 45| valnum = r39_4 @@ -335,37 +341,50 @@ test.cpp: # 46| m46_4(int) = Store : &:r46_3, r46_2 # 46| valnum = r45_8 # 47| v47_1(void) = NoOp : -# 39| r39_10(glval) = VariableAddress[#return] : +# 39| v39_13(void) = ReturnIndirection : &:r39_10, ~m44_6 +# 39| r39_14(glval) = VariableAddress[#return] : # 39| valnum = unique -# 39| v39_11(void) = ReturnValue : &:r39_10 -# 39| v39_12(void) = UnmodeledUse : mu* -# 39| v39_13(void) = AliasedUse : ~m44_6 -# 39| v39_14(void) = ExitFunction : +# 39| v39_15(void) = ReturnValue : &:r39_14 +# 39| v39_16(void) = UnmodeledUse : mu* +# 39| v39_17(void) = AliasedUse : ~m44_6 +# 39| v39_18(void) = ExitFunction : # 49| unsigned int my_strspn(char const*, char const*) # 49| Block 0 -# 49| v49_1(void) = EnterFunction : -# 49| m49_2(unknown) = AliasedDefinition : +# 49| v49_1(void) = EnterFunction : +# 49| m49_2(unknown) = AliasedDefinition : # 49| valnum = unique -# 49| mu49_3(unknown) = UnmodeledDefinition : +# 49| mu49_3(unknown) = UnmodeledDefinition : # 49| valnum = unique -# 49| r49_4(glval) = VariableAddress[str] : +# 49| r49_4(glval) = VariableAddress[str] : # 49| valnum = r49_4 -# 49| m49_5(char *) = InitializeParameter[str] : &:r49_4 +# 49| m49_5(char *) = InitializeParameter[str] : &:r49_4 # 49| valnum = m49_5 -# 49| r49_6(glval) = VariableAddress[chars] : -# 49| valnum = r49_6 -# 49| m49_7(char *) = InitializeParameter[chars] : &:r49_6 -# 49| valnum = m49_7 -# 50| r50_1(glval) = VariableAddress[ptr] : +# 49| r49_6(char *) = Load : &:r49_4, m49_5 +# 49| valnum = m49_5 +# 49| m49_7(unknown) = InitializeIndirection[str] : &:r49_6 +# 49| valnum = unique +# 49| m49_8(unknown) = Chi : total:m49_2, partial:m49_7 +# 49| valnum = unique +# 49| r49_9(glval) = VariableAddress[chars] : +# 49| valnum = r49_9 +# 49| m49_10(char *) = InitializeParameter[chars] : &:r49_9 +# 49| valnum = m49_10 +# 49| r49_11(char *) = Load : &:r49_9, m49_10 +# 49| valnum = m49_10 +# 49| m49_12(unknown) = InitializeIndirection[chars] : &:r49_11 +# 49| valnum = unique +# 49| m49_13(unknown) = Chi : total:m49_8, partial:m49_12 +# 49| valnum = unique +# 50| r50_1(glval) = VariableAddress[ptr] : # 50| valnum = r50_1 -# 50| m50_2(char *) = Uninitialized[ptr] : &:r50_1 +# 50| m50_2(char *) = Uninitialized[ptr] : &:r50_1 # 50| valnum = unique -# 51| r51_1(glval) = VariableAddress[result] : +# 51| r51_1(glval) = VariableAddress[result] : # 51| valnum = r51_1 -# 51| r51_2(unsigned int) = Constant[0] : +# 51| r51_2(unsigned int) = Constant[0] : # 51| valnum = r51_2 -# 51| m51_3(unsigned int) = Store : &:r51_1, r51_2 +# 51| m51_3(unsigned int) = Store : &:r51_1, r51_2 # 51| valnum = r51_2 #-----| Goto -> Block 1 @@ -376,7 +395,7 @@ test.cpp: # 53| valnum = r49_4 # 53| r53_3(char *) = Load : &:r53_2, m49_5 # 53| valnum = m49_5 -# 53| r53_4(char) = Load : &:r53_3, ~m49_2 +# 53| r53_4(char) = Load : &:r53_3, ~m49_13 # 53| valnum = unique # 53| r53_5(int) = Convert : r53_4 # 53| valnum = unique @@ -390,13 +409,13 @@ test.cpp: # 55| Block 2 # 55| r55_1(glval) = VariableAddress[chars] : -# 55| valnum = r49_6 -# 55| r55_2(char *) = Load : &:r55_1, m49_7 -# 55| valnum = m49_7 +# 55| valnum = r49_9 +# 55| r55_2(char *) = Load : &:r55_1, m49_10 +# 55| valnum = m49_10 # 55| r55_3(glval) = VariableAddress[ptr] : # 55| valnum = r50_1 # 55| m55_4(char *) = Store : &:r55_3, r55_2 -# 55| valnum = m49_7 +# 55| valnum = m49_10 #-----| Goto -> Block 3 # 56| Block 3 @@ -406,7 +425,7 @@ test.cpp: # 56| valnum = r50_1 # 56| r56_3(char *) = Load : &:r56_2, m56_1 # 56| valnum = m56_1 -# 56| r56_4(char) = Load : &:r56_3, ~m49_2 +# 56| r56_4(char) = Load : &:r56_3, ~m49_13 # 56| valnum = unique # 56| r56_5(int) = Convert : r56_4 # 56| valnum = unique @@ -414,7 +433,7 @@ test.cpp: # 56| valnum = r49_4 # 56| r56_7(char *) = Load : &:r56_6, m49_5 # 56| valnum = m49_5 -# 56| r56_8(char) = Load : &:r56_7, ~m49_2 +# 56| r56_8(char) = Load : &:r56_7, ~m49_13 # 56| valnum = unique # 56| r56_9(int) = Convert : r56_8 # 56| valnum = unique @@ -429,7 +448,7 @@ test.cpp: # 56| valnum = r50_1 # 56| r56_13(char *) = Load : &:r56_12, m56_1 # 56| valnum = m56_1 -# 56| r56_14(char) = Load : &:r56_13, ~m49_2 +# 56| r56_14(char) = Load : &:r56_13, ~m49_13 # 56| valnum = unique # 56| r56_15(int) = Convert : r56_14 # 56| valnum = unique @@ -459,7 +478,7 @@ test.cpp: # 59| valnum = r50_1 # 59| r59_2(char *) = Load : &:r59_1, m56_1 # 59| valnum = m56_1 -# 59| r59_3(char) = Load : &:r59_2, ~m49_2 +# 59| r59_3(char) = Load : &:r59_2, ~m49_13 # 59| valnum = unique # 59| r59_4(int) = Convert : r59_3 # 59| valnum = unique @@ -489,78 +508,86 @@ test.cpp: #-----| Goto (back edge) -> Block 1 # 63| Block 9 -# 63| v63_1(void) = NoOp : -# 65| r65_1(glval) = VariableAddress[#return] : +# 63| v63_1(void) = NoOp : +# 65| r65_1(glval) = VariableAddress[#return] : # 65| valnum = r65_1 -# 65| r65_2(glval) = VariableAddress[result] : +# 65| r65_2(glval) = VariableAddress[result] : # 65| valnum = r51_1 -# 65| r65_3(unsigned int) = Load : &:r65_2, m53_1 +# 65| r65_3(unsigned int) = Load : &:r65_2, m53_1 # 65| valnum = m53_1 -# 65| m65_4(unsigned int) = Store : &:r65_1, r65_3 +# 65| m65_4(unsigned int) = Store : &:r65_1, r65_3 # 65| valnum = m53_1 -# 49| r49_8(glval) = VariableAddress[#return] : +# 49| v49_14(void) = ReturnIndirection : &:r49_6, ~m49_13 +# 49| v49_15(void) = ReturnIndirection : &:r49_11, ~m49_13 +# 49| r49_16(glval) = VariableAddress[#return] : # 49| valnum = r65_1 -# 49| v49_9(void) = ReturnValue : &:r49_8, m65_4 -# 49| v49_10(void) = UnmodeledUse : mu* -# 49| v49_11(void) = AliasedUse : ~m49_2 -# 49| v49_12(void) = ExitFunction : +# 49| v49_17(void) = ReturnValue : &:r49_16, m65_4 +# 49| v49_18(void) = UnmodeledUse : mu* +# 49| v49_19(void) = AliasedUse : ~m49_13 +# 49| v49_20(void) = ExitFunction : # 75| void test04(two_values*) # 75| Block 0 -# 75| v75_1(void) = EnterFunction : -# 75| m75_2(unknown) = AliasedDefinition : +# 75| v75_1(void) = EnterFunction : +# 75| m75_2(unknown) = AliasedDefinition : # 75| valnum = unique -# 75| mu75_3(unknown) = UnmodeledDefinition : +# 75| mu75_3(unknown) = UnmodeledDefinition : # 75| valnum = unique -# 75| r75_4(glval) = VariableAddress[vals] : +# 75| r75_4(glval) = VariableAddress[vals] : # 75| valnum = r75_4 -# 75| m75_5(two_values *) = InitializeParameter[vals] : &:r75_4 +# 75| m75_5(two_values *) = InitializeParameter[vals] : &:r75_4 +# 75| valnum = m75_5 +# 75| r75_6(two_values *) = Load : &:r75_4, m75_5 # 75| valnum = m75_5 -# 77| r77_1(glval) = VariableAddress[v] : +# 75| m75_7(unknown) = InitializeIndirection[vals] : &:r75_6 +# 75| valnum = unique +# 75| m75_8(unknown) = Chi : total:m75_2, partial:m75_7 +# 75| valnum = unique +# 77| r77_1(glval) = VariableAddress[v] : # 77| valnum = r77_1 -# 77| r77_2(glval) = FunctionAddress[getAValue] : +# 77| r77_2(glval) = FunctionAddress[getAValue] : # 77| valnum = unique -# 77| r77_3(int) = Call : func:r77_2 +# 77| r77_3(int) = Call : func:r77_2 # 77| valnum = unique -# 77| m77_4(unknown) = ^CallSideEffect : ~m75_2 +# 77| m77_4(unknown) = ^CallSideEffect : ~m75_8 # 77| valnum = unique -# 77| m77_5(unknown) = Chi : total:m75_2, partial:m77_4 +# 77| m77_5(unknown) = Chi : total:m75_8, partial:m77_4 # 77| valnum = unique -# 77| r77_6(signed short) = Convert : r77_3 +# 77| r77_6(signed short) = Convert : r77_3 # 77| valnum = r77_6 -# 77| m77_7(signed short) = Store : &:r77_1, r77_6 +# 77| m77_7(signed short) = Store : &:r77_1, r77_6 # 77| valnum = r77_6 -# 79| r79_1(glval) = VariableAddress[v] : +# 79| r79_1(glval) = VariableAddress[v] : # 79| valnum = r77_1 -# 79| r79_2(signed short) = Load : &:r79_1, m77_7 +# 79| r79_2(signed short) = Load : &:r79_1, m77_7 # 79| valnum = r77_6 -# 79| r79_3(int) = Convert : r79_2 +# 79| r79_3(int) = Convert : r79_2 # 79| valnum = unique -# 79| r79_4(glval) = VariableAddress[vals] : +# 79| r79_4(glval) = VariableAddress[vals] : # 79| valnum = r75_4 -# 79| r79_5(two_values *) = Load : &:r79_4, m75_5 +# 79| r79_5(two_values *) = Load : &:r79_4, m75_5 # 79| valnum = m75_5 -# 79| r79_6(glval) = FieldAddress[val1] : r79_5 +# 79| r79_6(glval) = FieldAddress[val1] : r79_5 # 79| valnum = unique -# 79| r79_7(signed short) = Load : &:r79_6, ~m77_5 +# 79| r79_7(signed short) = Load : &:r79_6, ~m77_5 # 79| valnum = unique -# 79| r79_8(int) = Convert : r79_7 +# 79| r79_8(int) = Convert : r79_7 # 79| valnum = unique -# 79| r79_9(glval) = VariableAddress[vals] : +# 79| r79_9(glval) = VariableAddress[vals] : # 79| valnum = r75_4 -# 79| r79_10(two_values *) = Load : &:r79_9, m75_5 +# 79| r79_10(two_values *) = Load : &:r79_9, m75_5 # 79| valnum = m75_5 -# 79| r79_11(glval) = FieldAddress[val2] : r79_10 +# 79| r79_11(glval) = FieldAddress[val2] : r79_10 # 79| valnum = unique -# 79| r79_12(signed short) = Load : &:r79_11, ~m77_5 +# 79| r79_12(signed short) = Load : &:r79_11, ~m77_5 # 79| valnum = unique -# 79| r79_13(int) = Convert : r79_12 +# 79| r79_13(int) = Convert : r79_12 # 79| valnum = unique -# 79| r79_14(int) = Add : r79_8, r79_13 +# 79| r79_14(int) = Add : r79_8, r79_13 # 79| valnum = unique -# 79| r79_15(bool) = CompareLT : r79_3, r79_14 +# 79| r79_15(bool) = CompareLT : r79_3, r79_14 # 79| valnum = unique -# 79| v79_16(void) = ConditionalBranch : r79_15 +# 79| v79_16(void) = ConditionalBranch : r79_15 #-----| False -> Block 2 #-----| True -> Block 1 @@ -582,87 +609,95 @@ test.cpp: #-----| Goto -> Block 2 # 82| Block 2 -# 82| m82_1(unknown) = Phi : from 0:~m77_5, from 1:~m80_4 +# 82| m82_1(unknown) = Phi : from 0:~m77_5, from 1:~m80_4 # 82| valnum = unique -# 82| v82_2(void) = NoOp : -# 75| v75_6(void) = ReturnVoid : -# 75| v75_7(void) = UnmodeledUse : mu* -# 75| v75_8(void) = AliasedUse : ~m82_1 -# 75| v75_9(void) = ExitFunction : +# 82| v82_2(void) = NoOp : +# 75| v75_9(void) = ReturnIndirection : &:r75_6, ~m82_1 +# 75| v75_10(void) = ReturnVoid : +# 75| v75_11(void) = UnmodeledUse : mu* +# 75| v75_12(void) = AliasedUse : ~m82_1 +# 75| v75_13(void) = ExitFunction : # 84| void test05(int, int, void*) # 84| Block 0 -# 84| v84_1(void) = EnterFunction : -# 84| m84_2(unknown) = AliasedDefinition : +# 84| v84_1(void) = EnterFunction : +# 84| m84_2(unknown) = AliasedDefinition : # 84| valnum = unique -# 84| mu84_3(unknown) = UnmodeledDefinition : +# 84| mu84_3(unknown) = UnmodeledDefinition : # 84| valnum = unique -# 84| r84_4(glval) = VariableAddress[x] : +# 84| r84_4(glval) = VariableAddress[x] : # 84| valnum = r84_4 -# 84| m84_5(int) = InitializeParameter[x] : &:r84_4 +# 84| m84_5(int) = InitializeParameter[x] : &:r84_4 # 84| valnum = m84_5 -# 84| r84_6(glval) = VariableAddress[y] : +# 84| r84_6(glval) = VariableAddress[y] : # 84| valnum = r84_6 -# 84| m84_7(int) = InitializeParameter[y] : &:r84_6 +# 84| m84_7(int) = InitializeParameter[y] : &:r84_6 # 84| valnum = m84_7 -# 84| r84_8(glval) = VariableAddress[p] : +# 84| r84_8(glval) = VariableAddress[p] : # 84| valnum = r84_8 -# 84| m84_9(void *) = InitializeParameter[p] : &:r84_8 +# 84| m84_9(void *) = InitializeParameter[p] : &:r84_8 # 84| valnum = m84_9 -# 86| r86_1(glval) = VariableAddress[v] : +# 84| r84_10(void *) = Load : &:r84_8, m84_9 +# 84| valnum = m84_9 +# 84| m84_11(unknown) = InitializeIndirection[p] : &:r84_10 +# 84| valnum = unique +# 84| m84_12(unknown) = Chi : total:m84_2, partial:m84_11 +# 84| valnum = unique +# 86| r86_1(glval) = VariableAddress[v] : # 86| valnum = r86_1 -# 86| m86_2(int) = Uninitialized[v] : &:r86_1 +# 86| m86_2(int) = Uninitialized[v] : &:r86_1 # 86| valnum = unique -# 88| r88_1(glval) = VariableAddress[p] : +# 88| r88_1(glval) = VariableAddress[p] : # 88| valnum = r84_8 -# 88| r88_2(void *) = Load : &:r88_1, m84_9 +# 88| r88_2(void *) = Load : &:r88_1, m84_9 # 88| valnum = m84_9 -# 88| r88_3(void *) = Constant[0] : +# 88| r88_3(void *) = Constant[0] : # 88| valnum = unique -# 88| r88_4(bool) = CompareNE : r88_2, r88_3 +# 88| r88_4(bool) = CompareNE : r88_2, r88_3 # 88| valnum = unique -# 88| v88_5(void) = ConditionalBranch : r88_4 -#-----| False -> Block 2 -#-----| True -> Block 1 +# 88| v88_5(void) = ConditionalBranch : r88_4 +#-----| False -> Block 3 +#-----| True -> Block 2 # 88| Block 1 -# 88| r88_6(glval) = VariableAddress[x] : +# 88| m88_6(int) = Phi : from 2:m88_14, from 3:m88_18 +# 88| valnum = m88_6 +# 88| r88_7(glval) = VariableAddress[#temp88:7] : +# 88| valnum = r88_7 +# 88| r88_8(int) = Load : &:r88_7, m88_6 +# 88| valnum = m88_6 +# 88| r88_9(glval) = VariableAddress[v] : +# 88| valnum = r86_1 +# 88| m88_10(int) = Store : &:r88_9, r88_8 +# 88| valnum = m88_6 +# 89| v89_1(void) = NoOp : +# 84| v84_13(void) = ReturnIndirection : &:r84_10, ~m84_12 +# 84| v84_14(void) = ReturnVoid : +# 84| v84_15(void) = UnmodeledUse : mu* +# 84| v84_16(void) = AliasedUse : ~m84_12 +# 84| v84_17(void) = ExitFunction : + +# 88| Block 2 +# 88| r88_11(glval) = VariableAddress[x] : # 88| valnum = r84_4 -# 88| r88_7(int) = Load : &:r88_6, m84_5 +# 88| r88_12(int) = Load : &:r88_11, m84_5 # 88| valnum = m84_5 -# 88| r88_8(glval) = VariableAddress[#temp88:7] : -# 88| valnum = r88_8 -# 88| m88_9(int) = Store : &:r88_8, r88_7 +# 88| r88_13(glval) = VariableAddress[#temp88:7] : +# 88| valnum = r88_7 +# 88| m88_14(int) = Store : &:r88_13, r88_12 # 88| valnum = m84_5 -#-----| Goto -> Block 3 +#-----| Goto -> Block 1 -# 88| Block 2 -# 88| r88_10(glval) = VariableAddress[y] : +# 88| Block 3 +# 88| r88_15(glval) = VariableAddress[y] : # 88| valnum = r84_6 -# 88| r88_11(int) = Load : &:r88_10, m84_7 +# 88| r88_16(int) = Load : &:r88_15, m84_7 # 88| valnum = m84_7 -# 88| r88_12(glval) = VariableAddress[#temp88:7] : -# 88| valnum = r88_8 -# 88| m88_13(int) = Store : &:r88_12, r88_11 -# 88| valnum = m84_7 -#-----| Goto -> Block 3 - -# 88| Block 3 -# 88| m88_14(int) = Phi : from 1:m88_9, from 2:m88_13 -# 88| valnum = m88_14 -# 88| r88_15(glval) = VariableAddress[#temp88:7] : -# 88| valnum = r88_8 -# 88| r88_16(int) = Load : &:r88_15, m88_14 -# 88| valnum = m88_14 -# 88| r88_17(glval) = VariableAddress[v] : -# 88| valnum = r86_1 +# 88| r88_17(glval) = VariableAddress[#temp88:7] : +# 88| valnum = r88_7 # 88| m88_18(int) = Store : &:r88_17, r88_16 -# 88| valnum = m88_14 -# 89| v89_1(void) = NoOp : -# 84| v84_10(void) = ReturnVoid : -# 84| v84_11(void) = UnmodeledUse : mu* -# 84| v84_12(void) = AliasedUse : ~m84_2 -# 84| v84_13(void) = ExitFunction : +# 88| valnum = m84_7 +#-----| Goto -> Block 1 # 91| int regression_test00() # 91| Block 0 @@ -709,6 +744,12 @@ test.cpp: # 104| valnum = r104_4 # 104| m104_5(Derived *) = InitializeParameter[pd] : &:r104_4 # 104| valnum = m104_5 +# 104| r104_6(Derived *) = Load : &:r104_4, m104_5 +# 104| valnum = m104_5 +# 104| m104_7(unknown) = InitializeIndirection[pd] : &:r104_6 +# 104| valnum = unique +# 104| m104_8(unknown) = Chi : total:m104_2, partial:m104_7 +# 104| valnum = unique # 105| r105_1(glval) = VariableAddress[x] : # 105| valnum = unique # 105| r105_2(glval) = VariableAddress[pd] : @@ -719,7 +760,7 @@ test.cpp: # 105| valnum = r105_4 # 105| r105_5(glval) = FieldAddress[b] : r105_4 # 105| valnum = r105_5 -# 105| r105_6(int) = Load : &:r105_5, ~m104_2 +# 105| r105_6(int) = Load : &:r105_5, ~m104_8 # 105| valnum = r105_6 # 105| m105_7(int) = Store : &:r105_1, r105_6 # 105| valnum = r105_6 @@ -741,7 +782,7 @@ test.cpp: # 107| valnum = r105_4 # 107| r107_4(glval) = FieldAddress[b] : r107_3 # 107| valnum = r105_5 -# 107| r107_5(int) = Load : &:r107_4, ~m104_2 +# 107| r107_5(int) = Load : &:r107_4, ~m104_8 # 107| valnum = r107_5 # 107| m107_6(int) = Store : &:r107_1, r107_5 # 107| valnum = r107_5 @@ -753,12 +794,13 @@ test.cpp: # 109| valnum = r107_5 # 109| m109_4(int) = Store : &:r109_1, r109_3 # 109| valnum = r107_5 -# 104| r104_6(glval) = VariableAddress[#return] : +# 104| v104_9(void) = ReturnIndirection : &:r104_6, ~m104_8 +# 104| r104_10(glval) = VariableAddress[#return] : # 104| valnum = r109_1 -# 104| v104_7(void) = ReturnValue : &:r104_6, m109_4 -# 104| v104_8(void) = UnmodeledUse : mu* -# 104| v104_9(void) = AliasedUse : ~m104_2 -# 104| v104_10(void) = ExitFunction : +# 104| v104_11(void) = ReturnValue : &:r104_10, m109_4 +# 104| v104_12(void) = UnmodeledUse : mu* +# 104| v104_13(void) = AliasedUse : ~m104_8 +# 104| v104_14(void) = ExitFunction : # 112| void test06() # 112| Block 0 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 0e4f800bb1bf..edbec38d5b93 100644 --- a/csharp/ql/src/semmle/code/csharp/ir/implementation/Opcode.qll +++ b/csharp/ql/src/semmle/code/csharp/ir/implementation/Opcode.qll @@ -3,11 +3,13 @@ private newtype TOpcode = TUninitialized() or TError() or TInitializeParameter() or + TInitializeIndirection() or TInitializeThis() or TEnterFunction() or TExitFunction() or TReturnValue() or TReturnVoid() or + TReturnIndirection() or TCopyValue() or TLoad() or TStore() or @@ -180,6 +182,10 @@ module Opcode { final override string toString() { result = "InitializeParameter" } } + class InitializeIndirection extends MemoryAccessOpcode, TInitializeIndirection { + final override string toString() { result = "InitializeIndirection" } + } + class InitializeThis extends Opcode, TInitializeThis { final override string toString() { result = "InitializeThis" } } @@ -200,6 +206,10 @@ module Opcode { final override string toString() { result = "ReturnVoid" } } + class ReturnIndirection extends MemoryAccessOpcode, TReturnIndirection { + final override string toString() { result = "ReturnIndirection" } + } + class CopyValue extends UnaryOpcode, CopyOpcode, TCopyValue { final override string toString() { result = "CopyValue" } } 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 241de4406e84..b4e4e7c060c2 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 @@ -51,6 +51,7 @@ module InstructionSanity { opcode instanceof ReadSideEffectOpcode or opcode instanceof Opcode::InlineAsm or opcode instanceof Opcode::CallSideEffect or + opcode instanceof Opcode::ReturnIndirection or opcode instanceof Opcode::AliasedUse ) and tag instanceof SideEffectOperandTag @@ -713,6 +714,14 @@ class InitializeParameterInstruction extends VariableInstruction { final override MemoryAccessKind getResultMemoryAccess() { result instanceof IndirectMemoryAccess } } +class InitializeIndirectionInstruction extends VariableInstruction { + InitializeIndirectionInstruction() { getOpcode() instanceof Opcode::InitializeIndirection } + + final Language::Parameter getParameter() { result = var.(IRUserVariable).getVariable() } + + final override MemoryAccessKind getResultMemoryAccess() { result instanceof IndirectMemoryAccess } +} + /** * An instruction that initializes the `this` pointer parameter of the enclosing function. */ @@ -773,6 +782,18 @@ class ReturnValueInstruction extends ReturnInstruction { final Instruction getReturnValue() { result = getReturnValueOperand().getDef() } } +class ReturnIndirectionInstruction extends Instruction { + ReturnIndirectionInstruction() { getOpcode() instanceof Opcode::ReturnIndirection } + + final SideEffectOperand getSideEffectOperand() { result = getAnOperand() } + + final Instruction getSideEffect() { result = getSideEffectOperand().getDef() } + + final AddressOperand getSourceAddressOperand() { result = getAnOperand() } + + final Instruction getSourceAddress() { result = getSourceAddressOperand().getDef() } +} + class CopyInstruction extends Instruction { CopyInstruction() { getOpcode() instanceof CopyOpcode } 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 eaa9f20e66b4..e0e517620168 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 @@ -410,6 +410,9 @@ class SideEffectOperand extends TypedOperand { or useInstr instanceof BufferMayWriteSideEffectInstruction and result instanceof BufferMemoryAccess + or + useInstr instanceof ReturnIndirectionInstruction and + result instanceof BufferMemoryAccess } final override predicate hasMayMemoryAccess() { 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 241de4406e84..b4e4e7c060c2 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 @@ -51,6 +51,7 @@ module InstructionSanity { opcode instanceof ReadSideEffectOpcode or opcode instanceof Opcode::InlineAsm or opcode instanceof Opcode::CallSideEffect or + opcode instanceof Opcode::ReturnIndirection or opcode instanceof Opcode::AliasedUse ) and tag instanceof SideEffectOperandTag @@ -713,6 +714,14 @@ class InitializeParameterInstruction extends VariableInstruction { final override MemoryAccessKind getResultMemoryAccess() { result instanceof IndirectMemoryAccess } } +class InitializeIndirectionInstruction extends VariableInstruction { + InitializeIndirectionInstruction() { getOpcode() instanceof Opcode::InitializeIndirection } + + final Language::Parameter getParameter() { result = var.(IRUserVariable).getVariable() } + + final override MemoryAccessKind getResultMemoryAccess() { result instanceof IndirectMemoryAccess } +} + /** * An instruction that initializes the `this` pointer parameter of the enclosing function. */ @@ -773,6 +782,18 @@ class ReturnValueInstruction extends ReturnInstruction { final Instruction getReturnValue() { result = getReturnValueOperand().getDef() } } +class ReturnIndirectionInstruction extends Instruction { + ReturnIndirectionInstruction() { getOpcode() instanceof Opcode::ReturnIndirection } + + final SideEffectOperand getSideEffectOperand() { result = getAnOperand() } + + final Instruction getSideEffect() { result = getSideEffectOperand().getDef() } + + final AddressOperand getSourceAddressOperand() { result = getAnOperand() } + + final Instruction getSourceAddress() { result = getSourceAddressOperand().getDef() } +} + class CopyInstruction extends Instruction { CopyInstruction() { getOpcode() instanceof CopyOpcode } 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 eaa9f20e66b4..e0e517620168 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 @@ -410,6 +410,9 @@ class SideEffectOperand extends TypedOperand { or useInstr instanceof BufferMayWriteSideEffectInstruction and result instanceof BufferMemoryAccess + or + useInstr instanceof ReturnIndirectionInstruction and + result instanceof BufferMemoryAccess } final override predicate hasMayMemoryAccess() {