Merge pull request #2154 from rdmarsh2/rdmarsh/cpp/ir-callee-side-effects

C++: add InitializeIndirection for pointer params
This commit is contained in:
Dave Bartolomeo
2019-12-20 13:13:54 -07:00
committed by GitHub
27 changed files with 1446 additions and 971 deletions

View File

@@ -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" }
}

View File

@@ -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 }

View File

@@ -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() {

View File

@@ -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
}

View File

@@ -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 }

View File

@@ -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() {

View File

@@ -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"

View File

@@ -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 |

View File

@@ -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()
}
}

View File

@@ -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 }

View File

@@ -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() {

View File

@@ -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
}

View File

@@ -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 |

View File

@@ -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 |

File diff suppressed because it is too large Load Diff

View File

@@ -6,12 +6,15 @@ ssa.cpp:
# 13| mu13_3(unknown) = UnmodeledDefinition :
# 13| r13_4(glval<Point *>) = VariableAddress[p] :
# 13| m13_5(Point *) = InitializeParameter[p] : &:r13_4
# 13| r13_6(glval<bool>) = VariableAddress[which1] :
# 13| m13_7(bool) = InitializeParameter[which1] : &:r13_6
# 13| r13_8(glval<bool>) = 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<bool>) = VariableAddress[which1] :
# 13| m13_10(bool) = InitializeParameter[which1] : &:r13_9
# 13| r13_11(glval<bool>) = VariableAddress[which2] :
# 13| m13_12(bool) = InitializeParameter[which2] : &:r13_11
# 14| r14_1(glval<bool>) = 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<Point *>) = VariableAddress[p] :
# 15| r15_2(Point *) = Load : &:r15_1, m13_5
# 15| r15_3(glval<int>) = 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<Point *>) = VariableAddress[p] :
# 18| r18_2(Point *) = Load : &:r18_1, m13_5
# 18| r18_3(glval<int>) = 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<bool>) = 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<int>) = 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<int>) = 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<int>) = VariableAddress[n] :
# 68| m68_5(int) = InitializeParameter[n] : &:r68_4
# 68| r68_6(glval<char *>) = 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<int>) = VariableAddress[n] :
# 68| m68_5(int) = InitializeParameter[n] : &:r68_4
# 68| r68_6(glval<char *>) = 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<int>) = 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<int *>) = 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<int>) = VariableAddress[#return] :
# 181| r181_2(glval<int *>) = 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<int>) = 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<int>) = 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<unsigned int &>) = VariableAddress[a] :
# 184| m184_5(unsigned int &) = InitializeParameter[a] : &:r184_4
# 184| r184_6(glval<unsigned int &>) = VariableAddress[b] :
# 184| m184_7(unsigned int &) = InitializeParameter[b] : &:r184_6
# 184| r184_8(glval<unsigned int &>) = VariableAddress[c] :
# 184| m184_9(unsigned int &) = InitializeParameter[c] : &:r184_8
# 184| r184_10(glval<unsigned int &>) = VariableAddress[d] :
# 184| m184_11(unsigned int &) = InitializeParameter[d] : &:r184_10
# 189| r189_1(glval<unsigned int &>) = VariableAddress[a] :
# 189| r189_2(unsigned int &) = Load : &:r189_1, m184_5
# 189| r189_3(glval<unsigned int>) = CopyValue : r189_2
# 189| r189_4(glval<unsigned int &>) = VariableAddress[b] :
# 189| r189_5(unsigned int &) = Load : &:r189_4, m184_7
# 189| r189_6(glval<unsigned int>) = CopyValue : r189_5
# 190| r190_1(glval<unsigned int &>) = 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<unsigned int &>) = 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<unsigned int &>) = 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<unsigned int &>) = 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<unsigned int &>) = 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<unsigned int &>) = 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<unsigned int &>) = VariableAddress[a] :
# 189| r189_2(unsigned int &) = Load : &:r189_1, m184_5
# 189| r189_3(glval<unsigned int>) = CopyValue : r189_2
# 189| r189_4(glval<unsigned int &>) = VariableAddress[b] :
# 189| r189_5(unsigned int &) = Load : &:r189_4, m184_10
# 189| r189_6(glval<unsigned int>) = CopyValue : r189_5
# 190| r190_1(glval<unsigned int &>) = 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<unsigned int &>) = 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<char *>) = VariableAddress[str1] :
# 198| m198_5(char *) = InitializeParameter[str1] : &:r198_4
# 198| r198_6(glval<char *>) = VariableAddress[str2] :
# 198| m198_7(char *) = InitializeParameter[str2] : &:r198_6
# 198| r198_8(glval<int>) = VariableAddress[x] :
# 198| m198_9(int) = InitializeParameter[x] : &:r198_8
# 199| r199_1(glval<int>) = VariableAddress[ret] :
# 199| r199_2(glval<unknown>) = FunctionAddress[strcmp] :
# 199| r199_3(glval<char *>) = VariableAddress[str1] :
# 199| r199_4(char *) = Load : &:r199_3, m198_5
# 199| r199_5(char *) = Convert : r199_4
# 199| r199_6(glval<char *>) = 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<unknown>) = FunctionAddress[strlen] :
# 200| r200_2(glval<char *>) = 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<int>) = 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<unknown>) = FunctionAddress[abs] :
# 201| r201_2(glval<int>) = 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<int>) = 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<int>) = VariableAddress[#return] :
# 202| r202_2(glval<int>) = VariableAddress[ret] :
# 202| r202_3(int) = Load : &:r202_2, m201_8
# 202| m202_4(int) = Store : &:r202_1, r202_3
# 198| r198_10(glval<int>) = 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<char *>) = 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<char *>) = 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<int>) = VariableAddress[x] :
# 198| m198_15(int) = InitializeParameter[x] : &:r198_14
# 199| r199_1(glval<int>) = VariableAddress[ret] :
# 199| r199_2(glval<unknown>) = FunctionAddress[strcmp] :
# 199| r199_3(glval<char *>) = VariableAddress[str1] :
# 199| r199_4(char *) = Load : &:r199_3, m198_5
# 199| r199_5(char *) = Convert : r199_4
# 199| r199_6(glval<char *>) = 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<unknown>) = FunctionAddress[strlen] :
# 200| r200_2(glval<char *>) = 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<int>) = 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<unknown>) = FunctionAddress[abs] :
# 201| r201_2(glval<int>) = 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<int>) = 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<int>) = VariableAddress[#return] :
# 202| r202_2(glval<int>) = 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<int>) = 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

