Merge pull request #2184 from dave-bartolomeo/dave/AliasedUse

C++/C#: Add `AliasedUse` instruction to all functions
This commit is contained in:
Jonas Jensen 2019-10-29 08:37:57 +01:00 коммит произвёл GitHub
Родитель 04e3683035 cc5a689293
Коммит 0b2c2620cd
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
25 изменённых файлов: 689 добавлений и 344 удалений

Просмотреть файл

@ -5,6 +5,7 @@ private newtype TMemoryAccessKind =
TBufferMayMemoryAccess() or
TEscapedMemoryAccess() or
TEscapedMayMemoryAccess() or
TNonLocalMayMemoryAccess() or
TPhiMemoryAccess() or
TUnmodeledMemoryAccess() or
TChiTotalMemoryAccess() or
@ -80,6 +81,14 @@ class EscapedMayMemoryAccess extends MemoryAccessKind, TEscapedMayMemoryAccess {
override string toString() { result = "escaped(may)" }
}
/**
* The operand or result may access all memory whose address has escaped, other than data on the
* stack frame of the current function.
*/
class NonLocalMayMemoryAccess extends MemoryAccessKind, TNonLocalMayMemoryAccess {
override string toString() { result = "nonlocal(may)" }
}
/**
* The operand is a Phi operand, which accesses the same memory as its
* definition.

Просмотреть файл

@ -57,6 +57,7 @@ private newtype TOpcode =
TUnmodeledDefinition() or
TUnmodeledUse() or
TAliasedDefinition() or
TAliasedUse() or
TPhi() or
TBuiltIn() or
TVarArgsStart() or
@ -393,6 +394,10 @@ module Opcode {
final override string toString() { result = "AliasedDefinition" }
}
class AliasedUse extends Opcode, TAliasedUse {
final override string toString() { result = "AliasedUse" }
}
class Phi extends Opcode, TPhi {
final override string toString() { result = "Phi" }
}

Просмотреть файл

@ -50,7 +50,8 @@ module InstructionSanity {
(
opcode instanceof ReadSideEffectOpcode or
opcode instanceof Opcode::InlineAsm or
opcode instanceof Opcode::CallSideEffect
opcode instanceof Opcode::CallSideEffect or
opcode instanceof Opcode::AliasedUse
) and
tag instanceof SideEffectOperandTag
)
@ -263,6 +264,7 @@ module InstructionSanity {
) {
exists(IRBlock useBlock, int useIndex, Instruction defInstr, IRBlock defBlock, int defIndex |
not useOperand.getUse() instanceof UnmodeledUseInstruction and
not defInstr instanceof UnmodeledDefinitionInstruction and
pointOfEvaluation(useOperand, useBlock, useIndex) and
defInstr = useOperand.getAnyDef() and
(
@ -1421,6 +1423,13 @@ class AliasedDefinitionInstruction extends Instruction {
final override MemoryAccessKind getResultMemoryAccess() { result instanceof EscapedMemoryAccess }
}
/**
* An instruction that consumes all escaped memory on exit from the function.
*/
class AliasedUseInstruction extends Instruction {
AliasedUseInstruction() { getOpcode() instanceof Opcode::AliasedUse }
}
class UnmodeledUseInstruction extends Instruction {
UnmodeledUseInstruction() { getOpcode() instanceof Opcode::UnmodeledUse }

Просмотреть файл

@ -396,6 +396,9 @@ class SideEffectOperand extends TypedOperand {
override SideEffectOperandTag tag;
override MemoryAccessKind getMemoryAccess() {
useInstr instanceof AliasedUseInstruction and
result instanceof NonLocalMayMemoryAccess
or
useInstr instanceof CallSideEffectInstruction and
result instanceof EscapedMayMemoryAccess
or

Просмотреть файл

@ -45,6 +45,7 @@ private newtype TMemoryLocation =
languageType = type.getCanonicalLanguageType()
} or
TUnknownMemoryLocation(IRFunction irFunc) or
TUnknownNonLocalMemoryLocation(IRFunction irFunc) or
TUnknownVirtualVariable(IRFunction irFunc)
/**
@ -162,6 +163,26 @@ class UnknownMemoryLocation extends TUnknownMemoryLocation, MemoryLocation {
final override string getUniqueId() { result = "{Unknown}" }
}
/**
* An access to memory that is not known to be confined to a specific `IRVariable`, but is known to
* not access memory on the current function's stack frame.
*/
class UnknownNonLocalMemoryLocation extends TUnknownNonLocalMemoryLocation, MemoryLocation {
IRFunction irFunc;
UnknownNonLocalMemoryLocation() { this = TUnknownNonLocalMemoryLocation(irFunc) }
final override string toString() { result = "{UnknownNonLocal}" }
final override VirtualVariable getVirtualVariable() { result = TUnknownVirtualVariable(irFunc) }
final override Language::LanguageType getType() {
result = any(IRUnknownType type).getCanonicalLanguageType()
}
final override string getUniqueId() { result = "{UnknownNonLocal}" }
}
/**
* An access to all aliased memory.
*/
@ -194,6 +215,13 @@ Overlap getOverlap(MemoryLocation def, MemoryLocation use) {
def instanceof UnknownMemoryLocation and
result instanceof MayPartiallyOverlap
or
// An UnknownNonLocalMemoryLocation may partially overlap any location within the same virtual
// variable, except a local variable.
def.getVirtualVariable() = use.getVirtualVariable() and
def instanceof UnknownNonLocalMemoryLocation and
result instanceof MayPartiallyOverlap and
not use.(VariableMemoryLocation).getVariable() instanceof IRAutomaticVariable
or
exists(VariableMemoryLocation defVariableLocation |
defVariableLocation = def and
(
@ -202,6 +230,13 @@ Overlap getOverlap(MemoryLocation def, MemoryLocation use) {
(use instanceof UnknownMemoryLocation or use instanceof UnknownVirtualVariable) and
result instanceof MayPartiallyOverlap
or
// A VariableMemoryLocation that is not a local variable may partially overlap an unknown
// non-local location within the same virtual variable.
def.getVirtualVariable() = use.getVirtualVariable() and
use instanceof UnknownNonLocalMemoryLocation and
result instanceof MayPartiallyOverlap and
not defVariableLocation.getVariable() instanceof IRAutomaticVariable
or
// A VariableMemoryLocation overlaps another location within the same variable based on the relationship
// of the two offset intervals.
exists(Overlap intervalOverlap |
@ -327,6 +362,9 @@ MemoryLocation getResultMemoryLocation(Instruction instr) {
or
kind instanceof EscapedMayMemoryAccess and
result = TUnknownMemoryLocation(instr.getEnclosingIRFunction())
or
kind instanceof NonLocalMayMemoryAccess and
result = TUnknownNonLocalMemoryLocation(instr.getEnclosingIRFunction())
)
)
}
@ -351,6 +389,9 @@ MemoryLocation getOperandMemoryLocation(MemoryOperand operand) {
or
kind instanceof EscapedMayMemoryAccess and
result = TUnknownMemoryLocation(operand.getEnclosingIRFunction())
or
kind instanceof NonLocalMayMemoryAccess and
result = TUnknownNonLocalMemoryLocation(operand.getEnclosingIRFunction())
)
)
}

Просмотреть файл

@ -50,7 +50,8 @@ module InstructionSanity {
(
opcode instanceof ReadSideEffectOpcode or
opcode instanceof Opcode::InlineAsm or
opcode instanceof Opcode::CallSideEffect
opcode instanceof Opcode::CallSideEffect or
opcode instanceof Opcode::AliasedUse
) and
tag instanceof SideEffectOperandTag
)
@ -263,6 +264,7 @@ module InstructionSanity {
) {
exists(IRBlock useBlock, int useIndex, Instruction defInstr, IRBlock defBlock, int defIndex |
not useOperand.getUse() instanceof UnmodeledUseInstruction and
not defInstr instanceof UnmodeledDefinitionInstruction and
pointOfEvaluation(useOperand, useBlock, useIndex) and
defInstr = useOperand.getAnyDef() and
(
@ -1421,6 +1423,13 @@ class AliasedDefinitionInstruction extends Instruction {
final override MemoryAccessKind getResultMemoryAccess() { result instanceof EscapedMemoryAccess }
}
/**
* An instruction that consumes all escaped memory on exit from the function.
*/
class AliasedUseInstruction extends Instruction {
AliasedUseInstruction() { getOpcode() instanceof Opcode::AliasedUse }
}
class UnmodeledUseInstruction extends Instruction {
UnmodeledUseInstruction() { getOpcode() instanceof Opcode::UnmodeledUse }

Просмотреть файл

@ -396,6 +396,9 @@ class SideEffectOperand extends TypedOperand {
override SideEffectOperandTag tag;
override MemoryAccessKind getMemoryAccess() {
useInstr instanceof AliasedUseInstruction and
result instanceof NonLocalMayMemoryAccess
or
useInstr instanceof CallSideEffectInstruction and
result instanceof EscapedMayMemoryAccess
or

Просмотреть файл

@ -26,6 +26,7 @@ newtype TInstructionTag =
UnmodeledDefinitionTag() or
UnmodeledUseTag() or
AliasedDefinitionTag() or
AliasedUseTag() or
SwitchBranchTag() or
CallTargetTag() or
CallTag() or
@ -118,6 +119,8 @@ string getInstructionTagId(TInstructionTag tag) {
or
tag = AliasedDefinitionTag() and result = "AliasedDef"
or
tag = AliasedUseTag() and result = "AliasedUse"
or
tag = SwitchBranchTag() and result = "SwitchBranch"
or
tag = CallTargetTag() and result = "CallTarget"

Просмотреть файл

@ -96,6 +96,9 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction {
result = getInstruction(UnmodeledUseTag())
or
tag = UnmodeledUseTag() and
result = getInstruction(AliasedUseTag())
or
tag = AliasedUseTag() and
result = getInstruction(ExitFunctionTag())
)
}
@ -167,6 +170,10 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction {
opcode instanceof Opcode::UnmodeledUse and
resultType = getVoidType()
or
tag = AliasedUseTag() and
opcode instanceof Opcode::AliasedUse and
resultType = getVoidType()
or
tag = ExitFunctionTag() and
opcode instanceof Opcode::ExitFunction and
resultType = getVoidType()
@ -187,6 +194,10 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction {
operandTag instanceof UnmodeledUseOperandTag and
result = getUnmodeledDefinitionInstruction()
or
tag = AliasedUseTag() and
operandTag instanceof SideEffectOperandTag and
result = getUnmodeledDefinitionInstruction()
or
tag = ReturnTag() and
hasReturnValue() and
(
@ -203,6 +214,10 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction {
hasReturnValue() and
operandTag instanceof LoadOperandTag and
result = getTypeForPRValue(getReturnType())
or
tag = AliasedUseTag() and
operandTag instanceof SideEffectOperandTag and
result = getUnknownType()
}
final override IRVariable getInstructionVariable(InstructionTag tag) {

Просмотреть файл

@ -50,7 +50,8 @@ module InstructionSanity {
(
opcode instanceof ReadSideEffectOpcode or
opcode instanceof Opcode::InlineAsm or
opcode instanceof Opcode::CallSideEffect
opcode instanceof Opcode::CallSideEffect or
opcode instanceof Opcode::AliasedUse
) and
tag instanceof SideEffectOperandTag
)
@ -263,6 +264,7 @@ module InstructionSanity {
) {
exists(IRBlock useBlock, int useIndex, Instruction defInstr, IRBlock defBlock, int defIndex |
not useOperand.getUse() instanceof UnmodeledUseInstruction and
not defInstr instanceof UnmodeledDefinitionInstruction and
pointOfEvaluation(useOperand, useBlock, useIndex) and
defInstr = useOperand.getAnyDef() and
(
@ -1421,6 +1423,13 @@ class AliasedDefinitionInstruction extends Instruction {
final override MemoryAccessKind getResultMemoryAccess() { result instanceof EscapedMemoryAccess }
}
/**
* An instruction that consumes all escaped memory on exit from the function.
*/
class AliasedUseInstruction extends Instruction {
AliasedUseInstruction() { getOpcode() instanceof Opcode::AliasedUse }
}
class UnmodeledUseInstruction extends Instruction {
UnmodeledUseInstruction() { getOpcode() instanceof Opcode::UnmodeledUse }

Просмотреть файл

@ -396,6 +396,9 @@ class SideEffectOperand extends TypedOperand {
override SideEffectOperandTag tag;
override MemoryAccessKind getMemoryAccess() {
useInstr instanceof AliasedUseInstruction and
result instanceof NonLocalMayMemoryAccess
or
useInstr instanceof CallSideEffectInstruction and
result instanceof EscapedMayMemoryAccess
or

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -84,7 +84,8 @@ ssa.cpp:
# 13| r6_12(glval<int>) = VariableAddress[#return] :
# 13| v6_13(void) = ReturnValue : &:r6_12, m6_11
# 13| v6_14(void) = UnmodeledUse : mu*
# 13| v6_15(void) = ExitFunction :
# 13| v6_15(void) = AliasedUse : ~m6_0
# 13| v6_16(void) = ExitFunction :
# 31| int UnreachableViaGoto()
# 31| Block 0
@ -99,7 +100,8 @@ ssa.cpp:
# 31| r0_8(glval<int>) = VariableAddress[#return] :
# 31| v0_9(void) = ReturnValue : &:r0_8, m0_7
# 31| v0_10(void) = UnmodeledUse : mu*
# 31| v0_11(void) = ExitFunction :
# 31| v0_11(void) = AliasedUse : ~m0_1
# 31| v0_12(void) = ExitFunction :
# 38| int UnreachableIf(bool)
# 38| Block 0
@ -125,7 +127,8 @@ ssa.cpp:
# 38| r1_1(glval<int>) = VariableAddress[#return] :
# 38| v1_2(void) = ReturnValue : &:r1_1, m1_0
# 38| v1_3(void) = UnmodeledUse : mu*
# 38| v1_4(void) = ExitFunction :
# 38| v1_4(void) = AliasedUse : ~m0_1
# 38| v1_5(void) = ExitFunction :
# 42| Block 2
# 42| r2_0(glval<int>) = VariableAddress[x] :
@ -188,7 +191,8 @@ ssa.cpp:
# 59| r1_4(glval<int>) = VariableAddress[#return] :
# 59| v1_5(void) = ReturnValue : &:r1_4, m1_3
# 59| v1_6(void) = UnmodeledUse : mu*
# 59| v1_7(void) = ExitFunction :
# 59| v1_7(void) = AliasedUse : ~m0_1
# 59| v1_8(void) = ExitFunction :
# 59| Block 2
# 59| v2_0(void) = Unreached :
@ -219,7 +223,8 @@ ssa.cpp:
# 71| v2_0(void) = NoOp :
# 68| v2_1(void) = ReturnVoid :
# 68| v2_2(void) = UnmodeledUse : mu*
# 68| v2_3(void) = ExitFunction :
# 68| v2_3(void) = AliasedUse : ~m3_0
# 68| v2_4(void) = ExitFunction :
# 69| Block 3
# 69| m3_0(unknown) = Phi : from 0:~m0_1, from 1:~m1_7
@ -291,7 +296,8 @@ ssa.cpp:
# 89| v3_14(void) = NoOp :
# 75| v3_15(void) = ReturnVoid :
# 75| v3_16(void) = UnmodeledUse : mu*
# 75| v3_17(void) = ExitFunction :
# 75| v3_17(void) = AliasedUse : ~m0_1
# 75| v3_18(void) = ExitFunction :
# 91| void MustExactlyOverlap(Point)
# 91| Block 0
@ -307,7 +313,8 @@ ssa.cpp:
# 93| v0_9(void) = NoOp :
# 91| v0_10(void) = ReturnVoid :
# 91| v0_11(void) = UnmodeledUse : mu*
# 91| v0_12(void) = ExitFunction :
# 91| v0_12(void) = AliasedUse : ~m0_1
# 91| v0_13(void) = ExitFunction :
# 95| void MustExactlyOverlapEscaped(Point)
# 95| Block 0
@ -333,7 +340,8 @@ ssa.cpp:
# 98| v0_19(void) = NoOp :
# 95| v0_20(void) = ReturnVoid :
# 95| v0_21(void) = UnmodeledUse : mu*
# 95| v0_22(void) = ExitFunction :
# 95| v0_22(void) = AliasedUse : ~m0_15
# 95| v0_23(void) = ExitFunction :
# 100| void MustTotallyOverlap(Point)
# 100| Block 0
@ -355,7 +363,8 @@ ssa.cpp:
# 103| v0_15(void) = NoOp :
# 100| v0_16(void) = ReturnVoid :
# 100| v0_17(void) = UnmodeledUse : mu*
# 100| v0_18(void) = ExitFunction :
# 100| v0_18(void) = AliasedUse : ~m0_1
# 100| v0_19(void) = ExitFunction :
# 105| void MustTotallyOverlapEscaped(Point)
# 105| Block 0
@ -387,7 +396,8 @@ ssa.cpp:
# 109| v0_25(void) = NoOp :
# 105| v0_26(void) = ReturnVoid :
# 105| v0_27(void) = UnmodeledUse : mu*
# 105| v0_28(void) = ExitFunction :
# 105| v0_28(void) = AliasedUse : ~m0_21
# 105| v0_29(void) = ExitFunction :
# 111| void MayPartiallyOverlap(int, int)
# 111| Block 0
@ -417,7 +427,8 @@ ssa.cpp:
# 114| v0_23(void) = NoOp :
# 111| v0_24(void) = ReturnVoid :
# 111| v0_25(void) = UnmodeledUse : mu*
# 111| v0_26(void) = ExitFunction :
# 111| v0_26(void) = AliasedUse : ~m0_1
# 111| v0_27(void) = ExitFunction :
# 116| void MayPartiallyOverlapEscaped(int, int)
# 116| Block 0
@ -457,7 +468,8 @@ ssa.cpp:
# 120| v0_33(void) = NoOp :
# 116| v0_34(void) = ReturnVoid :
# 116| v0_35(void) = UnmodeledUse : mu*
# 116| v0_36(void) = ExitFunction :
# 116| v0_36(void) = AliasedUse : ~m0_29
# 116| v0_37(void) = ExitFunction :
# 122| void MergeMustExactlyOverlap(bool, int, int)
# 122| Block 0
@ -519,7 +531,8 @@ ssa.cpp:
# 132| v3_11(void) = NoOp :
# 122| v3_12(void) = ReturnVoid :
# 122| v3_13(void) = UnmodeledUse : mu*
# 122| v3_14(void) = ExitFunction :
# 122| v3_14(void) = AliasedUse : ~m0_1
# 122| v3_15(void) = ExitFunction :
# 134| void MergeMustExactlyWithMustTotallyOverlap(bool, Point, int)
# 134| Block 0
@ -575,7 +588,8 @@ ssa.cpp:
# 143| v3_7(void) = NoOp :
# 134| v3_8(void) = ReturnVoid :
# 134| v3_9(void) = UnmodeledUse : mu*
# 134| v3_10(void) = ExitFunction :
# 134| v3_10(void) = AliasedUse : ~m0_1
# 134| v3_11(void) = ExitFunction :
# 145| void MergeMustExactlyWithMayPartiallyOverlap(bool, Point, int)
# 145| Block 0
@ -629,7 +643,8 @@ ssa.cpp:
# 154| v3_5(void) = NoOp :
# 145| v3_6(void) = ReturnVoid :
# 145| v3_7(void) = UnmodeledUse : mu*
# 145| v3_8(void) = ExitFunction :
# 145| v3_8(void) = AliasedUse : ~m0_1
# 145| v3_9(void) = ExitFunction :
# 156| void MergeMustTotallyOverlapWithMayPartiallyOverlap(bool, Rect, int)
# 156| Block 0
@ -685,7 +700,8 @@ ssa.cpp:
# 165| v3_6(void) = NoOp :
# 156| v3_7(void) = ReturnVoid :
# 156| v3_8(void) = UnmodeledUse : mu*
# 156| v3_9(void) = ExitFunction :
# 156| v3_9(void) = AliasedUse : ~m0_1
# 156| v3_10(void) = ExitFunction :
# 171| void WrapperStruct(Wrapper)
# 171| Block 0
@ -719,7 +735,8 @@ ssa.cpp:
# 177| v0_27(void) = NoOp :
# 171| v0_28(void) = ReturnVoid :
# 171| v0_29(void) = UnmodeledUse : mu*
# 171| v0_30(void) = ExitFunction :
# 171| v0_30(void) = AliasedUse : ~m0_1
# 171| v0_31(void) = ExitFunction :
# 179| int AsmStmt(int*)
# 179| Block 0
@ -738,7 +755,8 @@ ssa.cpp:
# 179| r0_12(glval<int>) = VariableAddress[#return] :
# 179| v0_13(void) = ReturnValue : &:r0_12, m0_11
# 179| v0_14(void) = UnmodeledUse : mu*
# 179| v0_15(void) = ExitFunction :
# 179| v0_15(void) = AliasedUse : ~m0_6
# 179| v0_16(void) = ExitFunction :
# 184| void AsmStmtWithOutputs(unsigned int&, unsigned int&, unsigned int&, unsigned int&)
# 184| Block 0
@ -768,7 +786,8 @@ ssa.cpp:
# 192| v0_23(void) = NoOp :
# 184| v0_24(void) = ReturnVoid :
# 184| v0_25(void) = UnmodeledUse : mu*
# 184| v0_26(void) = ExitFunction :
# 184| v0_26(void) = AliasedUse : ~m0_22
# 184| v0_27(void) = ExitFunction :
# 198| int PureFunctions(char*, char*, int)
# 198| Block 0
@ -817,7 +836,8 @@ ssa.cpp:
# 198| r0_42(glval<int>) = VariableAddress[#return] :
# 198| v0_43(void) = ReturnValue : &:r0_42, m0_41
# 198| v0_44(void) = UnmodeledUse : mu*
# 198| v0_45(void) = ExitFunction :
# 198| v0_45(void) = AliasedUse : ~m0_1
# 198| v0_46(void) = ExitFunction :
# 207| int ModeledCallTarget(int)
# 207| Block 0
@ -847,4 +867,5 @@ ssa.cpp:
# 207| r0_23(glval<int>) = VariableAddress[#return] :
# 207| v0_24(void) = ReturnValue : &:r0_23, m0_22
# 207| v0_25(void) = UnmodeledUse : mu*
# 207| v0_26(void) = ExitFunction :
# 207| v0_26(void) = AliasedUse : ~m0_1
# 207| v0_27(void) = ExitFunction :

Просмотреть файл

@ -78,7 +78,8 @@ ssa.cpp:
# 13| r6_11(glval<int>) = VariableAddress[#return] :
# 13| v6_12(void) = ReturnValue : &:r6_11, m6_10
# 13| v6_13(void) = UnmodeledUse : mu*
# 13| v6_14(void) = ExitFunction :
# 13| v6_14(void) = AliasedUse : ~mu0_2
# 13| v6_15(void) = ExitFunction :
# 31| int UnreachableViaGoto()
# 31| Block 0
@ -93,7 +94,8 @@ ssa.cpp:
# 31| r0_8(glval<int>) = VariableAddress[#return] :
# 31| v0_9(void) = ReturnValue : &:r0_8, m0_7
# 31| v0_10(void) = UnmodeledUse : mu*
# 31| v0_11(void) = ExitFunction :
# 31| v0_11(void) = AliasedUse : ~mu0_2
# 31| v0_12(void) = ExitFunction :
# 38| int UnreachableIf(bool)
# 38| Block 0
@ -119,7 +121,8 @@ ssa.cpp:
# 38| r1_1(glval<int>) = VariableAddress[#return] :
# 38| v1_2(void) = ReturnValue : &:r1_1, m1_0
# 38| v1_3(void) = UnmodeledUse : mu*
# 38| v1_4(void) = ExitFunction :
# 38| v1_4(void) = AliasedUse : ~mu0_2
# 38| v1_5(void) = ExitFunction :
# 42| Block 2
# 42| r2_0(glval<int>) = VariableAddress[x] :
@ -191,7 +194,8 @@ ssa.cpp:
# 59| r1_4(glval<int>) = VariableAddress[#return] :
# 59| v1_5(void) = ReturnValue : &:r1_4, m1_3
# 59| v1_6(void) = UnmodeledUse : mu*
# 59| v1_7(void) = ExitFunction :
# 59| v1_7(void) = AliasedUse : ~mu0_2
# 59| v1_8(void) = ExitFunction :
# 59| Block 2
# 59| v2_0(void) = Unreached :
@ -221,7 +225,8 @@ ssa.cpp:
# 71| v2_0(void) = NoOp :
# 68| v2_1(void) = ReturnVoid :
# 68| v2_2(void) = UnmodeledUse : mu*
# 68| v2_3(void) = ExitFunction :
# 68| v2_3(void) = AliasedUse : ~mu0_2
# 68| v2_4(void) = ExitFunction :
# 69| Block 3
# 69| m3_0(int) = Phi : from 0:m0_4, from 1:m3_6
@ -292,7 +297,8 @@ ssa.cpp:
# 89| v3_14(void) = NoOp :
# 75| v3_15(void) = ReturnVoid :
# 75| v3_16(void) = UnmodeledUse : mu*
# 75| v3_17(void) = ExitFunction :
# 75| v3_17(void) = AliasedUse : ~mu0_2
# 75| v3_18(void) = ExitFunction :
# 91| void MustExactlyOverlap(Point)
# 91| Block 0
@ -308,7 +314,8 @@ ssa.cpp:
# 93| v0_9(void) = NoOp :
# 91| v0_10(void) = ReturnVoid :
# 91| v0_11(void) = UnmodeledUse : mu*
# 91| v0_12(void) = ExitFunction :
# 91| v0_12(void) = AliasedUse : ~mu0_2
# 91| v0_13(void) = ExitFunction :
# 95| void MustExactlyOverlapEscaped(Point)
# 95| Block 0
@ -331,7 +338,8 @@ ssa.cpp:
# 98| v0_16(void) = NoOp :
# 95| v0_17(void) = ReturnVoid :
# 95| v0_18(void) = UnmodeledUse : mu*
# 95| v0_19(void) = ExitFunction :
# 95| v0_19(void) = AliasedUse : ~mu0_2
# 95| v0_20(void) = ExitFunction :
# 100| void MustTotallyOverlap(Point)
# 100| Block 0
@ -353,7 +361,8 @@ ssa.cpp:
# 103| v0_15(void) = NoOp :
# 100| v0_16(void) = ReturnVoid :
# 100| v0_17(void) = UnmodeledUse : mu*
# 100| v0_18(void) = ExitFunction :
# 100| v0_18(void) = AliasedUse : ~mu0_2
# 100| v0_19(void) = ExitFunction :
# 105| void MustTotallyOverlapEscaped(Point)
# 105| Block 0
@ -382,7 +391,8 @@ ssa.cpp:
# 109| v0_22(void) = NoOp :
# 105| v0_23(void) = ReturnVoid :
# 105| v0_24(void) = UnmodeledUse : mu*
# 105| v0_25(void) = ExitFunction :
# 105| v0_25(void) = AliasedUse : ~mu0_2
# 105| v0_26(void) = ExitFunction :
# 111| void MayPartiallyOverlap(int, int)
# 111| Block 0
@ -410,7 +420,8 @@ ssa.cpp:
# 114| v0_21(void) = NoOp :
# 111| v0_22(void) = ReturnVoid :
# 111| v0_23(void) = UnmodeledUse : mu*
# 111| v0_24(void) = ExitFunction :
# 111| v0_24(void) = AliasedUse : ~mu0_2
# 111| v0_25(void) = ExitFunction :
# 116| void MayPartiallyOverlapEscaped(int, int)
# 116| Block 0
@ -445,7 +456,8 @@ ssa.cpp:
# 120| v0_28(void) = NoOp :
# 116| v0_29(void) = ReturnVoid :
# 116| v0_30(void) = UnmodeledUse : mu*
# 116| v0_31(void) = ExitFunction :
# 116| v0_31(void) = AliasedUse : ~mu0_2
# 116| v0_32(void) = ExitFunction :
# 122| void MergeMustExactlyOverlap(bool, int, int)
# 122| Block 0
@ -501,7 +513,8 @@ ssa.cpp:
# 132| v3_9(void) = NoOp :
# 122| v3_10(void) = ReturnVoid :
# 122| v3_11(void) = UnmodeledUse : mu*
# 122| v3_12(void) = ExitFunction :
# 122| v3_12(void) = AliasedUse : ~mu0_2
# 122| v3_13(void) = ExitFunction :
# 134| void MergeMustExactlyWithMustTotallyOverlap(bool, Point, int)
# 134| Block 0
@ -552,7 +565,8 @@ ssa.cpp:
# 143| v3_5(void) = NoOp :
# 134| v3_6(void) = ReturnVoid :
# 134| v3_7(void) = UnmodeledUse : mu*
# 134| v3_8(void) = ExitFunction :
# 134| v3_8(void) = AliasedUse : ~mu0_2
# 134| v3_9(void) = ExitFunction :
# 145| void MergeMustExactlyWithMayPartiallyOverlap(bool, Point, int)
# 145| Block 0
@ -602,7 +616,8 @@ ssa.cpp:
# 154| v3_4(void) = NoOp :
# 145| v3_5(void) = ReturnVoid :
# 145| v3_6(void) = UnmodeledUse : mu*
# 145| v3_7(void) = ExitFunction :
# 145| v3_7(void) = AliasedUse : ~mu0_2
# 145| v3_8(void) = ExitFunction :
# 156| void MergeMustTotallyOverlapWithMayPartiallyOverlap(bool, Rect, int)
# 156| Block 0
@ -654,7 +669,8 @@ ssa.cpp:
# 165| v3_5(void) = NoOp :
# 156| v3_6(void) = ReturnVoid :
# 156| v3_7(void) = UnmodeledUse : mu*
# 156| v3_8(void) = ExitFunction :
# 156| v3_8(void) = AliasedUse : ~mu0_2
# 156| v3_9(void) = ExitFunction :
# 171| void WrapperStruct(Wrapper)
# 171| Block 0
@ -688,7 +704,8 @@ ssa.cpp:
# 177| v0_27(void) = NoOp :
# 171| v0_28(void) = ReturnVoid :
# 171| v0_29(void) = UnmodeledUse : mu*
# 171| v0_30(void) = ExitFunction :
# 171| v0_30(void) = AliasedUse : ~mu0_2
# 171| v0_31(void) = ExitFunction :
# 179| int AsmStmt(int*)
# 179| Block 0
@ -706,7 +723,8 @@ ssa.cpp:
# 179| r0_11(glval<int>) = VariableAddress[#return] :
# 179| v0_12(void) = ReturnValue : &:r0_11, m0_10
# 179| v0_13(void) = UnmodeledUse : mu*
# 179| v0_14(void) = ExitFunction :
# 179| v0_14(void) = AliasedUse : ~mu0_2
# 179| v0_15(void) = ExitFunction :
# 184| void AsmStmtWithOutputs(unsigned int&, unsigned int&, unsigned int&, unsigned int&)
# 184| Block 0
@ -735,7 +753,8 @@ ssa.cpp:
# 192| v0_22(void) = NoOp :
# 184| v0_23(void) = ReturnVoid :
# 184| v0_24(void) = UnmodeledUse : mu*
# 184| v0_25(void) = ExitFunction :
# 184| v0_25(void) = AliasedUse : ~mu0_2
# 184| v0_26(void) = ExitFunction :
# 198| int PureFunctions(char*, char*, int)
# 198| Block 0
@ -784,7 +803,8 @@ ssa.cpp:
# 198| r0_42(glval<int>) = VariableAddress[#return] :
# 198| v0_43(void) = ReturnValue : &:r0_42, m0_41
# 198| v0_44(void) = UnmodeledUse : mu*
# 198| v0_45(void) = ExitFunction :
# 198| v0_45(void) = AliasedUse : ~mu0_2
# 198| v0_46(void) = ExitFunction :
# 207| int ModeledCallTarget(int)
# 207| Block 0
@ -811,4 +831,5 @@ ssa.cpp:
# 207| r0_20(glval<int>) = VariableAddress[#return] :
# 207| v0_21(void) = ReturnValue : &:r0_20, m0_19
# 207| v0_22(void) = UnmodeledUse : mu*
# 207| v0_23(void) = ExitFunction :
# 207| v0_23(void) = AliasedUse : ~mu0_2
# 207| v0_24(void) = ExitFunction :

Просмотреть файл

@ -610,89 +610,10 @@ lostReachability
| range_analysis.c:371:37:371:39 | Constant: 500 |
backEdgeCountMismatch
useNotDominatedByDefinition
| VacuousDestructorCall.cpp:4:3:4:3 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | VacuousDestructorCall.cpp:2:6:2:6 | IR: CallDestructor | void CallDestructor<int>(int, int*) |
| condition_decls.cpp:16:15:16:15 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | condition_decls.cpp:15:6:15:17 | IR: if_decl_bind | void if_decl_bind(int) |
| condition_decls.cpp:16:15:16:16 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:15:6:15:17 | IR: if_decl_bind | void if_decl_bind(int) |
| condition_decls.cpp:16:15:16:16 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | condition_decls.cpp:15:6:15:17 | IR: if_decl_bind | void if_decl_bind(int) |
| condition_decls.cpp:17:5:17:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:15:6:15:17 | IR: if_decl_bind | void if_decl_bind(int) |
| condition_decls.cpp:17:11:17:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:15:6:15:17 | IR: if_decl_bind | void if_decl_bind(int) |
| condition_decls.cpp:20:5:20:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:15:6:15:17 | IR: if_decl_bind | void if_decl_bind(int) |
| condition_decls.cpp:20:11:20:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:15:6:15:17 | IR: if_decl_bind | void if_decl_bind(int) |
| condition_decls.cpp:26:19:26:19 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) |
| condition_decls.cpp:26:19:26:20 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) |
| condition_decls.cpp:26:19:26:20 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) |
| condition_decls.cpp:28:5:28:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) |
| condition_decls.cpp:28:11:28:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) |
| condition_decls.cpp:31:5:31:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) |
| condition_decls.cpp:31:11:31:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) |
| condition_decls.cpp:34:5:34:18 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) |
| condition_decls.cpp:34:9:34:13 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:25:6:25:21 | IR: switch_decl_bind | void switch_decl_bind(int) |
| condition_decls.cpp:41:18:41:18 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | condition_decls.cpp:40:6:40:20 | IR: while_decl_bind | void while_decl_bind(int) |
| condition_decls.cpp:41:18:41:19 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:40:6:40:20 | IR: while_decl_bind | void while_decl_bind(int) |
| condition_decls.cpp:41:18:41:19 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | condition_decls.cpp:40:6:40:20 | IR: while_decl_bind | void while_decl_bind(int) |
| condition_decls.cpp:42:5:42:7 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:40:6:40:20 | IR: while_decl_bind | void while_decl_bind(int) |
| condition_decls.cpp:44:3:44:5 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:40:6:40:20 | IR: while_decl_bind | void while_decl_bind(int) |
| condition_decls.cpp:48:48:48:48 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | condition_decls.cpp:47:6:47:18 | IR: for_decl_bind | void for_decl_bind(int) |
| condition_decls.cpp:48:48:48:49 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:47:6:47:18 | IR: for_decl_bind | void for_decl_bind(int) |
| condition_decls.cpp:48:48:48:49 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | condition_decls.cpp:47:6:47:18 | IR: for_decl_bind | void for_decl_bind(int) |
| condition_decls.cpp:48:56:48:61 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:47:6:47:18 | IR: for_decl_bind | void for_decl_bind(int) |
| condition_decls.cpp:49:5:49:7 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:47:6:47:18 | IR: for_decl_bind | void for_decl_bind(int) |
| condition_decls.cpp:51:3:51:5 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | condition_decls.cpp:47:6:47:18 | IR: for_decl_bind | void for_decl_bind(int) |
| cpp11.cpp:28:21:28:21 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | cpp11.cpp:27:7:27:14 | IR: getFirst | int range_based_for_11::getFirst() |
| file://:0:0:0:0 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | cpp11.cpp:27:7:27:14 | IR: getFirst | int range_based_for_11::getFirst() |
| misc.c:68:16:68:16 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) |
| misc.c:70:13:70:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) |
| misc.c:72:11:72:11 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) |
| misc.c:82:5:82:12 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) |
| misc.c:83:5:83:12 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) |
| misc.c:83:14:83:14 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) |
| misc.c:83:17:83:17 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) |
| misc.c:84:6:84:13 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) |
| misc.c:84:6:84:13 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) |
| misc.c:84:16:84:16 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) |
| misc.c:84:19:84:19 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) |
| misc.c:85:9:85:13 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) |
| misc.c:86:9:86:9 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) |
| misc.c:87:10:87:10 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) |
| misc.c:88:9:88:9 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) |
| misc.c:88:9:88:17 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:16:6:16:10 | IR: misc1 | void misc1(int, int) |
| misc.c:171:15:171:15 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:168:6:168:8 | IR: vla | void vla() |
| misc.c:173:19:173:24 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | misc.c:168:6:168:8 | IR: vla | void vla() |
| misc.c:174:17:174:22 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | misc.c:168:6:168:8 | IR: vla | void vla() |
| misc.c:174:30:174:35 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | misc.c:168:6:168:8 | IR: vla | void vla() |
| misc.c:219:5:219:26 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:219:5:219:26 | IR: assign_designated_init | int assign_designated_init(someStruct*) |
| misc.c:220:4:220:5 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | misc.c:219:5:219:26 | IR: assign_designated_init | int assign_designated_init(someStruct*) |
| ms_try_except.cpp:9:19:9:19 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | ms_try_except.cpp:2:6:2:18 | IR: ms_try_except | void ms_try_except(int) |
| ms_try_except.cpp:19:17:19:17 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | ms_try_except.cpp:2:6:2:18 | IR: ms_try_except | void ms_try_except(int) |
| ms_try_mix.cpp:14:16:14:19 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:10:6:10:18 | IR: ms_except_mix | void ms_except_mix(int) |
| ms_try_mix.cpp:15:13:15:14 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:10:6:10:18 | IR: ms_except_mix | void ms_except_mix(int) |
| ms_try_mix.cpp:16:13:16:19 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:10:6:10:18 | IR: ms_except_mix | void ms_except_mix(int) |
| ms_try_mix.cpp:18:16:18:19 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:10:6:10:18 | IR: ms_except_mix | void ms_except_mix(int) |
| ms_try_mix.cpp:21:16:21:19 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:10:6:10:18 | IR: ms_except_mix | void ms_except_mix(int) |
| ms_try_mix.cpp:24:12:24:15 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:10:6:10:18 | IR: ms_except_mix | void ms_except_mix(int) |
| ms_try_mix.cpp:31:16:31:19 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:27:6:27:19 | IR: ms_finally_mix | void ms_finally_mix(int) |
| ms_try_mix.cpp:32:13:32:14 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:27:6:27:19 | IR: ms_finally_mix | void ms_finally_mix(int) |
| ms_try_mix.cpp:33:13:33:19 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:27:6:27:19 | IR: ms_finally_mix | void ms_finally_mix(int) |
| ms_try_mix.cpp:35:16:35:19 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:27:6:27:19 | IR: ms_finally_mix | void ms_finally_mix(int) |
| ms_try_mix.cpp:38:16:38:19 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:27:6:27:19 | IR: ms_finally_mix | void ms_finally_mix(int) |
| ms_try_mix.cpp:41:12:41:15 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:27:6:27:19 | IR: ms_finally_mix | void ms_finally_mix(int) |
| ms_try_mix.cpp:51:5:51:11 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | ms_try_mix.cpp:47:6:47:28 | IR: ms_empty_finally_at_end | void ms_empty_finally_at_end() |
| pointer_to_member.cpp:36:11:36:30 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | pointer_to_member.cpp:32:6:32:14 | IR: pmIsConst | void pmIsConst() |
| pointer_to_member.cpp:36:13:36:19 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | pointer_to_member.cpp:32:6:32:14 | IR: pmIsConst | void pmIsConst() |
| pointer_to_member.cpp:36:22:36:28 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | pointer_to_member.cpp:32:6:32:14 | IR: pmIsConst | void pmIsConst() |
| stmt_expr.cpp:30:20:30:21 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | stmt_expr.cpp:21:6:21:6 | IR: g | void stmtexpr::g(int) |
| stmt_expr.cpp:31:16:31:18 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | stmt_expr.cpp:21:6:21:6 | IR: g | void stmtexpr::g(int) |
| try_catch.cpp:21:13:21:24 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | try_catch.cpp:19:6:19:23 | IR: throw_from_nonstmt | void throw_from_nonstmt(int) |
| vla.c:3:5:3:8 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | vla.c:3:5:3:8 | IR: main | int main(int, char**) |
| vla.c:5:16:5:19 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | vla.c:3:5:3:8 | IR: main | int main(int, char**) |
| vla.c:5:22:5:25 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | vla.c:3:5:3:8 | IR: main | int main(int, char**) |
| vla.c:5:27:5:30 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | vla.c:3:5:3:8 | IR: main | int main(int, char**) |
| vla.c:5:27:5:33 | Load | Operand 'Load' is not dominated by its definition in function '$@'. | vla.c:3:5:3:8 | IR: main | int main(int, char**) |
| vla.c:12:37:12:42 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | vla.c:11:6:11:16 | IR: vla_typedef | void vla_typedef() |
| vla.c:12:55:12:60 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | vla.c:11:6:11:16 | IR: vla_typedef | void vla_typedef() |
| vla.c:14:40:14:45 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | vla.c:11:6:11:16 | IR: vla_typedef | void vla_typedef() |
| vla.c:14:58:14:63 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | vla.c:11:6:11:16 | IR: vla_typedef | void vla_typedef() |
| vla.c:14:74:14:79 | Operand | Operand 'Operand' is not dominated by its definition in function '$@'. | vla.c:11:6:11:16 | IR: vla_typedef | void vla_typedef() |
missingCanonicalLanguageType
multipleCanonicalLanguageTypes
missingIRType

