Merge pull request #3459 from dbartol/github/codeql-c-analysis-team/69

C++/C#: Remove `UnmodeledUse` instruction
This commit is contained in:
Dave Bartolomeo
2020-05-13 13:13:40 -04:00
committed by GitHub
55 changed files with 955 additions and 1676 deletions

View File

@@ -61,7 +61,6 @@ private newtype TOpcode =
TReThrow() or
TUnwind() or
TUnmodeledDefinition() or
TUnmodeledUse() or
TAliasedDefinition() or
TInitializeNonLocal() or
TAliasedUse() or
@@ -587,14 +586,6 @@ module Opcode {
}
}
class UnmodeledUse extends Opcode, TUnmodeledUse {
final override string toString() { result = "UnmodeledUse" }
final override predicate hasOperandInternal(OperandTag tag) {
tag instanceof UnmodeledUseOperandTag
}
}
class AliasedDefinition extends Opcode, TAliasedDefinition {
final override string toString() { result = "AliasedDefinition" }

View File

@@ -31,10 +31,14 @@ class IRBlockBase extends TIRBlock {
config.shouldEvaluateDebugStringsForFunction(this.getEnclosingFunction())
) and
this =
rank[result + 1](IRBlock funcBlock |
funcBlock.getEnclosingFunction() = getEnclosingFunction()
rank[result + 1](IRBlock funcBlock, int sortOverride |
funcBlock.getEnclosingFunction() = getEnclosingFunction() and
// Ensure that the block containing `EnterFunction` always comes first.
if funcBlock.getFirstInstruction() instanceof EnterFunctionInstruction
then sortOverride = 0
else sortOverride = 1
|
funcBlock order by funcBlock.getUniqueId()
funcBlock order by sortOverride, funcBlock.getUniqueId()
)
}

View File

@@ -55,7 +55,6 @@ module InstructionConsistency {
operand.getOperandTag() = tag
) and
operandCount > 1 and
not tag instanceof UnmodeledUseOperandTag and
message =
"Instruction has " + operandCount + " operands with tag '" + tag.toString() + "'" +
" in function '$@'." and
@@ -158,7 +157,6 @@ module InstructionConsistency {
) {
exists(MemoryOperand operand, Instruction def |
operand = instr.getAnOperand() and
not operand instanceof UnmodeledUseOperand and
def = operand.getAnyDef() and
not def.isResultModeled() and
not def instanceof UnmodeledDefinitionInstruction and
@@ -259,7 +257,6 @@ module InstructionConsistency {
Operand useOperand, string message, IRFunction func, string funcText
) {
exists(IRBlock useBlock, int useIndex, Instruction defInstr, IRBlock defBlock, int defIndex |
not useOperand.getUse() instanceof UnmodeledUseInstruction and
not defInstr instanceof UnmodeledDefinitionInstruction and
pointOfEvaluation(useOperand, useBlock, useIndex) and
defInstr = useOperand.getAnyDef() and

View File

@@ -45,11 +45,6 @@ class IRFunction extends TIRFunction {
result.getEnclosingIRFunction() = this
}
pragma[noinline]
final UnmodeledUseInstruction getUnmodeledUseInstruction() {
result.getEnclosingIRFunction() = this
}
/**
* Gets the single return instruction for this function.
*/

View File

@@ -320,8 +320,7 @@ class Instruction extends Construction::TInstruction {
/**
* Holds if the result of this instruction is precisely modeled in SSA. Always
* holds for a register result. For a memory result, a modeled result is
* connected to its actual uses. An unmodeled result is connected to the
* `UnmodeledUse` instruction.
* connected to its actual uses. An unmodeled result has no uses.
*
* For example:
* ```
@@ -1248,12 +1247,6 @@ class AliasedUseInstruction extends Instruction {
AliasedUseInstruction() { getOpcode() instanceof Opcode::AliasedUse }
}
class UnmodeledUseInstruction extends Instruction {
UnmodeledUseInstruction() { getOpcode() instanceof Opcode::UnmodeledUse }
override string getOperandsString() { result = "mu*" }
}
/**
* An instruction representing the choice of one of multiple input values based on control flow.
*

View File

@@ -19,11 +19,7 @@ private newtype TOperand =
) {
defInstr = Construction::getMemoryOperandDefinition(useInstr, tag, overlap) and
not Construction::isInCycle(useInstr) and
(
strictcount(Construction::getMemoryOperandDefinition(useInstr, tag, _)) = 1
or
tag instanceof UnmodeledUseOperandTag
)
strictcount(Construction::getMemoryOperandDefinition(useInstr, tag, _)) = 1
} or
TPhiOperand(
PhiInstruction useInstr, Instruction defInstr, IRBlock predecessorBlock, Overlap overlap
@@ -327,16 +323,6 @@ class ConditionOperand extends RegisterOperand {
override string toString() { result = "Condition" }
}
/**
* An operand of the special `UnmodeledUse` instruction, representing a value
* whose set of uses is unknown.
*/
class UnmodeledUseOperand extends NonPhiMemoryOperand {
override UnmodeledUseOperandTag tag;
override string toString() { result = "UnmodeledUse" }
}
/**
* The operand representing the target function of an `Call` instruction.
*/

View File

@@ -247,6 +247,10 @@ private predicate resultMayReachReturn(Instruction instr) { operandMayReachRetur
private predicate resultEscapesNonReturn(Instruction instr) {
// The result escapes if it has at least one use that escapes.
operandEscapesNonReturn(instr.getAUse())
or
// The result also escapes if it is not modeled in SSA, because we do not know where it might be
// used.
not instr.isResultModeled()
}
/**

View File

@@ -128,23 +128,10 @@ private module Cached {
oldOperand = oldInstruction.getAnOperand() and
tag = oldOperand.getOperandTag() and
(
(
if exists(Alias::getOperandMemoryLocation(oldOperand))
then hasMemoryOperandDefinition(oldInstruction, oldOperand, overlap, result)
else (
result = instruction.getEnclosingIRFunction().getUnmodeledDefinitionInstruction() and
overlap instanceof MustTotallyOverlap
)
)
or
// Connect any definitions that are not being modeled in SSA to the
// `UnmodeledUse` instruction.
exists(OldInstruction oldDefinition |
instruction instanceof UnmodeledUseInstruction and
tag instanceof UnmodeledUseOperandTag and
oldDefinition = oldOperand.getAnyDef() and
not exists(Alias::getResultMemoryLocation(oldDefinition)) and
result = getNewInstruction(oldDefinition) and
if exists(Alias::getOperandMemoryLocation(oldOperand))
then hasMemoryOperandDefinition(oldInstruction, oldOperand, overlap, result)
else (
result = instruction.getEnclosingIRFunction().getUnmodeledDefinitionInstruction() and
overlap instanceof MustTotallyOverlap
)
)
@@ -154,13 +141,6 @@ private module Cached {
tag instanceof ChiPartialOperandTag and
overlap instanceof MustExactlyOverlap
or
exists(IRFunction f |
tag instanceof UnmodeledUseOperandTag and
result = f.getUnmodeledDefinitionInstruction() and
instruction = f.getUnmodeledUseInstruction() and
overlap instanceof MustTotallyOverlap
)
or
tag instanceof ChiTotalOperandTag and
result = getChiInstructionTotalOperand(instruction) and
overlap instanceof MustExactlyOverlap

View File

@@ -15,7 +15,6 @@ private newtype TOperandTag =
TLeftOperand() or
TRightOperand() or
TConditionOperand() or
TUnmodeledUseOperand() or
TCallTargetOperand() or
TThisArgumentOperand() or
TPositionalArgumentOperand(int argIndex) { Language::hasPositionalArgIndex(argIndex) } or
@@ -165,18 +164,6 @@ class ConditionOperandTag extends RegisterOperandTag, TConditionOperand {
ConditionOperandTag conditionOperand() { result = TConditionOperand() }
/**
* An operand of the special `UnmodeledUse` instruction, representing a value
* whose set of uses is unknown.
*/
class UnmodeledUseOperandTag extends MemoryOperandTag, TUnmodeledUseOperand {
final override string toString() { result = "UnmodeledUse" }
final override int getSortOrder() { result = 9 }
}
UnmodeledUseOperandTag unmodeledUseOperand() { result = TUnmodeledUseOperand() }
/**
* The operand representing the target function of an `Call` instruction.
*/

View File

@@ -31,10 +31,14 @@ class IRBlockBase extends TIRBlock {
config.shouldEvaluateDebugStringsForFunction(this.getEnclosingFunction())
) and
this =
rank[result + 1](IRBlock funcBlock |
funcBlock.getEnclosingFunction() = getEnclosingFunction()
rank[result + 1](IRBlock funcBlock, int sortOverride |
funcBlock.getEnclosingFunction() = getEnclosingFunction() and
// Ensure that the block containing `EnterFunction` always comes first.
if funcBlock.getFirstInstruction() instanceof EnterFunctionInstruction
then sortOverride = 0
else sortOverride = 1
|
funcBlock order by funcBlock.getUniqueId()
funcBlock order by sortOverride, funcBlock.getUniqueId()
)
}

View File

@@ -55,7 +55,6 @@ module InstructionConsistency {
operand.getOperandTag() = tag
) and
operandCount > 1 and
not tag instanceof UnmodeledUseOperandTag and
message =
"Instruction has " + operandCount + " operands with tag '" + tag.toString() + "'" +
" in function '$@'." and
@@ -158,7 +157,6 @@ module InstructionConsistency {
) {
exists(MemoryOperand operand, Instruction def |
operand = instr.getAnOperand() and
not operand instanceof UnmodeledUseOperand and
def = operand.getAnyDef() and
not def.isResultModeled() and
not def instanceof UnmodeledDefinitionInstruction and
@@ -259,7 +257,6 @@ module InstructionConsistency {
Operand useOperand, string message, IRFunction func, string funcText
) {
exists(IRBlock useBlock, int useIndex, Instruction defInstr, IRBlock defBlock, int defIndex |
not useOperand.getUse() instanceof UnmodeledUseInstruction and
not defInstr instanceof UnmodeledDefinitionInstruction and
pointOfEvaluation(useOperand, useBlock, useIndex) and
defInstr = useOperand.getAnyDef() and

View File

@@ -45,11 +45,6 @@ class IRFunction extends TIRFunction {
result.getEnclosingIRFunction() = this
}
pragma[noinline]
final UnmodeledUseInstruction getUnmodeledUseInstruction() {
result.getEnclosingIRFunction() = this
}
/**
* Gets the single return instruction for this function.
*/

View File

@@ -320,8 +320,7 @@ class Instruction extends Construction::TInstruction {
/**
* Holds if the result of this instruction is precisely modeled in SSA. Always
* holds for a register result. For a memory result, a modeled result is
* connected to its actual uses. An unmodeled result is connected to the
* `UnmodeledUse` instruction.
* connected to its actual uses. An unmodeled result has no uses.
*
* For example:
* ```
@@ -1248,12 +1247,6 @@ class AliasedUseInstruction extends Instruction {
AliasedUseInstruction() { getOpcode() instanceof Opcode::AliasedUse }
}
class UnmodeledUseInstruction extends Instruction {
UnmodeledUseInstruction() { getOpcode() instanceof Opcode::UnmodeledUse }
override string getOperandsString() { result = "mu*" }
}
/**
* An instruction representing the choice of one of multiple input values based on control flow.
*

View File

@@ -19,11 +19,7 @@ private newtype TOperand =
) {
defInstr = Construction::getMemoryOperandDefinition(useInstr, tag, overlap) and
not Construction::isInCycle(useInstr) and
(
strictcount(Construction::getMemoryOperandDefinition(useInstr, tag, _)) = 1
or
tag instanceof UnmodeledUseOperandTag
)
strictcount(Construction::getMemoryOperandDefinition(useInstr, tag, _)) = 1
} or
TPhiOperand(
PhiInstruction useInstr, Instruction defInstr, IRBlock predecessorBlock, Overlap overlap
@@ -327,16 +323,6 @@ class ConditionOperand extends RegisterOperand {
override string toString() { result = "Condition" }
}
/**
* An operand of the special `UnmodeledUse` instruction, representing a value
* whose set of uses is unknown.
*/
class UnmodeledUseOperand extends NonPhiMemoryOperand {
override UnmodeledUseOperandTag tag;
override string toString() { result = "UnmodeledUse" }
}
/**
* The operand representing the target function of an `Call` instruction.
*/

View File

@@ -91,17 +91,25 @@ private module Cached {
Instruction getRegisterOperandDefinition(Instruction instruction, RegisterOperandTag tag) {
result =
getInstructionTranslatedElement(instruction)
.getInstructionOperand(getInstructionTag(instruction), tag)
.getInstructionRegisterOperand(getInstructionTag(instruction), tag)
}
cached
Instruction getMemoryOperandDefinition(
Instruction instruction, MemoryOperandTag tag, Overlap overlap
) {
result =
getInstructionTranslatedElement(instruction)
.getInstructionOperand(getInstructionTag(instruction), tag) and
overlap instanceof MustTotallyOverlap
exists(TranslatedElement translatedElement, TranslatedFunction translatedFunc |
translatedElement = getInstructionTranslatedElement(instruction) and
exists(getInstructionOperandType(instruction, tag)) and
translatedFunc = getTranslatedFunction(instruction.getEnclosingFunction()) and
result = translatedFunc.getUnmodeledDefinitionInstruction() and
overlap instanceof MustTotallyOverlap
)
or
// Without the code below, the optimizer will realize that raw IR never contains Chi operands,
// and report an error that `ChiTotalOperand` and `ChiPartialOperand` are infeasible.
(tag instanceof ChiTotalOperandTag or tag instanceof ChiPartialOperandTag) and
none()
}
/** Gets a non-phi instruction that defines an operand of `instr`. */
@@ -144,12 +152,13 @@ private module Cached {
CppType getInstructionOperandType(Instruction instruction, TypedOperandTag tag) {
// For all `LoadInstruction`s, the operand type of the `LoadOperand` is the same as
// the result type of the load.
tag instanceof LoadOperandTag and
result = instruction.(LoadInstruction).getResultLanguageType()
or
not instruction instanceof LoadInstruction and
result =
getInstructionTranslatedElement(instruction)
.getInstructionOperandType(getInstructionTag(instruction), tag)
.getInstructionMemoryOperandType(getInstructionTag(instruction), tag)
}
cached

View File

@@ -29,7 +29,6 @@ newtype TInstructionTag =
ReturnTag() or
ExitFunctionTag() or
UnmodeledDefinitionTag() or
UnmodeledUseTag() or
AliasedDefinitionTag() or
InitializeNonLocalTag() or
AliasedUseTag() or
@@ -129,8 +128,6 @@ string getInstructionTagId(TInstructionTag tag) {
or
tag = UnmodeledDefinitionTag() and result = "UnmodeledDef"
or
tag = UnmodeledUseTag() and result = "UnmodeledUse"
or
tag = AliasedDefinitionTag() and result = "AliasedDef"
or
tag = InitializeNonLocalTag() and result = "InitNonLocal"

View File

@@ -94,7 +94,7 @@ abstract class TranslatedCall extends TranslatedExpr {
)
}
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = CallTag() and
(
operandTag instanceof CallTargetOperandTag and
@@ -115,7 +115,9 @@ abstract class TranslatedCall extends TranslatedExpr {
result = getEnclosingFunction().getUnmodeledDefinitionInstruction()
}
final override CppType getInstructionOperandType(InstructionTag tag, TypedOperandTag operandTag) {
final override CppType getInstructionMemoryOperandType(
InstructionTag tag, TypedOperandTag operandTag
) {
tag = CallSideEffectTag() and
hasSideEffect() and
operandTag instanceof SideEffectOperandTag and
@@ -381,7 +383,7 @@ class TranslatedAllocationSideEffects extends TranslatedSideEffects,
else result = getParent().getChildSuccessor(this)
}
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = OnlyInstructionTag() and
operandTag = addressOperand() and
result = getPrimaryInstructionForSideEffect(OnlyInstructionTag())
@@ -437,7 +439,7 @@ class TranslatedStructorCallSideEffects extends TranslatedCallSideEffects {
override Instruction getFirstInstruction() { result = getInstruction(OnlyInstructionTag()) }
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag instanceof OnlyInstructionTag and
operandTag instanceof AddressOperandTag and
result = getParent().(TranslatedStructorCall).getQualifierResult()
@@ -513,17 +515,12 @@ class TranslatedSideEffect extends TranslatedElement, TTranslatedArgumentSideEff
kind instanceof GotoEdge
}
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag instanceof OnlyInstructionTag and
operandTag instanceof AddressOperandTag and
result = getTranslatedExpr(arg).getResult()
or
tag instanceof OnlyInstructionTag and
operandTag instanceof SideEffectOperandTag and
not isWrite() and
result = getEnclosingFunction().getUnmodeledDefinitionInstruction()
or
tag instanceof OnlyInstructionTag and
operandTag instanceof BufferSizeOperandTag and
result =
getTranslatedExpr(call
@@ -531,7 +528,8 @@ class TranslatedSideEffect extends TranslatedElement, TTranslatedArgumentSideEff
.getFullyConverted()).getResult()
}
override CppType getInstructionOperandType(InstructionTag tag, TypedOperandTag operandTag) {
override CppType getInstructionMemoryOperandType(InstructionTag tag, TypedOperandTag operandTag) {
not isWrite() and
if hasSpecificReadSideEffect(any(BufferAccessOpcode op))
then
result = getUnknownType() and

View File

@@ -182,7 +182,7 @@ class TranslatedValueCondition extends TranslatedCondition, TTranslatedValueCond
)
}
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = ValueConditionConditionalBranchTag() and
operandTag instanceof ConditionOperandTag and
result = getValueExpr().getResult()

View File

@@ -181,14 +181,11 @@ class TranslatedStaticLocalVariableDeclarationEntry extends TranslatedDeclaratio
tag = DynamicInitializationFlagConstantTag() and result = "1"
}
final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = DynamicInitializationFlagLoadTag() and
(
operandTag instanceof AddressOperandTag and
result = getInstruction(DynamicInitializationFlagAddressTag())
or
operandTag instanceof LoadOperandTag and
result = getTranslatedFunction(var.getFunction()).getUnmodeledDefinitionInstruction()
)
or
tag = DynamicInitializationConditionalBranchTag() and

View File

@@ -736,12 +736,12 @@ abstract class TranslatedElement extends TTranslatedElement {
* Gets the instruction whose result is consumed as an operand of the
* instruction specified by `tag`, with the operand specified by `operandTag`.
*/
Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) { none() }
Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) { none() }
/**
* Gets the type of the memory operand specified by `operandTag` on the the instruction specified by `tag`.
*/
CppType getInstructionOperandType(InstructionTag tag, TypedOperandTag operandTag) { none() }
CppType getInstructionMemoryOperandType(InstructionTag tag, TypedOperandTag operandTag) { none() }
/**
* Gets the size of the memory operand specified by `operandTag` on the the instruction specified by `tag`.

View File

@@ -183,7 +183,7 @@ class TranslatedConditionValue extends TranslatedCoreExpr, ConditionContext,
)
}
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = ConditionValueTrueStoreTag() and
(
operandTag instanceof AddressOperandTag and
@@ -206,9 +206,6 @@ class TranslatedConditionValue extends TranslatedCoreExpr, ConditionContext,
(
operandTag instanceof AddressOperandTag and
result = getInstruction(ConditionValueResultTempAddressTag())
or
operandTag instanceof LoadOperandTag and
result = getEnclosingFunction().getUnmodeledDefinitionInstruction()
)
}
@@ -282,14 +279,11 @@ class TranslatedLoad extends TranslatedExpr, TTranslatedLoad {
override Instruction getResult() { result = getInstruction(LoadTag()) }
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = LoadTag() and
(
operandTag instanceof AddressOperandTag and
result = getOperand().getResult()
or
operandTag instanceof LoadOperandTag and
result = getEnclosingFunction().getUnmodeledDefinitionInstruction()
)
}
@@ -332,7 +326,7 @@ class TranslatedResultCopy extends TranslatedExpr, TTranslatedResultCopy {
override Instruction getResult() { result = getInstruction(ResultCopyTag()) }
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = ResultCopyTag() and
operandTag instanceof UnaryOperandTag and
result = getOperand().getResult()
@@ -369,7 +363,9 @@ class TranslatedCommaExpr extends TranslatedNonConstantExpr {
none()
}
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) { none() }
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
none()
}
private TranslatedExpr getLeftOperand() {
result = getTranslatedExpr(expr.getLeftOperand().getFullyConverted())
@@ -429,7 +425,7 @@ abstract class TranslatedCrementOperation extends TranslatedNonConstantExpr {
resultType = getTypeForPRValue(expr.getType())
}
final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = CrementOpTag() and
(
operandTag instanceof LeftOperandTag and
@@ -580,7 +576,7 @@ class TranslatedArrayExpr extends TranslatedNonConstantExpr {
resultType = getTypeForGLValue(expr.getType())
}
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = OnlyInstructionTag() and
(
operandTag instanceof LeftOperandTag and
@@ -622,7 +618,7 @@ abstract class TranslatedTransparentExpr extends TranslatedNonConstantExpr {
final override Instruction getResult() { result = getOperand().getResult() }
final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
none()
}
@@ -685,7 +681,7 @@ class TranslatedThisExpr extends TranslatedNonConstantExpr {
final override Instruction getChildSuccessor(TranslatedElement child) { none() }
final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = OnlyInstructionTag() and
operandTag instanceof UnaryOperandTag and
result = getInitializeThisInstruction()
@@ -729,7 +725,9 @@ class TranslatedNonFieldVariableAccess extends TranslatedVariableAccess {
else result = getInstruction(OnlyInstructionTag())
}
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) { none() }
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
none()
}
override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) {
tag = OnlyInstructionTag() and
@@ -748,7 +746,7 @@ class TranslatedFieldAccess extends TranslatedVariableAccess {
override Instruction getFirstInstruction() { result = getQualifier().getFirstInstruction() }
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = OnlyInstructionTag() and
operandTag instanceof UnaryOperandTag and
result = getQualifier().getResult()
@@ -822,7 +820,7 @@ abstract class TranslatedConstantExpr extends TranslatedCoreExpr, TTranslatedVal
final override Instruction getResult() { result = getInstruction(OnlyInstructionTag()) }
final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
none()
}
@@ -906,7 +904,7 @@ class TranslatedUnaryExpr extends TranslatedSingleInstructionExpr {
child = getOperand() and result = getInstruction(OnlyInstructionTag())
}
final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = OnlyInstructionTag() and
result = getOperand().getResult() and
operandTag instanceof UnaryOperandTag
@@ -960,7 +958,7 @@ abstract class TranslatedSingleInstructionConversion extends TranslatedConversio
override Instruction getResult() { result = getInstruction(OnlyInstructionTag()) }
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = OnlyInstructionTag() and
operandTag instanceof UnaryOperandTag and
result = getOperand().getResult()
@@ -1070,7 +1068,7 @@ class TranslatedBoolConversion extends TranslatedConversion {
override Instruction getResult() { result = getInstruction(BoolConversionCompareTag()) }
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = BoolConversionCompareTag() and
(
operandTag instanceof LeftOperandTag and
@@ -1172,7 +1170,7 @@ class TranslatedBinaryOperation extends TranslatedSingleInstructionExpr {
id = 1 and result = getRightOperand()
}
final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = OnlyInstructionTag() and
if swapOperandsOnOp()
then (
@@ -1306,7 +1304,7 @@ class TranslatedAssignExpr extends TranslatedNonConstantExpr {
resultType = getTypeForPRValue(expr.getType()) // Always a prvalue
}
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = AssignmentStoreTag() and
(
operandTag instanceof AddressOperandTag and
@@ -1482,7 +1480,7 @@ class TranslatedAssignOperation extends TranslatedNonConstantExpr {
result = getElementSize(expr.getType())
}
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
leftOperandNeedsConversion() and
tag = AssignOperationConvertLeftTag() and
operandTag instanceof UnaryOperandTag and
@@ -1626,7 +1624,7 @@ class TranslatedNonConstantAllocationSize extends TranslatedAllocationSize {
result = expr.getAllocatedElementType().getSize().toString()
}
final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = AllocationSizeTag() and
(
operandTag instanceof LeftOperandTag and result = getInstruction(AllocationExtentConvertTag())
@@ -1742,7 +1740,7 @@ class TranslatedDestructorFieldDestruction extends TranslatedNonConstantExpr, St
final override Instruction getFirstInstruction() { result = getInstruction(OnlyInstructionTag()) }
final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = OnlyInstructionTag() and
operandTag instanceof UnaryOperandTag and
result = getTranslatedFunction(expr.getEnclosingFunction()).getInitializeThisInstruction()
@@ -1832,7 +1830,7 @@ abstract class TranslatedConditionalExpr extends TranslatedNonConstantExpr {
)
}
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
not resultIsVoid() and
(
not thenIsVoid() and
@@ -1859,9 +1857,6 @@ abstract class TranslatedConditionalExpr extends TranslatedNonConstantExpr {
(
operandTag instanceof AddressOperandTag and
result = getInstruction(ConditionValueResultTempAddressTag())
or
operandTag instanceof LoadOperandTag and
result = getEnclosingFunction().getUnmodeledDefinitionInstruction()
)
)
}
@@ -2014,8 +2009,8 @@ class TranslatedBinaryConditionalExpr extends TranslatedConditionalExpr {
)
}
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
result = super.getInstructionOperand(tag, operandTag)
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
result = super.getInstructionRegisterOperand(tag, operandTag)
or
tag = ValueConditionConditionalBranchTag() and
operandTag instanceof ConditionOperandTag and
@@ -2093,20 +2088,19 @@ class TranslatedThrowValueExpr extends TranslatedThrowExpr, TranslatedVariableIn
type = getTypeForPRValue(getExceptionType())
}
final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
result = TranslatedVariableInitialization.super.getInstructionOperand(tag, operandTag)
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
result = TranslatedVariableInitialization.super.getInstructionRegisterOperand(tag, operandTag)
or
tag = ThrowTag() and
(
operandTag instanceof AddressOperandTag and
result = getInstruction(InitializerVariableAddressTag())
or
operandTag instanceof LoadOperandTag and
result = getEnclosingFunction().getUnmodeledDefinitionInstruction()
)
}
final override CppType getInstructionOperandType(InstructionTag tag, TypedOperandTag operandTag) {
final override CppType getInstructionMemoryOperandType(
InstructionTag tag, TypedOperandTag operandTag
) {
tag = ThrowTag() and
operandTag instanceof LoadOperandTag and
result = getTypeForPRValue(getExceptionType())
@@ -2191,7 +2185,7 @@ class TranslatedBuiltInOperation extends TranslatedNonConstantExpr {
resultType = getResultType()
}
final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = OnlyInstructionTag() and
exists(int index |
operandTag = positionalArgumentOperand(index) and
@@ -2311,7 +2305,7 @@ class TranslatedVarArgsStart extends TranslatedNonConstantExpr {
result = getEnclosingFunction().getEllipsisVariable()
}
final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = VarArgsStartTag() and
operandTag instanceof UnaryOperandTag and
result = getInstruction(VarArgsStartEllipsisAddressTag())
@@ -2382,14 +2376,11 @@ class TranslatedVarArg extends TranslatedNonConstantExpr {
result = getInstruction(VarArgsVAListLoadTag())
}
final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = VarArgsVAListLoadTag() and
(
operandTag instanceof AddressOperandTag and
result = getVAList().getResult()
or
operandTag instanceof LoadOperandTag and
result = getEnclosingFunction().getUnmodeledDefinitionInstruction()
)
or
tag = VarArgsArgAddressTag() and
@@ -2442,7 +2433,7 @@ class TranslatedVarArgsEnd extends TranslatedNonConstantExpr {
result = getInstruction(OnlyInstructionTag())
}
final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = OnlyInstructionTag() and
operandTag instanceof UnaryOperandTag and
result = getVAList().getResult()
@@ -2503,14 +2494,11 @@ class TranslatedVarArgCopy extends TranslatedNonConstantExpr {
result = getInstruction(VarArgsVAListStoreTag())
}
final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = VarArgsVAListLoadTag() and
(
operandTag instanceof AddressOperandTag and
result = getSourceVAList().getResult()
or
operandTag instanceof LoadOperandTag and
result = getEnclosingFunction().getUnmodeledDefinitionInstruction()
)
or
tag = VarArgsVAListStoreTag() and
@@ -2560,7 +2548,7 @@ abstract class TranslatedNewOrNewArrayExpr extends TranslatedNonConstantExpr, In
child = getInitialization() and result = getParent().getChildSuccessor(this)
}
final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = OnlyInstructionTag() and
operandTag instanceof UnaryOperandTag and
result = getAllocatorCall().getResult()
@@ -2623,7 +2611,7 @@ class TranslatedDeleteArrayExprPlaceHolder extends TranslatedSingleInstructionEx
child = getOperand() and result = getInstruction(OnlyInstructionTag())
}
final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
none()
}
@@ -2657,7 +2645,7 @@ class TranslatedDeleteExprPlaceHolder extends TranslatedSingleInstructionExpr {
child = getOperand() and result = getInstruction(OnlyInstructionTag())
}
final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
none()
}
@@ -2761,7 +2749,7 @@ class TranslatedLambdaExpr extends TranslatedNonConstantExpr, InitializationCont
resultType = getTypeForPRValue(expr.getType())
}
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = InitializerStoreTag() and
operandTag instanceof AddressOperandTag and
result = getInstruction(InitializerVariableAddressTag())
@@ -2770,9 +2758,6 @@ class TranslatedLambdaExpr extends TranslatedNonConstantExpr, InitializationCont
(
operandTag instanceof AddressOperandTag and
result = getInstruction(InitializerVariableAddressTag())
or
operandTag instanceof LoadOperandTag and
result = getEnclosingFunction().getUnmodeledDefinitionInstruction()
)
}
@@ -2832,7 +2817,7 @@ class TranslatedStmtExpr extends TranslatedNonConstantExpr {
override Instruction getResult() { result = getInstruction(OnlyInstructionTag()) }
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag instanceof OnlyInstructionTag and
operandTag instanceof UnaryOperandTag and
result = getTranslatedExpr(expr.getResultExpr().getFullyConverted()).getResult()
@@ -2856,7 +2841,7 @@ class TranslatedErrorExpr extends TranslatedSingleInstructionExpr {
final override Instruction getChildSuccessor(TranslatedElement child) { none() }
final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
none()
}

View File

@@ -138,12 +138,9 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction {
result = getInstruction(ReturnTag())
or
tag = ReturnTag() and
result = getInstruction(UnmodeledUseTag())
result = getInstruction(AliasedUseTag())
or
tag = UnwindTag() and
result = getInstruction(UnmodeledUseTag())
or
tag = UnmodeledUseTag() and
result = getInstruction(AliasedUseTag())
or
tag = AliasedUseTag() and
@@ -221,10 +218,6 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction {
exists(ThrowExpr throw | throw.getEnclosingFunction() = func)
)
or
tag = UnmodeledUseTag() and
opcode instanceof Opcode::UnmodeledUse and
resultType = getVoidType()
or
tag = AliasedUseTag() and
opcode instanceof Opcode::AliasedUse and
resultType = getVoidType()
@@ -239,32 +232,18 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction {
result = getInstruction(UnwindTag())
}
final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
tag = UnmodeledUseTag() and
operandTag instanceof UnmodeledUseOperandTag and
result.getEnclosingFunction() = func and
result.hasMemoryResult()
or
tag = UnmodeledUseTag() and
operandTag instanceof UnmodeledUseOperandTag and
result = getUnmodeledDefinitionInstruction()
or
tag = AliasedUseTag() and
operandTag instanceof SideEffectOperandTag and
result = getUnmodeledDefinitionInstruction()
or
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = ReturnTag() and
hasReturnValue() and
(
operandTag instanceof AddressOperandTag and
result = getInstruction(ReturnValueAddressTag())
or
operandTag instanceof LoadOperandTag and
result = getUnmodeledDefinitionInstruction()
)
}
final override CppType getInstructionOperandType(InstructionTag tag, TypedOperandTag operandTag) {
final override CppType getInstructionMemoryOperandType(
InstructionTag tag, TypedOperandTag operandTag
) {
tag = ReturnTag() and
hasReturnValue() and
operandTag instanceof LoadOperandTag and
@@ -445,7 +424,7 @@ abstract class TranslatedParameter extends TranslatedElement {
result = getIRVariable()
}
final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = InitializerStoreTag() and
(
operandTag instanceof AddressOperandTag and
@@ -457,9 +436,6 @@ abstract class TranslatedParameter extends TranslatedElement {
(
operandTag instanceof AddressOperandTag and
result = getInstruction(InitializerVariableAddressTag())
or
operandTag instanceof LoadOperandTag and
result = getTranslatedFunction(getFunction()).getUnmodeledDefinitionInstruction()
)
or
tag = InitializerIndirectStoreTag() and
@@ -734,17 +710,15 @@ class TranslatedReadEffect extends TranslatedElement, TTranslatedReadEffect {
resultType = getVoidType()
}
final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
tag = OnlyInstructionTag() and
operandTag = sideEffectOperand() and
result = getTranslatedFunction(getFunction()).getUnmodeledDefinitionInstruction()
or
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = OnlyInstructionTag() and
operandTag = addressOperand() and
result = getTranslatedParameter(param).getInstruction(InitializerIndirectAddressTag())
}
final override CppType getInstructionOperandType(InstructionTag tag, TypedOperandTag operandTag) {
final override CppType getInstructionMemoryOperandType(
InstructionTag tag, TypedOperandTag operandTag
) {
tag = OnlyInstructionTag() and
operandTag = sideEffectOperand() and
result = getUnknownType()

View File

@@ -75,7 +75,7 @@ abstract class TranslatedVariableInitialization extends TranslatedElement, Initi
child = getInitialization() and result = getInitializationSuccessor()
}
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
hasUninitializedInstruction() and
tag = InitializerStoreTag() and
operandTag instanceof AddressOperandTag and
@@ -262,7 +262,7 @@ class TranslatedSimpleDirectInitialization extends TranslatedDirectInitializatio
child = getInitializer() and result = getInstruction(InitializerStoreTag())
}
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = InitializerStoreTag() and
(
operandTag instanceof AddressOperandTag and
@@ -355,14 +355,11 @@ class TranslatedStringLiteralInitialization extends TranslatedDirectInitializati
child = getInitializer() and result = getInstruction(InitializerLoadStringTag())
}
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = InitializerLoadStringTag() and
(
operandTag instanceof AddressOperandTag and
result = getInitializer().getResult()
or
operandTag instanceof LoadOperandTag and
result = getEnclosingFunction().getUnmodeledDefinitionInstruction()
)
or
tag = InitializerStoreTag() and
@@ -461,7 +458,9 @@ class TranslatedConstructorInitialization extends TranslatedDirectInitialization
child = getInitializer() and result = getParent().getChildSuccessor(this)
}
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) { none() }
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
none()
}
override Instruction getReceiver() { result = getContext().getTargetAddress() }
}
@@ -508,7 +507,7 @@ abstract class TranslatedFieldInitialization extends TranslatedElement {
resultType = getTypeForGLValue(field.getType())
}
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = getFieldAddressTag() and
operandTag instanceof UnaryOperandTag and
result = getParent().(InitializationContext).getTargetAddress()
@@ -599,8 +598,8 @@ class TranslatedFieldValueInitialization extends TranslatedFieldInitialization,
result = getZeroValue(field.getUnspecifiedType())
}
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
result = TranslatedFieldInitialization.super.getInstructionOperand(tag, operandTag)
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
result = TranslatedFieldInitialization.super.getInstructionRegisterOperand(tag, operandTag)
or
tag = getFieldDefaultValueStoreTag() and
(
@@ -656,7 +655,7 @@ abstract class TranslatedElementInitialization extends TranslatedElement {
kind instanceof GotoEdge
}
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = getElementAddressTag() and
(
operandTag instanceof LeftOperandTag and
@@ -782,8 +781,8 @@ class TranslatedElementValueInitialization extends TranslatedElementInitializati
result = elementCount * getElementType().getSize()
}
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
result = TranslatedElementInitialization.super.getInstructionOperand(tag, operandTag)
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
result = TranslatedElementInitialization.super.getInstructionRegisterOperand(tag, operandTag)
or
tag = getElementDefaultValueStoreTag() and
(
@@ -861,7 +860,7 @@ abstract class TranslatedBaseStructorCall extends TranslatedStructorCallFromStru
final override Instruction getReceiver() { result = getInstruction(OnlyInstructionTag()) }
final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = OnlyInstructionTag() and
operandTag instanceof UnaryOperandTag and
result = getTranslatedFunction(getFunction()).getInitializeThisInstruction()

View File

@@ -713,7 +713,7 @@ class TranslatedSwitchStmt extends TranslatedStmt {
resultType = getVoidType()
}
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
tag = SwitchBranchTag() and
operandTag instanceof ConditionOperandTag and
result = getExpr().getResult()
@@ -759,11 +759,7 @@ class TranslatedAsmStmt extends TranslatedStmt {
resultType = getUnknownType()
}
override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
tag = AsmTag() and
operandTag instanceof SideEffectOperandTag and
result = getTranslatedFunction(stmt.getEnclosingFunction()).getUnmodeledDefinitionInstruction()
or
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
exists(int index |
tag = AsmTag() and
operandTag = asmOperand(index) and
@@ -771,7 +767,9 @@ class TranslatedAsmStmt extends TranslatedStmt {
)
}
final override CppType getInstructionOperandType(InstructionTag tag, TypedOperandTag operandTag) {
final override CppType getInstructionMemoryOperandType(
InstructionTag tag, TypedOperandTag operandTag
) {
tag = AsmTag() and
operandTag instanceof SideEffectOperandTag and
result = getUnknownType()

View File

@@ -31,10 +31,14 @@ class IRBlockBase extends TIRBlock {
config.shouldEvaluateDebugStringsForFunction(this.getEnclosingFunction())
) and
this =
rank[result + 1](IRBlock funcBlock |
funcBlock.getEnclosingFunction() = getEnclosingFunction()
rank[result + 1](IRBlock funcBlock, int sortOverride |
funcBlock.getEnclosingFunction() = getEnclosingFunction() and
// Ensure that the block containing `EnterFunction` always comes first.
if funcBlock.getFirstInstruction() instanceof EnterFunctionInstruction
then sortOverride = 0
else sortOverride = 1
|
funcBlock order by funcBlock.getUniqueId()
funcBlock order by sortOverride, funcBlock.getUniqueId()
)
}

View File

@@ -55,7 +55,6 @@ module InstructionConsistency {
operand.getOperandTag() = tag
) and
operandCount > 1 and
not tag instanceof UnmodeledUseOperandTag and
message =
"Instruction has " + operandCount + " operands with tag '" + tag.toString() + "'" +
" in function '$@'." and
@@ -158,7 +157,6 @@ module InstructionConsistency {
) {
exists(MemoryOperand operand, Instruction def |
operand = instr.getAnOperand() and
not operand instanceof UnmodeledUseOperand and
def = operand.getAnyDef() and
not def.isResultModeled() and
not def instanceof UnmodeledDefinitionInstruction and
@@ -259,7 +257,6 @@ module InstructionConsistency {
Operand useOperand, string message, IRFunction func, string funcText
) {
exists(IRBlock useBlock, int useIndex, Instruction defInstr, IRBlock defBlock, int defIndex |
not useOperand.getUse() instanceof UnmodeledUseInstruction and
not defInstr instanceof UnmodeledDefinitionInstruction and
pointOfEvaluation(useOperand, useBlock, useIndex) and
defInstr = useOperand.getAnyDef() and

View File

@@ -45,11 +45,6 @@ class IRFunction extends TIRFunction {
result.getEnclosingIRFunction() = this
}
pragma[noinline]
final UnmodeledUseInstruction getUnmodeledUseInstruction() {
result.getEnclosingIRFunction() = this
}
/**
* Gets the single return instruction for this function.
*/

View File

@@ -320,8 +320,7 @@ class Instruction extends Construction::TInstruction {
/**
* Holds if the result of this instruction is precisely modeled in SSA. Always
* holds for a register result. For a memory result, a modeled result is
* connected to its actual uses. An unmodeled result is connected to the
* `UnmodeledUse` instruction.
* connected to its actual uses. An unmodeled result has no uses.
*
* For example:
* ```
@@ -1248,12 +1247,6 @@ class AliasedUseInstruction extends Instruction {
AliasedUseInstruction() { getOpcode() instanceof Opcode::AliasedUse }
}
class UnmodeledUseInstruction extends Instruction {
UnmodeledUseInstruction() { getOpcode() instanceof Opcode::UnmodeledUse }
override string getOperandsString() { result = "mu*" }
}
/**
* An instruction representing the choice of one of multiple input values based on control flow.
*

View File

@@ -19,11 +19,7 @@ private newtype TOperand =
) {
defInstr = Construction::getMemoryOperandDefinition(useInstr, tag, overlap) and
not Construction::isInCycle(useInstr) and
(
strictcount(Construction::getMemoryOperandDefinition(useInstr, tag, _)) = 1
or
tag instanceof UnmodeledUseOperandTag
)
strictcount(Construction::getMemoryOperandDefinition(useInstr, tag, _)) = 1
} or
TPhiOperand(
PhiInstruction useInstr, Instruction defInstr, IRBlock predecessorBlock, Overlap overlap
@@ -327,16 +323,6 @@ class ConditionOperand extends RegisterOperand {
override string toString() { result = "Condition" }
}
/**
* An operand of the special `UnmodeledUse` instruction, representing a value
* whose set of uses is unknown.
*/
class UnmodeledUseOperand extends NonPhiMemoryOperand {
override UnmodeledUseOperandTag tag;
override string toString() { result = "UnmodeledUse" }
}
/**
* The operand representing the target function of an `Call` instruction.
*/

View File

@@ -247,6 +247,10 @@ private predicate resultMayReachReturn(Instruction instr) { operandMayReachRetur
private predicate resultEscapesNonReturn(Instruction instr) {
// The result escapes if it has at least one use that escapes.
operandEscapesNonReturn(instr.getAUse())
or
// The result also escapes if it is not modeled in SSA, because we do not know where it might be
// used.
not instr.isResultModeled()
}
/**

View File

@@ -128,23 +128,10 @@ private module Cached {
oldOperand = oldInstruction.getAnOperand() and
tag = oldOperand.getOperandTag() and
(
(
if exists(Alias::getOperandMemoryLocation(oldOperand))
then hasMemoryOperandDefinition(oldInstruction, oldOperand, overlap, result)
else (
result = instruction.getEnclosingIRFunction().getUnmodeledDefinitionInstruction() and
overlap instanceof MustTotallyOverlap
)
)
or
// Connect any definitions that are not being modeled in SSA to the
// `UnmodeledUse` instruction.
exists(OldInstruction oldDefinition |
instruction instanceof UnmodeledUseInstruction and
tag instanceof UnmodeledUseOperandTag and
oldDefinition = oldOperand.getAnyDef() and
not exists(Alias::getResultMemoryLocation(oldDefinition)) and
result = getNewInstruction(oldDefinition) and
if exists(Alias::getOperandMemoryLocation(oldOperand))
then hasMemoryOperandDefinition(oldInstruction, oldOperand, overlap, result)
else (
result = instruction.getEnclosingIRFunction().getUnmodeledDefinitionInstruction() and
overlap instanceof MustTotallyOverlap
)
)
@@ -154,13 +141,6 @@ private module Cached {
tag instanceof ChiPartialOperandTag and
overlap instanceof MustExactlyOverlap
or
exists(IRFunction f |
tag instanceof UnmodeledUseOperandTag and
result = f.getUnmodeledDefinitionInstruction() and
instruction = f.getUnmodeledUseInstruction() and
overlap instanceof MustTotallyOverlap
)
or
tag instanceof ChiTotalOperandTag and
result = getChiInstructionTotalOperand(instruction) and
overlap instanceof MustExactlyOverlap

File diff suppressed because it is too large Load Diff

View File

@@ -92,9 +92,8 @@ ssa.cpp:
# 13| v13_14(void) = ReturnIndirection[p] : &:r13_8, m28_3
# 13| r13_15(glval<int>) = VariableAddress[#return] :
# 13| v13_16(void) = ReturnValue : &:r13_15, m28_14
# 13| v13_17(void) = UnmodeledUse : mu*
# 13| v13_18(void) = AliasedUse : m13_3
# 13| v13_19(void) = ExitFunction :
# 13| v13_17(void) = AliasedUse : m13_3
# 13| v13_18(void) = ExitFunction :
# 31| int UnreachableViaGoto()
# 31| Block 0
@@ -110,9 +109,8 @@ ssa.cpp:
# 35| m35_3(int) = Store : &:r35_1, r35_2
# 31| r31_6(glval<int>) = VariableAddress[#return] :
# 31| v31_7(void) = ReturnValue : &:r31_6, m35_3
# 31| v31_8(void) = UnmodeledUse : mu*
# 31| v31_9(void) = AliasedUse : m31_3
# 31| v31_10(void) = ExitFunction :
# 31| v31_8(void) = AliasedUse : m31_3
# 31| v31_9(void) = ExitFunction :
# 38| int UnreachableIf(bool)
# 38| Block 0
@@ -139,9 +137,8 @@ ssa.cpp:
# 38| m38_8(int) = Phi : from 3:m46_3, from 5:m51_3
# 38| r38_9(glval<int>) = VariableAddress[#return] :
# 38| v38_10(void) = ReturnValue : &:r38_9, m38_8
# 38| v38_11(void) = UnmodeledUse : mu*
# 38| v38_12(void) = AliasedUse : m38_3
# 38| v38_13(void) = ExitFunction :
# 38| v38_11(void) = AliasedUse : m38_3
# 38| v38_12(void) = ExitFunction :
# 42| Block 2
# 42| r42_1(glval<int>) = VariableAddress[x] :
@@ -176,7 +173,7 @@ ssa.cpp:
#-----| Goto -> Block 1
# 38| Block 6
# 38| v38_14(void) = Unreached :
# 38| v38_13(void) = Unreached :
# 59| int DoWhileFalse()
# 59| Block 0
@@ -205,12 +202,11 @@ ssa.cpp:
# 65| m65_4(int) = Store : &:r65_1, r65_3
# 59| r59_6(glval<int>) = VariableAddress[#return] :
# 59| v59_7(void) = ReturnValue : &:r59_6, m65_4
# 59| v59_8(void) = UnmodeledUse : mu*
# 59| v59_9(void) = AliasedUse : m59_3
# 59| v59_10(void) = ExitFunction :
# 59| v59_8(void) = AliasedUse : m59_3
# 59| v59_9(void) = ExitFunction :
# 59| Block 2
# 59| v59_11(void) = Unreached :
# 59| v59_10(void) = Unreached :
# 68| void chiNodeAtEndOfLoop(int, char*)
# 68| Block 0
@@ -260,9 +256,8 @@ ssa.cpp:
# 71| v71_1(void) = NoOp :
# 68| v68_12(void) = ReturnIndirection[p] : &:r68_10, m68_11
# 68| v68_13(void) = ReturnVoid :
# 68| v68_14(void) = UnmodeledUse : mu*
# 68| v68_15(void) = AliasedUse : ~m69_3
# 68| v68_16(void) = ExitFunction :
# 68| v68_14(void) = AliasedUse : ~m69_3
# 68| v68_15(void) = ExitFunction :
# 75| void ScalarPhi(bool)
# 75| Block 0
@@ -320,9 +315,8 @@ ssa.cpp:
# 88| m88_4(int) = Store : &:r88_1, r88_3
# 89| v89_1(void) = NoOp :
# 75| v75_8(void) = ReturnVoid :
# 75| v75_9(void) = UnmodeledUse : mu*
# 75| v75_10(void) = AliasedUse : m75_3
# 75| v75_11(void) = ExitFunction :
# 75| v75_9(void) = AliasedUse : m75_3
# 75| v75_10(void) = ExitFunction :
# 91| void MustExactlyOverlap(Point)
# 91| Block 0
@@ -339,9 +333,8 @@ ssa.cpp:
# 92| m92_4(Point) = Store : &:r92_1, r92_3
# 93| v93_1(void) = NoOp :
# 91| v91_8(void) = ReturnVoid :
# 91| v91_9(void) = UnmodeledUse : mu*
# 91| v91_10(void) = AliasedUse : m91_3
# 91| v91_11(void) = ExitFunction :
# 91| v91_9(void) = AliasedUse : m91_3
# 91| v91_10(void) = ExitFunction :
# 95| void MustExactlyOverlapEscaped(Point)
# 95| Block 0
@@ -369,9 +362,8 @@ ssa.cpp:
# 97| m97_10(unknown) = Chi : total:m97_7, partial:m97_9
# 98| v98_1(void) = NoOp :
# 95| v95_9(void) = ReturnVoid :
# 95| v95_10(void) = UnmodeledUse : mu*
# 95| v95_11(void) = AliasedUse : ~m97_7
# 95| v95_12(void) = ExitFunction :
# 95| v95_10(void) = AliasedUse : ~m97_7
# 95| v95_11(void) = ExitFunction :
# 100| void MustTotallyOverlap(Point)
# 100| Block 0
@@ -394,9 +386,8 @@ ssa.cpp:
# 102| m102_5(int) = Store : &:r102_1, r102_4
# 103| v103_1(void) = NoOp :
# 100| v100_8(void) = ReturnVoid :
# 100| v100_9(void) = UnmodeledUse : mu*
# 100| v100_10(void) = AliasedUse : m100_3
# 100| v100_11(void) = ExitFunction :
# 100| v100_9(void) = AliasedUse : m100_3
# 100| v100_10(void) = ExitFunction :
# 105| void MustTotallyOverlapEscaped(Point)
# 105| Block 0
@@ -430,9 +421,8 @@ ssa.cpp:
# 108| m108_10(unknown) = Chi : total:m108_7, partial:m108_9
# 109| v109_1(void) = NoOp :
# 105| v105_9(void) = ReturnVoid :
# 105| v105_10(void) = UnmodeledUse : mu*
# 105| v105_11(void) = AliasedUse : ~m108_7
# 105| v105_12(void) = ExitFunction :
# 105| v105_10(void) = AliasedUse : ~m108_7
# 105| v105_11(void) = ExitFunction :
# 111| void MayPartiallyOverlap(int, int)
# 111| Block 0
@@ -463,9 +453,8 @@ ssa.cpp:
# 113| m113_4(Point) = Store : &:r113_1, r113_3
# 114| v114_1(void) = NoOp :
# 111| v111_10(void) = ReturnVoid :
# 111| v111_11(void) = UnmodeledUse : mu*
# 111| v111_12(void) = AliasedUse : m111_3
# 111| v111_13(void) = ExitFunction :
# 111| v111_11(void) = AliasedUse : m111_3
# 111| v111_12(void) = ExitFunction :
# 116| void MayPartiallyOverlapEscaped(int, int)
# 116| Block 0
@@ -507,9 +496,8 @@ ssa.cpp:
# 119| m119_10(unknown) = Chi : total:m119_7, partial:m119_9
# 120| v120_1(void) = NoOp :
# 116| v116_10(void) = ReturnVoid :
# 116| v116_11(void) = UnmodeledUse : mu*
# 116| v116_12(void) = AliasedUse : ~m119_7
# 116| v116_13(void) = ExitFunction :
# 116| v116_11(void) = AliasedUse : ~m119_7
# 116| v116_12(void) = ExitFunction :
# 122| void MergeMustExactlyOverlap(bool, int, int)
# 122| Block 0
@@ -572,9 +560,8 @@ ssa.cpp:
# 131| m131_4(Point) = Store : &:r131_1, r131_3
# 132| v132_1(void) = NoOp :
# 122| v122_12(void) = ReturnVoid :
# 122| v122_13(void) = UnmodeledUse : mu*
# 122| v122_14(void) = AliasedUse : m122_3
# 122| v122_15(void) = ExitFunction :
# 122| v122_13(void) = AliasedUse : m122_3
# 122| v122_14(void) = ExitFunction :
# 134| void MergeMustExactlyWithMustTotallyOverlap(bool, Point, int)
# 134| Block 0
@@ -631,9 +618,8 @@ ssa.cpp:
# 142| m142_7(int) = Store : &:r142_3, r142_6
# 143| v143_1(void) = NoOp :
# 134| v134_12(void) = ReturnVoid :
# 134| v134_13(void) = UnmodeledUse : mu*
# 134| v134_14(void) = AliasedUse : m134_3
# 134| v134_15(void) = ExitFunction :
# 134| v134_13(void) = AliasedUse : m134_3
# 134| v134_14(void) = ExitFunction :
# 145| void MergeMustExactlyWithMayPartiallyOverlap(bool, Point, int)
# 145| Block 0
@@ -688,9 +674,8 @@ ssa.cpp:
# 153| m153_5(Point) = Store : &:r153_2, r153_4
# 154| v154_1(void) = NoOp :
# 145| v145_12(void) = ReturnVoid :
# 145| v145_13(void) = UnmodeledUse : mu*
# 145| v145_14(void) = AliasedUse : m145_3
# 145| v145_15(void) = ExitFunction :
# 145| v145_13(void) = AliasedUse : m145_3
# 145| v145_14(void) = ExitFunction :
# 156| void MergeMustTotallyOverlapWithMayPartiallyOverlap(bool, Rect, int)
# 156| Block 0
@@ -747,9 +732,8 @@ ssa.cpp:
# 164| m164_6(Point) = Store : &:r164_2, r164_5
# 165| v165_1(void) = NoOp :
# 156| v156_12(void) = ReturnVoid :
# 156| v156_13(void) = UnmodeledUse : mu*
# 156| v156_14(void) = AliasedUse : m156_3
# 156| v156_15(void) = ExitFunction :
# 156| v156_13(void) = AliasedUse : m156_3
# 156| v156_14(void) = ExitFunction :
# 171| void WrapperStruct(Wrapper)
# 171| Block 0
@@ -784,9 +768,8 @@ ssa.cpp:
# 176| m176_4(Wrapper) = Store : &:r176_3, r176_2
# 177| v177_1(void) = NoOp :
# 171| v171_8(void) = ReturnVoid :
# 171| v171_9(void) = UnmodeledUse : mu*
# 171| v171_10(void) = AliasedUse : m171_3
# 171| v171_11(void) = ExitFunction :
# 171| v171_9(void) = AliasedUse : m171_3
# 171| v171_10(void) = ExitFunction :
# 179| int AsmStmt(int*)
# 179| Block 0
@@ -809,9 +792,8 @@ ssa.cpp:
# 179| v179_10(void) = ReturnIndirection[p] : &:r179_8, m179_9
# 179| r179_11(glval<int>) = VariableAddress[#return] :
# 179| v179_12(void) = ReturnValue : &:r179_11, m181_5
# 179| v179_13(void) = UnmodeledUse : mu*
# 179| v179_14(void) = AliasedUse : ~m180_2
# 179| v179_15(void) = ExitFunction :
# 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
@@ -858,9 +840,8 @@ ssa.cpp:
# 184| v184_26(void) = ReturnIndirection[c] : &:r184_18, m184_19
# 184| v184_27(void) = ReturnIndirection[d] : &:r184_22, m184_23
# 184| v184_28(void) = ReturnVoid :
# 184| v184_29(void) = UnmodeledUse : mu*
# 184| v184_30(void) = AliasedUse : ~m186_2
# 184| v184_31(void) = ExitFunction :
# 184| v184_29(void) = AliasedUse : ~m186_2
# 184| v184_30(void) = ExitFunction :
# 198| int PureFunctions(char*, char*, int)
# 198| Block 0
@@ -917,9 +898,8 @@ ssa.cpp:
# 198| v198_17(void) = ReturnIndirection[str2] : &:r198_12, 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_3
# 198| v198_22(void) = ExitFunction :
# 198| v198_20(void) = AliasedUse : m198_3
# 198| v198_21(void) = ExitFunction :
# 207| int ModeledCallTarget(int)
# 207| Block 0
@@ -952,9 +932,8 @@ ssa.cpp:
# 210| m210_4(int) = Store : &:r210_1, r210_3
# 207| r207_9(glval<int>) = VariableAddress[#return] :
# 207| v207_10(void) = ReturnValue : &:r207_9, m210_4
# 207| v207_11(void) = UnmodeledUse : mu*
# 207| v207_12(void) = AliasedUse : m207_3
# 207| v207_13(void) = ExitFunction :
# 207| v207_11(void) = AliasedUse : m207_3
# 207| v207_12(void) = ExitFunction :
# 213| void InitArray()
# 213| Block 0
@@ -1021,9 +1000,8 @@ ssa.cpp:
# 221| m221_12(char[3]) = Chi : total:m221_7, partial:m221_11
# 222| v222_1(void) = NoOp :
# 213| v213_6(void) = ReturnVoid :
# 213| v213_7(void) = UnmodeledUse : mu*
# 213| v213_8(void) = AliasedUse : m213_3
# 213| v213_9(void) = ExitFunction :
# 213| v213_7(void) = AliasedUse : m213_3
# 213| v213_8(void) = ExitFunction :
# 226| char StringLiteralAliasing()
# 226| Block 0
@@ -1049,9 +1027,8 @@ ssa.cpp:
# 230| m230_7(char) = Store : &:r230_1, r230_6
# 226| r226_6(glval<char>) = VariableAddress[#return] :
# 226| v226_7(void) = ReturnValue : &:r226_6, m230_7
# 226| v226_8(void) = UnmodeledUse : mu*
# 226| v226_9(void) = AliasedUse : ~m227_4
# 226| v226_10(void) = ExitFunction :
# 226| v226_8(void) = AliasedUse : ~m227_4
# 226| v226_9(void) = ExitFunction :
# 235| void Constructible::Constructible(int)
# 235| Block 0
@@ -1065,9 +1042,8 @@ ssa.cpp:
# 235| m235_8(int) = InitializeParameter[x] : &:r235_7
# 235| v235_9(void) = NoOp :
# 235| v235_10(void) = ReturnVoid :
# 235| v235_11(void) = UnmodeledUse : mu*
# 235| v235_12(void) = AliasedUse : m235_3
# 235| v235_13(void) = ExitFunction :
# 235| v235_11(void) = AliasedUse : m235_3
# 235| v235_12(void) = ExitFunction :
# 236| void Constructible::g()
# 236| Block 0
@@ -1079,9 +1055,8 @@ ssa.cpp:
# 236| r236_6(glval<Constructible>) = InitializeThis :
# 236| v236_7(void) = NoOp :
# 236| v236_8(void) = ReturnVoid :
# 236| v236_9(void) = UnmodeledUse : mu*
# 236| v236_10(void) = AliasedUse : m236_3
# 236| v236_11(void) = ExitFunction :
# 236| v236_9(void) = AliasedUse : m236_3
# 236| v236_10(void) = ExitFunction :
# 239| void ExplicitConstructorCalls()
# 239| Block 0
@@ -1134,9 +1109,8 @@ ssa.cpp:
# 244| m244_8(Constructible) = Chi : total:m243_9, partial:m244_7
# 245| v245_1(void) = NoOp :
# 239| v239_6(void) = ReturnVoid :
# 239| v239_7(void) = UnmodeledUse : mu*
# 239| v239_8(void) = AliasedUse : ~m244_5
# 239| v239_9(void) = ExitFunction :
# 239| v239_7(void) = AliasedUse : ~m244_5
# 239| v239_8(void) = ExitFunction :
# 247| char* VoidStarIndirectParameters(char*, int)
# 247| Block 0
@@ -1192,9 +1166,8 @@ ssa.cpp:
# 247| v247_13(void) = ReturnIndirection[src] : &:r247_8, ~m250_13
# 247| r247_14(glval<char *>) = VariableAddress[#return] :
# 247| v247_15(void) = ReturnValue : &:r247_14, m251_4
# 247| v247_16(void) = UnmodeledUse : mu*
# 247| v247_17(void) = AliasedUse : ~m250_13
# 247| v247_18(void) = ExitFunction :
# 247| v247_16(void) = AliasedUse : ~m250_13
# 247| v247_17(void) = ExitFunction :
# 254| char StringLiteralAliasing2(bool)
# 254| Block 0
@@ -1240,9 +1213,8 @@ ssa.cpp:
# 263| m263_7(char) = Store : &:r263_1, r263_6
# 254| r254_8(glval<char>) = VariableAddress[#return] :
# 254| v254_9(void) = ReturnValue : &:r254_8, m263_7
# 254| v254_10(void) = UnmodeledUse : mu*
# 254| v254_11(void) = AliasedUse : ~m262_1
# 254| v254_12(void) = ExitFunction :
# 254| v254_10(void) = AliasedUse : ~m262_1
# 254| v254_11(void) = ExitFunction :
# 268| void* MallocAliasing(void*, int)
# 268| Block 0
@@ -1286,9 +1258,8 @@ ssa.cpp:
# 268| v268_13(void) = ReturnIndirection[s] : &:r268_8, ~m270_11
# 268| r268_14(glval<void *>) = VariableAddress[#return] :
# 268| v268_15(void) = ReturnValue : &:r268_14, m271_4
# 268| v268_16(void) = UnmodeledUse : mu*
# 268| v268_17(void) = AliasedUse : ~m270_11
# 268| v268_18(void) = ExitFunction :
# 268| v268_16(void) = AliasedUse : ~m270_11
# 268| v268_17(void) = ExitFunction :
# 275| void EscapedButNotConflated(bool, Point, int)
# 275| Block 0
@@ -1344,9 +1315,8 @@ ssa.cpp:
# 281| m281_7(int) = Store : &:r281_3, r281_6
# 282| v282_1(void) = NoOp :
# 275| v275_12(void) = ReturnVoid :
# 275| v275_13(void) = UnmodeledUse : mu*
# 275| v275_14(void) = AliasedUse : ~m281_2
# 275| v275_15(void) = ExitFunction :
# 275| v275_13(void) = AliasedUse : ~m281_2
# 275| v275_14(void) = ExitFunction :
# 286| void A::A(int)
# 286| Block 0
@@ -1360,9 +1330,8 @@ ssa.cpp:
# 286| m286_8(int) = InitializeParameter[x] : &:r286_7
# 286| v286_9(void) = NoOp :
# 286| v286_10(void) = ReturnVoid :
# 286| v286_11(void) = UnmodeledUse : mu*
# 286| v286_12(void) = AliasedUse : m286_3
# 286| v286_13(void) = ExitFunction :
# 286| v286_11(void) = AliasedUse : m286_3
# 286| v286_12(void) = ExitFunction :
# 287| void A::A(A*)
# 287| Block 0
@@ -1379,9 +1348,8 @@ ssa.cpp:
# 287| v287_11(void) = NoOp :
# 287| v287_12(void) = ReturnIndirection[p#0] : &:r287_9, m287_10
# 287| v287_13(void) = ReturnVoid :
# 287| v287_14(void) = UnmodeledUse : mu*
# 287| v287_15(void) = AliasedUse : m287_3
# 287| v287_16(void) = ExitFunction :
# 287| v287_14(void) = AliasedUse : m287_3
# 287| v287_15(void) = ExitFunction :
# 288| void A::A()
# 288| Block 0
@@ -1393,9 +1361,8 @@ ssa.cpp:
# 288| r288_6(glval<A>) = InitializeThis :
# 288| v288_7(void) = NoOp :
# 288| v288_8(void) = ReturnVoid :
# 288| v288_9(void) = UnmodeledUse : mu*
# 288| v288_10(void) = AliasedUse : m288_3
# 288| v288_11(void) = ExitFunction :
# 288| v288_9(void) = AliasedUse : m288_3
# 288| v288_10(void) = ExitFunction :
# 291| Point* NewAliasing(int)
# 291| Block 0
@@ -1480,9 +1447,8 @@ ssa.cpp:
# 296| m296_4(Point *) = Store : &:r296_1, r296_3
# 291| r291_8(glval<Point *>) = VariableAddress[#return] :
# 291| v291_9(void) = ReturnValue : &:r291_8, m296_4
# 291| v291_10(void) = UnmodeledUse : mu*
# 291| v291_11(void) = AliasedUse : ~m295_12
# 291| v291_12(void) = ExitFunction :
# 291| v291_10(void) = AliasedUse : ~m295_12
# 291| v291_11(void) = ExitFunction :
# 301| int main(int, char**)
# 301| Block 0
@@ -1530,6 +1496,5 @@ ssa.cpp:
# 301| v301_13(void) = ReturnIndirection[argv] : &:r301_10, ~m303_11
# 301| r301_14(glval<int>) = VariableAddress[#return] :
# 301| v301_15(void) = ReturnValue : &:r301_14, m304_7
# 301| v301_16(void) = UnmodeledUse : mu*
# 301| v301_17(void) = AliasedUse : ~m303_11
# 301| v301_18(void) = ExitFunction :
# 301| v301_16(void) = AliasedUse : ~m303_11
# 301| v301_17(void) = ExitFunction :

View File

@@ -92,9 +92,8 @@ ssa.cpp:
# 13| v13_14(void) = ReturnIndirection[p] : &:r13_8, m28_3
# 13| r13_15(glval<int>) = VariableAddress[#return] :
# 13| v13_16(void) = ReturnValue : &:r13_15, m28_14
# 13| v13_17(void) = UnmodeledUse : mu*
# 13| v13_18(void) = AliasedUse : m13_3
# 13| v13_19(void) = ExitFunction :
# 13| v13_17(void) = AliasedUse : m13_3
# 13| v13_18(void) = ExitFunction :
# 31| int UnreachableViaGoto()
# 31| Block 0
@@ -110,9 +109,8 @@ ssa.cpp:
# 35| m35_3(int) = Store : &:r35_1, r35_2
# 31| r31_6(glval<int>) = VariableAddress[#return] :
# 31| v31_7(void) = ReturnValue : &:r31_6, m35_3
# 31| v31_8(void) = UnmodeledUse : mu*
# 31| v31_9(void) = AliasedUse : m31_3
# 31| v31_10(void) = ExitFunction :
# 31| v31_8(void) = AliasedUse : m31_3
# 31| v31_9(void) = ExitFunction :
# 38| int UnreachableIf(bool)
# 38| Block 0
@@ -139,9 +137,8 @@ ssa.cpp:
# 38| m38_8(int) = Phi : from 3:m46_3, from 5:m51_3
# 38| r38_9(glval<int>) = VariableAddress[#return] :
# 38| v38_10(void) = ReturnValue : &:r38_9, m38_8
# 38| v38_11(void) = UnmodeledUse : mu*
# 38| v38_12(void) = AliasedUse : m38_3
# 38| v38_13(void) = ExitFunction :
# 38| v38_11(void) = AliasedUse : m38_3
# 38| v38_12(void) = ExitFunction :
# 42| Block 2
# 42| r42_1(glval<int>) = VariableAddress[x] :
@@ -176,7 +173,7 @@ ssa.cpp:
#-----| Goto -> Block 1
# 38| Block 6
# 38| v38_14(void) = Unreached :
# 38| v38_13(void) = Unreached :
# 59| int DoWhileFalse()
# 59| Block 0
@@ -205,12 +202,11 @@ ssa.cpp:
# 65| m65_4(int) = Store : &:r65_1, r65_3
# 59| r59_6(glval<int>) = VariableAddress[#return] :
# 59| v59_7(void) = ReturnValue : &:r59_6, m65_4
# 59| v59_8(void) = UnmodeledUse : mu*
# 59| v59_9(void) = AliasedUse : m59_3
# 59| v59_10(void) = ExitFunction :
# 59| v59_8(void) = AliasedUse : m59_3
# 59| v59_9(void) = ExitFunction :
# 59| Block 2
# 59| v59_11(void) = Unreached :
# 59| v59_10(void) = Unreached :
# 68| void chiNodeAtEndOfLoop(int, char*)
# 68| Block 0
@@ -260,9 +256,8 @@ ssa.cpp:
# 71| v71_1(void) = NoOp :
# 68| v68_12(void) = ReturnIndirection[p] : &:r68_10, m68_11
# 68| v68_13(void) = ReturnVoid :
# 68| v68_14(void) = UnmodeledUse : mu*
# 68| v68_15(void) = AliasedUse : ~m69_3
# 68| v68_16(void) = ExitFunction :
# 68| v68_14(void) = AliasedUse : ~m69_3
# 68| v68_15(void) = ExitFunction :
# 75| void ScalarPhi(bool)
# 75| Block 0
@@ -320,9 +315,8 @@ ssa.cpp:
# 88| m88_4(int) = Store : &:r88_1, r88_3
# 89| v89_1(void) = NoOp :
# 75| v75_8(void) = ReturnVoid :
# 75| v75_9(void) = UnmodeledUse : mu*
# 75| v75_10(void) = AliasedUse : m75_3
# 75| v75_11(void) = ExitFunction :
# 75| v75_9(void) = AliasedUse : m75_3
# 75| v75_10(void) = ExitFunction :
# 91| void MustExactlyOverlap(Point)
# 91| Block 0
@@ -339,9 +333,8 @@ ssa.cpp:
# 92| m92_4(Point) = Store : &:r92_1, r92_3
# 93| v93_1(void) = NoOp :
# 91| v91_8(void) = ReturnVoid :
# 91| v91_9(void) = UnmodeledUse : mu*
# 91| v91_10(void) = AliasedUse : m91_3
# 91| v91_11(void) = ExitFunction :
# 91| v91_9(void) = AliasedUse : m91_3
# 91| v91_10(void) = ExitFunction :
# 95| void MustExactlyOverlapEscaped(Point)
# 95| Block 0
@@ -368,9 +361,8 @@ ssa.cpp:
# 97| m97_10(Point) = Chi : total:m95_7, partial:m97_9
# 98| v98_1(void) = NoOp :
# 95| v95_8(void) = ReturnVoid :
# 95| v95_9(void) = UnmodeledUse : mu*
# 95| v95_10(void) = AliasedUse : ~m97_7
# 95| v95_11(void) = ExitFunction :
# 95| v95_9(void) = AliasedUse : ~m97_7
# 95| v95_10(void) = ExitFunction :
# 100| void MustTotallyOverlap(Point)
# 100| Block 0
@@ -393,9 +385,8 @@ ssa.cpp:
# 102| m102_5(int) = Store : &:r102_1, r102_4
# 103| v103_1(void) = NoOp :
# 100| v100_8(void) = ReturnVoid :
# 100| v100_9(void) = UnmodeledUse : mu*
# 100| v100_10(void) = AliasedUse : m100_3
# 100| v100_11(void) = ExitFunction :
# 100| v100_9(void) = AliasedUse : m100_3
# 100| v100_10(void) = ExitFunction :
# 105| void MustTotallyOverlapEscaped(Point)
# 105| Block 0
@@ -428,9 +419,8 @@ ssa.cpp:
# 108| m108_10(Point) = Chi : total:m105_7, partial:m108_9
# 109| v109_1(void) = NoOp :
# 105| v105_8(void) = ReturnVoid :
# 105| v105_9(void) = UnmodeledUse : mu*
# 105| v105_10(void) = AliasedUse : ~m108_7
# 105| v105_11(void) = ExitFunction :
# 105| v105_9(void) = AliasedUse : ~m108_7
# 105| v105_10(void) = ExitFunction :
# 111| void MayPartiallyOverlap(int, int)
# 111| Block 0
@@ -461,9 +451,8 @@ ssa.cpp:
# 113| m113_4(Point) = Store : &:r113_1, r113_3
# 114| v114_1(void) = NoOp :
# 111| v111_10(void) = ReturnVoid :
# 111| v111_11(void) = UnmodeledUse : mu*
# 111| v111_12(void) = AliasedUse : m111_3
# 111| v111_13(void) = ExitFunction :
# 111| v111_11(void) = AliasedUse : m111_3
# 111| v111_12(void) = ExitFunction :
# 116| void MayPartiallyOverlapEscaped(int, int)
# 116| Block 0
@@ -504,9 +493,8 @@ ssa.cpp:
# 119| m119_10(Point) = Chi : total:m117_12, partial:m119_9
# 120| v120_1(void) = NoOp :
# 116| v116_10(void) = ReturnVoid :
# 116| v116_11(void) = UnmodeledUse : mu*
# 116| v116_12(void) = AliasedUse : ~m119_7
# 116| v116_13(void) = ExitFunction :
# 116| v116_11(void) = AliasedUse : ~m119_7
# 116| v116_12(void) = ExitFunction :
# 122| void MergeMustExactlyOverlap(bool, int, int)
# 122| Block 0
@@ -569,9 +557,8 @@ ssa.cpp:
# 131| m131_4(Point) = Store : &:r131_1, r131_3
# 132| v132_1(void) = NoOp :
# 122| v122_12(void) = ReturnVoid :
# 122| v122_13(void) = UnmodeledUse : mu*
# 122| v122_14(void) = AliasedUse : m122_3
# 122| v122_15(void) = ExitFunction :
# 122| v122_13(void) = AliasedUse : m122_3
# 122| v122_14(void) = ExitFunction :
# 134| void MergeMustExactlyWithMustTotallyOverlap(bool, Point, int)
# 134| Block 0
@@ -628,9 +615,8 @@ ssa.cpp:
# 142| m142_7(int) = Store : &:r142_3, r142_6
# 143| v143_1(void) = NoOp :
# 134| v134_12(void) = ReturnVoid :
# 134| v134_13(void) = UnmodeledUse : mu*
# 134| v134_14(void) = AliasedUse : m134_3
# 134| v134_15(void) = ExitFunction :
# 134| v134_13(void) = AliasedUse : m134_3
# 134| v134_14(void) = ExitFunction :
# 145| void MergeMustExactlyWithMayPartiallyOverlap(bool, Point, int)
# 145| Block 0
@@ -685,9 +671,8 @@ ssa.cpp:
# 153| m153_5(Point) = Store : &:r153_2, r153_4
# 154| v154_1(void) = NoOp :
# 145| v145_12(void) = ReturnVoid :
# 145| v145_13(void) = UnmodeledUse : mu*
# 145| v145_14(void) = AliasedUse : m145_3
# 145| v145_15(void) = ExitFunction :
# 145| v145_13(void) = AliasedUse : m145_3
# 145| v145_14(void) = ExitFunction :
# 156| void MergeMustTotallyOverlapWithMayPartiallyOverlap(bool, Rect, int)
# 156| Block 0
@@ -744,9 +729,8 @@ ssa.cpp:
# 164| m164_6(Point) = Store : &:r164_2, r164_5
# 165| v165_1(void) = NoOp :
# 156| v156_12(void) = ReturnVoid :
# 156| v156_13(void) = UnmodeledUse : mu*
# 156| v156_14(void) = AliasedUse : m156_3
# 156| v156_15(void) = ExitFunction :
# 156| v156_13(void) = AliasedUse : m156_3
# 156| v156_14(void) = ExitFunction :
# 171| void WrapperStruct(Wrapper)
# 171| Block 0
@@ -781,9 +765,8 @@ ssa.cpp:
# 176| m176_4(Wrapper) = Store : &:r176_3, r176_2
# 177| v177_1(void) = NoOp :
# 171| v171_8(void) = ReturnVoid :
# 171| v171_9(void) = UnmodeledUse : mu*
# 171| v171_10(void) = AliasedUse : m171_3
# 171| v171_11(void) = ExitFunction :
# 171| v171_9(void) = AliasedUse : m171_3
# 171| v171_10(void) = ExitFunction :
# 179| int AsmStmt(int*)
# 179| Block 0
@@ -806,9 +789,8 @@ ssa.cpp:
# 179| v179_10(void) = ReturnIndirection[p] : &:r179_8, m179_9
# 179| r179_11(glval<int>) = VariableAddress[#return] :
# 179| v179_12(void) = ReturnValue : &:r179_11, m181_5
# 179| v179_13(void) = UnmodeledUse : mu*
# 179| v179_14(void) = AliasedUse : ~m180_2
# 179| v179_15(void) = ExitFunction :
# 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
@@ -853,9 +835,8 @@ ssa.cpp:
# 184| v184_24(void) = ReturnIndirection[c] : &:r184_16, m184_17
# 184| v184_25(void) = ReturnIndirection[d] : &:r184_20, m184_21
# 184| v184_26(void) = ReturnVoid :
# 184| v184_27(void) = UnmodeledUse : mu*
# 184| v184_28(void) = AliasedUse : ~m186_2
# 184| v184_29(void) = ExitFunction :
# 184| v184_27(void) = AliasedUse : ~m186_2
# 184| v184_28(void) = ExitFunction :
# 198| int PureFunctions(char*, char*, int)
# 198| Block 0
@@ -912,9 +893,8 @@ ssa.cpp:
# 198| v198_17(void) = ReturnIndirection[str2] : &:r198_12, 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_3
# 198| v198_22(void) = ExitFunction :
# 198| v198_20(void) = AliasedUse : m198_3
# 198| v198_21(void) = ExitFunction :
# 207| int ModeledCallTarget(int)
# 207| Block 0
@@ -945,9 +925,8 @@ ssa.cpp:
# 210| m210_4(int) = Store : &:r210_1, r210_3
# 207| r207_8(glval<int>) = VariableAddress[#return] :
# 207| v207_9(void) = ReturnValue : &:r207_8, m210_4
# 207| v207_10(void) = UnmodeledUse : mu*
# 207| v207_11(void) = AliasedUse : m207_3
# 207| v207_12(void) = ExitFunction :
# 207| v207_10(void) = AliasedUse : m207_3
# 207| v207_11(void) = ExitFunction :
# 213| void InitArray()
# 213| Block 0
@@ -1014,9 +993,8 @@ ssa.cpp:
# 221| m221_12(char[3]) = Chi : total:m221_7, partial:m221_11
# 222| v222_1(void) = NoOp :
# 213| v213_6(void) = ReturnVoid :
# 213| v213_7(void) = UnmodeledUse : mu*
# 213| v213_8(void) = AliasedUse : m213_3
# 213| v213_9(void) = ExitFunction :
# 213| v213_7(void) = AliasedUse : m213_3
# 213| v213_8(void) = ExitFunction :
# 226| char StringLiteralAliasing()
# 226| Block 0
@@ -1042,9 +1020,8 @@ ssa.cpp:
# 230| m230_7(char) = Store : &:r230_1, r230_6
# 226| r226_6(glval<char>) = VariableAddress[#return] :
# 226| v226_7(void) = ReturnValue : &:r226_6, m230_7
# 226| v226_8(void) = UnmodeledUse : mu*
# 226| v226_9(void) = AliasedUse : ~m227_4
# 226| v226_10(void) = ExitFunction :
# 226| v226_8(void) = AliasedUse : ~m227_4
# 226| v226_9(void) = ExitFunction :
# 235| void Constructible::Constructible(int)
# 235| Block 0
@@ -1058,9 +1035,8 @@ ssa.cpp:
# 235| m235_8(int) = InitializeParameter[x] : &:r235_7
# 235| v235_9(void) = NoOp :
# 235| v235_10(void) = ReturnVoid :
# 235| v235_11(void) = UnmodeledUse : mu*
# 235| v235_12(void) = AliasedUse : m235_3
# 235| v235_13(void) = ExitFunction :
# 235| v235_11(void) = AliasedUse : m235_3
# 235| v235_12(void) = ExitFunction :
# 236| void Constructible::g()
# 236| Block 0
@@ -1072,9 +1048,8 @@ ssa.cpp:
# 236| r236_6(glval<Constructible>) = InitializeThis :
# 236| v236_7(void) = NoOp :
# 236| v236_8(void) = ReturnVoid :
# 236| v236_9(void) = UnmodeledUse : mu*
# 236| v236_10(void) = AliasedUse : m236_3
# 236| v236_11(void) = ExitFunction :
# 236| v236_9(void) = AliasedUse : m236_3
# 236| v236_10(void) = ExitFunction :
# 239| void ExplicitConstructorCalls()
# 239| Block 0
@@ -1127,9 +1102,8 @@ ssa.cpp:
# 244| m244_8(Constructible) = Chi : total:m243_9, partial:m244_7
# 245| v245_1(void) = NoOp :
# 239| v239_6(void) = ReturnVoid :
# 239| v239_7(void) = UnmodeledUse : mu*
# 239| v239_8(void) = AliasedUse : ~m244_5
# 239| v239_9(void) = ExitFunction :
# 239| v239_7(void) = AliasedUse : ~m244_5
# 239| v239_8(void) = ExitFunction :
# 247| char* VoidStarIndirectParameters(char*, int)
# 247| Block 0
@@ -1183,9 +1157,8 @@ ssa.cpp:
# 247| v247_12(void) = ReturnIndirection[src] : &:r247_8, m249_6
# 247| r247_13(glval<char *>) = VariableAddress[#return] :
# 247| v247_14(void) = ReturnValue : &:r247_13, m251_4
# 247| v247_15(void) = UnmodeledUse : mu*
# 247| v247_16(void) = AliasedUse : ~m248_10
# 247| v247_17(void) = ExitFunction :
# 247| v247_15(void) = AliasedUse : ~m248_10
# 247| v247_16(void) = ExitFunction :
# 254| char StringLiteralAliasing2(bool)
# 254| Block 0
@@ -1231,9 +1204,8 @@ ssa.cpp:
# 263| m263_7(char) = Store : &:r263_1, r263_6
# 254| r254_8(glval<char>) = VariableAddress[#return] :
# 254| v254_9(void) = ReturnValue : &:r254_8, m263_7
# 254| v254_10(void) = UnmodeledUse : mu*
# 254| v254_11(void) = AliasedUse : ~m262_1
# 254| v254_12(void) = ExitFunction :
# 254| v254_10(void) = AliasedUse : ~m262_1
# 254| v254_11(void) = ExitFunction :
# 268| void* MallocAliasing(void*, int)
# 268| Block 0
@@ -1275,9 +1247,8 @@ ssa.cpp:
# 268| v268_12(void) = ReturnIndirection[s] : &:r268_8, m268_9
# 268| r268_13(glval<void *>) = VariableAddress[#return] :
# 268| v268_14(void) = ReturnValue : &:r268_13, m271_4
# 268| v268_15(void) = UnmodeledUse : mu*
# 268| v268_16(void) = AliasedUse : ~m269_7
# 268| v268_17(void) = ExitFunction :
# 268| v268_15(void) = AliasedUse : ~m269_7
# 268| v268_16(void) = ExitFunction :
# 275| void EscapedButNotConflated(bool, Point, int)
# 275| Block 0
@@ -1332,9 +1303,8 @@ ssa.cpp:
# 281| m281_7(int) = Store : &:r281_3, r281_6
# 282| v282_1(void) = NoOp :
# 275| v275_12(void) = ReturnVoid :
# 275| v275_13(void) = UnmodeledUse : mu*
# 275| v275_14(void) = AliasedUse : ~m277_5
# 275| v275_15(void) = ExitFunction :
# 275| v275_13(void) = AliasedUse : ~m277_5
# 275| v275_14(void) = ExitFunction :
# 286| void A::A(int)
# 286| Block 0
@@ -1348,9 +1318,8 @@ ssa.cpp:
# 286| m286_8(int) = InitializeParameter[x] : &:r286_7
# 286| v286_9(void) = NoOp :
# 286| v286_10(void) = ReturnVoid :
# 286| v286_11(void) = UnmodeledUse : mu*
# 286| v286_12(void) = AliasedUse : m286_3
# 286| v286_13(void) = ExitFunction :
# 286| v286_11(void) = AliasedUse : m286_3
# 286| v286_12(void) = ExitFunction :
# 287| void A::A(A*)
# 287| Block 0
@@ -1367,9 +1336,8 @@ ssa.cpp:
# 287| v287_11(void) = NoOp :
# 287| v287_12(void) = ReturnIndirection[p#0] : &:r287_9, m287_10
# 287| v287_13(void) = ReturnVoid :
# 287| v287_14(void) = UnmodeledUse : mu*
# 287| v287_15(void) = AliasedUse : m287_3
# 287| v287_16(void) = ExitFunction :
# 287| v287_14(void) = AliasedUse : m287_3
# 287| v287_15(void) = ExitFunction :
# 288| void A::A()
# 288| Block 0
@@ -1381,9 +1349,8 @@ ssa.cpp:
# 288| r288_6(glval<A>) = InitializeThis :
# 288| v288_7(void) = NoOp :
# 288| v288_8(void) = ReturnVoid :
# 288| v288_9(void) = UnmodeledUse : mu*
# 288| v288_10(void) = AliasedUse : m288_3
# 288| v288_11(void) = ExitFunction :
# 288| v288_9(void) = AliasedUse : m288_3
# 288| v288_10(void) = ExitFunction :
# 291| Point* NewAliasing(int)
# 291| Block 0
@@ -1468,9 +1435,8 @@ ssa.cpp:
# 296| m296_4(Point *) = Store : &:r296_1, r296_3
# 291| r291_8(glval<Point *>) = VariableAddress[#return] :
# 291| v291_9(void) = ReturnValue : &:r291_8, m296_4
# 291| v291_10(void) = UnmodeledUse : mu*
# 291| v291_11(void) = AliasedUse : ~m295_12
# 291| v291_12(void) = ExitFunction :
# 291| v291_10(void) = AliasedUse : ~m295_12
# 291| v291_11(void) = ExitFunction :
# 301| int main(int, char**)
# 301| Block 0
@@ -1517,6 +1483,5 @@ ssa.cpp:
# 301| v301_12(void) = ReturnIndirection[argv] : &:r301_10, ~m303_11, m303_11
# 301| r301_13(glval<int>) = VariableAddress[#return] :
# 301| v301_14(void) = ReturnValue : &:r301_13, m304_7
# 301| v301_15(void) = UnmodeledUse : mu*
# 301| v301_16(void) = AliasedUse : ~m303_8
# 301| v301_17(void) = ExitFunction :
# 301| v301_15(void) = AliasedUse : ~m303_8
# 301| v301_16(void) = ExitFunction :

View File

@@ -81,9 +81,8 @@ ssa.cpp:
# 13| v13_13(void) = ReturnIndirection[p] : &:r13_7, ~mu13_4
# 13| r13_14(glval<int>) = VariableAddress[#return] :
# 13| v13_15(void) = ReturnValue : &:r13_14, m28_11
# 13| v13_16(void) = UnmodeledUse : mu*
# 13| v13_17(void) = AliasedUse : ~mu13_4
# 13| v13_18(void) = ExitFunction :
# 13| v13_16(void) = AliasedUse : ~mu13_4
# 13| v13_17(void) = ExitFunction :
# 31| int UnreachableViaGoto()
# 31| Block 0
@@ -98,9 +97,8 @@ ssa.cpp:
# 35| m35_3(int) = Store : &:r35_1, r35_2
# 31| r31_5(glval<int>) = VariableAddress[#return] :
# 31| v31_6(void) = ReturnValue : &:r31_5, m35_3
# 31| v31_7(void) = UnmodeledUse : mu*
# 31| v31_8(void) = AliasedUse : ~mu31_4
# 31| v31_9(void) = ExitFunction :
# 31| v31_7(void) = AliasedUse : ~mu31_4
# 31| v31_8(void) = ExitFunction :
# 38| int UnreachableIf(bool)
# 38| Block 0
@@ -126,9 +124,8 @@ ssa.cpp:
# 38| m38_7(int) = Phi : from 3:m43_3, from 4:m46_3, from 6:m51_3, from 7:m54_3
# 38| r38_8(glval<int>) = VariableAddress[#return] :
# 38| v38_9(void) = ReturnValue : &:r38_8, m38_7
# 38| v38_10(void) = UnmodeledUse : mu*
# 38| v38_11(void) = AliasedUse : ~mu38_4
# 38| v38_12(void) = ExitFunction :
# 38| v38_10(void) = AliasedUse : ~mu38_4
# 38| v38_11(void) = ExitFunction :
# 42| Block 2
# 42| r42_1(glval<int>) = VariableAddress[x] :
@@ -200,12 +197,11 @@ ssa.cpp:
# 65| m65_4(int) = Store : &:r65_1, r65_3
# 59| r59_5(glval<int>) = VariableAddress[#return] :
# 59| v59_6(void) = ReturnValue : &:r59_5, m65_4
# 59| v59_7(void) = UnmodeledUse : mu*
# 59| v59_8(void) = AliasedUse : ~mu59_4
# 59| v59_9(void) = ExitFunction :
# 59| v59_7(void) = AliasedUse : ~mu59_4
# 59| v59_8(void) = ExitFunction :
# 59| Block 2
# 59| v59_10(void) = Unreached :
# 59| v59_9(void) = Unreached :
# 68| void chiNodeAtEndOfLoop(int, char*)
# 68| Block 0
@@ -252,9 +248,8 @@ ssa.cpp:
# 71| v71_1(void) = NoOp :
# 68| v68_11(void) = ReturnIndirection[p] : &:r68_9, ~mu68_4
# 68| v68_12(void) = ReturnVoid :
# 68| v68_13(void) = UnmodeledUse : mu*
# 68| v68_14(void) = AliasedUse : ~mu68_4
# 68| v68_15(void) = ExitFunction :
# 68| v68_13(void) = AliasedUse : ~mu68_4
# 68| v68_14(void) = ExitFunction :
# 75| void ScalarPhi(bool)
# 75| Block 0
@@ -311,9 +306,8 @@ ssa.cpp:
# 88| m88_4(int) = Store : &:r88_1, r88_3
# 89| v89_1(void) = NoOp :
# 75| v75_7(void) = ReturnVoid :
# 75| v75_8(void) = UnmodeledUse : mu*
# 75| v75_9(void) = AliasedUse : ~mu75_4
# 75| v75_10(void) = ExitFunction :
# 75| v75_8(void) = AliasedUse : ~mu75_4
# 75| v75_9(void) = ExitFunction :
# 91| void MustExactlyOverlap(Point)
# 91| Block 0
@@ -329,9 +323,8 @@ ssa.cpp:
# 92| m92_4(Point) = Store : &:r92_1, r92_3
# 93| v93_1(void) = NoOp :
# 91| v91_7(void) = ReturnVoid :
# 91| v91_8(void) = UnmodeledUse : mu*
# 91| v91_9(void) = AliasedUse : ~mu91_4
# 91| v91_10(void) = ExitFunction :
# 91| v91_8(void) = AliasedUse : ~mu91_4
# 91| v91_9(void) = ExitFunction :
# 95| void MustExactlyOverlapEscaped(Point)
# 95| Block 0
@@ -355,9 +348,8 @@ ssa.cpp:
# 97| mu97_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r97_4
# 98| v98_1(void) = NoOp :
# 95| v95_7(void) = ReturnVoid :
# 95| v95_8(void) = UnmodeledUse : mu*
# 95| v95_9(void) = AliasedUse : ~mu95_4
# 95| v95_10(void) = ExitFunction :
# 95| v95_8(void) = AliasedUse : ~mu95_4
# 95| v95_9(void) = ExitFunction :
# 100| void MustTotallyOverlap(Point)
# 100| Block 0
@@ -379,9 +371,8 @@ ssa.cpp:
# 102| m102_5(int) = Store : &:r102_1, r102_4
# 103| v103_1(void) = NoOp :
# 100| v100_7(void) = ReturnVoid :
# 100| v100_8(void) = UnmodeledUse : mu*
# 100| v100_9(void) = AliasedUse : ~mu100_4
# 100| v100_10(void) = ExitFunction :
# 100| v100_8(void) = AliasedUse : ~mu100_4
# 100| v100_9(void) = ExitFunction :
# 105| void MustTotallyOverlapEscaped(Point)
# 105| Block 0
@@ -411,9 +402,8 @@ ssa.cpp:
# 108| mu108_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r108_4
# 109| v109_1(void) = NoOp :
# 105| v105_7(void) = ReturnVoid :
# 105| v105_8(void) = UnmodeledUse : mu*
# 105| v105_9(void) = AliasedUse : ~mu105_4
# 105| v105_10(void) = ExitFunction :
# 105| v105_8(void) = AliasedUse : ~mu105_4
# 105| v105_9(void) = ExitFunction :
# 111| void MayPartiallyOverlap(int, int)
# 111| Block 0
@@ -441,9 +431,8 @@ ssa.cpp:
# 113| m113_4(Point) = Store : &:r113_1, r113_3
# 114| v114_1(void) = NoOp :
# 111| v111_9(void) = ReturnVoid :
# 111| v111_10(void) = UnmodeledUse : mu*
# 111| v111_11(void) = AliasedUse : ~mu111_4
# 111| v111_12(void) = ExitFunction :
# 111| v111_10(void) = AliasedUse : ~mu111_4
# 111| v111_11(void) = ExitFunction :
# 116| void MayPartiallyOverlapEscaped(int, int)
# 116| Block 0
@@ -479,9 +468,8 @@ ssa.cpp:
# 119| mu119_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r119_4
# 120| v120_1(void) = NoOp :
# 116| v116_9(void) = ReturnVoid :
# 116| v116_10(void) = UnmodeledUse : mu*
# 116| v116_11(void) = AliasedUse : ~mu116_4
# 116| v116_12(void) = ExitFunction :
# 116| v116_10(void) = AliasedUse : ~mu116_4
# 116| v116_11(void) = ExitFunction :
# 122| void MergeMustExactlyOverlap(bool, int, int)
# 122| Block 0
@@ -537,9 +525,8 @@ ssa.cpp:
# 131| m131_4(Point) = Store : &:r131_1, r131_3
# 132| v132_1(void) = NoOp :
# 122| v122_11(void) = ReturnVoid :
# 122| v122_12(void) = UnmodeledUse : mu*
# 122| v122_13(void) = AliasedUse : ~mu122_4
# 122| v122_14(void) = ExitFunction :
# 122| v122_12(void) = AliasedUse : ~mu122_4
# 122| v122_13(void) = ExitFunction :
# 134| void MergeMustExactlyWithMustTotallyOverlap(bool, Point, int)
# 134| Block 0
@@ -590,9 +577,8 @@ ssa.cpp:
# 142| m142_5(int) = Store : &:r142_1, r142_4
# 143| v143_1(void) = NoOp :
# 134| v134_11(void) = ReturnVoid :
# 134| v134_12(void) = UnmodeledUse : mu*
# 134| v134_13(void) = AliasedUse : ~mu134_4
# 134| v134_14(void) = ExitFunction :
# 134| v134_12(void) = AliasedUse : ~mu134_4
# 134| v134_13(void) = ExitFunction :
# 145| void MergeMustExactlyWithMayPartiallyOverlap(bool, Point, int)
# 145| Block 0
@@ -642,9 +628,8 @@ ssa.cpp:
# 153| m153_4(Point) = Store : &:r153_1, r153_3
# 154| v154_1(void) = NoOp :
# 145| v145_11(void) = ReturnVoid :
# 145| v145_12(void) = UnmodeledUse : mu*
# 145| v145_13(void) = AliasedUse : ~mu145_4
# 145| v145_14(void) = ExitFunction :
# 145| v145_12(void) = AliasedUse : ~mu145_4
# 145| v145_13(void) = ExitFunction :
# 156| void MergeMustTotallyOverlapWithMayPartiallyOverlap(bool, Rect, int)
# 156| Block 0
@@ -696,9 +681,8 @@ ssa.cpp:
# 164| m164_5(Point) = Store : &:r164_1, r164_4
# 165| v165_1(void) = NoOp :
# 156| v156_11(void) = ReturnVoid :
# 156| v156_12(void) = UnmodeledUse : mu*
# 156| v156_13(void) = AliasedUse : ~mu156_4
# 156| v156_14(void) = ExitFunction :
# 156| v156_12(void) = AliasedUse : ~mu156_4
# 156| v156_13(void) = ExitFunction :
# 171| void WrapperStruct(Wrapper)
# 171| Block 0
@@ -732,9 +716,8 @@ ssa.cpp:
# 176| m176_4(Wrapper) = Store : &:r176_3, r176_2
# 177| v177_1(void) = NoOp :
# 171| v171_7(void) = ReturnVoid :
# 171| v171_8(void) = UnmodeledUse : mu*
# 171| v171_9(void) = AliasedUse : ~mu171_4
# 171| v171_10(void) = ExitFunction :
# 171| v171_8(void) = AliasedUse : ~mu171_4
# 171| v171_9(void) = ExitFunction :
# 179| int AsmStmt(int*)
# 179| Block 0
@@ -755,9 +738,8 @@ ssa.cpp:
# 179| v179_9(void) = ReturnIndirection[p] : &:r179_7, ~mu179_4
# 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 : ~mu179_4
# 179| v179_14(void) = ExitFunction :
# 179| v179_12(void) = AliasedUse : ~mu179_4
# 179| v179_13(void) = ExitFunction :
# 184| void AsmStmtWithOutputs(unsigned int&, unsigned int&, unsigned int&, unsigned int&)
# 184| Block 0
@@ -800,9 +782,8 @@ ssa.cpp:
# 184| v184_23(void) = ReturnIndirection[c] : &:r184_15, ~mu184_4
# 184| v184_24(void) = ReturnIndirection[d] : &:r184_19, ~mu184_4
# 184| v184_25(void) = ReturnVoid :
# 184| v184_26(void) = UnmodeledUse : mu*
# 184| v184_27(void) = AliasedUse : ~mu184_4
# 184| v184_28(void) = ExitFunction :
# 184| v184_26(void) = AliasedUse : ~mu184_4
# 184| v184_27(void) = ExitFunction :
# 198| int PureFunctions(char*, char*, int)
# 198| Block 0
@@ -858,9 +839,8 @@ ssa.cpp:
# 198| v198_16(void) = ReturnIndirection[str2] : &:r198_11, ~mu198_4
# 198| r198_17(glval<int>) = VariableAddress[#return] :
# 198| v198_18(void) = ReturnValue : &:r198_17, m202_4
# 198| v198_19(void) = UnmodeledUse : mu*
# 198| v198_20(void) = AliasedUse : ~mu198_4
# 198| v198_21(void) = ExitFunction :
# 198| v198_19(void) = AliasedUse : ~mu198_4
# 198| v198_20(void) = ExitFunction :
# 207| int ModeledCallTarget(int)
# 207| Block 0
@@ -889,9 +869,8 @@ ssa.cpp:
# 210| m210_4(int) = Store : &:r210_1, r210_3
# 207| r207_7(glval<int>) = VariableAddress[#return] :
# 207| v207_8(void) = ReturnValue : &:r207_7, m210_4
# 207| v207_9(void) = UnmodeledUse : mu*
# 207| v207_10(void) = AliasedUse : ~mu207_4
# 207| v207_11(void) = ExitFunction :
# 207| v207_9(void) = AliasedUse : ~mu207_4
# 207| v207_10(void) = ExitFunction :
# 213| void InitArray()
# 213| Block 0
@@ -951,9 +930,8 @@ ssa.cpp:
# 221| mu221_10(unknown[2]) = Store : &:r221_8, r221_9
# 222| v222_1(void) = NoOp :
# 213| v213_5(void) = ReturnVoid :
# 213| v213_6(void) = UnmodeledUse : mu*
# 213| v213_7(void) = AliasedUse : ~mu213_4
# 213| v213_8(void) = ExitFunction :
# 213| v213_6(void) = AliasedUse : ~mu213_4
# 213| v213_7(void) = ExitFunction :
# 226| char StringLiteralAliasing()
# 226| Block 0
@@ -977,9 +955,8 @@ ssa.cpp:
# 230| m230_7(char) = Store : &:r230_1, r230_6
# 226| r226_5(glval<char>) = VariableAddress[#return] :
# 226| v226_6(void) = ReturnValue : &:r226_5, m230_7
# 226| v226_7(void) = UnmodeledUse : mu*
# 226| v226_8(void) = AliasedUse : ~mu226_4
# 226| v226_9(void) = ExitFunction :
# 226| v226_7(void) = AliasedUse : ~mu226_4
# 226| v226_8(void) = ExitFunction :
# 235| void Constructible::Constructible(int)
# 235| Block 0
@@ -992,9 +969,8 @@ ssa.cpp:
# 235| m235_7(int) = InitializeParameter[x] : &:r235_6
# 235| v235_8(void) = NoOp :
# 235| v235_9(void) = ReturnVoid :
# 235| v235_10(void) = UnmodeledUse : mu*
# 235| v235_11(void) = AliasedUse : ~mu235_4
# 235| v235_12(void) = ExitFunction :
# 235| v235_10(void) = AliasedUse : ~mu235_4
# 235| v235_11(void) = ExitFunction :
# 236| void Constructible::g()
# 236| Block 0
@@ -1005,9 +981,8 @@ ssa.cpp:
# 236| r236_5(glval<Constructible>) = InitializeThis :
# 236| v236_6(void) = NoOp :
# 236| v236_7(void) = ReturnVoid :
# 236| v236_8(void) = UnmodeledUse : mu*
# 236| v236_9(void) = AliasedUse : ~mu236_4
# 236| v236_10(void) = ExitFunction :
# 236| v236_8(void) = AliasedUse : ~mu236_4
# 236| v236_9(void) = ExitFunction :
# 239| void ExplicitConstructorCalls()
# 239| Block 0
@@ -1049,9 +1024,8 @@ ssa.cpp:
# 244| mu244_6(Constructible) = ^IndirectMayWriteSideEffect[-1] : &:r244_1
# 245| v245_1(void) = NoOp :
# 239| v239_5(void) = ReturnVoid :
# 239| v239_6(void) = UnmodeledUse : mu*
# 239| v239_7(void) = AliasedUse : ~mu239_4
# 239| v239_8(void) = ExitFunction :
# 239| v239_6(void) = AliasedUse : ~mu239_4
# 239| v239_7(void) = ExitFunction :
# 247| char* VoidStarIndirectParameters(char*, int)
# 247| Block 0
@@ -1101,9 +1075,8 @@ ssa.cpp:
# 247| v247_11(void) = ReturnIndirection[src] : &:r247_7, ~mu247_4
# 247| r247_12(glval<char *>) = VariableAddress[#return] :
# 247| v247_13(void) = ReturnValue : &:r247_12, m251_4
# 247| v247_14(void) = UnmodeledUse : mu*
# 247| v247_15(void) = AliasedUse : ~mu247_4
# 247| v247_16(void) = ExitFunction :
# 247| v247_14(void) = AliasedUse : ~mu247_4
# 247| v247_15(void) = ExitFunction :
# 254| char StringLiteralAliasing2(bool)
# 254| Block 0
@@ -1145,9 +1118,8 @@ ssa.cpp:
# 263| m263_7(char) = Store : &:r263_1, r263_6
# 254| r254_7(glval<char>) = VariableAddress[#return] :
# 254| v254_8(void) = ReturnValue : &:r254_7, m263_7
# 254| v254_9(void) = UnmodeledUse : mu*
# 254| v254_10(void) = AliasedUse : ~mu254_4
# 254| v254_11(void) = ExitFunction :
# 254| v254_9(void) = AliasedUse : ~mu254_4
# 254| v254_10(void) = ExitFunction :
# 268| void* MallocAliasing(void*, int)
# 268| Block 0
@@ -1186,9 +1158,8 @@ ssa.cpp:
# 268| v268_11(void) = ReturnIndirection[s] : &:r268_7, ~mu268_4
# 268| r268_12(glval<void *>) = VariableAddress[#return] :
# 268| v268_13(void) = ReturnValue : &:r268_12, m271_4
# 268| v268_14(void) = UnmodeledUse : mu*
# 268| v268_15(void) = AliasedUse : ~mu268_4
# 268| v268_16(void) = ExitFunction :
# 268| v268_14(void) = AliasedUse : ~mu268_4
# 268| v268_15(void) = ExitFunction :
# 275| void EscapedButNotConflated(bool, Point, int)
# 275| Block 0
@@ -1236,9 +1207,8 @@ ssa.cpp:
# 281| m281_5(int) = Store : &:r281_1, r281_4
# 282| v282_1(void) = NoOp :
# 275| v275_11(void) = ReturnVoid :
# 275| v275_12(void) = UnmodeledUse : mu*
# 275| v275_13(void) = AliasedUse : ~mu275_4
# 275| v275_14(void) = ExitFunction :
# 275| v275_12(void) = AliasedUse : ~mu275_4
# 275| v275_13(void) = ExitFunction :
# 286| void A::A(int)
# 286| Block 0
@@ -1251,9 +1221,8 @@ ssa.cpp:
# 286| m286_7(int) = InitializeParameter[x] : &:r286_6
# 286| v286_8(void) = NoOp :
# 286| v286_9(void) = ReturnVoid :
# 286| v286_10(void) = UnmodeledUse : mu*
# 286| v286_11(void) = AliasedUse : ~mu286_4
# 286| v286_12(void) = ExitFunction :
# 286| v286_10(void) = AliasedUse : ~mu286_4
# 286| v286_11(void) = ExitFunction :
# 287| void A::A(A*)
# 287| Block 0
@@ -1269,9 +1238,8 @@ ssa.cpp:
# 287| v287_10(void) = NoOp :
# 287| v287_11(void) = ReturnIndirection[p#0] : &:r287_8, ~mu287_4
# 287| v287_12(void) = ReturnVoid :
# 287| v287_13(void) = UnmodeledUse : mu*
# 287| v287_14(void) = AliasedUse : ~mu287_4
# 287| v287_15(void) = ExitFunction :
# 287| v287_13(void) = AliasedUse : ~mu287_4
# 287| v287_14(void) = ExitFunction :
# 288| void A::A()
# 288| Block 0
@@ -1282,9 +1250,8 @@ ssa.cpp:
# 288| r288_5(glval<A>) = InitializeThis :
# 288| v288_6(void) = NoOp :
# 288| v288_7(void) = ReturnVoid :
# 288| v288_8(void) = UnmodeledUse : mu*
# 288| v288_9(void) = AliasedUse : ~mu288_4
# 288| v288_10(void) = ExitFunction :
# 288| v288_8(void) = AliasedUse : ~mu288_4
# 288| v288_9(void) = ExitFunction :
# 291| Point* NewAliasing(int)
# 291| Block 0
@@ -1356,9 +1323,8 @@ ssa.cpp:
# 296| m296_4(Point *) = Store : &:r296_1, r296_3
# 291| r291_7(glval<Point *>) = VariableAddress[#return] :
# 291| v291_8(void) = ReturnValue : &:r291_7, m296_4
# 291| v291_9(void) = UnmodeledUse : mu*
# 291| v291_10(void) = AliasedUse : ~mu291_4
# 291| v291_11(void) = ExitFunction :
# 291| v291_9(void) = AliasedUse : ~mu291_4
# 291| v291_10(void) = ExitFunction :
# 301| int main(int, char**)
# 301| Block 0
@@ -1400,6 +1366,5 @@ ssa.cpp:
# 301| v301_11(void) = ReturnIndirection[argv] : &:r301_9, ~mu301_4
# 301| r301_12(glval<int>) = VariableAddress[#return] :
# 301| v301_13(void) = ReturnValue : &:r301_12, m304_7
# 301| v301_14(void) = UnmodeledUse : mu*
# 301| v301_15(void) = AliasedUse : ~mu301_4
# 301| v301_16(void) = ExitFunction :
# 301| v301_14(void) = AliasedUse : ~mu301_4
# 301| v301_15(void) = ExitFunction :

View File

@@ -81,9 +81,8 @@ ssa.cpp:
# 13| v13_13(void) = ReturnIndirection[p] : &:r13_7, ~mu13_4
# 13| r13_14(glval<int>) = VariableAddress[#return] :
# 13| v13_15(void) = ReturnValue : &:r13_14, m28_11
# 13| v13_16(void) = UnmodeledUse : mu*
# 13| v13_17(void) = AliasedUse : ~mu13_4
# 13| v13_18(void) = ExitFunction :
# 13| v13_16(void) = AliasedUse : ~mu13_4
# 13| v13_17(void) = ExitFunction :
# 31| int UnreachableViaGoto()
# 31| Block 0
@@ -98,9 +97,8 @@ ssa.cpp:
# 35| m35_3(int) = Store : &:r35_1, r35_2
# 31| r31_5(glval<int>) = VariableAddress[#return] :
# 31| v31_6(void) = ReturnValue : &:r31_5, m35_3
# 31| v31_7(void) = UnmodeledUse : mu*
# 31| v31_8(void) = AliasedUse : ~mu31_4
# 31| v31_9(void) = ExitFunction :
# 31| v31_7(void) = AliasedUse : ~mu31_4
# 31| v31_8(void) = ExitFunction :
# 38| int UnreachableIf(bool)
# 38| Block 0
@@ -126,9 +124,8 @@ ssa.cpp:
# 38| m38_7(int) = Phi : from 3:m43_3, from 4:m46_3, from 6:m51_3, from 7:m54_3
# 38| r38_8(glval<int>) = VariableAddress[#return] :
# 38| v38_9(void) = ReturnValue : &:r38_8, m38_7
# 38| v38_10(void) = UnmodeledUse : mu*
# 38| v38_11(void) = AliasedUse : ~mu38_4
# 38| v38_12(void) = ExitFunction :
# 38| v38_10(void) = AliasedUse : ~mu38_4
# 38| v38_11(void) = ExitFunction :
# 42| Block 2
# 42| r42_1(glval<int>) = VariableAddress[x] :
@@ -200,12 +197,11 @@ ssa.cpp:
# 65| m65_4(int) = Store : &:r65_1, r65_3
# 59| r59_5(glval<int>) = VariableAddress[#return] :
# 59| v59_6(void) = ReturnValue : &:r59_5, m65_4
# 59| v59_7(void) = UnmodeledUse : mu*
# 59| v59_8(void) = AliasedUse : ~mu59_4
# 59| v59_9(void) = ExitFunction :
# 59| v59_7(void) = AliasedUse : ~mu59_4
# 59| v59_8(void) = ExitFunction :
# 59| Block 2
# 59| v59_10(void) = Unreached :
# 59| v59_9(void) = Unreached :
# 68| void chiNodeAtEndOfLoop(int, char*)
# 68| Block 0
@@ -252,9 +248,8 @@ ssa.cpp:
# 71| v71_1(void) = NoOp :
# 68| v68_11(void) = ReturnIndirection[p] : &:r68_9, ~mu68_4
# 68| v68_12(void) = ReturnVoid :
# 68| v68_13(void) = UnmodeledUse : mu*
# 68| v68_14(void) = AliasedUse : ~mu68_4
# 68| v68_15(void) = ExitFunction :
# 68| v68_13(void) = AliasedUse : ~mu68_4
# 68| v68_14(void) = ExitFunction :
# 75| void ScalarPhi(bool)
# 75| Block 0
@@ -311,9 +306,8 @@ ssa.cpp:
# 88| m88_4(int) = Store : &:r88_1, r88_3
# 89| v89_1(void) = NoOp :
# 75| v75_7(void) = ReturnVoid :
# 75| v75_8(void) = UnmodeledUse : mu*
# 75| v75_9(void) = AliasedUse : ~mu75_4
# 75| v75_10(void) = ExitFunction :
# 75| v75_8(void) = AliasedUse : ~mu75_4
# 75| v75_9(void) = ExitFunction :
# 91| void MustExactlyOverlap(Point)
# 91| Block 0
@@ -329,9 +323,8 @@ ssa.cpp:
# 92| m92_4(Point) = Store : &:r92_1, r92_3
# 93| v93_1(void) = NoOp :
# 91| v91_7(void) = ReturnVoid :
# 91| v91_8(void) = UnmodeledUse : mu*
# 91| v91_9(void) = AliasedUse : ~mu91_4
# 91| v91_10(void) = ExitFunction :
# 91| v91_8(void) = AliasedUse : ~mu91_4
# 91| v91_9(void) = ExitFunction :
# 95| void MustExactlyOverlapEscaped(Point)
# 95| Block 0
@@ -355,9 +348,8 @@ ssa.cpp:
# 97| mu97_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r97_4
# 98| v98_1(void) = NoOp :
# 95| v95_7(void) = ReturnVoid :
# 95| v95_8(void) = UnmodeledUse : mu*
# 95| v95_9(void) = AliasedUse : ~mu95_4
# 95| v95_10(void) = ExitFunction :
# 95| v95_8(void) = AliasedUse : ~mu95_4
# 95| v95_9(void) = ExitFunction :
# 100| void MustTotallyOverlap(Point)
# 100| Block 0
@@ -379,9 +371,8 @@ ssa.cpp:
# 102| m102_5(int) = Store : &:r102_1, r102_4
# 103| v103_1(void) = NoOp :
# 100| v100_7(void) = ReturnVoid :
# 100| v100_8(void) = UnmodeledUse : mu*
# 100| v100_9(void) = AliasedUse : ~mu100_4
# 100| v100_10(void) = ExitFunction :
# 100| v100_8(void) = AliasedUse : ~mu100_4
# 100| v100_9(void) = ExitFunction :
# 105| void MustTotallyOverlapEscaped(Point)
# 105| Block 0
@@ -411,9 +402,8 @@ ssa.cpp:
# 108| mu108_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r108_4
# 109| v109_1(void) = NoOp :
# 105| v105_7(void) = ReturnVoid :
# 105| v105_8(void) = UnmodeledUse : mu*
# 105| v105_9(void) = AliasedUse : ~mu105_4
# 105| v105_10(void) = ExitFunction :
# 105| v105_8(void) = AliasedUse : ~mu105_4
# 105| v105_9(void) = ExitFunction :
# 111| void MayPartiallyOverlap(int, int)
# 111| Block 0
@@ -441,9 +431,8 @@ ssa.cpp:
# 113| m113_4(Point) = Store : &:r113_1, r113_3
# 114| v114_1(void) = NoOp :
# 111| v111_9(void) = ReturnVoid :
# 111| v111_10(void) = UnmodeledUse : mu*
# 111| v111_11(void) = AliasedUse : ~mu111_4
# 111| v111_12(void) = ExitFunction :
# 111| v111_10(void) = AliasedUse : ~mu111_4
# 111| v111_11(void) = ExitFunction :
# 116| void MayPartiallyOverlapEscaped(int, int)
# 116| Block 0
@@ -479,9 +468,8 @@ ssa.cpp:
# 119| mu119_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r119_4
# 120| v120_1(void) = NoOp :
# 116| v116_9(void) = ReturnVoid :
# 116| v116_10(void) = UnmodeledUse : mu*
# 116| v116_11(void) = AliasedUse : ~mu116_4
# 116| v116_12(void) = ExitFunction :
# 116| v116_10(void) = AliasedUse : ~mu116_4
# 116| v116_11(void) = ExitFunction :
# 122| void MergeMustExactlyOverlap(bool, int, int)
# 122| Block 0
@@ -537,9 +525,8 @@ ssa.cpp:
# 131| m131_4(Point) = Store : &:r131_1, r131_3
# 132| v132_1(void) = NoOp :
# 122| v122_11(void) = ReturnVoid :
# 122| v122_12(void) = UnmodeledUse : mu*
# 122| v122_13(void) = AliasedUse : ~mu122_4
# 122| v122_14(void) = ExitFunction :
# 122| v122_12(void) = AliasedUse : ~mu122_4
# 122| v122_13(void) = ExitFunction :
# 134| void MergeMustExactlyWithMustTotallyOverlap(bool, Point, int)
# 134| Block 0
@@ -590,9 +577,8 @@ ssa.cpp:
# 142| m142_5(int) = Store : &:r142_1, r142_4
# 143| v143_1(void) = NoOp :
# 134| v134_11(void) = ReturnVoid :
# 134| v134_12(void) = UnmodeledUse : mu*
# 134| v134_13(void) = AliasedUse : ~mu134_4
# 134| v134_14(void) = ExitFunction :
# 134| v134_12(void) = AliasedUse : ~mu134_4
# 134| v134_13(void) = ExitFunction :
# 145| void MergeMustExactlyWithMayPartiallyOverlap(bool, Point, int)
# 145| Block 0
@@ -642,9 +628,8 @@ ssa.cpp:
# 153| m153_4(Point) = Store : &:r153_1, r153_3
# 154| v154_1(void) = NoOp :
# 145| v145_11(void) = ReturnVoid :
# 145| v145_12(void) = UnmodeledUse : mu*
# 145| v145_13(void) = AliasedUse : ~mu145_4
# 145| v145_14(void) = ExitFunction :
# 145| v145_12(void) = AliasedUse : ~mu145_4
# 145| v145_13(void) = ExitFunction :
# 156| void MergeMustTotallyOverlapWithMayPartiallyOverlap(bool, Rect, int)
# 156| Block 0
@@ -696,9 +681,8 @@ ssa.cpp:
# 164| m164_5(Point) = Store : &:r164_1, r164_4
# 165| v165_1(void) = NoOp :
# 156| v156_11(void) = ReturnVoid :
# 156| v156_12(void) = UnmodeledUse : mu*
# 156| v156_13(void) = AliasedUse : ~mu156_4
# 156| v156_14(void) = ExitFunction :
# 156| v156_12(void) = AliasedUse : ~mu156_4
# 156| v156_13(void) = ExitFunction :
# 171| void WrapperStruct(Wrapper)
# 171| Block 0
@@ -732,9 +716,8 @@ ssa.cpp:
# 176| m176_4(Wrapper) = Store : &:r176_3, r176_2
# 177| v177_1(void) = NoOp :
# 171| v171_7(void) = ReturnVoid :
# 171| v171_8(void) = UnmodeledUse : mu*
# 171| v171_9(void) = AliasedUse : ~mu171_4
# 171| v171_10(void) = ExitFunction :
# 171| v171_8(void) = AliasedUse : ~mu171_4
# 171| v171_9(void) = ExitFunction :
# 179| int AsmStmt(int*)
# 179| Block 0
@@ -755,9 +738,8 @@ ssa.cpp:
# 179| v179_9(void) = ReturnIndirection[p] : &:r179_7, ~mu179_4
# 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 : ~mu179_4
# 179| v179_14(void) = ExitFunction :
# 179| v179_12(void) = AliasedUse : ~mu179_4
# 179| v179_13(void) = ExitFunction :
# 184| void AsmStmtWithOutputs(unsigned int&, unsigned int&, unsigned int&, unsigned int&)
# 184| Block 0
@@ -800,9 +782,8 @@ ssa.cpp:
# 184| v184_23(void) = ReturnIndirection[c] : &:r184_15, ~mu184_4
# 184| v184_24(void) = ReturnIndirection[d] : &:r184_19, ~mu184_4
# 184| v184_25(void) = ReturnVoid :
# 184| v184_26(void) = UnmodeledUse : mu*
# 184| v184_27(void) = AliasedUse : ~mu184_4
# 184| v184_28(void) = ExitFunction :
# 184| v184_26(void) = AliasedUse : ~mu184_4
# 184| v184_27(void) = ExitFunction :
# 198| int PureFunctions(char*, char*, int)
# 198| Block 0
@@ -858,9 +839,8 @@ ssa.cpp:
# 198| v198_16(void) = ReturnIndirection[str2] : &:r198_11, ~mu198_4
# 198| r198_17(glval<int>) = VariableAddress[#return] :
# 198| v198_18(void) = ReturnValue : &:r198_17, m202_4
# 198| v198_19(void) = UnmodeledUse : mu*
# 198| v198_20(void) = AliasedUse : ~mu198_4
# 198| v198_21(void) = ExitFunction :
# 198| v198_19(void) = AliasedUse : ~mu198_4
# 198| v198_20(void) = ExitFunction :
# 207| int ModeledCallTarget(int)
# 207| Block 0
@@ -889,9 +869,8 @@ ssa.cpp:
# 210| m210_4(int) = Store : &:r210_1, r210_3
# 207| r207_7(glval<int>) = VariableAddress[#return] :
# 207| v207_8(void) = ReturnValue : &:r207_7, m210_4
# 207| v207_9(void) = UnmodeledUse : mu*
# 207| v207_10(void) = AliasedUse : ~mu207_4
# 207| v207_11(void) = ExitFunction :
# 207| v207_9(void) = AliasedUse : ~mu207_4
# 207| v207_10(void) = ExitFunction :
# 213| void InitArray()
# 213| Block 0
@@ -951,9 +930,8 @@ ssa.cpp:
# 221| mu221_10(unknown[2]) = Store : &:r221_8, r221_9
# 222| v222_1(void) = NoOp :
# 213| v213_5(void) = ReturnVoid :
# 213| v213_6(void) = UnmodeledUse : mu*
# 213| v213_7(void) = AliasedUse : ~mu213_4
# 213| v213_8(void) = ExitFunction :
# 213| v213_6(void) = AliasedUse : ~mu213_4
# 213| v213_7(void) = ExitFunction :
# 226| char StringLiteralAliasing()
# 226| Block 0
@@ -977,9 +955,8 @@ ssa.cpp:
# 230| m230_7(char) = Store : &:r230_1, r230_6
# 226| r226_5(glval<char>) = VariableAddress[#return] :
# 226| v226_6(void) = ReturnValue : &:r226_5, m230_7
# 226| v226_7(void) = UnmodeledUse : mu*
# 226| v226_8(void) = AliasedUse : ~mu226_4
# 226| v226_9(void) = ExitFunction :
# 226| v226_7(void) = AliasedUse : ~mu226_4
# 226| v226_8(void) = ExitFunction :
# 235| void Constructible::Constructible(int)
# 235| Block 0
@@ -992,9 +969,8 @@ ssa.cpp:
# 235| m235_7(int) = InitializeParameter[x] : &:r235_6
# 235| v235_8(void) = NoOp :
# 235| v235_9(void) = ReturnVoid :
# 235| v235_10(void) = UnmodeledUse : mu*
# 235| v235_11(void) = AliasedUse : ~mu235_4
# 235| v235_12(void) = ExitFunction :
# 235| v235_10(void) = AliasedUse : ~mu235_4
# 235| v235_11(void) = ExitFunction :
# 236| void Constructible::g()
# 236| Block 0
@@ -1005,9 +981,8 @@ ssa.cpp:
# 236| r236_5(glval<Constructible>) = InitializeThis :
# 236| v236_6(void) = NoOp :
# 236| v236_7(void) = ReturnVoid :
# 236| v236_8(void) = UnmodeledUse : mu*
# 236| v236_9(void) = AliasedUse : ~mu236_4
# 236| v236_10(void) = ExitFunction :
# 236| v236_8(void) = AliasedUse : ~mu236_4
# 236| v236_9(void) = ExitFunction :
# 239| void ExplicitConstructorCalls()
# 239| Block 0
@@ -1049,9 +1024,8 @@ ssa.cpp:
# 244| mu244_6(Constructible) = ^IndirectMayWriteSideEffect[-1] : &:r244_1
# 245| v245_1(void) = NoOp :
# 239| v239_5(void) = ReturnVoid :
# 239| v239_6(void) = UnmodeledUse : mu*
# 239| v239_7(void) = AliasedUse : ~mu239_4
# 239| v239_8(void) = ExitFunction :
# 239| v239_6(void) = AliasedUse : ~mu239_4
# 239| v239_7(void) = ExitFunction :
# 247| char* VoidStarIndirectParameters(char*, int)
# 247| Block 0
@@ -1101,9 +1075,8 @@ ssa.cpp:
# 247| v247_11(void) = ReturnIndirection[src] : &:r247_7, ~mu247_4
# 247| r247_12(glval<char *>) = VariableAddress[#return] :
# 247| v247_13(void) = ReturnValue : &:r247_12, m251_4
# 247| v247_14(void) = UnmodeledUse : mu*
# 247| v247_15(void) = AliasedUse : ~mu247_4
# 247| v247_16(void) = ExitFunction :
# 247| v247_14(void) = AliasedUse : ~mu247_4
# 247| v247_15(void) = ExitFunction :
# 254| char StringLiteralAliasing2(bool)
# 254| Block 0
@@ -1145,9 +1118,8 @@ ssa.cpp:
# 263| m263_7(char) = Store : &:r263_1, r263_6
# 254| r254_7(glval<char>) = VariableAddress[#return] :
# 254| v254_8(void) = ReturnValue : &:r254_7, m263_7
# 254| v254_9(void) = UnmodeledUse : mu*
# 254| v254_10(void) = AliasedUse : ~mu254_4
# 254| v254_11(void) = ExitFunction :
# 254| v254_9(void) = AliasedUse : ~mu254_4
# 254| v254_10(void) = ExitFunction :
# 268| void* MallocAliasing(void*, int)
# 268| Block 0
@@ -1186,9 +1158,8 @@ ssa.cpp:
# 268| v268_11(void) = ReturnIndirection[s] : &:r268_7, ~mu268_4
# 268| r268_12(glval<void *>) = VariableAddress[#return] :
# 268| v268_13(void) = ReturnValue : &:r268_12, m271_4
# 268| v268_14(void) = UnmodeledUse : mu*
# 268| v268_15(void) = AliasedUse : ~mu268_4
# 268| v268_16(void) = ExitFunction :
# 268| v268_14(void) = AliasedUse : ~mu268_4
# 268| v268_15(void) = ExitFunction :
# 275| void EscapedButNotConflated(bool, Point, int)
# 275| Block 0
@@ -1236,9 +1207,8 @@ ssa.cpp:
# 281| m281_5(int) = Store : &:r281_1, r281_4
# 282| v282_1(void) = NoOp :
# 275| v275_11(void) = ReturnVoid :
# 275| v275_12(void) = UnmodeledUse : mu*
# 275| v275_13(void) = AliasedUse : ~mu275_4
# 275| v275_14(void) = ExitFunction :
# 275| v275_12(void) = AliasedUse : ~mu275_4
# 275| v275_13(void) = ExitFunction :
# 286| void A::A(int)
# 286| Block 0
@@ -1251,9 +1221,8 @@ ssa.cpp:
# 286| m286_7(int) = InitializeParameter[x] : &:r286_6
# 286| v286_8(void) = NoOp :
# 286| v286_9(void) = ReturnVoid :
# 286| v286_10(void) = UnmodeledUse : mu*
# 286| v286_11(void) = AliasedUse : ~mu286_4
# 286| v286_12(void) = ExitFunction :
# 286| v286_10(void) = AliasedUse : ~mu286_4
# 286| v286_11(void) = ExitFunction :
# 287| void A::A(A*)
# 287| Block 0
@@ -1269,9 +1238,8 @@ ssa.cpp:
# 287| v287_10(void) = NoOp :
# 287| v287_11(void) = ReturnIndirection[p#0] : &:r287_8, ~mu287_4
# 287| v287_12(void) = ReturnVoid :
# 287| v287_13(void) = UnmodeledUse : mu*
# 287| v287_14(void) = AliasedUse : ~mu287_4
# 287| v287_15(void) = ExitFunction :
# 287| v287_13(void) = AliasedUse : ~mu287_4
# 287| v287_14(void) = ExitFunction :
# 288| void A::A()
# 288| Block 0
@@ -1282,9 +1250,8 @@ ssa.cpp:
# 288| r288_5(glval<A>) = InitializeThis :
# 288| v288_6(void) = NoOp :
# 288| v288_7(void) = ReturnVoid :
# 288| v288_8(void) = UnmodeledUse : mu*
# 288| v288_9(void) = AliasedUse : ~mu288_4
# 288| v288_10(void) = ExitFunction :
# 288| v288_8(void) = AliasedUse : ~mu288_4
# 288| v288_9(void) = ExitFunction :
# 291| Point* NewAliasing(int)
# 291| Block 0
@@ -1356,9 +1323,8 @@ ssa.cpp:
# 296| m296_4(Point *) = Store : &:r296_1, r296_3
# 291| r291_7(glval<Point *>) = VariableAddress[#return] :
# 291| v291_8(void) = ReturnValue : &:r291_7, m296_4
# 291| v291_9(void) = UnmodeledUse : mu*
# 291| v291_10(void) = AliasedUse : ~mu291_4
# 291| v291_11(void) = ExitFunction :
# 291| v291_9(void) = AliasedUse : ~mu291_4
# 291| v291_10(void) = ExitFunction :
# 301| int main(int, char**)
# 301| Block 0
@@ -1400,6 +1366,5 @@ ssa.cpp:
# 301| v301_11(void) = ReturnIndirection[argv] : &:r301_9, ~mu301_4
# 301| r301_12(glval<int>) = VariableAddress[#return] :
# 301| v301_13(void) = ReturnValue : &:r301_12, m304_7
# 301| v301_14(void) = UnmodeledUse : mu*
# 301| v301_15(void) = AliasedUse : ~mu301_4
# 301| v301_16(void) = ExitFunction :
# 301| v301_14(void) = AliasedUse : ~mu301_4
# 301| v301_15(void) = ExitFunction :

View File

@@ -11,7 +11,6 @@ uniqueNodeLocation
| aggregateinitializer.c:1:6:1:6 | Phi | Node should have one location but has 20. |
| aggregateinitializer.c:1:6:1:6 | ReturnVoid | Node should have one location but has 20. |
| aggregateinitializer.c:1:6:1:6 | UnmodeledDefinition | Node should have one location but has 20. |
| aggregateinitializer.c:1:6:1:6 | UnmodeledUse | Node should have one location but has 20. |
| aggregateinitializer.c:1:6:1:6 | Unreached | Node should have one location but has 20. |
| allocators.cpp:14:5:14:8 | AliasedDefinition | Node should have one location but has 4. |
| allocators.cpp:14:5:14:8 | AliasedUse | Node should have one location but has 4. |
@@ -23,7 +22,6 @@ uniqueNodeLocation
| allocators.cpp:14:5:14:8 | Phi | Node should have one location but has 4. |
| allocators.cpp:14:5:14:8 | ReturnValue | Node should have one location but has 4. |
| allocators.cpp:14:5:14:8 | UnmodeledDefinition | Node should have one location but has 4. |
| allocators.cpp:14:5:14:8 | UnmodeledUse | Node should have one location but has 4. |
| allocators.cpp:14:5:14:8 | VariableAddress | Node should have one location but has 4. |
| array_delete.cpp:5:6:5:6 | AliasedDefinition | Node should have one location but has 14. |
| array_delete.cpp:5:6:5:6 | AliasedUse | Node should have one location but has 14. |
@@ -34,7 +32,6 @@ uniqueNodeLocation
| array_delete.cpp:5:6:5:6 | Phi | Node should have one location but has 14. |
| array_delete.cpp:5:6:5:6 | ReturnVoid | Node should have one location but has 14. |
| array_delete.cpp:5:6:5:6 | UnmodeledDefinition | Node should have one location but has 14. |
| array_delete.cpp:5:6:5:6 | UnmodeledUse | Node should have one location but has 14. |
| assignexpr.cpp:6:6:6:6 | AliasedDefinition | Node should have one location but has 14. |
| assignexpr.cpp:6:6:6:6 | AliasedUse | Node should have one location but has 14. |
| assignexpr.cpp:6:6:6:6 | Chi | Node should have one location but has 14. |
@@ -44,7 +41,6 @@ uniqueNodeLocation
| assignexpr.cpp:6:6:6:6 | Phi | Node should have one location but has 14. |
| assignexpr.cpp:6:6:6:6 | ReturnVoid | Node should have one location but has 14. |
| assignexpr.cpp:6:6:6:6 | UnmodeledDefinition | Node should have one location but has 14. |
| assignexpr.cpp:6:6:6:6 | UnmodeledUse | Node should have one location but has 14. |
| break_labels.c:2:5:2:5 | AliasedDefinition | Node should have one location but has 20. |
| break_labels.c:2:5:2:5 | AliasedUse | Node should have one location but has 20. |
| break_labels.c:2:5:2:5 | Chi | Node should have one location but has 20. |
@@ -54,7 +50,6 @@ uniqueNodeLocation
| break_labels.c:2:5:2:5 | Phi | Node should have one location but has 20. |
| break_labels.c:2:5:2:5 | ReturnVoid | Node should have one location but has 20. |
| break_labels.c:2:5:2:5 | UnmodeledDefinition | Node should have one location but has 20. |
| break_labels.c:2:5:2:5 | UnmodeledUse | Node should have one location but has 20. |
| break_labels.c:2:5:2:5 | Unreached | Node should have one location but has 20. |
| break_labels.c:2:11:2:11 | VariableAddress | Node should have one location but has 4. |
| break_labels.c:2:11:2:11 | i | Node should have one location but has 4. |
@@ -70,7 +65,6 @@ uniqueNodeLocation
| conditional_destructors.cpp:29:6:29:7 | Phi | Node should have one location but has 2. |
| conditional_destructors.cpp:29:6:29:7 | ReturnVoid | Node should have one location but has 2. |
| conditional_destructors.cpp:29:6:29:7 | UnmodeledDefinition | Node should have one location but has 2. |
| conditional_destructors.cpp:29:6:29:7 | UnmodeledUse | Node should have one location but has 2. |
| conditional_destructors.cpp:38:6:38:7 | AliasedDefinition | Node should have one location but has 2. |
| conditional_destructors.cpp:38:6:38:7 | AliasedUse | Node should have one location but has 2. |
| conditional_destructors.cpp:38:6:38:7 | Chi | Node should have one location but has 2. |
@@ -80,7 +74,6 @@ uniqueNodeLocation
| conditional_destructors.cpp:38:6:38:7 | Phi | Node should have one location but has 2. |
| conditional_destructors.cpp:38:6:38:7 | ReturnVoid | Node should have one location but has 2. |
| conditional_destructors.cpp:38:6:38:7 | UnmodeledDefinition | Node should have one location but has 2. |
| conditional_destructors.cpp:38:6:38:7 | UnmodeledUse | Node should have one location but has 2. |
| conditional_destructors.cpp:38:6:38:7 | Unreached | Node should have one location but has 2. |
| constmemberaccess.cpp:3:7:3:7 | x | Node should have one location but has 2. |
| constmemberaccess.cpp:6:6:6:6 | AliasedDefinition | Node should have one location but has 14. |
@@ -92,7 +85,6 @@ uniqueNodeLocation
| constmemberaccess.cpp:6:6:6:6 | Phi | Node should have one location but has 14. |
| constmemberaccess.cpp:6:6:6:6 | ReturnVoid | Node should have one location but has 14. |
| constmemberaccess.cpp:6:6:6:6 | UnmodeledDefinition | Node should have one location but has 14. |
| constmemberaccess.cpp:6:6:6:6 | UnmodeledUse | Node should have one location but has 14. |
| constructorinitializer.cpp:3:9:3:9 | i | Node should have one location but has 2. |
| constructorinitializer.cpp:3:9:3:9 | x | Node should have one location but has 2. |
| constructorinitializer.cpp:3:16:3:16 | j | Node should have one location but has 2. |
@@ -106,7 +98,6 @@ uniqueNodeLocation
| constructorinitializer.cpp:6:6:6:6 | Phi | Node should have one location but has 14. |
| constructorinitializer.cpp:6:6:6:6 | ReturnVoid | Node should have one location but has 14. |
| constructorinitializer.cpp:6:6:6:6 | UnmodeledDefinition | Node should have one location but has 14. |
| constructorinitializer.cpp:6:6:6:6 | UnmodeledUse | Node should have one location but has 14. |
| defconstructornewexpr.cpp:3:6:3:6 | AliasedDefinition | Node should have one location but has 14. |
| defconstructornewexpr.cpp:3:6:3:6 | AliasedUse | Node should have one location but has 14. |
| defconstructornewexpr.cpp:3:6:3:6 | Chi | Node should have one location but has 14. |
@@ -116,7 +107,6 @@ uniqueNodeLocation
| defconstructornewexpr.cpp:3:6:3:6 | Phi | Node should have one location but has 14. |
| defconstructornewexpr.cpp:3:6:3:6 | ReturnVoid | Node should have one location but has 14. |
| defconstructornewexpr.cpp:3:6:3:6 | UnmodeledDefinition | Node should have one location but has 14. |
| defconstructornewexpr.cpp:3:6:3:6 | UnmodeledUse | Node should have one location but has 14. |
| defdestructordeleteexpr.cpp:3:6:3:6 | AliasedDefinition | Node should have one location but has 14. |
| defdestructordeleteexpr.cpp:3:6:3:6 | AliasedUse | Node should have one location but has 14. |
| defdestructordeleteexpr.cpp:3:6:3:6 | Chi | Node should have one location but has 14. |
@@ -126,7 +116,6 @@ uniqueNodeLocation
| defdestructordeleteexpr.cpp:3:6:3:6 | Phi | Node should have one location but has 14. |
| defdestructordeleteexpr.cpp:3:6:3:6 | ReturnVoid | Node should have one location but has 14. |
| defdestructordeleteexpr.cpp:3:6:3:6 | UnmodeledDefinition | Node should have one location but has 14. |
| defdestructordeleteexpr.cpp:3:6:3:6 | UnmodeledUse | Node should have one location but has 14. |
| deleteexpr.cpp:6:6:6:6 | AliasedDefinition | Node should have one location but has 14. |
| deleteexpr.cpp:6:6:6:6 | AliasedUse | Node should have one location but has 14. |
| deleteexpr.cpp:6:6:6:6 | Chi | Node should have one location but has 14. |
@@ -136,7 +125,6 @@ uniqueNodeLocation
| deleteexpr.cpp:6:6:6:6 | Phi | Node should have one location but has 14. |
| deleteexpr.cpp:6:6:6:6 | ReturnVoid | Node should have one location but has 14. |
| deleteexpr.cpp:6:6:6:6 | UnmodeledDefinition | Node should have one location but has 14. |
| deleteexpr.cpp:6:6:6:6 | UnmodeledUse | Node should have one location but has 14. |
| dostmt.c:8:6:8:18 | AliasedDefinition | Node should have one location but has 4. |
| dostmt.c:8:6:8:18 | AliasedUse | Node should have one location but has 4. |
| dostmt.c:8:6:8:18 | Chi | Node should have one location but has 4. |
@@ -145,7 +133,6 @@ uniqueNodeLocation
| dostmt.c:8:6:8:18 | InitializeNonLocal | Node should have one location but has 4. |
| dostmt.c:8:6:8:18 | ReturnVoid | Node should have one location but has 4. |
| dostmt.c:8:6:8:18 | UnmodeledDefinition | Node should have one location but has 4. |
| dostmt.c:8:6:8:18 | UnmodeledUse | Node should have one location but has 4. |
| dostmt.c:8:6:8:18 | Unreached | Node should have one location but has 4. |
| dostmt.c:16:6:16:18 | AliasedDefinition | Node should have one location but has 4. |
| dostmt.c:16:6:16:18 | AliasedUse | Node should have one location but has 4. |
@@ -155,7 +142,6 @@ uniqueNodeLocation
| dostmt.c:16:6:16:18 | InitializeNonLocal | Node should have one location but has 4. |
| dostmt.c:16:6:16:18 | ReturnVoid | Node should have one location but has 4. |
| dostmt.c:16:6:16:18 | UnmodeledDefinition | Node should have one location but has 4. |
| dostmt.c:16:6:16:18 | UnmodeledUse | Node should have one location but has 4. |
| dostmt.c:16:6:16:18 | Unreached | Node should have one location but has 4. |
| dostmt.c:25:6:25:18 | AliasedDefinition | Node should have one location but has 2. |
| dostmt.c:25:6:25:18 | Chi | Node should have one location but has 2. |
@@ -171,7 +157,6 @@ uniqueNodeLocation
| dostmt.c:32:6:32:11 | InitializeNonLocal | Node should have one location but has 4. |
| dostmt.c:32:6:32:11 | ReturnVoid | Node should have one location but has 4. |
| dostmt.c:32:6:32:11 | UnmodeledDefinition | Node should have one location but has 4. |
| dostmt.c:32:6:32:11 | UnmodeledUse | Node should have one location but has 4. |
| duff.c:2:6:2:6 | AliasedDefinition | Node should have one location but has 20. |
| duff.c:2:6:2:6 | AliasedUse | Node should have one location but has 20. |
| duff.c:2:6:2:6 | Chi | Node should have one location but has 20. |
@@ -181,7 +166,6 @@ uniqueNodeLocation
| duff.c:2:6:2:6 | Phi | Node should have one location but has 20. |
| duff.c:2:6:2:6 | ReturnVoid | Node should have one location but has 20. |
| duff.c:2:6:2:6 | UnmodeledDefinition | Node should have one location but has 20. |
| duff.c:2:6:2:6 | UnmodeledUse | Node should have one location but has 20. |
| duff.c:2:6:2:6 | Unreached | Node should have one location but has 20. |
| duff.c:2:12:2:12 | VariableAddress | Node should have one location but has 4. |
| duff.c:2:12:2:12 | i | Node should have one location but has 4. |
@@ -197,7 +181,6 @@ uniqueNodeLocation
| dummyblock.c:1:6:1:6 | Phi | Node should have one location but has 20. |
| dummyblock.c:1:6:1:6 | ReturnVoid | Node should have one location but has 20. |
| dummyblock.c:1:6:1:6 | UnmodeledDefinition | Node should have one location but has 20. |
| dummyblock.c:1:6:1:6 | UnmodeledUse | Node should have one location but has 20. |
| dummyblock.c:1:6:1:6 | Unreached | Node should have one location but has 20. |
| emptyblock.c:1:6:1:6 | AliasedDefinition | Node should have one location but has 20. |
| emptyblock.c:1:6:1:6 | AliasedUse | Node should have one location but has 20. |
@@ -208,7 +191,6 @@ uniqueNodeLocation
| emptyblock.c:1:6:1:6 | Phi | Node should have one location but has 20. |
| emptyblock.c:1:6:1:6 | ReturnVoid | Node should have one location but has 20. |
| emptyblock.c:1:6:1:6 | UnmodeledDefinition | Node should have one location but has 20. |
| emptyblock.c:1:6:1:6 | UnmodeledUse | Node should have one location but has 20. |
| emptyblock.c:1:6:1:6 | Unreached | Node should have one location but has 20. |
| enum.c:5:5:5:5 | AliasedDefinition | Node should have one location but has 20. |
| enum.c:5:5:5:5 | AliasedUse | Node should have one location but has 20. |
@@ -219,7 +201,6 @@ uniqueNodeLocation
| enum.c:5:5:5:5 | Phi | Node should have one location but has 20. |
| enum.c:5:5:5:5 | ReturnVoid | Node should have one location but has 20. |
| enum.c:5:5:5:5 | UnmodeledDefinition | Node should have one location but has 20. |
| enum.c:5:5:5:5 | UnmodeledUse | Node should have one location but has 20. |
| enum.c:5:5:5:5 | Unreached | Node should have one location but has 20. |
| exprstmt.c:1:6:1:6 | AliasedDefinition | Node should have one location but has 20. |
| exprstmt.c:1:6:1:6 | AliasedUse | Node should have one location but has 20. |
@@ -230,7 +211,6 @@ uniqueNodeLocation
| exprstmt.c:1:6:1:6 | Phi | Node should have one location but has 20. |
| exprstmt.c:1:6:1:6 | ReturnVoid | Node should have one location but has 20. |
| exprstmt.c:1:6:1:6 | UnmodeledDefinition | Node should have one location but has 20. |
| exprstmt.c:1:6:1:6 | UnmodeledUse | Node should have one location but has 20. |
| exprstmt.c:1:6:1:6 | Unreached | Node should have one location but has 20. |
| fieldaccess.cpp:3:7:3:7 | x | Node should have one location but has 2. |
| fieldaccess.cpp:6:6:6:6 | AliasedDefinition | Node should have one location but has 14. |
@@ -242,7 +222,6 @@ uniqueNodeLocation
| fieldaccess.cpp:6:6:6:6 | Phi | Node should have one location but has 14. |
| fieldaccess.cpp:6:6:6:6 | ReturnVoid | Node should have one location but has 14. |
| fieldaccess.cpp:6:6:6:6 | UnmodeledDefinition | Node should have one location but has 14. |
| fieldaccess.cpp:6:6:6:6 | UnmodeledUse | Node should have one location but has 14. |
| file://:0:0:0:0 | InitializeIndirection | Node should have one location but has 0. |
| file://:0:0:0:0 | Load | Node should have one location but has 0. |
| file://:0:0:0:0 | ReturnIndirection | Node should have one location but has 0. |
@@ -282,7 +261,6 @@ uniqueNodeLocation
| forstmt.cpp:1:6:1:7 | Phi | Node should have one location but has 2. |
| forstmt.cpp:1:6:1:7 | ReturnVoid | Node should have one location but has 2. |
| forstmt.cpp:1:6:1:7 | UnmodeledDefinition | Node should have one location but has 2. |
| forstmt.cpp:1:6:1:7 | UnmodeledUse | Node should have one location but has 2. |
| forstmt.cpp:8:6:8:7 | AliasedDefinition | Node should have one location but has 2. |
| forstmt.cpp:8:6:8:7 | AliasedUse | Node should have one location but has 2. |
| forstmt.cpp:8:6:8:7 | Chi | Node should have one location but has 2. |
@@ -292,7 +270,6 @@ uniqueNodeLocation
| forstmt.cpp:8:6:8:7 | Phi | Node should have one location but has 2. |
| forstmt.cpp:8:6:8:7 | ReturnVoid | Node should have one location but has 2. |
| forstmt.cpp:8:6:8:7 | UnmodeledDefinition | Node should have one location but has 2. |
| forstmt.cpp:8:6:8:7 | UnmodeledUse | Node should have one location but has 2. |
| forstmt.cpp:8:6:8:7 | Unreached | Node should have one location but has 2. |
| ifelsestmt.c:1:6:1:19 | AliasedDefinition | Node should have one location but has 3. |
| ifelsestmt.c:1:6:1:19 | AliasedUse | Node should have one location but has 3. |
@@ -302,7 +279,6 @@ uniqueNodeLocation
| ifelsestmt.c:1:6:1:19 | InitializeNonLocal | Node should have one location but has 3. |
| ifelsestmt.c:1:6:1:19 | ReturnVoid | Node should have one location but has 3. |
| ifelsestmt.c:1:6:1:19 | UnmodeledDefinition | Node should have one location but has 3. |
| ifelsestmt.c:1:6:1:19 | UnmodeledUse | Node should have one location but has 3. |
| ifelsestmt.c:1:6:1:19 | Unreached | Node should have one location but has 3. |
| ifelsestmt.c:11:6:11:19 | AliasedDefinition | Node should have one location but has 3. |
| ifelsestmt.c:11:6:11:19 | AliasedUse | Node should have one location but has 3. |
@@ -312,7 +288,6 @@ uniqueNodeLocation
| ifelsestmt.c:11:6:11:19 | InitializeNonLocal | Node should have one location but has 3. |
| ifelsestmt.c:11:6:11:19 | ReturnVoid | Node should have one location but has 3. |
| ifelsestmt.c:11:6:11:19 | UnmodeledDefinition | Node should have one location but has 3. |
| ifelsestmt.c:11:6:11:19 | UnmodeledUse | Node should have one location but has 3. |
| ifelsestmt.c:11:6:11:19 | Unreached | Node should have one location but has 3. |
| ifelsestmt.c:19:6:19:18 | AliasedDefinition | Node should have one location but has 4. |
| ifelsestmt.c:19:6:19:18 | AliasedUse | Node should have one location but has 4. |
@@ -322,7 +297,6 @@ uniqueNodeLocation
| ifelsestmt.c:19:6:19:18 | InitializeNonLocal | Node should have one location but has 4. |
| ifelsestmt.c:19:6:19:18 | ReturnVoid | Node should have one location but has 4. |
| ifelsestmt.c:19:6:19:18 | UnmodeledDefinition | Node should have one location but has 4. |
| ifelsestmt.c:19:6:19:18 | UnmodeledUse | Node should have one location but has 4. |
| ifelsestmt.c:19:6:19:18 | Unreached | Node should have one location but has 4. |
| ifelsestmt.c:29:6:29:18 | AliasedDefinition | Node should have one location but has 4. |
| ifelsestmt.c:29:6:29:18 | AliasedUse | Node should have one location but has 4. |
@@ -332,7 +306,6 @@ uniqueNodeLocation
| ifelsestmt.c:29:6:29:18 | InitializeNonLocal | Node should have one location but has 4. |
| ifelsestmt.c:29:6:29:18 | ReturnVoid | Node should have one location but has 4. |
| ifelsestmt.c:29:6:29:18 | UnmodeledDefinition | Node should have one location but has 4. |
| ifelsestmt.c:29:6:29:18 | UnmodeledUse | Node should have one location but has 4. |
| ifelsestmt.c:29:6:29:18 | Unreached | Node should have one location but has 4. |
| ifelsestmt.c:37:6:37:11 | AliasedDefinition | Node should have one location but has 4. |
| ifelsestmt.c:37:6:37:11 | AliasedUse | Node should have one location but has 4. |
@@ -342,7 +315,6 @@ uniqueNodeLocation
| ifelsestmt.c:37:6:37:11 | InitializeNonLocal | Node should have one location but has 4. |
| ifelsestmt.c:37:6:37:11 | ReturnVoid | Node should have one location but has 4. |
| ifelsestmt.c:37:6:37:11 | UnmodeledDefinition | Node should have one location but has 4. |
| ifelsestmt.c:37:6:37:11 | UnmodeledUse | Node should have one location but has 4. |
| ifelsestmt.c:37:17:37:17 | VariableAddress | Node should have one location but has 2. |
| ifelsestmt.c:37:17:37:17 | x | Node should have one location but has 2. |
| ifelsestmt.c:37:17:37:17 | x | Node should have one location but has 2. |
@@ -357,7 +329,6 @@ uniqueNodeLocation
| ifstmt.c:1:6:1:19 | InitializeNonLocal | Node should have one location but has 3. |
| ifstmt.c:1:6:1:19 | ReturnVoid | Node should have one location but has 3. |
| ifstmt.c:1:6:1:19 | UnmodeledDefinition | Node should have one location but has 3. |
| ifstmt.c:1:6:1:19 | UnmodeledUse | Node should have one location but has 3. |
| ifstmt.c:1:6:1:19 | Unreached | Node should have one location but has 3. |
| ifstmt.c:8:6:8:19 | AliasedDefinition | Node should have one location but has 3. |
| ifstmt.c:8:6:8:19 | AliasedUse | Node should have one location but has 3. |
@@ -367,7 +338,6 @@ uniqueNodeLocation
| ifstmt.c:8:6:8:19 | InitializeNonLocal | Node should have one location but has 3. |
| ifstmt.c:8:6:8:19 | ReturnVoid | Node should have one location but has 3. |
| ifstmt.c:8:6:8:19 | UnmodeledDefinition | Node should have one location but has 3. |
| ifstmt.c:8:6:8:19 | UnmodeledUse | Node should have one location but has 3. |
| ifstmt.c:8:6:8:19 | Unreached | Node should have one location but has 3. |
| ifstmt.c:14:6:14:18 | AliasedDefinition | Node should have one location but has 4. |
| ifstmt.c:14:6:14:18 | AliasedUse | Node should have one location but has 4. |
@@ -377,7 +347,6 @@ uniqueNodeLocation
| ifstmt.c:14:6:14:18 | InitializeNonLocal | Node should have one location but has 4. |
| ifstmt.c:14:6:14:18 | ReturnVoid | Node should have one location but has 4. |
| ifstmt.c:14:6:14:18 | UnmodeledDefinition | Node should have one location but has 4. |
| ifstmt.c:14:6:14:18 | UnmodeledUse | Node should have one location but has 4. |
| ifstmt.c:14:6:14:18 | Unreached | Node should have one location but has 4. |
| ifstmt.c:21:6:21:18 | AliasedDefinition | Node should have one location but has 4. |
| ifstmt.c:21:6:21:18 | AliasedUse | Node should have one location but has 4. |
@@ -387,7 +356,6 @@ uniqueNodeLocation
| ifstmt.c:21:6:21:18 | InitializeNonLocal | Node should have one location but has 4. |
| ifstmt.c:21:6:21:18 | ReturnVoid | Node should have one location but has 4. |
| ifstmt.c:21:6:21:18 | UnmodeledDefinition | Node should have one location but has 4. |
| ifstmt.c:21:6:21:18 | UnmodeledUse | Node should have one location but has 4. |
| ifstmt.c:21:6:21:18 | Unreached | Node should have one location but has 4. |
| ifstmt.c:27:6:27:11 | AliasedDefinition | Node should have one location but has 4. |
| ifstmt.c:27:6:27:11 | AliasedUse | Node should have one location but has 4. |
@@ -397,7 +365,6 @@ uniqueNodeLocation
| ifstmt.c:27:6:27:11 | InitializeNonLocal | Node should have one location but has 4. |
| ifstmt.c:27:6:27:11 | ReturnVoid | Node should have one location but has 4. |
| ifstmt.c:27:6:27:11 | UnmodeledDefinition | Node should have one location but has 4. |
| ifstmt.c:27:6:27:11 | UnmodeledUse | Node should have one location but has 4. |
| ifstmt.c:27:17:27:17 | VariableAddress | Node should have one location but has 2. |
| ifstmt.c:27:17:27:17 | x | Node should have one location but has 2. |
| ifstmt.c:27:17:27:17 | x | Node should have one location but has 2. |
@@ -413,7 +380,6 @@ uniqueNodeLocation
| initializer.c:1:6:1:6 | Phi | Node should have one location but has 20. |
| initializer.c:1:6:1:6 | ReturnVoid | Node should have one location but has 20. |
| initializer.c:1:6:1:6 | UnmodeledDefinition | Node should have one location but has 20. |
| initializer.c:1:6:1:6 | UnmodeledUse | Node should have one location but has 20. |
| initializer.c:1:6:1:6 | Unreached | Node should have one location but has 20. |
| landexpr.c:1:6:1:6 | AliasedDefinition | Node should have one location but has 20. |
| landexpr.c:1:6:1:6 | AliasedUse | Node should have one location but has 20. |
@@ -424,7 +390,6 @@ uniqueNodeLocation
| landexpr.c:1:6:1:6 | Phi | Node should have one location but has 20. |
| landexpr.c:1:6:1:6 | ReturnVoid | Node should have one location but has 20. |
| landexpr.c:1:6:1:6 | UnmodeledDefinition | Node should have one location but has 20. |
| landexpr.c:1:6:1:6 | UnmodeledUse | Node should have one location but has 20. |
| landexpr.c:1:6:1:6 | Unreached | Node should have one location but has 20. |
| lorexpr.c:1:6:1:6 | AliasedDefinition | Node should have one location but has 20. |
| lorexpr.c:1:6:1:6 | AliasedUse | Node should have one location but has 20. |
@@ -435,7 +400,6 @@ uniqueNodeLocation
| lorexpr.c:1:6:1:6 | Phi | Node should have one location but has 20. |
| lorexpr.c:1:6:1:6 | ReturnVoid | Node should have one location but has 20. |
| lorexpr.c:1:6:1:6 | UnmodeledDefinition | Node should have one location but has 20. |
| lorexpr.c:1:6:1:6 | UnmodeledUse | Node should have one location but has 20. |
| lorexpr.c:1:6:1:6 | Unreached | Node should have one location but has 20. |
| ltrbinopexpr.c:1:6:1:6 | AliasedDefinition | Node should have one location but has 20. |
| ltrbinopexpr.c:1:6:1:6 | AliasedUse | Node should have one location but has 20. |
@@ -446,7 +410,6 @@ uniqueNodeLocation
| ltrbinopexpr.c:1:6:1:6 | Phi | Node should have one location but has 20. |
| ltrbinopexpr.c:1:6:1:6 | ReturnVoid | Node should have one location but has 20. |
| ltrbinopexpr.c:1:6:1:6 | UnmodeledDefinition | Node should have one location but has 20. |
| ltrbinopexpr.c:1:6:1:6 | UnmodeledUse | Node should have one location but has 20. |
| ltrbinopexpr.c:1:6:1:6 | Unreached | Node should have one location but has 20. |
| membercallexpr.cpp:6:6:6:6 | AliasedDefinition | Node should have one location but has 14. |
| membercallexpr.cpp:6:6:6:6 | AliasedUse | Node should have one location but has 14. |
@@ -457,7 +420,6 @@ uniqueNodeLocation
| membercallexpr.cpp:6:6:6:6 | Phi | Node should have one location but has 14. |
| membercallexpr.cpp:6:6:6:6 | ReturnVoid | Node should have one location but has 14. |
| membercallexpr.cpp:6:6:6:6 | UnmodeledDefinition | Node should have one location but has 14. |
| membercallexpr.cpp:6:6:6:6 | UnmodeledUse | Node should have one location but has 14. |
| membercallexpr_args.cpp:3:6:3:6 | d | Node should have one location but has 2. |
| membercallexpr_args.cpp:4:14:4:14 | x | Node should have one location but has 2. |
| membercallexpr_args.cpp:4:21:4:21 | y | Node should have one location but has 2. |
@@ -470,7 +432,6 @@ uniqueNodeLocation
| membercallexpr_args.cpp:7:6:7:6 | Phi | Node should have one location but has 14. |
| membercallexpr_args.cpp:7:6:7:6 | ReturnVoid | Node should have one location but has 14. |
| membercallexpr_args.cpp:7:6:7:6 | UnmodeledDefinition | Node should have one location but has 14. |
| membercallexpr_args.cpp:7:6:7:6 | UnmodeledUse | Node should have one location but has 14. |
| newexpr.cpp:3:9:3:9 | i | Node should have one location but has 2. |
| newexpr.cpp:3:9:3:9 | x | Node should have one location but has 2. |
| newexpr.cpp:3:16:3:16 | j | Node should have one location but has 2. |
@@ -484,7 +445,6 @@ uniqueNodeLocation
| newexpr.cpp:6:6:6:6 | Phi | Node should have one location but has 14. |
| newexpr.cpp:6:6:6:6 | ReturnVoid | Node should have one location but has 14. |
| newexpr.cpp:6:6:6:6 | UnmodeledDefinition | Node should have one location but has 14. |
| newexpr.cpp:6:6:6:6 | UnmodeledUse | Node should have one location but has 14. |
| no_dynamic_init.cpp:9:5:9:8 | AliasedDefinition | Node should have one location but has 4. |
| no_dynamic_init.cpp:9:5:9:8 | AliasedUse | Node should have one location but has 4. |
| no_dynamic_init.cpp:9:5:9:8 | Chi | Node should have one location but has 4. |
@@ -495,7 +455,6 @@ uniqueNodeLocation
| no_dynamic_init.cpp:9:5:9:8 | Phi | Node should have one location but has 4. |
| no_dynamic_init.cpp:9:5:9:8 | ReturnValue | Node should have one location but has 4. |
| no_dynamic_init.cpp:9:5:9:8 | UnmodeledDefinition | Node should have one location but has 4. |
| no_dynamic_init.cpp:9:5:9:8 | UnmodeledUse | Node should have one location but has 4. |
| no_dynamic_init.cpp:9:5:9:8 | VariableAddress | Node should have one location but has 4. |
| nodefaultswitchstmt.c:1:6:1:6 | AliasedDefinition | Node should have one location but has 20. |
| nodefaultswitchstmt.c:1:6:1:6 | AliasedUse | Node should have one location but has 20. |
@@ -506,7 +465,6 @@ uniqueNodeLocation
| nodefaultswitchstmt.c:1:6:1:6 | Phi | Node should have one location but has 20. |
| nodefaultswitchstmt.c:1:6:1:6 | ReturnVoid | Node should have one location but has 20. |
| nodefaultswitchstmt.c:1:6:1:6 | UnmodeledDefinition | Node should have one location but has 20. |
| nodefaultswitchstmt.c:1:6:1:6 | UnmodeledUse | Node should have one location but has 20. |
| nodefaultswitchstmt.c:1:6:1:6 | Unreached | Node should have one location but has 20. |
| nodefaultswitchstmt.c:1:12:1:12 | VariableAddress | Node should have one location but has 4. |
| nodefaultswitchstmt.c:1:12:1:12 | i | Node should have one location but has 4. |
@@ -521,7 +479,6 @@ uniqueNodeLocation
| nonmembercallexpr.c:1:6:1:6 | InitializeNonLocal | Node should have one location but has 2. |
| nonmembercallexpr.c:1:6:1:6 | ReturnVoid | Node should have one location but has 2. |
| nonmembercallexpr.c:1:6:1:6 | UnmodeledDefinition | Node should have one location but has 2. |
| nonmembercallexpr.c:1:6:1:6 | UnmodeledUse | Node should have one location but has 2. |
| nonmembercallexpr.c:3:6:3:6 | AliasedDefinition | Node should have one location but has 20. |
| nonmembercallexpr.c:3:6:3:6 | AliasedUse | Node should have one location but has 20. |
| nonmembercallexpr.c:3:6:3:6 | Chi | Node should have one location but has 20. |
@@ -531,7 +488,6 @@ uniqueNodeLocation
| nonmembercallexpr.c:3:6:3:6 | Phi | Node should have one location but has 20. |
| nonmembercallexpr.c:3:6:3:6 | ReturnVoid | Node should have one location but has 20. |
| nonmembercallexpr.c:3:6:3:6 | UnmodeledDefinition | Node should have one location but has 20. |
| nonmembercallexpr.c:3:6:3:6 | UnmodeledUse | Node should have one location but has 20. |
| nonmembercallexpr.c:3:6:3:6 | Unreached | Node should have one location but has 20. |
| nonmemberfp2callexpr.c:3:6:3:6 | AliasedDefinition | Node should have one location but has 20. |
| nonmemberfp2callexpr.c:3:6:3:6 | AliasedUse | Node should have one location but has 20. |
@@ -542,7 +498,6 @@ uniqueNodeLocation
| nonmemberfp2callexpr.c:3:6:3:6 | Phi | Node should have one location but has 20. |
| nonmemberfp2callexpr.c:3:6:3:6 | ReturnVoid | Node should have one location but has 20. |
| nonmemberfp2callexpr.c:3:6:3:6 | UnmodeledDefinition | Node should have one location but has 20. |
| nonmemberfp2callexpr.c:3:6:3:6 | UnmodeledUse | Node should have one location but has 20. |
| nonmemberfp2callexpr.c:3:6:3:6 | Unreached | Node should have one location but has 20. |
| nonmemberfpcallexpr.c:1:6:1:6 | AliasedDefinition | Node should have one location but has 20. |
| nonmemberfpcallexpr.c:1:6:1:6 | AliasedUse | Node should have one location but has 20. |
@@ -553,7 +508,6 @@ uniqueNodeLocation
| nonmemberfpcallexpr.c:1:6:1:6 | Phi | Node should have one location but has 20. |
| nonmemberfpcallexpr.c:1:6:1:6 | ReturnVoid | Node should have one location but has 20. |
| nonmemberfpcallexpr.c:1:6:1:6 | UnmodeledDefinition | Node should have one location but has 20. |
| nonmemberfpcallexpr.c:1:6:1:6 | UnmodeledUse | Node should have one location but has 20. |
| nonmemberfpcallexpr.c:1:6:1:6 | Unreached | Node should have one location but has 20. |
| parameterinitializer.cpp:18:5:18:8 | AliasedDefinition | Node should have one location but has 4. |
| parameterinitializer.cpp:18:5:18:8 | AliasedUse | Node should have one location but has 4. |
@@ -565,7 +519,6 @@ uniqueNodeLocation
| parameterinitializer.cpp:18:5:18:8 | Phi | Node should have one location but has 4. |
| parameterinitializer.cpp:18:5:18:8 | ReturnValue | Node should have one location but has 4. |
| parameterinitializer.cpp:18:5:18:8 | UnmodeledDefinition | Node should have one location but has 4. |
| parameterinitializer.cpp:18:5:18:8 | UnmodeledUse | Node should have one location but has 4. |
| parameterinitializer.cpp:18:5:18:8 | VariableAddress | Node should have one location but has 4. |
| pmcallexpr.cpp:6:6:6:6 | AliasedDefinition | Node should have one location but has 14. |
| pmcallexpr.cpp:6:6:6:6 | AliasedUse | Node should have one location but has 14. |
@@ -576,7 +529,6 @@ uniqueNodeLocation
| pmcallexpr.cpp:6:6:6:6 | Phi | Node should have one location but has 14. |
| pmcallexpr.cpp:6:6:6:6 | ReturnVoid | Node should have one location but has 14. |
| pmcallexpr.cpp:6:6:6:6 | UnmodeledDefinition | Node should have one location but has 14. |
| pmcallexpr.cpp:6:6:6:6 | UnmodeledUse | Node should have one location but has 14. |
| questionexpr.c:1:6:1:6 | AliasedDefinition | Node should have one location but has 20. |
| questionexpr.c:1:6:1:6 | AliasedUse | Node should have one location but has 20. |
| questionexpr.c:1:6:1:6 | Chi | Node should have one location but has 20. |
@@ -586,7 +538,6 @@ uniqueNodeLocation
| questionexpr.c:1:6:1:6 | Phi | Node should have one location but has 20. |
| questionexpr.c:1:6:1:6 | ReturnVoid | Node should have one location but has 20. |
| questionexpr.c:1:6:1:6 | UnmodeledDefinition | Node should have one location but has 20. |
| questionexpr.c:1:6:1:6 | UnmodeledUse | Node should have one location but has 20. |
| questionexpr.c:1:6:1:6 | Unreached | Node should have one location but has 20. |
| revsubscriptexpr.c:1:6:1:6 | AliasedDefinition | Node should have one location but has 2. |
| revsubscriptexpr.c:1:6:1:6 | AliasedUse | Node should have one location but has 2. |
@@ -596,7 +547,6 @@ uniqueNodeLocation
| revsubscriptexpr.c:1:6:1:6 | InitializeNonLocal | Node should have one location but has 2. |
| revsubscriptexpr.c:1:6:1:6 | ReturnVoid | Node should have one location but has 2. |
| revsubscriptexpr.c:1:6:1:6 | UnmodeledDefinition | Node should have one location but has 2. |
| revsubscriptexpr.c:1:6:1:6 | UnmodeledUse | Node should have one location but has 2. |
| staticmembercallexpr.cpp:6:6:6:6 | AliasedDefinition | Node should have one location but has 14. |
| staticmembercallexpr.cpp:6:6:6:6 | AliasedUse | Node should have one location but has 14. |
| staticmembercallexpr.cpp:6:6:6:6 | Chi | Node should have one location but has 14. |
@@ -606,7 +556,6 @@ uniqueNodeLocation
| staticmembercallexpr.cpp:6:6:6:6 | Phi | Node should have one location but has 14. |
| staticmembercallexpr.cpp:6:6:6:6 | ReturnVoid | Node should have one location but has 14. |
| staticmembercallexpr.cpp:6:6:6:6 | UnmodeledDefinition | Node should have one location but has 14. |
| staticmembercallexpr.cpp:6:6:6:6 | UnmodeledUse | Node should have one location but has 14. |
| staticmembercallexpr_args.cpp:3:6:3:6 | d | Node should have one location but has 2. |
| staticmembercallexpr_args.cpp:4:21:4:21 | x | Node should have one location but has 2. |
| staticmembercallexpr_args.cpp:4:28:4:28 | y | Node should have one location but has 2. |
@@ -619,7 +568,6 @@ uniqueNodeLocation
| staticmembercallexpr_args.cpp:7:6:7:6 | Phi | Node should have one location but has 14. |
| staticmembercallexpr_args.cpp:7:6:7:6 | ReturnVoid | Node should have one location but has 14. |
| staticmembercallexpr_args.cpp:7:6:7:6 | UnmodeledDefinition | Node should have one location but has 14. |
| staticmembercallexpr_args.cpp:7:6:7:6 | UnmodeledUse | Node should have one location but has 14. |
| stream_it.cpp:16:5:16:8 | AliasedDefinition | Node should have one location but has 4. |
| stream_it.cpp:16:5:16:8 | AliasedUse | Node should have one location but has 4. |
| stream_it.cpp:16:5:16:8 | Chi | Node should have one location but has 4. |
@@ -630,7 +578,6 @@ uniqueNodeLocation
| stream_it.cpp:16:5:16:8 | Phi | Node should have one location but has 4. |
| stream_it.cpp:16:5:16:8 | ReturnValue | Node should have one location but has 4. |
| stream_it.cpp:16:5:16:8 | UnmodeledDefinition | Node should have one location but has 4. |
| stream_it.cpp:16:5:16:8 | UnmodeledUse | Node should have one location but has 4. |
| stream_it.cpp:16:5:16:8 | VariableAddress | Node should have one location but has 4. |
| subscriptexpr.c:1:6:1:6 | AliasedDefinition | Node should have one location but has 20. |
| subscriptexpr.c:1:6:1:6 | AliasedUse | Node should have one location but has 20. |
@@ -641,7 +588,6 @@ uniqueNodeLocation
| subscriptexpr.c:1:6:1:6 | Phi | Node should have one location but has 20. |
| subscriptexpr.c:1:6:1:6 | ReturnVoid | Node should have one location but has 20. |
| subscriptexpr.c:1:6:1:6 | UnmodeledDefinition | Node should have one location but has 20. |
| subscriptexpr.c:1:6:1:6 | UnmodeledUse | Node should have one location but has 20. |
| subscriptexpr.c:1:6:1:6 | Unreached | Node should have one location but has 20. |
| switchstmt.c:1:6:1:6 | AliasedDefinition | Node should have one location but has 20. |
| switchstmt.c:1:6:1:6 | AliasedUse | Node should have one location but has 20. |
@@ -652,7 +598,6 @@ uniqueNodeLocation
| switchstmt.c:1:6:1:6 | Phi | Node should have one location but has 20. |
| switchstmt.c:1:6:1:6 | ReturnVoid | Node should have one location but has 20. |
| switchstmt.c:1:6:1:6 | UnmodeledDefinition | Node should have one location but has 20. |
| switchstmt.c:1:6:1:6 | UnmodeledUse | Node should have one location but has 20. |
| switchstmt.c:1:6:1:6 | Unreached | Node should have one location but has 20. |
| switchstmt.c:1:12:1:12 | VariableAddress | Node should have one location but has 4. |
| switchstmt.c:1:12:1:12 | i | Node should have one location but has 4. |
@@ -668,7 +613,6 @@ uniqueNodeLocation
| tinyforstmt.c:1:6:1:6 | Phi | Node should have one location but has 20. |
| tinyforstmt.c:1:6:1:6 | ReturnVoid | Node should have one location but has 20. |
| tinyforstmt.c:1:6:1:6 | UnmodeledDefinition | Node should have one location but has 20. |
| tinyforstmt.c:1:6:1:6 | UnmodeledUse | Node should have one location but has 20. |
| tinyforstmt.c:1:6:1:6 | Unreached | Node should have one location but has 20. |
| unaryopexpr.c:1:6:1:6 | AliasedDefinition | Node should have one location but has 20. |
| unaryopexpr.c:1:6:1:6 | AliasedUse | Node should have one location but has 20. |
@@ -679,7 +623,6 @@ uniqueNodeLocation
| unaryopexpr.c:1:6:1:6 | Phi | Node should have one location but has 20. |
| unaryopexpr.c:1:6:1:6 | ReturnVoid | Node should have one location but has 20. |
| unaryopexpr.c:1:6:1:6 | UnmodeledDefinition | Node should have one location but has 20. |
| unaryopexpr.c:1:6:1:6 | UnmodeledUse | Node should have one location but has 20. |
| unaryopexpr.c:1:6:1:6 | Unreached | Node should have one location but has 20. |
| whilestmt.c:1:6:1:19 | AliasedDefinition | Node should have one location but has 3. |
| whilestmt.c:1:6:1:19 | AliasedUse | Node should have one location but has 3. |
@@ -689,7 +632,6 @@ uniqueNodeLocation
| whilestmt.c:1:6:1:19 | InitializeNonLocal | Node should have one location but has 3. |
| whilestmt.c:1:6:1:19 | ReturnVoid | Node should have one location but has 3. |
| whilestmt.c:1:6:1:19 | UnmodeledDefinition | Node should have one location but has 3. |
| whilestmt.c:1:6:1:19 | UnmodeledUse | Node should have one location but has 3. |
| whilestmt.c:1:6:1:19 | Unreached | Node should have one location but has 3. |
| whilestmt.c:8:6:8:19 | AliasedDefinition | Node should have one location but has 3. |
| whilestmt.c:8:6:8:19 | AliasedUse | Node should have one location but has 3. |
@@ -699,7 +641,6 @@ uniqueNodeLocation
| whilestmt.c:8:6:8:19 | InitializeNonLocal | Node should have one location but has 3. |
| whilestmt.c:8:6:8:19 | ReturnVoid | Node should have one location but has 3. |
| whilestmt.c:8:6:8:19 | UnmodeledDefinition | Node should have one location but has 3. |
| whilestmt.c:8:6:8:19 | UnmodeledUse | Node should have one location but has 3. |
| whilestmt.c:8:6:8:19 | Unreached | Node should have one location but has 3. |
| whilestmt.c:15:6:15:18 | AliasedDefinition | Node should have one location but has 4. |
| whilestmt.c:15:6:15:18 | AliasedUse | Node should have one location but has 4. |
@@ -709,7 +650,6 @@ uniqueNodeLocation
| whilestmt.c:15:6:15:18 | InitializeNonLocal | Node should have one location but has 4. |
| whilestmt.c:15:6:15:18 | ReturnVoid | Node should have one location but has 4. |
| whilestmt.c:15:6:15:18 | UnmodeledDefinition | Node should have one location but has 4. |
| whilestmt.c:15:6:15:18 | UnmodeledUse | Node should have one location but has 4. |
| whilestmt.c:15:6:15:18 | Unreached | Node should have one location but has 4. |
| whilestmt.c:23:6:23:18 | AliasedDefinition | Node should have one location but has 4. |
| whilestmt.c:23:6:23:18 | AliasedUse | Node should have one location but has 4. |
@@ -719,7 +659,6 @@ uniqueNodeLocation
| whilestmt.c:23:6:23:18 | InitializeNonLocal | Node should have one location but has 4. |
| whilestmt.c:23:6:23:18 | ReturnVoid | Node should have one location but has 4. |
| whilestmt.c:23:6:23:18 | UnmodeledDefinition | Node should have one location but has 4. |
| whilestmt.c:23:6:23:18 | UnmodeledUse | Node should have one location but has 4. |
| whilestmt.c:23:6:23:18 | Unreached | Node should have one location but has 4. |
| whilestmt.c:32:6:32:18 | AliasedDefinition | Node should have one location but has 2. |
| whilestmt.c:32:6:32:18 | Chi | Node should have one location but has 2. |
@@ -735,7 +674,6 @@ uniqueNodeLocation
| whilestmt.c:39:6:39:11 | InitializeNonLocal | Node should have one location but has 4. |
| whilestmt.c:39:6:39:11 | ReturnVoid | Node should have one location but has 4. |
| whilestmt.c:39:6:39:11 | UnmodeledDefinition | Node should have one location but has 4. |
| whilestmt.c:39:6:39:11 | UnmodeledUse | Node should have one location but has 4. |
missingLocation
| Nodes without location: 30 |
uniqueNodeToString

View File

@@ -68,9 +68,8 @@ test.cpp:
# 7| valnum = m5_7, m6_7, m7_4, r5_5, r6_5, r7_2
# 8| v8_1(void) = NoOp :
# 1| v1_10(void) = ReturnVoid :
# 1| v1_11(void) = UnmodeledUse : mu*
# 1| v1_12(void) = AliasedUse : m1_3
# 1| v1_13(void) = ExitFunction :
# 1| v1_11(void) = AliasedUse : m1_3
# 1| v1_12(void) = ExitFunction :
# 12| void test01(int, int)
# 12| Block 0
@@ -153,9 +152,8 @@ test.cpp:
# 18| valnum = m16_10, m17_10, m18_4, r16_8, r17_8, r18_2
# 19| v19_1(void) = NoOp :
# 12| v12_10(void) = ReturnVoid :
# 12| v12_11(void) = UnmodeledUse : mu*
# 12| v12_12(void) = AliasedUse : m12_3
# 12| v12_13(void) = ExitFunction :
# 12| v12_11(void) = AliasedUse : m12_3
# 12| v12_12(void) = ExitFunction :
# 25| void test02(int, int)
# 25| Block 0
@@ -245,9 +243,8 @@ test.cpp:
# 32| valnum = m31_10, m32_4, r31_8, r32_2
# 33| v33_1(void) = NoOp :
# 25| v25_10(void) = ReturnVoid :
# 25| v25_11(void) = UnmodeledUse : mu*
# 25| v25_12(void) = AliasedUse : ~m30_4
# 25| v25_13(void) = ExitFunction :
# 25| v25_11(void) = AliasedUse : ~m30_4
# 25| v25_12(void) = ExitFunction :
# 39| void test03(int, int, int*)
# 39| Block 0
@@ -351,9 +348,8 @@ test.cpp:
# 47| v47_1(void) = NoOp :
# 39| v39_14(void) = ReturnIndirection[p2] : &:r39_12, m44_6
# 39| v39_15(void) = ReturnVoid :
# 39| v39_16(void) = UnmodeledUse : mu*
# 39| v39_17(void) = AliasedUse : m39_3
# 39| v39_18(void) = ExitFunction :
# 39| v39_16(void) = AliasedUse : m39_3
# 39| v39_17(void) = ExitFunction :
# 49| unsigned int my_strspn(char const*, char const*)
# 49| Block 0
@@ -528,9 +524,8 @@ test.cpp:
# 49| r49_16(glval<unsigned int>) = VariableAddress[#return] :
# 49| valnum = r49_16, r65_1
# 49| v49_17(void) = ReturnValue : &:r49_16, m65_4
# 49| v49_18(void) = UnmodeledUse : mu*
# 49| v49_19(void) = AliasedUse : m49_3
# 49| v49_20(void) = ExitFunction :
# 49| v49_18(void) = AliasedUse : m49_3
# 49| v49_19(void) = ExitFunction :
# 75| void test04(two_values*)
# 75| Block 0
@@ -622,9 +617,8 @@ test.cpp:
# 82| v82_2(void) = NoOp :
# 75| v75_10(void) = ReturnIndirection[vals] : &:r75_8, m75_9
# 75| v75_11(void) = ReturnVoid :
# 75| v75_12(void) = UnmodeledUse : mu*
# 75| v75_13(void) = AliasedUse : ~m82_1
# 75| v75_14(void) = ExitFunction :
# 75| v75_12(void) = AliasedUse : ~m82_1
# 75| v75_13(void) = ExitFunction :
# 84| void test05(int, int, void*)
# 84| Block 0
@@ -683,9 +677,8 @@ test.cpp:
# 89| v89_1(void) = NoOp :
# 84| v84_14(void) = ReturnIndirection[p] : &:r84_12, m84_13
# 84| v84_15(void) = ReturnVoid :
# 84| v84_16(void) = UnmodeledUse : mu*
# 84| v84_17(void) = AliasedUse : m84_3
# 84| v84_18(void) = ExitFunction :
# 84| v84_16(void) = AliasedUse : m84_3
# 84| v84_17(void) = ExitFunction :
# 88| Block 2
# 88| r88_11(glval<int>) = VariableAddress[x] :
@@ -743,9 +736,8 @@ test.cpp:
# 91| r91_6(glval<int>) = VariableAddress[#return] :
# 91| valnum = r91_6, r93_1
# 91| v91_7(void) = ReturnValue : &:r91_6, m93_4
# 91| v91_8(void) = UnmodeledUse : mu*
# 91| v91_9(void) = AliasedUse : m91_3
# 91| v91_10(void) = ExitFunction :
# 91| v91_8(void) = AliasedUse : m91_3
# 91| v91_9(void) = ExitFunction :
# 104| int inheritanceConversions(Derived*)
# 104| Block 0
@@ -814,9 +806,8 @@ test.cpp:
# 104| r104_11(glval<int>) = VariableAddress[#return] :
# 104| valnum = r104_11, r109_1
# 104| v104_12(void) = ReturnValue : &:r104_11, m109_4
# 104| v104_13(void) = UnmodeledUse : mu*
# 104| v104_14(void) = AliasedUse : m104_3
# 104| v104_15(void) = ExitFunction :
# 104| v104_13(void) = AliasedUse : m104_3
# 104| v104_14(void) = ExitFunction :
# 112| void test06()
# 112| Block 0
@@ -839,9 +830,8 @@ test.cpp:
# 116| valnum = unique
# 117| v117_1(void) = NoOp :
# 112| v112_6(void) = ReturnVoid :
# 112| v112_7(void) = UnmodeledUse : mu*
# 112| v112_8(void) = AliasedUse : m112_3
# 112| v112_9(void) = ExitFunction :
# 112| v112_7(void) = AliasedUse : m112_3
# 112| v112_8(void) = ExitFunction :
# 124| void test_read_arg_same(A*, int)
# 124| Block 0
@@ -919,9 +909,8 @@ test.cpp:
# 130| v130_1(void) = NoOp :
# 124| v124_12(void) = ReturnIndirection[pa] : &:r124_8, m128_7
# 124| v124_13(void) = ReturnVoid :
# 124| v124_14(void) = UnmodeledUse : mu*
# 124| v124_15(void) = AliasedUse : m124_3
# 124| v124_16(void) = ExitFunction :
# 124| v124_14(void) = AliasedUse : m124_3
# 124| v124_15(void) = ExitFunction :
# 135| void test_read_global_same()
# 135| Block 0
@@ -986,9 +975,8 @@ test.cpp:
# 140| valnum = m140_6, r140_5
# 141| v141_1(void) = NoOp :
# 135| v135_6(void) = ReturnVoid :
# 135| v135_7(void) = UnmodeledUse : mu*
# 135| v135_8(void) = AliasedUse : ~m139_7
# 135| v135_9(void) = ExitFunction :
# 135| v135_7(void) = AliasedUse : ~m139_7
# 135| v135_8(void) = ExitFunction :
# 143| void test_read_arg_different(A*)
# 143| Block 0
@@ -1062,9 +1050,8 @@ test.cpp:
# 150| v150_1(void) = NoOp :
# 143| v143_10(void) = ReturnIndirection[pa] : &:r143_8, m147_7
# 143| v143_11(void) = ReturnVoid :
# 143| v143_12(void) = UnmodeledUse : mu*
# 143| v143_13(void) = AliasedUse : m143_3
# 143| v143_14(void) = ExitFunction :
# 143| v143_12(void) = AliasedUse : m143_3
# 143| v143_13(void) = ExitFunction :
# 152| void test_read_global_different(int)
# 152| Block 0
@@ -1133,6 +1120,5 @@ test.cpp:
# 158| valnum = m158_6, r158_5
# 159| v159_1(void) = NoOp :
# 152| v152_8(void) = ReturnVoid :
# 152| v152_9(void) = UnmodeledUse : mu*
# 152| v152_10(void) = AliasedUse : ~m156_7
# 152| v152_11(void) = ExitFunction :
# 152| v152_9(void) = AliasedUse : ~m156_7
# 152| v152_10(void) = ExitFunction :

View File

@@ -61,7 +61,6 @@ private newtype TOpcode =
TReThrow() or
TUnwind() or
TUnmodeledDefinition() or
TUnmodeledUse() or
TAliasedDefinition() or
TInitializeNonLocal() or
TAliasedUse() or
@@ -587,14 +586,6 @@ module Opcode {
}
}
class UnmodeledUse extends Opcode, TUnmodeledUse {
final override string toString() { result = "UnmodeledUse" }
final override predicate hasOperandInternal(OperandTag tag) {
tag instanceof UnmodeledUseOperandTag
}
}
class AliasedDefinition extends Opcode, TAliasedDefinition {
final override string toString() { result = "AliasedDefinition" }

View File

@@ -15,7 +15,6 @@ private newtype TOperandTag =
TLeftOperand() or
TRightOperand() or
TConditionOperand() or
TUnmodeledUseOperand() or
TCallTargetOperand() or
TThisArgumentOperand() or
TPositionalArgumentOperand(int argIndex) { Language::hasPositionalArgIndex(argIndex) } or
@@ -165,18 +164,6 @@ class ConditionOperandTag extends RegisterOperandTag, TConditionOperand {
ConditionOperandTag conditionOperand() { result = TConditionOperand() }
/**
* An operand of the special `UnmodeledUse` instruction, representing a value
* whose set of uses is unknown.
*/
class UnmodeledUseOperandTag extends MemoryOperandTag, TUnmodeledUseOperand {
final override string toString() { result = "UnmodeledUse" }
final override int getSortOrder() { result = 9 }
}
UnmodeledUseOperandTag unmodeledUseOperand() { result = TUnmodeledUseOperand() }
/**
* The operand representing the target function of an `Call` instruction.
*/

View File

@@ -31,10 +31,14 @@ class IRBlockBase extends TIRBlock {
config.shouldEvaluateDebugStringsForFunction(this.getEnclosingFunction())
) and
this =
rank[result + 1](IRBlock funcBlock |
funcBlock.getEnclosingFunction() = getEnclosingFunction()
rank[result + 1](IRBlock funcBlock, int sortOverride |
funcBlock.getEnclosingFunction() = getEnclosingFunction() and
// Ensure that the block containing `EnterFunction` always comes first.
if funcBlock.getFirstInstruction() instanceof EnterFunctionInstruction
then sortOverride = 0
else sortOverride = 1
|
funcBlock order by funcBlock.getUniqueId()
funcBlock order by sortOverride, funcBlock.getUniqueId()
)
}

View File

@@ -55,7 +55,6 @@ module InstructionConsistency {
operand.getOperandTag() = tag
) and
operandCount > 1 and
not tag instanceof UnmodeledUseOperandTag and
message =
"Instruction has " + operandCount + " operands with tag '" + tag.toString() + "'" +
" in function '$@'." and
@@ -158,7 +157,6 @@ module InstructionConsistency {
) {
exists(MemoryOperand operand, Instruction def |
operand = instr.getAnOperand() and
not operand instanceof UnmodeledUseOperand and
def = operand.getAnyDef() and
not def.isResultModeled() and
not def instanceof UnmodeledDefinitionInstruction and
@@ -259,7 +257,6 @@ module InstructionConsistency {
Operand useOperand, string message, IRFunction func, string funcText
) {
exists(IRBlock useBlock, int useIndex, Instruction defInstr, IRBlock defBlock, int defIndex |
not useOperand.getUse() instanceof UnmodeledUseInstruction and
not defInstr instanceof UnmodeledDefinitionInstruction and
pointOfEvaluation(useOperand, useBlock, useIndex) and
defInstr = useOperand.getAnyDef() and

View File

@@ -45,11 +45,6 @@ class IRFunction extends TIRFunction {
result.getEnclosingIRFunction() = this
}
pragma[noinline]
final UnmodeledUseInstruction getUnmodeledUseInstruction() {
result.getEnclosingIRFunction() = this
}
/**
* Gets the single return instruction for this function.
*/

View File

@@ -320,8 +320,7 @@ class Instruction extends Construction::TInstruction {
/**
* Holds if the result of this instruction is precisely modeled in SSA. Always
* holds for a register result. For a memory result, a modeled result is
* connected to its actual uses. An unmodeled result is connected to the
* `UnmodeledUse` instruction.
* connected to its actual uses. An unmodeled result has no uses.
*
* For example:
* ```
@@ -1248,12 +1247,6 @@ class AliasedUseInstruction extends Instruction {
AliasedUseInstruction() { getOpcode() instanceof Opcode::AliasedUse }
}
class UnmodeledUseInstruction extends Instruction {
UnmodeledUseInstruction() { getOpcode() instanceof Opcode::UnmodeledUse }
override string getOperandsString() { result = "mu*" }
}
/**
* An instruction representing the choice of one of multiple input values based on control flow.
*

View File

@@ -19,11 +19,7 @@ private newtype TOperand =
) {
defInstr = Construction::getMemoryOperandDefinition(useInstr, tag, overlap) and
not Construction::isInCycle(useInstr) and
(
strictcount(Construction::getMemoryOperandDefinition(useInstr, tag, _)) = 1
or
tag instanceof UnmodeledUseOperandTag
)
strictcount(Construction::getMemoryOperandDefinition(useInstr, tag, _)) = 1
} or
TPhiOperand(
PhiInstruction useInstr, Instruction defInstr, IRBlock predecessorBlock, Overlap overlap
@@ -327,16 +323,6 @@ class ConditionOperand extends RegisterOperand {
override string toString() { result = "Condition" }
}
/**
* An operand of the special `UnmodeledUse` instruction, representing a value
* whose set of uses is unknown.
*/
class UnmodeledUseOperand extends NonPhiMemoryOperand {
override UnmodeledUseOperandTag tag;
override string toString() { result = "UnmodeledUse" }
}
/**
* The operand representing the target function of an `Call` instruction.
*/

View File

@@ -30,7 +30,6 @@ newtype TInstructionTag =
ReturnTag() or
ExitFunctionTag() or
UnmodeledDefinitionTag() or
UnmodeledUseTag() or
AliasedDefinitionTag() or
AliasedUseTag() or
SwitchBranchTag() or
@@ -128,8 +127,6 @@ string getInstructionTagId(TInstructionTag tag) {
or
tag = UnmodeledDefinitionTag() and result = "UnmodeledDef"
or
tag = UnmodeledUseTag() and result = "UnmodeledUse"
or
tag = AliasedDefinitionTag() and result = "AliasedDef"
or
tag = AliasedUseTag() and result = "AliasedUse"

View File

@@ -93,13 +93,10 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction {
result = this.getInstruction(ReturnTag())
or
tag = ReturnTag() and
result = this.getInstruction(UnmodeledUseTag())
result = this.getInstruction(AliasedUseTag())
or
tag = UnwindTag() and
result = this.getInstruction(UnmodeledUseTag())
or
tag = UnmodeledUseTag() and
result = getInstruction(AliasedUseTag())
result = this.getInstruction(AliasedUseTag())
or
tag = AliasedUseTag() and
result = this.getInstruction(ExitFunctionTag())
@@ -171,10 +168,6 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction {
exists(ThrowStmt throw | throw.getEnclosingCallable() = callable)
)
or
tag = UnmodeledUseTag() and
opcode instanceof Opcode::UnmodeledUse and
resultType = getVoidType()
or
tag = AliasedUseTag() and
opcode instanceof Opcode::AliasedUse and
resultType = getVoidType()
@@ -190,15 +183,6 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction {
}
final override Instruction getInstructionOperand(InstructionTag tag, OperandTag operandTag) {
tag = UnmodeledUseTag() and
operandTag instanceof UnmodeledUseOperandTag and
result.getEnclosingFunction() = callable and
result.hasMemoryResult()
or
tag = UnmodeledUseTag() and
operandTag instanceof UnmodeledUseOperandTag and
result = getUnmodeledDefinitionInstruction()
or
tag = AliasedUseTag() and
operandTag instanceof SideEffectOperandTag and
result = getUnmodeledDefinitionInstruction()

View File

@@ -31,10 +31,14 @@ class IRBlockBase extends TIRBlock {
config.shouldEvaluateDebugStringsForFunction(this.getEnclosingFunction())
) and
this =
rank[result + 1](IRBlock funcBlock |
funcBlock.getEnclosingFunction() = getEnclosingFunction()
rank[result + 1](IRBlock funcBlock, int sortOverride |
funcBlock.getEnclosingFunction() = getEnclosingFunction() and
// Ensure that the block containing `EnterFunction` always comes first.
if funcBlock.getFirstInstruction() instanceof EnterFunctionInstruction
then sortOverride = 0
else sortOverride = 1
|
funcBlock order by funcBlock.getUniqueId()
funcBlock order by sortOverride, funcBlock.getUniqueId()
)
}

View File

@@ -55,7 +55,6 @@ module InstructionConsistency {
operand.getOperandTag() = tag
) and
operandCount > 1 and
not tag instanceof UnmodeledUseOperandTag and
message =
"Instruction has " + operandCount + " operands with tag '" + tag.toString() + "'" +
" in function '$@'." and
@@ -158,7 +157,6 @@ module InstructionConsistency {
) {
exists(MemoryOperand operand, Instruction def |
operand = instr.getAnOperand() and
not operand instanceof UnmodeledUseOperand and
def = operand.getAnyDef() and
not def.isResultModeled() and
not def instanceof UnmodeledDefinitionInstruction and
@@ -259,7 +257,6 @@ module InstructionConsistency {
Operand useOperand, string message, IRFunction func, string funcText
) {
exists(IRBlock useBlock, int useIndex, Instruction defInstr, IRBlock defBlock, int defIndex |
not useOperand.getUse() instanceof UnmodeledUseInstruction and
not defInstr instanceof UnmodeledDefinitionInstruction and
pointOfEvaluation(useOperand, useBlock, useIndex) and
defInstr = useOperand.getAnyDef() and

View File

@@ -45,11 +45,6 @@ class IRFunction extends TIRFunction {
result.getEnclosingIRFunction() = this
}
pragma[noinline]
final UnmodeledUseInstruction getUnmodeledUseInstruction() {
result.getEnclosingIRFunction() = this
}
/**
* Gets the single return instruction for this function.
*/

View File

@@ -320,8 +320,7 @@ class Instruction extends Construction::TInstruction {
/**
* Holds if the result of this instruction is precisely modeled in SSA. Always
* holds for a register result. For a memory result, a modeled result is
* connected to its actual uses. An unmodeled result is connected to the
* `UnmodeledUse` instruction.
* connected to its actual uses. An unmodeled result has no uses.
*
* For example:
* ```
@@ -1248,12 +1247,6 @@ class AliasedUseInstruction extends Instruction {
AliasedUseInstruction() { getOpcode() instanceof Opcode::AliasedUse }
}
class UnmodeledUseInstruction extends Instruction {
UnmodeledUseInstruction() { getOpcode() instanceof Opcode::UnmodeledUse }
override string getOperandsString() { result = "mu*" }
}
/**
* An instruction representing the choice of one of multiple input values based on control flow.
*

View File

@@ -19,11 +19,7 @@ private newtype TOperand =
) {
defInstr = Construction::getMemoryOperandDefinition(useInstr, tag, overlap) and
not Construction::isInCycle(useInstr) and
(
strictcount(Construction::getMemoryOperandDefinition(useInstr, tag, _)) = 1
or
tag instanceof UnmodeledUseOperandTag
)
strictcount(Construction::getMemoryOperandDefinition(useInstr, tag, _)) = 1
} or
TPhiOperand(
PhiInstruction useInstr, Instruction defInstr, IRBlock predecessorBlock, Overlap overlap
@@ -327,16 +323,6 @@ class ConditionOperand extends RegisterOperand {
override string toString() { result = "Condition" }
}
/**
* An operand of the special `UnmodeledUse` instruction, representing a value
* whose set of uses is unknown.
*/
class UnmodeledUseOperand extends NonPhiMemoryOperand {
override UnmodeledUseOperandTag tag;
override string toString() { result = "UnmodeledUse" }
}
/**
* The operand representing the target function of an `Call` instruction.
*/

View File

@@ -247,6 +247,10 @@ private predicate resultMayReachReturn(Instruction instr) { operandMayReachRetur
private predicate resultEscapesNonReturn(Instruction instr) {
// The result escapes if it has at least one use that escapes.
operandEscapesNonReturn(instr.getAUse())
or
// The result also escapes if it is not modeled in SSA, because we do not know where it might be
// used.
not instr.isResultModeled()
}
/**

View File

@@ -128,23 +128,10 @@ private module Cached {
oldOperand = oldInstruction.getAnOperand() and
tag = oldOperand.getOperandTag() and
(
(
if exists(Alias::getOperandMemoryLocation(oldOperand))
then hasMemoryOperandDefinition(oldInstruction, oldOperand, overlap, result)
else (
result = instruction.getEnclosingIRFunction().getUnmodeledDefinitionInstruction() and
overlap instanceof MustTotallyOverlap
)
)
or
// Connect any definitions that are not being modeled in SSA to the
// `UnmodeledUse` instruction.
exists(OldInstruction oldDefinition |
instruction instanceof UnmodeledUseInstruction and
tag instanceof UnmodeledUseOperandTag and
oldDefinition = oldOperand.getAnyDef() and
not exists(Alias::getResultMemoryLocation(oldDefinition)) and
result = getNewInstruction(oldDefinition) and
if exists(Alias::getOperandMemoryLocation(oldOperand))
then hasMemoryOperandDefinition(oldInstruction, oldOperand, overlap, result)
else (
result = instruction.getEnclosingIRFunction().getUnmodeledDefinitionInstruction() and
overlap instanceof MustTotallyOverlap
)
)
@@ -154,13 +141,6 @@ private module Cached {
tag instanceof ChiPartialOperandTag and
overlap instanceof MustExactlyOverlap
or
exists(IRFunction f |
tag instanceof UnmodeledUseOperandTag and
result = f.getUnmodeledDefinitionInstruction() and
instruction = f.getUnmodeledUseInstruction() and
overlap instanceof MustTotallyOverlap
)
or
tag instanceof ChiTotalOperandTag and
result = getChiInstructionTotalOperand(instruction) and
overlap instanceof MustExactlyOverlap

View File

@@ -52,9 +52,8 @@ array.cs:
# 10| r10_6(Int32[]) = PointerAdd[4] : r10_3, r10_5
# 10| mu10_7(Int32) = Store : &:r10_6, r10_1
# 2| v2_5(Void) = ReturnVoid :
# 2| v2_6(Void) = UnmodeledUse : mu*
# 2| v2_7(Void) = AliasedUse : ~mu2_3
# 2| v2_8(Void) = ExitFunction :
# 2| v2_6(Void) = AliasedUse : ~mu2_3
# 2| v2_7(Void) = ExitFunction :
# 13| System.Void ArrayTest.twod_and_init_acc()
# 13| Block 0
@@ -144,9 +143,8 @@ array.cs:
# 20| r20_8(Int32[]) = PointerAdd[4] : r20_6, r20_7
# 20| mu20_9(Int32) = Store : &:r20_8, r20_1
# 13| v13_5(Void) = ReturnVoid :
# 13| v13_6(Void) = UnmodeledUse : mu*
# 13| v13_7(Void) = AliasedUse : ~mu13_3
# 13| v13_8(Void) = ExitFunction :
# 13| v13_6(Void) = AliasedUse : ~mu13_3
# 13| v13_7(Void) = ExitFunction :
assignop.cs:
# 4| System.Void AssignOp.Main()
@@ -216,9 +214,8 @@ assignop.cs:
# 17| r17_4(Int32) = BitOr : r17_3, r17_1
# 17| mu17_5(Int32) = Store : &:r17_2, r17_4
# 4| v4_4(Void) = ReturnVoid :
# 4| v4_5(Void) = UnmodeledUse : mu*
# 4| v4_6(Void) = AliasedUse : ~mu4_3
# 4| v4_7(Void) = ExitFunction :
# 4| v4_5(Void) = AliasedUse : ~mu4_3
# 4| v4_6(Void) = ExitFunction :
casts.cs:
# 11| System.Void Casts.Main()
@@ -243,9 +240,8 @@ casts.cs:
# 15| r15_4(Casts_B) = CheckedConvertOrNull : r15_3
# 15| mu15_5(Casts_B) = Store : &:r15_1, r15_4
# 11| v11_4(Void) = ReturnVoid :
# 11| v11_5(Void) = UnmodeledUse : mu*
# 11| v11_6(Void) = AliasedUse : ~mu11_3
# 11| v11_7(Void) = ExitFunction :
# 11| v11_5(Void) = AliasedUse : ~mu11_3
# 11| v11_6(Void) = ExitFunction :
collections.cs:
# 11| System.Void Collections.Main()
@@ -288,9 +284,8 @@ collections.cs:
# 16| mu16_14(<unknown>) = ^CallSideEffect : ~mu11_3
# 13| mu13_6(Dictionary<Int32,MyClass>) = Store : &:r13_1, r13_2
# 11| v11_4(Void) = ReturnVoid :
# 11| v11_5(Void) = UnmodeledUse : mu*
# 11| v11_6(Void) = AliasedUse : ~mu11_3
# 11| v11_7(Void) = ExitFunction :
# 11| v11_5(Void) = AliasedUse : ~mu11_3
# 11| v11_6(Void) = ExitFunction :
constructor_init.cs:
# 5| System.Void BaseClass..ctor()
@@ -301,9 +296,8 @@ constructor_init.cs:
# 5| r5_4(glval<BaseClass>) = InitializeThis :
# 6| v6_1(Void) = NoOp :
# 5| v5_5(Void) = ReturnVoid :
# 5| v5_6(Void) = UnmodeledUse : mu*
# 5| v5_7(Void) = AliasedUse : ~mu5_3
# 5| v5_8(Void) = ExitFunction :
# 5| v5_6(Void) = AliasedUse : ~mu5_3
# 5| v5_7(Void) = ExitFunction :
# 9| System.Void BaseClass..ctor(System.Int32)
# 9| Block 0
@@ -319,9 +313,8 @@ constructor_init.cs:
# 11| r11_4(glval<Int32>) = FieldAddress[num] : r11_3
# 11| mu11_5(Int32) = Store : &:r11_4, r11_2
# 9| v9_7(Void) = ReturnVoid :
# 9| v9_8(Void) = UnmodeledUse : mu*
# 9| v9_9(Void) = AliasedUse : ~mu9_3
# 9| v9_10(Void) = ExitFunction :
# 9| v9_8(Void) = AliasedUse : ~mu9_3
# 9| v9_9(Void) = ExitFunction :
# 17| System.Void DerivedClass..ctor()
# 17| Block 0
@@ -335,9 +328,8 @@ constructor_init.cs:
# 17| mu17_8(<unknown>) = ^CallSideEffect : ~mu17_3
# 18| v18_1(Void) = NoOp :
# 17| v17_9(Void) = ReturnVoid :
# 17| v17_10(Void) = UnmodeledUse : mu*
# 17| v17_11(Void) = AliasedUse : ~mu17_3
# 17| v17_12(Void) = ExitFunction :
# 17| v17_10(Void) = AliasedUse : ~mu17_3
# 17| v17_11(Void) = ExitFunction :
# 21| System.Void DerivedClass..ctor(System.Int32)
# 21| Block 0
@@ -355,9 +347,8 @@ constructor_init.cs:
# 21| mu21_12(<unknown>) = ^CallSideEffect : ~mu21_3
# 22| v22_1(Void) = NoOp :
# 21| v21_13(Void) = ReturnVoid :
# 21| v21_14(Void) = UnmodeledUse : mu*
# 21| v21_15(Void) = AliasedUse : ~mu21_3
# 21| v21_16(Void) = ExitFunction :
# 21| v21_14(Void) = AliasedUse : ~mu21_3
# 21| v21_15(Void) = ExitFunction :
# 25| System.Void DerivedClass..ctor(System.Int32,System.Int32)
# 25| Block 0
@@ -376,9 +367,8 @@ constructor_init.cs:
# 25| mu25_13(<unknown>) = ^CallSideEffect : ~mu25_3
# 26| v26_1(Void) = NoOp :
# 25| v25_14(Void) = ReturnVoid :
# 25| v25_15(Void) = UnmodeledUse : mu*
# 25| v25_16(Void) = AliasedUse : ~mu25_3
# 25| v25_17(Void) = ExitFunction :
# 25| v25_15(Void) = AliasedUse : ~mu25_3
# 25| v25_16(Void) = ExitFunction :
# 29| System.Void DerivedClass.Main()
# 29| Block 0
@@ -407,9 +397,8 @@ constructor_init.cs:
# 33| mu33_7(<unknown>) = ^CallSideEffect : ~mu29_3
# 33| mu33_8(DerivedClass) = Store : &:r33_1, r33_2
# 29| v29_4(Void) = ReturnVoid :
# 29| v29_5(Void) = UnmodeledUse : mu*
# 29| v29_6(Void) = AliasedUse : ~mu29_3
# 29| v29_7(Void) = ExitFunction :
# 29| v29_5(Void) = AliasedUse : ~mu29_3
# 29| v29_6(Void) = ExitFunction :
crement.cs:
# 3| System.Void CrementOpsTest.Main()
@@ -449,9 +438,8 @@ crement.cs:
# 9| r9_6(glval<Int32>) = VariableAddress[x] :
# 9| mu9_7(Int32) = Store : &:r9_6, r9_2
# 3| v3_4(Void) = ReturnVoid :
# 3| v3_5(Void) = UnmodeledUse : mu*
# 3| v3_6(Void) = AliasedUse : ~mu3_3
# 3| v3_7(Void) = ExitFunction :
# 3| v3_5(Void) = AliasedUse : ~mu3_3
# 3| v3_6(Void) = ExitFunction :
delegates.cs:
# 6| System.Int32 Delegates.returns(System.Int32)
@@ -467,9 +455,8 @@ delegates.cs:
# 8| mu8_4(Int32) = Store : &:r8_1, r8_3
# 6| r6_6(glval<Int32>) = VariableAddress[#return] :
# 6| v6_7(Void) = ReturnValue : &:r6_6, ~mu6_3
# 6| v6_8(Void) = UnmodeledUse : mu*
# 6| v6_9(Void) = AliasedUse : ~mu6_3
# 6| v6_10(Void) = ExitFunction :
# 6| v6_8(Void) = AliasedUse : ~mu6_3
# 6| v6_9(Void) = ExitFunction :
# 11| System.Void Delegates.Main()
# 11| Block 0
@@ -490,9 +477,8 @@ delegates.cs:
# 13| v13_5(Void) = Call : func:r13_3, this:r13_2, 0:r13_4
# 13| mu13_6(<unknown>) = ^CallSideEffect : ~mu11_3
# 11| v11_4(Void) = ReturnVoid :
# 11| v11_5(Void) = UnmodeledUse : mu*
# 11| v11_6(Void) = AliasedUse : ~mu11_3
# 11| v11_7(Void) = ExitFunction :
# 11| v11_5(Void) = AliasedUse : ~mu11_3
# 11| v11_6(Void) = ExitFunction :
events.cs:
# 8| System.Void Events..ctor()
@@ -510,9 +496,8 @@ events.cs:
# 10| r10_7(glval<MyDel>) = FieldAddress[Inst] : r10_6
# 10| mu10_8(MyDel) = Store : &:r10_7, r10_1
# 8| v8_5(Void) = ReturnVoid :
# 8| v8_6(Void) = UnmodeledUse : mu*
# 8| v8_7(Void) = AliasedUse : ~mu8_3
# 8| v8_8(Void) = ExitFunction :
# 8| v8_6(Void) = AliasedUse : ~mu8_3
# 8| v8_7(Void) = ExitFunction :
# 13| System.Void Events.AddEvent()
# 13| Block 0
@@ -528,9 +513,8 @@ events.cs:
# 15| v15_6(Void) = Call : func:r15_2, this:r15_1, 0:r15_5
# 15| mu15_7(<unknown>) = ^CallSideEffect : ~mu13_3
# 13| v13_5(Void) = ReturnVoid :
# 13| v13_6(Void) = UnmodeledUse : mu*
# 13| v13_7(Void) = AliasedUse : ~mu13_3
# 13| v13_8(Void) = ExitFunction :
# 13| v13_6(Void) = AliasedUse : ~mu13_3
# 13| v13_7(Void) = ExitFunction :
# 18| System.Void Events.RemoveEvent()
# 18| Block 0
@@ -546,9 +530,8 @@ events.cs:
# 20| v20_6(Void) = Call : func:r20_2, this:r20_1, 0:r20_5
# 20| mu20_7(<unknown>) = ^CallSideEffect : ~mu18_3
# 18| v18_5(Void) = ReturnVoid :
# 18| v18_6(Void) = UnmodeledUse : mu*
# 18| v18_7(Void) = AliasedUse : ~mu18_3
# 18| v18_8(Void) = ExitFunction :
# 18| v18_6(Void) = AliasedUse : ~mu18_3
# 18| v18_7(Void) = ExitFunction :
# 23| System.String Events.Fun(System.String)
# 23| Block 0
@@ -564,9 +547,8 @@ events.cs:
# 25| mu25_4(String) = Store : &:r25_1, r25_3
# 23| r23_7(glval<String>) = VariableAddress[#return] :
# 23| v23_8(Void) = ReturnValue : &:r23_7, ~mu23_3
# 23| v23_9(Void) = UnmodeledUse : mu*
# 23| v23_10(Void) = AliasedUse : ~mu23_3
# 23| v23_11(Void) = ExitFunction :
# 23| v23_9(Void) = AliasedUse : ~mu23_3
# 23| v23_10(Void) = ExitFunction :
# 28| System.Void Events.Main(System.String[])
# 28| Block 0
@@ -600,9 +582,8 @@ events.cs:
# 33| v33_4(Void) = Call : func:r33_3, this:r33_2
# 33| mu33_5(<unknown>) = ^CallSideEffect : ~mu28_3
# 28| v28_6(Void) = ReturnVoid :
# 28| v28_7(Void) = UnmodeledUse : mu*
# 28| v28_8(Void) = AliasedUse : ~mu28_3
# 28| v28_9(Void) = ExitFunction :
# 28| v28_7(Void) = AliasedUse : ~mu28_3
# 28| v28_8(Void) = ExitFunction :
foreach.cs:
# 4| System.Void ForEach.Main()
@@ -680,9 +661,8 @@ foreach.cs:
# 7| v7_24(Void) = Call : func:r7_23, this:r7_22
# 7| mu7_25(<unknown>) = ^CallSideEffect : ~mu4_3
# 4| v4_4(Void) = ReturnVoid :
# 4| v4_5(Void) = UnmodeledUse : mu*
# 4| v4_6(Void) = AliasedUse : ~mu4_3
# 4| v4_7(Void) = ExitFunction :
# 4| v4_5(Void) = AliasedUse : ~mu4_3
# 4| v4_6(Void) = ExitFunction :
func_with_param_call.cs:
# 5| System.Int32 test_call_with_param.f(System.Int32,System.Int32)
@@ -703,9 +683,8 @@ func_with_param_call.cs:
# 7| mu7_7(Int32) = Store : &:r7_1, r7_6
# 5| r5_8(glval<Int32>) = VariableAddress[#return] :
# 5| v5_9(Void) = ReturnValue : &:r5_8, ~mu5_3
# 5| v5_10(Void) = UnmodeledUse : mu*
# 5| v5_11(Void) = AliasedUse : ~mu5_3
# 5| v5_12(Void) = ExitFunction :
# 5| v5_10(Void) = AliasedUse : ~mu5_3
# 5| v5_11(Void) = ExitFunction :
# 10| System.Int32 test_call_with_param.g()
# 10| Block 0
@@ -721,9 +700,8 @@ func_with_param_call.cs:
# 12| mu12_7(Int32) = Store : &:r12_1, r12_5
# 10| r10_4(glval<Int32>) = VariableAddress[#return] :
# 10| v10_5(Void) = ReturnValue : &:r10_4, ~mu10_3
# 10| v10_6(Void) = UnmodeledUse : mu*
# 10| v10_7(Void) = AliasedUse : ~mu10_3
# 10| v10_8(Void) = ExitFunction :
# 10| v10_6(Void) = AliasedUse : ~mu10_3
# 10| v10_7(Void) = ExitFunction :
indexers.cs:
# 8| System.String Indexers.MyClass.get_Item(System.Int32)
@@ -745,9 +723,8 @@ indexers.cs:
# 10| mu10_9(String) = Store : &:r10_1, r10_8
# 8| r8_5(glval<String>) = VariableAddress[#return] :
# 8| v8_6(Void) = ReturnValue : &:r8_5, ~mu8_3
# 8| v8_7(Void) = UnmodeledUse : mu*
# 8| v8_8(Void) = AliasedUse : ~mu8_3
# 8| v8_9(Void) = ExitFunction :
# 8| v8_7(Void) = AliasedUse : ~mu8_3
# 8| v8_8(Void) = ExitFunction :
# 12| System.Void Indexers.MyClass.set_Item(System.Int32,System.String)
# 12| Block 0
@@ -769,9 +746,8 @@ indexers.cs:
# 14| r14_8(String[]) = PointerAdd[8] : r14_5, r14_7
# 14| mu14_9(String) = Store : &:r14_8, r14_2
# 12| v12_7(Void) = ReturnVoid :
# 12| v12_8(Void) = UnmodeledUse : mu*
# 12| v12_9(Void) = AliasedUse : ~mu12_3
# 12| v12_10(Void) = ExitFunction :
# 12| v12_8(Void) = AliasedUse : ~mu12_3
# 12| v12_9(Void) = ExitFunction :
# 19| System.Void Indexers.Main()
# 19| Block 0
@@ -811,9 +787,8 @@ indexers.cs:
# 24| v24_11(Void) = Call : func:r24_3, this:r24_2, 0:r24_4, 1:r24_9
# 24| mu24_12(<unknown>) = ^CallSideEffect : ~mu19_3
# 19| v19_4(Void) = ReturnVoid :
# 19| v19_5(Void) = UnmodeledUse : mu*
# 19| v19_6(Void) = AliasedUse : ~mu19_3
# 19| v19_7(Void) = ExitFunction :
# 19| v19_5(Void) = AliasedUse : ~mu19_3
# 19| v19_6(Void) = ExitFunction :
inheritance_polymorphism.cs:
# 3| System.Int32 A.function()
@@ -827,9 +802,8 @@ inheritance_polymorphism.cs:
# 5| mu5_3(Int32) = Store : &:r5_1, r5_2
# 3| r3_5(glval<Int32>) = VariableAddress[#return] :
# 3| v3_6(Void) = ReturnValue : &:r3_5, ~mu3_3
# 3| v3_7(Void) = UnmodeledUse : mu*
# 3| v3_8(Void) = AliasedUse : ~mu3_3
# 3| v3_9(Void) = ExitFunction :
# 3| v3_7(Void) = AliasedUse : ~mu3_3
# 3| v3_8(Void) = ExitFunction :
# 15| System.Int32 C.function()
# 15| Block 0
@@ -842,9 +816,8 @@ inheritance_polymorphism.cs:
# 17| mu17_3(Int32) = Store : &:r17_1, r17_2
# 15| r15_5(glval<Int32>) = VariableAddress[#return] :
# 15| v15_6(Void) = ReturnValue : &:r15_5, ~mu15_3
# 15| v15_7(Void) = UnmodeledUse : mu*
# 15| v15_8(Void) = AliasedUse : ~mu15_3
# 15| v15_9(Void) = ExitFunction :
# 15| v15_7(Void) = AliasedUse : ~mu15_3
# 15| v15_8(Void) = ExitFunction :
# 23| System.Void Program.Main()
# 23| Block 0
@@ -887,9 +860,8 @@ inheritance_polymorphism.cs:
# 34| r34_4(Int32) = Call : func:r34_3, this:r34_2
# 34| mu34_5(<unknown>) = ^CallSideEffect : ~mu23_3
# 23| v23_4(Void) = ReturnVoid :
# 23| v23_5(Void) = UnmodeledUse : mu*
# 23| v23_6(Void) = AliasedUse : ~mu23_3
# 23| v23_7(Void) = ExitFunction :
# 23| v23_5(Void) = AliasedUse : ~mu23_3
# 23| v23_6(Void) = ExitFunction :
inoutref.cs:
# 11| System.Void InOutRef.set(MyClass,MyClass)
@@ -907,9 +879,8 @@ inoutref.cs:
# 13| r13_4(MyClass) = Load : &:r13_3, ~mu11_3
# 13| mu13_5(MyClass) = Store : &:r13_4, r13_2
# 11| v11_8(Void) = ReturnVoid :
# 11| v11_9(Void) = UnmodeledUse : mu*
# 11| v11_10(Void) = AliasedUse : ~mu11_3
# 11| v11_11(Void) = ExitFunction :
# 11| v11_9(Void) = AliasedUse : ~mu11_3
# 11| v11_10(Void) = ExitFunction :
# 16| System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass)
# 16| Block 0
@@ -967,9 +938,8 @@ inoutref.cs:
# 26| v26_7(Void) = Call : func:r26_1, 0:r26_3, 1:r26_6
# 26| mu26_8(<unknown>) = ^CallSideEffect : ~mu16_3
# 16| v16_14(Void) = ReturnVoid :
# 16| v16_15(Void) = UnmodeledUse : mu*
# 16| v16_16(Void) = AliasedUse : ~mu16_3
# 16| v16_17(Void) = ExitFunction :
# 16| v16_15(Void) = AliasedUse : ~mu16_3
# 16| v16_16(Void) = ExitFunction :
# 29| System.Void InOutRef.Main()
# 29| Block 0
@@ -1006,9 +976,8 @@ inoutref.cs:
# 36| r36_4(Int32) = Load : &:r36_3, ~mu29_3
# 36| mu36_5(Int32) = Store : &:r36_1, r36_4
# 29| v29_4(Void) = ReturnVoid :
# 29| v29_5(Void) = UnmodeledUse : mu*
# 29| v29_6(Void) = AliasedUse : ~mu29_3
# 29| v29_7(Void) = ExitFunction :
# 29| v29_5(Void) = AliasedUse : ~mu29_3
# 29| v29_6(Void) = ExitFunction :
isexpr.cs:
# 8| System.Void IsExpr.Main()
@@ -1038,9 +1007,8 @@ isexpr.cs:
# 8| Block 1
# 8| v8_4(Void) = ReturnVoid :
# 8| v8_5(Void) = UnmodeledUse : mu*
# 8| v8_6(Void) = AliasedUse : ~mu8_3
# 8| v8_7(Void) = ExitFunction :
# 8| v8_5(Void) = AliasedUse : ~mu8_3
# 8| v8_6(Void) = ExitFunction :
# 13| Block 2
# 13| v13_9(Void) = ConditionalBranch : r13_7
@@ -1245,9 +1213,8 @@ jumps.cs:
# 38| v38_3(Void) = Call : func:r38_1, 0:r38_2
# 38| mu38_4(<unknown>) = ^CallSideEffect : ~mu5_3
# 5| v5_4(Void) = ReturnVoid :
# 5| v5_5(Void) = UnmodeledUse : mu*
# 5| v5_6(Void) = AliasedUse : ~mu5_3
# 5| v5_7(Void) = ExitFunction :
# 5| v5_5(Void) = AliasedUse : ~mu5_3
# 5| v5_6(Void) = ExitFunction :
lock.cs:
# 5| System.Void LockTest.A()
@@ -1290,9 +1257,8 @@ lock.cs:
# 5| Block 1
# 5| v5_4(Void) = ReturnVoid :
# 5| v5_5(Void) = UnmodeledUse : mu*
# 5| v5_6(Void) = AliasedUse : ~mu5_3
# 5| v5_7(Void) = ExitFunction :
# 5| v5_5(Void) = AliasedUse : ~mu5_3
# 5| v5_6(Void) = ExitFunction :
# 8| Block 2
# 8| r8_17(<funcaddr>) = FunctionAddress[Exit] :
@@ -1311,9 +1277,8 @@ obj_creation.cs:
# 7| r7_4(glval<MyClass>) = InitializeThis :
# 8| v8_1(Void) = NoOp :
# 7| v7_5(Void) = ReturnVoid :
# 7| v7_6(Void) = UnmodeledUse : mu*
# 7| v7_7(Void) = AliasedUse : ~mu7_3
# 7| v7_8(Void) = ExitFunction :
# 7| v7_6(Void) = AliasedUse : ~mu7_3
# 7| v7_7(Void) = ExitFunction :
# 11| System.Void ObjCreation.MyClass..ctor(System.Int32)
# 11| Block 0
@@ -1329,9 +1294,8 @@ obj_creation.cs:
# 13| r13_4(glval<Int32>) = FieldAddress[x] : r13_3
# 13| mu13_5(Int32) = Store : &:r13_4, r13_2
# 11| v11_7(Void) = ReturnVoid :
# 11| v11_8(Void) = UnmodeledUse : mu*
# 11| v11_9(Void) = AliasedUse : ~mu11_3
# 11| v11_10(Void) = ExitFunction :
# 11| v11_8(Void) = AliasedUse : ~mu11_3
# 11| v11_9(Void) = ExitFunction :
# 17| System.Void ObjCreation.SomeFun(ObjCreation.MyClass)
# 17| Block 0
@@ -1342,9 +1306,8 @@ obj_creation.cs:
# 17| mu17_5(MyClass) = InitializeParameter[x] : &:r17_4
# 18| v18_1(Void) = NoOp :
# 17| v17_6(Void) = ReturnVoid :
# 17| v17_7(Void) = UnmodeledUse : mu*
# 17| v17_8(Void) = AliasedUse : ~mu17_3
# 17| v17_9(Void) = ExitFunction :
# 17| v17_7(Void) = AliasedUse : ~mu17_3
# 17| v17_8(Void) = ExitFunction :
# 21| System.Void ObjCreation.Main()
# 21| Block 0
@@ -1382,9 +1345,8 @@ obj_creation.cs:
# 27| v27_7(Void) = Call : func:r27_1, 0:r27_2
# 27| mu27_8(<unknown>) = ^CallSideEffect : ~mu21_3
# 21| v21_4(Void) = ReturnVoid :
# 21| v21_5(Void) = UnmodeledUse : mu*
# 21| v21_6(Void) = AliasedUse : ~mu21_3
# 21| v21_7(Void) = ExitFunction :
# 21| v21_5(Void) = AliasedUse : ~mu21_3
# 21| v21_6(Void) = ExitFunction :
pointers.cs:
# 3| System.Void Pointers.addone(System.Int32[])
@@ -1417,9 +1379,8 @@ pointers.cs:
# 3| Block 1
# 3| v3_6(Void) = ReturnVoid :
# 3| v3_7(Void) = UnmodeledUse : mu*
# 3| v3_8(Void) = AliasedUse : ~mu3_3
# 3| v3_9(Void) = ExitFunction :
# 3| v3_7(Void) = AliasedUse : ~mu3_3
# 3| v3_8(Void) = ExitFunction :
# 9| Block 2
# 9| r9_4(glval<Int32>) = VariableAddress[i] :
@@ -1513,9 +1474,8 @@ pointers.cs:
# 40| v40_4(Void) = Call : func:r40_1, 0:r40_3
# 40| mu40_5(<unknown>) = ^CallSideEffect : ~mu25_3
# 25| v25_4(Void) = ReturnVoid :
# 25| v25_5(Void) = UnmodeledUse : mu*
# 25| v25_6(Void) = AliasedUse : ~mu25_3
# 25| v25_7(Void) = ExitFunction :
# 25| v25_5(Void) = AliasedUse : ~mu25_3
# 25| v25_6(Void) = ExitFunction :
prop.cs:
# 7| System.Int32 PropClass.get_Prop()
@@ -1532,9 +1492,8 @@ prop.cs:
# 9| mu9_6(Int32) = Store : &:r9_1, r9_4
# 7| r7_5(glval<Int32>) = VariableAddress[#return] :
# 7| v7_6(Void) = ReturnValue : &:r7_5, ~mu7_3
# 7| v7_7(Void) = UnmodeledUse : mu*
# 7| v7_8(Void) = AliasedUse : ~mu7_3
# 7| v7_9(Void) = ExitFunction :
# 7| v7_7(Void) = AliasedUse : ~mu7_3
# 7| v7_8(Void) = ExitFunction :
# 12| System.Void PropClass.set_Prop(System.Int32)
# 12| Block 0
@@ -1549,9 +1508,8 @@ prop.cs:
# 14| r14_3(glval<Int32>) = VariableAddress[prop] :
# 14| mu14_4(Int32) = Store : &:r14_3, r14_2
# 12| v12_7(Void) = ReturnVoid :
# 12| v12_8(Void) = UnmodeledUse : mu*
# 12| v12_9(Void) = AliasedUse : ~mu12_3
# 12| v12_10(Void) = ExitFunction :
# 12| v12_8(Void) = AliasedUse : ~mu12_3
# 12| v12_9(Void) = ExitFunction :
# 18| System.Int32 PropClass.func()
# 18| Block 0
@@ -1564,9 +1522,8 @@ prop.cs:
# 20| mu20_3(Int32) = Store : &:r20_1, r20_2
# 18| r18_5(glval<Int32>) = VariableAddress[#return] :
# 18| v18_6(Void) = ReturnValue : &:r18_5, ~mu18_3
# 18| v18_7(Void) = UnmodeledUse : mu*
# 18| v18_8(Void) = AliasedUse : ~mu18_3
# 18| v18_9(Void) = ExitFunction :
# 18| v18_7(Void) = AliasedUse : ~mu18_3
# 18| v18_8(Void) = ExitFunction :
# 26| System.Void Prog.Main()
# 26| Block 0
@@ -1593,9 +1550,8 @@ prop.cs:
# 30| mu30_6(<unknown>) = ^CallSideEffect : ~mu26_3
# 30| mu30_7(Int32) = Store : &:r30_1, r30_5
# 26| v26_4(Void) = ReturnVoid :
# 26| v26_5(Void) = UnmodeledUse : mu*
# 26| v26_6(Void) = AliasedUse : ~mu26_3
# 26| v26_7(Void) = ExitFunction :
# 26| v26_5(Void) = AliasedUse : ~mu26_3
# 26| v26_6(Void) = ExitFunction :
simple_call.cs:
# 5| System.Int32 test_simple_call.f()
@@ -1608,9 +1564,8 @@ simple_call.cs:
# 7| mu7_3(Int32) = Store : &:r7_1, r7_2
# 5| r5_4(glval<Int32>) = VariableAddress[#return] :
# 5| v5_5(Void) = ReturnValue : &:r5_4, ~mu5_3
# 5| v5_6(Void) = UnmodeledUse : mu*
# 5| v5_7(Void) = AliasedUse : ~mu5_3
# 5| v5_8(Void) = ExitFunction :
# 5| v5_6(Void) = AliasedUse : ~mu5_3
# 5| v5_7(Void) = ExitFunction :
# 10| System.Int32 test_simple_call.g()
# 10| Block 0
@@ -1625,9 +1580,8 @@ simple_call.cs:
# 12| mu12_5(Int32) = Store : &:r12_1, r12_3
# 10| r10_5(glval<Int32>) = VariableAddress[#return] :
# 10| v10_6(Void) = ReturnValue : &:r10_5, ~mu10_3
# 10| v10_7(Void) = UnmodeledUse : mu*
# 10| v10_8(Void) = AliasedUse : ~mu10_3
# 10| v10_9(Void) = ExitFunction :
# 10| v10_7(Void) = AliasedUse : ~mu10_3
# 10| v10_8(Void) = ExitFunction :
simple_function.cs:
# 5| System.Int32 test_simple_function.f()
@@ -1640,9 +1594,8 @@ simple_function.cs:
# 7| mu7_3(Int32) = Store : &:r7_1, r7_2
# 5| r5_4(glval<Int32>) = VariableAddress[#return] :
# 5| v5_5(Void) = ReturnValue : &:r5_4, ~mu5_3
# 5| v5_6(Void) = UnmodeledUse : mu*
# 5| v5_7(Void) = AliasedUse : ~mu5_3
# 5| v5_8(Void) = ExitFunction :
# 5| v5_6(Void) = AliasedUse : ~mu5_3
# 5| v5_7(Void) = ExitFunction :
stmts.cs:
# 5| System.Int32 test_stmts.ifStmt(System.Int32)
@@ -1663,9 +1616,8 @@ stmts.cs:
# 5| Block 1
# 5| r5_6(glval<Int32>) = VariableAddress[#return] :
# 5| v5_7(Void) = ReturnValue : &:r5_6, ~mu5_3
# 5| v5_8(Void) = UnmodeledUse : mu*
# 5| v5_9(Void) = AliasedUse : ~mu5_3
# 5| v5_10(Void) = ExitFunction :
# 5| v5_8(Void) = AliasedUse : ~mu5_3
# 5| v5_9(Void) = ExitFunction :
# 10| Block 2
# 10| r10_1(glval<Int32>) = VariableAddress[#return] :
@@ -1693,9 +1645,8 @@ stmts.cs:
# 13| Block 1
# 13| v13_6(Void) = ReturnVoid :
# 13| v13_7(Void) = UnmodeledUse : mu*
# 13| v13_8(Void) = AliasedUse : ~mu13_3
# 13| v13_9(Void) = ExitFunction :
# 13| v13_7(Void) = AliasedUse : ~mu13_3
# 13| v13_8(Void) = ExitFunction :
# 16| Block 2
# 16| r16_1(glval<Int32>) = VariableAddress[i] :
@@ -1741,9 +1692,8 @@ stmts.cs:
# 22| Block 1
# 22| r22_4(glval<Int32>) = VariableAddress[#return] :
# 22| v22_5(Void) = ReturnValue : &:r22_4, ~mu22_3
# 22| v22_6(Void) = UnmodeledUse : mu*
# 22| v22_7(Void) = AliasedUse : ~mu22_3
# 22| v22_8(Void) = ExitFunction :
# 22| v22_6(Void) = AliasedUse : ~mu22_3
# 22| v22_7(Void) = ExitFunction :
# 29| Block 2
# 29| v29_1(Void) = NoOp :
@@ -1799,12 +1749,11 @@ stmts.cs:
#-----| True -> Block 3
# 46| Block 1
# 46| v46_4(Void) = UnmodeledUse : mu*
# 46| v46_5(Void) = AliasedUse : ~mu46_3
# 46| v46_6(Void) = ExitFunction :
# 46| v46_4(Void) = AliasedUse : ~mu46_3
# 46| v46_5(Void) = ExitFunction :
# 46| Block 2
# 46| v46_7(Void) = Unwind :
# 46| v46_6(Void) = Unwind :
#-----| Goto -> Block 1
# 52| Block 3
@@ -1827,7 +1776,7 @@ stmts.cs:
# 65| r65_1(Int32) = Constant[2] :
# 65| r65_2(glval<Int32>) = VariableAddress[x] :
# 65| mu65_3(Int32) = Store : &:r65_2, r65_1
# 46| v46_8(Void) = ReturnVoid :
# 46| v46_7(Void) = ReturnVoid :
#-----| Goto -> Block 1
# 55| Block 6
@@ -1866,9 +1815,8 @@ stmts.cs:
# 69| Block 1
# 69| v69_4(Void) = ReturnVoid :
# 69| v69_5(Void) = UnmodeledUse : mu*
# 69| v69_6(Void) = AliasedUse : ~mu69_3
# 69| v69_7(Void) = ExitFunction :
# 69| v69_5(Void) = AliasedUse : ~mu69_3
# 69| v69_6(Void) = ExitFunction :
# 72| Block 2
# 72| r72_7(glval<Int32>) = VariableAddress[i] :
@@ -1944,9 +1892,8 @@ stmts.cs:
# 89| Block 1
# 89| v89_4(Void) = ReturnVoid :
# 89| v89_5(Void) = UnmodeledUse : mu*
# 89| v89_6(Void) = AliasedUse : ~mu89_3
# 89| v89_7(Void) = ExitFunction :
# 89| v89_5(Void) = AliasedUse : ~mu89_3
# 89| v89_6(Void) = ExitFunction :
# 94| Block 2
# 94| r94_1(glval<Int32>) = VariableAddress[x] :
@@ -1985,9 +1932,8 @@ stmts.cs:
# 108| r108_5(glval<Int32>) = VariableAddress[num] :
# 108| mu108_6(Int32) = Store : &:r108_5, r108_4
# 99| v99_4(Void) = ReturnVoid :
# 99| v99_5(Void) = UnmodeledUse : mu*
# 99| v99_6(Void) = AliasedUse : ~mu99_3
# 99| v99_7(Void) = ExitFunction :
# 99| v99_5(Void) = AliasedUse : ~mu99_3
# 99| v99_6(Void) = ExitFunction :
using.cs:
# 7| System.Void UsingStmt.MyDisposable..ctor()
@@ -1998,9 +1944,8 @@ using.cs:
# 7| r7_4(glval<MyDisposable>) = InitializeThis :
# 7| v7_5(Void) = NoOp :
# 7| v7_6(Void) = ReturnVoid :
# 7| v7_7(Void) = UnmodeledUse : mu*
# 7| v7_8(Void) = AliasedUse : ~mu7_3
# 7| v7_9(Void) = ExitFunction :
# 7| v7_7(Void) = AliasedUse : ~mu7_3
# 7| v7_8(Void) = ExitFunction :
# 8| System.Void UsingStmt.MyDisposable.DoSomething()
# 8| Block 0
@@ -2010,9 +1955,8 @@ using.cs:
# 8| r8_4(glval<MyDisposable>) = InitializeThis :
# 8| v8_5(Void) = NoOp :
# 8| v8_6(Void) = ReturnVoid :
# 8| v8_7(Void) = UnmodeledUse : mu*
# 8| v8_8(Void) = AliasedUse : ~mu8_3
# 8| v8_9(Void) = ExitFunction :
# 8| v8_7(Void) = AliasedUse : ~mu8_3
# 8| v8_8(Void) = ExitFunction :
# 9| System.Void UsingStmt.MyDisposable.Dispose()
# 9| Block 0
@@ -2022,9 +1966,8 @@ using.cs:
# 9| r9_4(glval<MyDisposable>) = InitializeThis :
# 9| v9_5(Void) = NoOp :
# 9| v9_6(Void) = ReturnVoid :
# 9| v9_7(Void) = UnmodeledUse : mu*
# 9| v9_8(Void) = AliasedUse : ~mu9_3
# 9| v9_9(Void) = ExitFunction :
# 9| v9_7(Void) = AliasedUse : ~mu9_3
# 9| v9_8(Void) = ExitFunction :
# 12| System.Void UsingStmt.Main()
# 12| Block 0
@@ -2065,9 +2008,8 @@ using.cs:
# 26| v26_4(Void) = Call : func:r26_3, this:r26_2
# 26| mu26_5(<unknown>) = ^CallSideEffect : ~mu12_3
# 12| v12_4(Void) = ReturnVoid :
# 12| v12_5(Void) = UnmodeledUse : mu*
# 12| v12_6(Void) = AliasedUse : ~mu12_3
# 12| v12_7(Void) = ExitFunction :
# 12| v12_5(Void) = AliasedUse : ~mu12_3
# 12| v12_6(Void) = ExitFunction :
variables.cs:
# 5| System.Void test_variables.f()
@@ -2092,6 +2034,5 @@ variables.cs:
# 10| r10_3(Int32) = Load : &:r10_2, ~mu5_3
# 10| mu10_4(Int32) = Store : &:r10_1, r10_3
# 5| v5_4(Void) = ReturnVoid :
# 5| v5_5(Void) = UnmodeledUse : mu*
# 5| v5_6(Void) = AliasedUse : ~mu5_3
# 5| v5_7(Void) = ExitFunction :
# 5| v5_5(Void) = AliasedUse : ~mu5_3
# 5| v5_6(Void) = ExitFunction :