View File

@@ -6,12 +6,14 @@ ssa.cpp:
# 13| mu13_3(unknown) = UnmodeledDefinition :
# 13| r13_4(glval<Point *>) = VariableAddress[p] :
# 13| m13_5(Point *) = InitializeParameter[p] : &:r13_4
# 13| r13_6(glval<bool>) = VariableAddress[which1] :
# 13| m13_7(bool) = InitializeParameter[which1] : &:r13_6
# 13| r13_8(glval<bool>) = 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<bool>) = VariableAddress[which1] :
# 13| m13_9(bool) = InitializeParameter[which1] : &:r13_8
# 13| r13_10(glval<bool>) = VariableAddress[which2] :
# 13| m13_11(bool) = InitializeParameter[which2] : &:r13_10
# 14| r14_1(glval<bool>) = 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<bool>) = 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<int>) = 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<int>) = 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<int>) = VariableAddress[n] :
# 68| m68_5(int) = InitializeParameter[n] : &:r68_4
# 68| r68_6(glval<char *>) = 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<int>) = VariableAddress[n] :
# 68| m68_5(int) = InitializeParameter[n] : &:r68_4
# 68| r68_6(glval<char *>) = 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<int *>) = 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<int>) = VariableAddress[#return] :
# 181| r181_2(glval<int *>) = 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<int>) = 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<int>) = 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<unsigned int &>) = VariableAddress[a] :
# 184| m184_5(unsigned int &) = InitializeParameter[a] : &:r184_4
# 184| r184_6(glval<unsigned int &>) = VariableAddress[b] :
# 184| m184_7(unsigned int &) = InitializeParameter[b] : &:r184_6
# 184| r184_8(glval<unsigned int &>) = VariableAddress[c] :
# 184| m184_9(unsigned int &) = InitializeParameter[c] : &:r184_8
# 184| r184_10(glval<unsigned int &>) = VariableAddress[d] :
# 184| m184_11(unsigned int &) = InitializeParameter[d] : &:r184_10
# 189| r189_1(glval<unsigned int &>) = VariableAddress[a] :
# 189| r189_2(unsigned int &) = Load : &:r189_1, m184_5
# 189| r189_3(glval<unsigned int>) = CopyValue : r189_2
# 189| r189_4(glval<unsigned int &>) = VariableAddress[b] :
# 189| r189_5(unsigned int &) = Load : &:r189_4, m184_7
# 189| r189_6(glval<unsigned int>) = CopyValue : r189_5
# 190| r190_1(glval<unsigned int &>) = 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<unsigned int &>) = 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<unsigned int &>) = 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<unsigned int &>) = 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<unsigned int &>) = 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<unsigned int &>) = 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<unsigned int &>) = VariableAddress[a] :
# 189| r189_2(unsigned int &) = Load : &:r189_1, m184_5
# 189| r189_3(glval<unsigned int>) = CopyValue : r189_2
# 189| r189_4(glval<unsigned int &>) = VariableAddress[b] :
# 189| r189_5(unsigned int &) = Load : &:r189_4, m184_9
# 189| r189_6(glval<unsigned int>) = CopyValue : r189_5
# 190| r190_1(glval<unsigned int &>) = 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<unsigned int &>) = 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<char *>) = VariableAddress[str1] :
# 198| m198_5(char *) = InitializeParameter[str1] : &:r198_4
# 198| r198_6(glval<char *>) = VariableAddress[str2] :
# 198| m198_7(char *) = InitializeParameter[str2] : &:r198_6
# 198| r198_8(glval<int>) = VariableAddress[x] :
# 198| m198_9(int) = InitializeParameter[x] : &:r198_8
# 199| r199_1(glval<int>) = VariableAddress[ret] :
# 199| r199_2(glval<unknown>) = FunctionAddress[strcmp] :
# 199| r199_3(glval<char *>) = VariableAddress[str1] :
# 199| r199_4(char *) = Load : &:r199_3, m198_5
# 199| r199_5(char *) = Convert : r199_4
# 199| r199_6(glval<char *>) = 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<unknown>) = FunctionAddress[strlen] :
# 200| r200_2(glval<char *>) = 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<int>) = 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<unknown>) = FunctionAddress[abs] :
# 201| r201_2(glval<int>) = 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<int>) = 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<int>) = VariableAddress[#return] :
# 202| r202_2(glval<int>) = VariableAddress[ret] :
# 202| r202_3(int) = Load : &:r202_2, m201_8
# 202| m202_4(int) = Store : &:r202_1, r202_3
# 198| r198_10(glval<int>) = 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<char *>) = 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<char *>) = 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<int>) = VariableAddress[x] :
# 198| m198_13(int) = InitializeParameter[x] : &:r198_12
# 199| r199_1(glval<int>) = VariableAddress[ret] :
# 199| r199_2(glval<unknown>) = FunctionAddress[strcmp] :
# 199| r199_3(glval<char *>) = VariableAddress[str1] :
# 199| r199_4(char *) = Load : &:r199_3, m198_5
# 199| r199_5(char *) = Convert : r199_4
# 199| r199_6(glval<char *>) = 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<unknown>) = FunctionAddress[strlen] :
# 200| r200_2(glval<char *>) = 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<int>) = 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<unknown>) = FunctionAddress[abs] :
# 201| r201_2(glval<int>) = 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<int>) = 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<int>) = VariableAddress[#return] :
# 202| r202_2(glval<int>) = 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<int>) = 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