Просмотреть файл

@ -67,7 +67,8 @@ test.cpp:
# 1| valnum = unique
# 1| v0_33(void) = ReturnValue : &:r0_32
# 1| v0_34(void) = UnmodeledUse : mu*
# 1| v0_35(void) = ExitFunction :
# 1| v0_35(void) = AliasedUse : ~m0_1
# 1| v0_36(void) = ExitFunction :
# 12| int test01(int, int)
# 12| Block 0
@ -149,7 +150,8 @@ test.cpp:
# 12| valnum = unique
# 12| v0_39(void) = ReturnValue : &:r0_38
# 12| v0_40(void) = UnmodeledUse : mu*
# 12| v0_41(void) = ExitFunction :
# 12| v0_41(void) = AliasedUse : ~m0_1
# 12| v0_42(void) = ExitFunction :
# 25| int test02(int, int)
# 25| Block 0
@ -238,7 +240,8 @@ test.cpp:
# 25| valnum = unique
# 25| v0_43(void) = ReturnValue : &:r0_42
# 25| v0_44(void) = UnmodeledUse : mu*
# 25| v0_45(void) = ExitFunction :
# 25| v0_45(void) = AliasedUse : ~m0_26
# 25| v0_46(void) = ExitFunction :
# 39| int test03(int, int, int*)
# 39| Block 0
@ -334,7 +337,8 @@ test.cpp:
# 39| valnum = unique
# 39| v0_46(void) = ReturnValue : &:r0_45
# 39| v0_47(void) = UnmodeledUse : mu*
# 39| v0_48(void) = ExitFunction :
# 39| v0_48(void) = AliasedUse : ~m0_29
# 39| v0_49(void) = ExitFunction :
# 49| unsigned int my_strspn(char const*, char const*)
# 49| Block 0
@ -496,7 +500,8 @@ test.cpp:
# 49| valnum = r9_1
# 49| v9_6(void) = ReturnValue : &:r9_5, m9_4
# 49| v9_7(void) = UnmodeledUse : mu*
# 49| v9_8(void) = ExitFunction :
# 49| v9_8(void) = AliasedUse : ~m0_1
# 49| v9_9(void) = ExitFunction :
# 75| void test04(two_values*)
# 75| Block 0
@ -575,10 +580,13 @@ test.cpp:
#-----| Goto -> Block 2
# 82| Block 2
# 82| v2_0(void) = NoOp :
# 75| v2_1(void) = ReturnVoid :
# 75| v2_2(void) = UnmodeledUse : mu*
# 75| v2_3(void) = ExitFunction :
# 82| m2_0(unknown) = Phi : from 0:~m0_9, from 1:~m1_3
# 82| valnum = unique
# 82| v2_1(void) = NoOp :
# 75| v2_2(void) = ReturnVoid :
# 75| v2_3(void) = UnmodeledUse : mu*
# 75| v2_4(void) = AliasedUse : ~m2_0
# 75| v2_5(void) = ExitFunction :
# 84| void test05(int, int, void*)
# 84| Block 0
@ -651,7 +659,8 @@ test.cpp:
# 89| v3_5(void) = NoOp :
# 84| v3_6(void) = ReturnVoid :
# 84| v3_7(void) = UnmodeledUse : mu*
# 84| v3_8(void) = ExitFunction :
# 84| v3_8(void) = AliasedUse : ~m0_1
# 84| v3_9(void) = ExitFunction :
# 91| int regression_test00()
# 91| Block 0
@ -682,7 +691,8 @@ test.cpp:
# 91| valnum = r0_8
# 91| v0_13(void) = ReturnValue : &:r0_12, m0_11
# 91| v0_14(void) = UnmodeledUse : mu*
# 91| v0_15(void) = ExitFunction :
# 91| v0_15(void) = AliasedUse : ~m0_1
# 91| v0_16(void) = ExitFunction :
# 104| int inheritanceConversions(Derived*)
# 104| Block 0
@ -743,7 +753,8 @@ test.cpp:
# 104| valnum = r0_23
# 104| v0_28(void) = ReturnValue : &:r0_27, m0_26
# 104| v0_29(void) = UnmodeledUse : mu*
# 104| v0_30(void) = ExitFunction :
# 104| v0_30(void) = AliasedUse : ~m0_1
# 104| v0_31(void) = ExitFunction :
# 112| void test06()
# 112| Block 0
@ -763,4 +774,5 @@ test.cpp:
# 117| v0_7(void) = NoOp :
# 112| v0_8(void) = ReturnVoid :
# 112| v0_9(void) = UnmodeledUse : mu*
# 112| v0_10(void) = ExitFunction :
# 112| v0_10(void) = AliasedUse : ~m0_1
# 112| v0_11(void) = ExitFunction :