View File

@@ -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 |

View File

@@ -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 |

View File

@@ -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, 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

View File

@@ -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 |

View File

@@ -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<int>) = 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<int>) = 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<int>) = 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<int>) = VariableAddress[#return] :
# 39| v39_13(void) = ReturnIndirection : &:r39_10, ~m44_6
# 39| r39_14(glval<int>) = 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<char *>) = VariableAddress[str] :
# 49| r49_4(glval<char *>) = 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<char *>) = VariableAddress[chars] :
# 49| valnum = r49_6
# 49| m49_7(char *) = InitializeParameter[chars] : &:r49_6
# 49| valnum = m49_7
# 50| r50_1(glval<char *>) = 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<char *>) = 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<char *>) = 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<unsigned int>) = VariableAddress[result] :
# 51| r51_1(glval<unsigned int>) = 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<char *>) = 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<char *>) = 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<unsigned int>) = VariableAddress[#return] :
# 63| v63_1(void) = NoOp :
# 65| r65_1(glval<unsigned int>) = VariableAddress[#return] :
# 65| valnum = r65_1
# 65| r65_2(glval<unsigned int>) = VariableAddress[result] :
# 65| r65_2(glval<unsigned int>) = 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<unsigned int>) = VariableAddress[#return] :
# 49| v49_14(void) = ReturnIndirection : &:r49_6, ~m49_13
# 49| v49_15(void) = ReturnIndirection : &:r49_11, ~m49_13
# 49| r49_16(glval<unsigned int>) = 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<two_values *>) = VariableAddress[vals] :
# 75| r75_4(glval<two_values *>) = 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
# 77| r77_1(glval<signed short>) = VariableAddress[v] :
# 75| r75_6(two_values *) = Load : &:r75_4, m75_5
# 75| valnum = m75_5
# 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<signed short>) = VariableAddress[v] :
# 77| valnum = r77_1
# 77| r77_2(glval<unknown>) = FunctionAddress[getAValue] :
# 77| r77_2(glval<unknown>) = 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<signed short>) = VariableAddress[v] :
# 79| r79_1(glval<signed short>) = 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<two_values *>) = VariableAddress[vals] :
# 79| r79_4(glval<two_values *>) = 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<signed short>) = FieldAddress[val1] : r79_5
# 79| r79_6(glval<signed short>) = 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<two_values *>) = VariableAddress[vals] :
# 79| r79_9(glval<two_values *>) = 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<signed short>) = FieldAddress[val2] : r79_10
# 79| r79_11(glval<signed short>) = 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<int>) = VariableAddress[x] :
# 84| r84_4(glval<int>) = 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<int>) = VariableAddress[y] :
# 84| r84_6(glval<int>) = 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<void *>) = VariableAddress[p] :
# 84| r84_8(glval<void *>) = 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<int>) = 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<int>) = 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<void *>) = VariableAddress[p] :
# 88| r88_1(glval<void *>) = 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<int>) = VariableAddress[x] :
# 88| valnum = r84_4
# 88| r88_7(int) = Load : &:r88_6, m84_5
# 88| valnum = m84_5
# 88| r88_8(glval<int>) = VariableAddress[#temp88:7] :
# 88| valnum = r88_8
# 88| m88_9(int) = Store : &:r88_8, r88_7
# 88| valnum = m84_5
#-----| Goto -> Block 3
# 88| m88_6(int) = Phi : from 2:m88_14, from 3:m88_18
# 88| valnum = m88_6
# 88| r88_7(glval<int>) = VariableAddress[#temp88:7] :
# 88| valnum = r88_7
# 88| r88_8(int) = Load : &:r88_7, m88_6
# 88| valnum = m88_6
# 88| r88_9(glval<int>) = 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_10(glval<int>) = VariableAddress[y] :
# 88| valnum = r84_6
# 88| r88_11(int) = Load : &:r88_10, m84_7
# 88| valnum = m84_7
# 88| r88_12(glval<int>) = VariableAddress[#temp88:7] :
# 88| valnum = r88_8
# 88| m88_13(int) = Store : &:r88_12, r88_11
# 88| valnum = m84_7
#-----| Goto -> Block 3
# 88| r88_11(glval<int>) = VariableAddress[x] :
# 88| valnum = r84_4
# 88| r88_12(int) = Load : &:r88_11, m84_5
# 88| valnum = m84_5
# 88| r88_13(glval<int>) = VariableAddress[#temp88:7] :
# 88| valnum = r88_7
# 88| m88_14(int) = Store : &:r88_13, r88_12
# 88| valnum = m84_5
#-----| Goto -> Block 1
# 88| Block 3
# 88| m88_14(int) = Phi : from 1:m88_9, from 2:m88_13
# 88| valnum = m88_14
# 88| r88_15(glval<int>) = VariableAddress[#temp88:7] :
# 88| valnum = r88_8
# 88| r88_16(int) = Load : &:r88_15, m88_14
# 88| valnum = m88_14
# 88| r88_17(glval<int>) = VariableAddress[v] :
# 88| valnum = r86_1
# 88| r88_15(glval<int>) = VariableAddress[y] :
# 88| valnum = r84_6
# 88| r88_16(int) = Load : &:r88_15, m84_7
# 88| valnum = m84_7
# 88| r88_17(glval<int>) = 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<int>) = VariableAddress[x] :
# 105| valnum = unique
# 105| r105_2(glval<Derived *>) = VariableAddress[pd] :
@@ -719,7 +760,7 @@ test.cpp:
# 105| valnum = r105_4
# 105| r105_5(glval<int>) = 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<int>) = 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<int>) = VariableAddress[#return] :
# 104| v104_9(void) = ReturnIndirection : &:r104_6, ~m104_8
# 104| r104_10(glval<int>) = 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

View File

@@ -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" }
}

View File

@@ -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 }

View File

@@ -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() {

View File

@@ -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 }

View File

@@ -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() {