Просмотреть файл

@ -5,6 +5,7 @@ private newtype TMemoryAccessKind =
TBufferMayMemoryAccess() or
TEscapedMemoryAccess() or
TEscapedMayMemoryAccess() or
TNonLocalMayMemoryAccess() or
TPhiMemoryAccess() or
TUnmodeledMemoryAccess() or
TChiTotalMemoryAccess() or
@ -80,6 +81,14 @@ class EscapedMayMemoryAccess extends MemoryAccessKind, TEscapedMayMemoryAccess {
override string toString() { result = "escaped(may)" }
}
/**
* The operand or result may access all memory whose address has escaped, other than data on the
* stack frame of the current function.
*/
class NonLocalMayMemoryAccess extends MemoryAccessKind, TNonLocalMayMemoryAccess {
override string toString() { result = "nonlocal(may)" }
}
/**
* The operand is a Phi operand, which accesses the same memory as its
* definition.

Просмотреть файл

@ -57,6 +57,7 @@ private newtype TOpcode =
TUnmodeledDefinition() or
TUnmodeledUse() or
TAliasedDefinition() or
TAliasedUse() or
TPhi() or
TBuiltIn() or
TVarArgsStart() or
@ -393,6 +394,10 @@ module Opcode {
final override string toString() { result = "AliasedDefinition" }
}
class AliasedUse extends Opcode, TAliasedUse {
final override string toString() { result = "AliasedUse" }
}
class Phi extends Opcode, TPhi {
final override string toString() { result = "Phi" }
}

Просмотреть файл

@ -50,7 +50,8 @@ module InstructionSanity {
(
opcode instanceof ReadSideEffectOpcode or
opcode instanceof Opcode::InlineAsm or
opcode instanceof Opcode::CallSideEffect
opcode instanceof Opcode::CallSideEffect or
opcode instanceof Opcode::AliasedUse
) and
tag instanceof SideEffectOperandTag
)
@ -263,6 +264,7 @@ module InstructionSanity {
) {
exists(IRBlock useBlock, int useIndex, Instruction defInstr, IRBlock defBlock, int defIndex |
not useOperand.getUse() instanceof UnmodeledUseInstruction and
not defInstr instanceof UnmodeledDefinitionInstruction and
pointOfEvaluation(useOperand, useBlock, useIndex) and
defInstr = useOperand.getAnyDef() and
(
@ -1421,6 +1423,13 @@ class AliasedDefinitionInstruction extends Instruction {
final override MemoryAccessKind getResultMemoryAccess() { result instanceof EscapedMemoryAccess }
}
/**
* An instruction that consumes all escaped memory on exit from the function.
*/
class AliasedUseInstruction extends Instruction {
AliasedUseInstruction() { getOpcode() instanceof Opcode::AliasedUse }
}
class UnmodeledUseInstruction extends Instruction {
UnmodeledUseInstruction() { getOpcode() instanceof Opcode::UnmodeledUse }

Просмотреть файл

@ -396,6 +396,9 @@ class SideEffectOperand extends TypedOperand {
override SideEffectOperandTag tag;
override MemoryAccessKind getMemoryAccess() {
useInstr instanceof AliasedUseInstruction and
result instanceof NonLocalMayMemoryAccess
or
useInstr instanceof CallSideEffectInstruction and
result instanceof EscapedMayMemoryAccess
or

Просмотреть файл

@ -32,6 +32,7 @@ newtype TInstructionTag =
UnmodeledDefinitionTag() or
UnmodeledUseTag() or
AliasedDefinitionTag() or
AliasedUseTag() or
SwitchBranchTag() or
CallTargetTag() or
CallTag() or
@ -131,6 +132,8 @@ string getInstructionTagId(TInstructionTag tag) {
or
tag = AliasedDefinitionTag() and result = "AliasedDef"
or
tag = AliasedUseTag() and result = "AliasedUse"
or
tag = SwitchBranchTag() and result = "SwitchBranch"
or
tag = CallTargetTag() and result = "CallTarget"

Просмотреть файл

@ -99,6 +99,9 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction {
result = this.getInstruction(UnmodeledUseTag())
or
tag = UnmodeledUseTag() and
result = getInstruction(AliasedUseTag())
or
tag = AliasedUseTag() and
result = this.getInstruction(ExitFunctionTag())
)
}
@ -172,6 +175,10 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction {
opcode instanceof Opcode::UnmodeledUse and
resultType = getVoidType()
or
tag = AliasedUseTag() and
opcode instanceof Opcode::AliasedUse and
resultType = getVoidType()
or
tag = ExitFunctionTag() and
opcode instanceof Opcode::ExitFunction and
resultType = getVoidType()
@ -192,6 +199,10 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction {
operandTag instanceof UnmodeledUseOperandTag and
result = getUnmodeledDefinitionInstruction()
or
tag = AliasedUseTag() and
operandTag instanceof SideEffectOperandTag and
result = getUnmodeledDefinitionInstruction()
or
tag = ReturnTag() and
not this.getReturnType() instanceof VoidType and
(
@ -208,6 +219,10 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction {
not this.getReturnType() instanceof VoidType and
operandTag instanceof LoadOperandTag and
result = getTypeForPRValue(this.getReturnType())
or
tag = AliasedUseTag() and
operandTag instanceof SideEffectOperandTag and
result = getUnknownType()
}
final override IRVariable getInstructionVariable(InstructionTag tag) {

Просмотреть файл

@ -50,7 +50,8 @@ module InstructionSanity {
(
opcode instanceof ReadSideEffectOpcode or
opcode instanceof Opcode::InlineAsm or
opcode instanceof Opcode::CallSideEffect
opcode instanceof Opcode::CallSideEffect or
opcode instanceof Opcode::AliasedUse
) and
tag instanceof SideEffectOperandTag
)
@ -263,6 +264,7 @@ module InstructionSanity {
) {
exists(IRBlock useBlock, int useIndex, Instruction defInstr, IRBlock defBlock, int defIndex |
not useOperand.getUse() instanceof UnmodeledUseInstruction and
not defInstr instanceof UnmodeledDefinitionInstruction and
pointOfEvaluation(useOperand, useBlock, useIndex) and
defInstr = useOperand.getAnyDef() and
(
@ -1421,6 +1423,13 @@ class AliasedDefinitionInstruction extends Instruction {
final override MemoryAccessKind getResultMemoryAccess() { result instanceof EscapedMemoryAccess }
}
/**
* An instruction that consumes all escaped memory on exit from the function.
*/
class AliasedUseInstruction extends Instruction {
AliasedUseInstruction() { getOpcode() instanceof Opcode::AliasedUse }
}
class UnmodeledUseInstruction extends Instruction {
UnmodeledUseInstruction() { getOpcode() instanceof Opcode::UnmodeledUse }

Просмотреть файл

@ -396,6 +396,9 @@ class SideEffectOperand extends TypedOperand {
override SideEffectOperandTag tag;
override MemoryAccessKind getMemoryAccess() {
useInstr instanceof AliasedUseInstruction and
result instanceof NonLocalMayMemoryAccess
or
useInstr instanceof CallSideEffectInstruction and
result instanceof EscapedMayMemoryAccess
or

Просмотреть файл

@ -53,7 +53,8 @@ array.cs:
# 10| mu0_49(Int32) = Store : &:r0_48, r0_43
# 2| v0_50(Void) = ReturnVoid :
# 2| v0_51(Void) = UnmodeledUse : mu*
# 2| v0_52(Void) = ExitFunction :
# 2| v0_52(Void) = AliasedUse : ~mu0_2
# 2| v0_53(Void) = ExitFunction :
# 13| System.Void ArrayTest.twod_and_init_acc()
# 13| Block 0
@ -144,7 +145,8 @@ array.cs:
# 20| mu0_84(Int32) = Store : &:r0_83, r0_76
# 13| v0_85(Void) = ReturnVoid :
# 13| v0_86(Void) = UnmodeledUse : mu*
# 13| v0_87(Void) = ExitFunction :
# 13| v0_87(Void) = AliasedUse : ~mu0_2
# 13| v0_88(Void) = ExitFunction :
assignop.cs:
# 4| System.Void AssignOp.Main()
@ -215,7 +217,8 @@ assignop.cs:
# 17| mu0_63(Int32) = Store : &:r0_60, r0_62
# 4| v0_64(Void) = ReturnVoid :
# 4| v0_65(Void) = UnmodeledUse : mu*
# 4| v0_66(Void) = ExitFunction :
# 4| v0_66(Void) = AliasedUse : ~mu0_2
# 4| v0_67(Void) = ExitFunction :
casts.cs:
# 11| System.Void Casts.Main()
@ -241,7 +244,8 @@ casts.cs:
# 15| mu0_18(Casts_B) = Store : &:r0_14, r0_17
# 11| v0_19(Void) = ReturnVoid :
# 11| v0_20(Void) = UnmodeledUse : mu*
# 11| v0_21(Void) = ExitFunction :
# 11| v0_21(Void) = AliasedUse : ~mu0_2
# 11| v0_22(Void) = ExitFunction :
collections.cs:
# 11| System.Void Collections.Main()
@ -285,7 +289,8 @@ collections.cs:
# 13| mu0_36(Dictionary<Int32,MyClass>) = Store : &:r0_3, r0_4
# 11| v0_37(Void) = ReturnVoid :
# 11| v0_38(Void) = UnmodeledUse : mu*
# 11| v0_39(Void) = ExitFunction :
# 11| v0_39(Void) = AliasedUse : ~mu0_2
# 11| v0_40(Void) = ExitFunction :
constructor_init.cs:
# 5| System.Void BaseClass..ctor()
@ -297,7 +302,8 @@ constructor_init.cs:
# 6| v0_4(Void) = NoOp :
# 5| v0_5(Void) = ReturnVoid :
# 5| v0_6(Void) = UnmodeledUse : mu*
# 5| v0_7(Void) = ExitFunction :
# 5| v0_7(Void) = AliasedUse : ~mu0_2
# 5| v0_8(Void) = ExitFunction :
# 9| System.Void BaseClass..ctor(System.Int32)
# 9| Block 0
@ -314,7 +320,8 @@ constructor_init.cs:
# 11| mu0_10(Int32) = Store : &:r0_9, r0_7
# 9| v0_11(Void) = ReturnVoid :
# 9| v0_12(Void) = UnmodeledUse : mu*
# 9| v0_13(Void) = ExitFunction :
# 9| v0_13(Void) = AliasedUse : ~mu0_2
# 9| v0_14(Void) = ExitFunction :
# 17| System.Void DerivedClass..ctor()
# 17| Block 0
@ -329,7 +336,8 @@ constructor_init.cs:
# 18| v0_8(Void) = NoOp :
# 17| v0_9(Void) = ReturnVoid :
# 17| v0_10(Void) = UnmodeledUse : mu*
# 17| v0_11(Void) = ExitFunction :
# 17| v0_11(Void) = AliasedUse : ~mu0_2
# 17| v0_12(Void) = ExitFunction :
# 21| System.Void DerivedClass..ctor(System.Int32)
# 21| Block 0
@ -348,7 +356,8 @@ constructor_init.cs:
# 22| v0_12(Void) = NoOp :
# 21| v0_13(Void) = ReturnVoid :
# 21| v0_14(Void) = UnmodeledUse : mu*
# 21| v0_15(Void) = ExitFunction :
# 21| v0_15(Void) = AliasedUse : ~mu0_2
# 21| v0_16(Void) = ExitFunction :
# 25| System.Void DerivedClass..ctor(System.Int32,System.Int32)
# 25| Block 0
@ -368,7 +377,8 @@ constructor_init.cs:
# 26| v0_13(Void) = NoOp :
# 25| v0_14(Void) = ReturnVoid :
# 25| v0_15(Void) = UnmodeledUse : mu*
# 25| v0_16(Void) = ExitFunction :
# 25| v0_16(Void) = AliasedUse : ~mu0_2
# 25| v0_17(Void) = ExitFunction :
# 29| System.Void DerivedClass.Main()
# 29| Block 0
@ -398,7 +408,8 @@ constructor_init.cs:
# 33| mu0_23(DerivedClass) = Store : &:r0_16, r0_17
# 29| v0_24(Void) = ReturnVoid :
# 29| v0_25(Void) = UnmodeledUse : mu*
# 29| v0_26(Void) = ExitFunction :
# 29| v0_26(Void) = AliasedUse : ~mu0_2
# 29| v0_27(Void) = ExitFunction :
crement.cs:
# 3| System.Void CrementOpsTest.Main()
@ -439,7 +450,8 @@ crement.cs:
# 9| mu0_33(Int32) = Store : &:r0_32, r0_28
# 3| v0_34(Void) = ReturnVoid :
# 3| v0_35(Void) = UnmodeledUse : mu*
# 3| v0_36(Void) = ExitFunction :
# 3| v0_36(Void) = AliasedUse : ~mu0_2
# 3| v0_37(Void) = ExitFunction :
delegates.cs:
# 6| System.Int32 Delegates.returns(System.Int32)
@ -456,7 +468,8 @@ delegates.cs:
# 6| r0_9(glval<Int32>) = VariableAddress[#return] :
# 6| v0_10(Void) = ReturnValue : &:r0_9, ~mu0_2
# 6| v0_11(Void) = UnmodeledUse : mu*
# 6| v0_12(Void) = ExitFunction :
# 6| v0_12(Void) = AliasedUse : ~mu0_2
# 6| v0_13(Void) = ExitFunction :
# 11| System.Void Delegates.Main()
# 11| Block 0
@ -478,7 +491,8 @@ delegates.cs:
# 13| mu0_15(<unknown>) = ^CallSideEffect : ~mu0_2
# 11| v0_16(Void) = ReturnVoid :
# 11| v0_17(Void) = UnmodeledUse : mu*
# 11| v0_18(Void) = ExitFunction :
# 11| v0_18(Void) = AliasedUse : ~mu0_2
# 11| v0_19(Void) = ExitFunction :
events.cs:
# 8| System.Void Events..ctor()
@ -497,7 +511,8 @@ events.cs:
# 10| mu0_11(MyDel) = Store : &:r0_10, r0_4
# 8| v0_12(Void) = ReturnVoid :
# 8| v0_13(Void) = UnmodeledUse : mu*
# 8| v0_14(Void) = ExitFunction :
# 8| v0_14(Void) = AliasedUse : ~mu0_2
# 8| v0_15(Void) = ExitFunction :
# 13| System.Void Events.AddEvent()
# 13| Block 0
@ -514,7 +529,8 @@ events.cs:
# 15| mu0_10(<unknown>) = ^CallSideEffect : ~mu0_2
# 13| v0_11(Void) = ReturnVoid :
# 13| v0_12(Void) = UnmodeledUse : mu*
# 13| v0_13(Void) = ExitFunction :
# 13| v0_13(Void) = AliasedUse : ~mu0_2
# 13| v0_14(Void) = ExitFunction :
# 18| System.Void Events.RemoveEvent()
# 18| Block 0
@ -531,7 +547,8 @@ events.cs:
# 20| mu0_10(<unknown>) = ^CallSideEffect : ~mu0_2
# 18| v0_11(Void) = ReturnVoid :
# 18| v0_12(Void) = UnmodeledUse : mu*
# 18| v0_13(Void) = ExitFunction :
# 18| v0_13(Void) = AliasedUse : ~mu0_2
# 18| v0_14(Void) = ExitFunction :
# 23| System.String Events.Fun(System.String)
# 23| Block 0
@ -548,7 +565,8 @@ events.cs:
# 23| r0_10(glval<String>) = VariableAddress[#return] :
# 23| v0_11(Void) = ReturnValue : &:r0_10, ~mu0_2
# 23| v0_12(Void) = UnmodeledUse : mu*
# 23| v0_13(Void) = ExitFunction :
# 23| v0_13(Void) = AliasedUse : ~mu0_2
# 23| v0_14(Void) = ExitFunction :
# 28| System.Void Events.Main(System.String[])
# 28| Block 0
@ -583,7 +601,8 @@ events.cs:
# 33| mu0_28(<unknown>) = ^CallSideEffect : ~mu0_2
# 28| v0_29(Void) = ReturnVoid :
# 28| v0_30(Void) = UnmodeledUse : mu*
# 28| v0_31(Void) = ExitFunction :
# 28| v0_31(Void) = AliasedUse : ~mu0_2
# 28| v0_32(Void) = ExitFunction :
foreach.cs:
# 4| System.Void ForEach.Main()
@ -662,7 +681,8 @@ foreach.cs:
# 7| mu3_4(<unknown>) = ^CallSideEffect : ~mu0_2
# 4| v3_5(Void) = ReturnVoid :
# 4| v3_6(Void) = UnmodeledUse : mu*
# 4| v3_7(Void) = ExitFunction :
# 4| v3_7(Void) = AliasedUse : ~mu0_2
# 4| v3_8(Void) = ExitFunction :
func_with_param_call.cs:
# 5| System.Int32 test_call_with_param.f(System.Int32,System.Int32)
@ -684,7 +704,8 @@ func_with_param_call.cs:
# 5| r0_14(glval<Int32>) = VariableAddress[#return] :
# 5| v0_15(Void) = ReturnValue : &:r0_14, ~mu0_2
# 5| v0_16(Void) = UnmodeledUse : mu*
# 5| v0_17(Void) = ExitFunction :
# 5| v0_17(Void) = AliasedUse : ~mu0_2
# 5| v0_18(Void) = ExitFunction :
# 10| System.Int32 test_call_with_param.g()
# 10| Block 0
@ -701,7 +722,8 @@ func_with_param_call.cs:
# 10| r0_10(glval<Int32>) = VariableAddress[#return] :
# 10| v0_11(Void) = ReturnValue : &:r0_10, ~mu0_2
# 10| v0_12(Void) = UnmodeledUse : mu*
# 10| v0_13(Void) = ExitFunction :
# 10| v0_13(Void) = AliasedUse : ~mu0_2
# 10| v0_14(Void) = ExitFunction :
indexers.cs:
# 8| System.String Indexers.MyClass.get_Item(System.Int32)
@ -724,7 +746,8 @@ indexers.cs:
# 8| r0_15(glval<String>) = VariableAddress[#return] :
# 8| v0_16(Void) = ReturnValue : &:r0_15, ~mu0_2
# 8| v0_17(Void) = UnmodeledUse : mu*
# 8| v0_18(Void) = ExitFunction :
# 8| v0_18(Void) = AliasedUse : ~mu0_2
# 8| v0_19(Void) = ExitFunction :
# 12| System.Void Indexers.MyClass.set_Item(System.Int32,System.String)
# 12| Block 0
@ -747,7 +770,8 @@ indexers.cs:
# 14| mu0_16(String) = Store : &:r0_15, r0_9
# 12| v0_17(Void) = ReturnVoid :
# 12| v0_18(Void) = UnmodeledUse : mu*
# 12| v0_19(Void) = ExitFunction :
# 12| v0_19(Void) = AliasedUse : ~mu0_2
# 12| v0_20(Void) = ExitFunction :
# 19| System.Void Indexers.Main()
# 19| Block 0
@ -788,7 +812,8 @@ indexers.cs:
# 24| mu0_34(<unknown>) = ^CallSideEffect : ~mu0_2
# 19| v0_35(Void) = ReturnVoid :
# 19| v0_36(Void) = UnmodeledUse : mu*
# 19| v0_37(Void) = ExitFunction :
# 19| v0_37(Void) = AliasedUse : ~mu0_2
# 19| v0_38(Void) = ExitFunction :
inheritance_polymorphism.cs:
# 3| System.Int32 A.function()
@ -803,7 +828,8 @@ inheritance_polymorphism.cs:
# 3| r0_7(glval<Int32>) = VariableAddress[#return] :
# 3| v0_8(Void) = ReturnValue : &:r0_7, ~mu0_2
# 3| v0_9(Void) = UnmodeledUse : mu*
# 3| v0_10(Void) = ExitFunction :
# 3| v0_10(Void) = AliasedUse : ~mu0_2
# 3| v0_11(Void) = ExitFunction :
# 15| System.Int32 C.function()
# 15| Block 0
@ -817,7 +843,8 @@ inheritance_polymorphism.cs:
# 15| r0_7(glval<Int32>) = VariableAddress[#return] :
# 15| v0_8(Void) = ReturnValue : &:r0_7, ~mu0_2
# 15| v0_9(Void) = UnmodeledUse : mu*
# 15| v0_10(Void) = ExitFunction :
# 15| v0_10(Void) = AliasedUse : ~mu0_2
# 15| v0_11(Void) = ExitFunction :
# 23| System.Void Program.Main()
# 23| Block 0
@ -861,7 +888,8 @@ inheritance_polymorphism.cs:
# 34| mu0_37(<unknown>) = ^CallSideEffect : ~mu0_2
# 23| v0_38(Void) = ReturnVoid :
# 23| v0_39(Void) = UnmodeledUse : mu*
# 23| v0_40(Void) = ExitFunction :
# 23| v0_40(Void) = AliasedUse : ~mu0_2
# 23| v0_41(Void) = ExitFunction :
inoutref.cs:
# 11| System.Void InOutRef.set(MyClass,MyClass)
@ -880,7 +908,8 @@ inoutref.cs:
# 13| mu0_11(MyClass) = Store : &:r0_10, r0_8
# 11| v0_12(Void) = ReturnVoid :
# 11| v0_13(Void) = UnmodeledUse : mu*
# 11| v0_14(Void) = ExitFunction :
# 11| v0_14(Void) = AliasedUse : ~mu0_2
# 11| v0_15(Void) = ExitFunction :
# 16| System.Void InOutRef.F(System.Int32,MyStruct,MyStruct,MyClass,MyClass)
# 16| Block 0
@ -939,7 +968,8 @@ inoutref.cs:
# 26| mu0_52(<unknown>) = ^CallSideEffect : ~mu0_2
# 16| v0_53(Void) = ReturnVoid :
# 16| v0_54(Void) = UnmodeledUse : mu*
# 16| v0_55(Void) = ExitFunction :
# 16| v0_55(Void) = AliasedUse : ~mu0_2
# 16| v0_56(Void) = ExitFunction :
# 29| System.Void InOutRef.Main()
# 29| Block 0
@ -977,7 +1007,8 @@ inoutref.cs:
# 36| mu0_31(Int32) = Store : &:r0_27, r0_30
# 29| v0_32(Void) = ReturnVoid :
# 29| v0_33(Void) = UnmodeledUse : mu*
# 29| v0_34(Void) = ExitFunction :
# 29| v0_34(Void) = AliasedUse : ~mu0_2
# 29| v0_35(Void) = ExitFunction :
isexpr.cs:
# 8| System.Void IsExpr.Main()
@ -1008,7 +1039,8 @@ isexpr.cs:
# 8| Block 1
# 8| v1_0(Void) = ReturnVoid :
# 8| v1_1(Void) = UnmodeledUse : mu*
# 8| v1_2(Void) = ExitFunction :
# 8| v1_2(Void) = AliasedUse : ~mu0_2
# 8| v1_3(Void) = ExitFunction :
# 13| Block 2
# 13| v2_0(Void) = ConditionalBranch : r0_18
@ -1214,7 +1246,8 @@ jumps.cs:
# 38| mu22_4(<unknown>) = ^CallSideEffect : ~mu0_2
# 5| v22_5(Void) = ReturnVoid :
# 5| v22_6(Void) = UnmodeledUse : mu*
# 5| v22_7(Void) = ExitFunction :
# 5| v22_7(Void) = AliasedUse : ~mu0_2
# 5| v22_8(Void) = ExitFunction :
lock.cs:
# 5| System.Void LockTest.A()
@ -1258,7 +1291,8 @@ lock.cs:
# 5| Block 1
# 5| v1_0(Void) = ReturnVoid :
# 5| v1_1(Void) = UnmodeledUse : mu*
# 5| v1_2(Void) = ExitFunction :
# 5| v1_2(Void) = AliasedUse : ~mu0_2
# 5| v1_3(Void) = ExitFunction :
# 8| Block 2
# 8| r2_0(<funcaddr>) = FunctionAddress[Exit] :
@ -1278,7 +1312,8 @@ obj_creation.cs:
# 8| v0_4(Void) = NoOp :
# 7| v0_5(Void) = ReturnVoid :
# 7| v0_6(Void) = UnmodeledUse : mu*
# 7| v0_7(Void) = ExitFunction :
# 7| v0_7(Void) = AliasedUse : ~mu0_2
# 7| v0_8(Void) = ExitFunction :
# 11| System.Void ObjCreation.MyClass..ctor(System.Int32)
# 11| Block 0
@ -1295,7 +1330,8 @@ obj_creation.cs:
# 13| mu0_10(Int32) = Store : &:r0_9, r0_7
# 11| v0_11(Void) = ReturnVoid :
# 11| v0_12(Void) = UnmodeledUse : mu*
# 11| v0_13(Void) = ExitFunction :
# 11| v0_13(Void) = AliasedUse : ~mu0_2
# 11| v0_14(Void) = ExitFunction :
# 17| System.Void ObjCreation.SomeFun(ObjCreation.MyClass)
# 17| Block 0
@ -1307,7 +1343,8 @@ obj_creation.cs:
# 18| v0_5(Void) = NoOp :
# 17| v0_6(Void) = ReturnVoid :
# 17| v0_7(Void) = UnmodeledUse : mu*
# 17| v0_8(Void) = ExitFunction :
# 17| v0_8(Void) = AliasedUse : ~mu0_2
# 17| v0_9(Void) = ExitFunction :
# 21| System.Void ObjCreation.Main()
# 21| Block 0
@ -1346,7 +1383,8 @@ obj_creation.cs:
# 27| mu0_32(<unknown>) = ^CallSideEffect : ~mu0_2
# 21| v0_33(Void) = ReturnVoid :
# 21| v0_34(Void) = UnmodeledUse : mu*
# 21| v0_35(Void) = ExitFunction :
# 21| v0_35(Void) = AliasedUse : ~mu0_2
# 21| v0_36(Void) = ExitFunction :
pointers.cs:
# 3| System.Void Pointers.addone(System.Int32[])
@ -1380,7 +1418,8 @@ pointers.cs:
# 3| Block 1
# 3| v1_0(Void) = ReturnVoid :
# 3| v1_1(Void) = UnmodeledUse : mu*
# 3| v1_2(Void) = ExitFunction :
# 3| v1_2(Void) = AliasedUse : ~mu0_2
# 3| v1_3(Void) = ExitFunction :
# 9| Block 2
# 9| r2_0(glval<Int32>) = VariableAddress[i] :
@ -1475,7 +1514,8 @@ pointers.cs:
# 40| mu0_61(<unknown>) = ^CallSideEffect : ~mu0_2
# 25| v0_62(Void) = ReturnVoid :
# 25| v0_63(Void) = UnmodeledUse : mu*
# 25| v0_64(Void) = ExitFunction :
# 25| v0_64(Void) = AliasedUse : ~mu0_2
# 25| v0_65(Void) = ExitFunction :
prop.cs:
# 7| System.Int32 PropClass.get_Prop()
@ -1493,7 +1533,8 @@ prop.cs:
# 7| r0_10(glval<Int32>) = VariableAddress[#return] :
# 7| v0_11(Void) = ReturnValue : &:r0_10, ~mu0_2
# 7| v0_12(Void) = UnmodeledUse : mu*
# 7| v0_13(Void) = ExitFunction :
# 7| v0_13(Void) = AliasedUse : ~mu0_2
# 7| v0_14(Void) = ExitFunction :
# 12| System.Void PropClass.set_Prop(System.Int32)
# 12| Block 0
@ -1509,7 +1550,8 @@ prop.cs:
# 14| mu0_9(Int32) = Store : &:r0_8, r0_7
# 12| v0_10(Void) = ReturnVoid :
# 12| v0_11(Void) = UnmodeledUse : mu*
# 12| v0_12(Void) = ExitFunction :
# 12| v0_12(Void) = AliasedUse : ~mu0_2
# 12| v0_13(Void) = ExitFunction :
# 18| System.Int32 PropClass.func()
# 18| Block 0
@ -1523,7 +1565,8 @@ prop.cs:
# 18| r0_7(glval<Int32>) = VariableAddress[#return] :
# 18| v0_8(Void) = ReturnValue : &:r0_7, ~mu0_2
# 18| v0_9(Void) = UnmodeledUse : mu*
# 18| v0_10(Void) = ExitFunction :
# 18| v0_10(Void) = AliasedUse : ~mu0_2
# 18| v0_11(Void) = ExitFunction :
# 26| System.Void Prog.Main()
# 26| Block 0
@ -1551,7 +1594,8 @@ prop.cs:
# 30| mu0_21(Int32) = Store : &:r0_15, r0_19
# 26| v0_22(Void) = ReturnVoid :
# 26| v0_23(Void) = UnmodeledUse : mu*
# 26| v0_24(Void) = ExitFunction :
# 26| v0_24(Void) = AliasedUse : ~mu0_2
# 26| v0_25(Void) = ExitFunction :
simple_call.cs:
# 5| System.Int32 test_simple_call.f()
@ -1565,7 +1609,8 @@ simple_call.cs:
# 5| r0_6(glval<Int32>) = VariableAddress[#return] :
# 5| v0_7(Void) = ReturnValue : &:r0_6, ~mu0_2
# 5| v0_8(Void) = UnmodeledUse : mu*
# 5| v0_9(Void) = ExitFunction :
# 5| v0_9(Void) = AliasedUse : ~mu0_2
# 5| v0_10(Void) = ExitFunction :
# 10| System.Int32 test_simple_call.g()
# 10| Block 0
@ -1581,7 +1626,8 @@ simple_call.cs:
# 10| r0_9(glval<Int32>) = VariableAddress[#return] :
# 10| v0_10(Void) = ReturnValue : &:r0_9, ~mu0_2
# 10| v0_11(Void) = UnmodeledUse : mu*
# 10| v0_12(Void) = ExitFunction :
# 10| v0_12(Void) = AliasedUse : ~mu0_2
# 10| v0_13(Void) = ExitFunction :
simple_function.cs:
# 5| System.Int32 test_simple_function.f()
@ -1595,7 +1641,8 @@ simple_function.cs:
# 5| r0_6(glval<Int32>) = VariableAddress[#return] :
# 5| v0_7(Void) = ReturnValue : &:r0_6, ~mu0_2
# 5| v0_8(Void) = UnmodeledUse : mu*
# 5| v0_9(Void) = ExitFunction :
# 5| v0_9(Void) = AliasedUse : ~mu0_2
# 5| v0_10(Void) = ExitFunction :
stmts.cs:
# 5| System.Int32 test_stmts.ifStmt(System.Int32)
@ -1617,7 +1664,8 @@ stmts.cs:
# 5| r1_0(glval<Int32>) = VariableAddress[#return] :
# 5| v1_1(Void) = ReturnValue : &:r1_0, ~mu0_2
# 5| v1_2(Void) = UnmodeledUse : mu*
# 5| v1_3(Void) = ExitFunction :
# 5| v1_3(Void) = AliasedUse : ~mu0_2
# 5| v1_4(Void) = ExitFunction :
# 10| Block 2
# 10| r2_0(glval<Int32>) = VariableAddress[#return] :
@ -1646,7 +1694,8 @@ stmts.cs:
# 13| Block 1
# 13| v1_0(Void) = ReturnVoid :
# 13| v1_1(Void) = UnmodeledUse : mu*
# 13| v1_2(Void) = ExitFunction :
# 13| v1_2(Void) = AliasedUse : ~mu0_2
# 13| v1_3(Void) = ExitFunction :
# 16| Block 2
# 16| r2_0(glval<Int32>) = VariableAddress[i] :
@ -1693,7 +1742,8 @@ stmts.cs:
# 22| r1_0(glval<Int32>) = VariableAddress[#return] :
# 22| v1_1(Void) = ReturnValue : &:r1_0, ~mu0_2
# 22| v1_2(Void) = UnmodeledUse : mu*
# 22| v1_3(Void) = ExitFunction :
# 22| v1_3(Void) = AliasedUse : ~mu0_2
# 22| v1_4(Void) = ExitFunction :
# 29| Block 2
# 29| v2_0(Void) = NoOp :
@ -1750,7 +1800,8 @@ stmts.cs:
# 46| Block 1
# 46| v1_0(Void) = UnmodeledUse : mu*
# 46| v1_1(Void) = ExitFunction :
# 46| v1_1(Void) = AliasedUse : ~mu0_2
# 46| v1_2(Void) = ExitFunction :
# 46| Block 2
# 46| v2_0(Void) = Unwind :
@ -1816,7 +1867,8 @@ stmts.cs:
# 69| Block 1
# 69| v1_0(Void) = ReturnVoid :
# 69| v1_1(Void) = UnmodeledUse : mu*
# 69| v1_2(Void) = ExitFunction :
# 69| v1_2(Void) = AliasedUse : ~mu0_2
# 69| v1_3(Void) = ExitFunction :
# 72| Block 2
# 72| r2_0(glval<Int32>) = VariableAddress[i] :
@ -1893,7 +1945,8 @@ stmts.cs:
# 89| Block 1
# 89| v1_0(Void) = ReturnVoid :
# 89| v1_1(Void) = UnmodeledUse : mu*
# 89| v1_2(Void) = ExitFunction :
# 89| v1_2(Void) = AliasedUse : ~mu0_2
# 89| v1_3(Void) = ExitFunction :
# 94| Block 2
# 94| r2_0(glval<Int32>) = VariableAddress[x] :
@ -1933,7 +1986,8 @@ stmts.cs:
# 108| mu0_18(Int32) = Store : &:r0_17, r0_16
# 99| v0_19(Void) = ReturnVoid :
# 99| v0_20(Void) = UnmodeledUse : mu*
# 99| v0_21(Void) = ExitFunction :
# 99| v0_21(Void) = AliasedUse : ~mu0_2
# 99| v0_22(Void) = ExitFunction :
using.cs:
# 7| System.Void UsingStmt.MyDisposable..ctor()
@ -1945,7 +1999,8 @@ using.cs:
# 7| v0_4(Void) = NoOp :
# 7| v0_5(Void) = ReturnVoid :
# 7| v0_6(Void) = UnmodeledUse : mu*
# 7| v0_7(Void) = ExitFunction :
# 7| v0_7(Void) = AliasedUse : ~mu0_2
# 7| v0_8(Void) = ExitFunction :
# 8| System.Void UsingStmt.MyDisposable.DoSomething()
# 8| Block 0
@ -1956,7 +2011,8 @@ using.cs:
# 8| v0_4(Void) = NoOp :
# 8| v0_5(Void) = ReturnVoid :
# 8| v0_6(Void) = UnmodeledUse : mu*
# 8| v0_7(Void) = ExitFunction :
# 8| v0_7(Void) = AliasedUse : ~mu0_2
# 8| v0_8(Void) = ExitFunction :
# 9| System.Void UsingStmt.MyDisposable.Dispose()
# 9| Block 0
@ -1967,7 +2023,8 @@ using.cs:
# 9| v0_4(Void) = NoOp :
# 9| v0_5(Void) = ReturnVoid :
# 9| v0_6(Void) = UnmodeledUse : mu*
# 9| v0_7(Void) = ExitFunction :
# 9| v0_7(Void) = AliasedUse : ~mu0_2
# 9| v0_8(Void) = ExitFunction :
# 12| System.Void UsingStmt.Main()
# 12| Block 0
@ -2009,7 +2066,8 @@ using.cs:
# 26| mu0_35(<unknown>) = ^CallSideEffect : ~mu0_2
# 12| v0_36(Void) = ReturnVoid :
# 12| v0_37(Void) = UnmodeledUse : mu*
# 12| v0_38(Void) = ExitFunction :
# 12| v0_38(Void) = AliasedUse : ~mu0_2
# 12| v0_39(Void) = ExitFunction :
variables.cs:
# 5| System.Void test_variables.f()
@ -2035,4 +2093,5 @@ variables.cs:
# 10| mu0_18(Int32) = Store : &:r0_15, r0_17
# 5| v0_19(Void) = ReturnVoid :
# 5| v0_20(Void) = UnmodeledUse : mu*
# 5| v0_21(Void) = ExitFunction :
# 5| v0_21(Void) = AliasedUse : ~mu0_2
# 5| v0_22(Void) = ExitFunction :