From e60f902c3617092b02a12f3d4183676a8bb57010 Mon Sep 17 00:00:00 2001 From: Dave Bartolomeo Date: Tue, 14 Jan 2020 17:57:15 -0700 Subject: [PATCH] C++/C#: Fix missing virtual variables The aliased SSA code was assuming that, for every automatic variable, there would be at least one memory access that reads or writes the entire variable. We've encountered a couple cases where that isn't true due to extractor issues. As a workaround, we now always create the `VariableMemoryLocation` for every local variable. I've also added a sanity test to detect this condition in the future. Along the way, I had to fix a perf issue in the PrintIR code. When determining the ID of a result based on line number, we were considering all `Instruction`s generated for a particular line, regardless of whether they were all in the same `IRFunction`. In addition, the predicate had what appeared to be a bad join order that made it take forever on large snapshots. I've scoped it down to just consider `Instruction`s in the same function, and outlined that predicate to fix the join order issue. This causes some numbering changes, but they're for the better. I don't think there was actually any nondeterminism there before, but now the numbering won't depend on the number of instantiations of a template, either. --- .../aliased_ssa/Instruction.qll | 17 +- .../aliased_ssa/internal/AliasedSSA.qll | 22 +- .../aliased_ssa/internal/SSAConstruction.qll | 9 + .../cpp/ir/implementation/raw/Instruction.qll | 17 +- .../unaliased_ssa/Instruction.qll | 17 +- .../internal/SSAConstruction.qll | 9 + .../unaliased_ssa/internal/SimpleSSA.qll | 4 + .../code/cpp/ir/internal/IRCppLanguage.qll | 2 + .../ir/ir/aliased_ssa_ssa_sanity.expected | 2 + .../test/library-tests/ir/ir/raw_ir.expected | 1246 ++++++++--------- .../ir/ir/unaliased_ssa_ssa_sanity.expected | 2 + .../ir/ssa/aliased_ssa_ssa_sanity.expected | 2 + .../ir/ssa/unaliased_ssa_ssa_sanity.expected | 2 + .../ir/implementation/raw/Instruction.qll | 17 +- .../unaliased_ssa/Instruction.qll | 17 +- .../internal/SSAConstruction.qll | 9 + .../unaliased_ssa/internal/SimpleSSA.qll | 4 + .../csharp/ir/internal/IRCSharpLanguage.qll | 2 + .../test/library-tests/ir/ir/raw_ir.expected | 4 +- .../ir/ir/unaliased_ssa_ssa_sanity.expected | 2 + 20 files changed, 770 insertions(+), 636 deletions(-) diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll index a4a9718ab95..a370888c895 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Instruction.qll @@ -260,6 +260,19 @@ module InstructionSanity { } } +/** + * Gets an `Instruction` that is contained in `IRFunction`, and has a location with the specified + * `File` and line number. Used for assigning register names when printing IR. + */ +private Instruction getAnInstructionAtLine(IRFunction irFunc, Language::File file, int line) { + exists(Language::Location location | + irFunc = result.getEnclosingIRFunction() and + location = result.getLocation() and + file = location.getFile() and + line = location.getStartLine() + ) +} + /** * Represents a single operation in the IR. */ @@ -324,8 +337,8 @@ class Instruction extends Construction::TInstruction { private int getLineRank() { this = rank[result](Instruction instr | - instr.getAST().getFile() = getAST().getFile() and - instr.getAST().getLocation().getStartLine() = getAST().getLocation().getStartLine() + instr = getAnInstructionAtLine(getEnclosingIRFunction(), getLocation().getFile(), + getLocation().getStartLine()) | instr order by instr.getBlock().getDisplayIndex(), instr.getDisplayIndexInBlock() ) diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll index 9abd315c945..5c8342f60ec 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll @@ -41,8 +41,18 @@ private newtype TMemoryLocation = IntValue endBitOffset, boolean isMayAccess ) { ( - hasResultMemoryAccess(_, var, type, _, startBitOffset, endBitOffset, isMayAccess) or + hasResultMemoryAccess(_, var, type, _, startBitOffset, endBitOffset, isMayAccess) + or hasOperandMemoryAccess(_, var, type, _, startBitOffset, endBitOffset, isMayAccess) + or + exists(IRAutomaticVariable autoVar | + // Always create a memory location for the entire variable. + autoVar = var and + type = autoVar.getIRType() and + startBitOffset = 0 and + endBitOffset = type.getByteSize() * 8 and + isMayAccess = false + ) ) and languageType = type.getCanonicalLanguageType() } or @@ -78,6 +88,8 @@ abstract class MemoryLocation extends TMemoryLocation { abstract IRFunction getIRFunction(); + abstract Location getLocation(); + final IRType getIRType() { result = getType().getIRType() } abstract predicate isMayAccess(); @@ -141,6 +153,8 @@ class VariableMemoryLocation extends TVariableMemoryLocation, MemoryLocation { final override IRFunction getIRFunction() { result = var.getEnclosingIRFunction() } + final override Location getLocation() { result = var.getLocation() } + final IntValue getStartBitOffset() { result = startBitOffset } final IntValue getEndBitOffset() { result = endBitOffset } @@ -208,6 +222,8 @@ class UnknownMemoryLocation extends TUnknownMemoryLocation, MemoryLocation { final override IRFunction getIRFunction() { result = irFunc } + final override Location getLocation() { result = irFunc.getLocation() } + final override string getUniqueId() { result = "{Unknown}" } final override predicate isMayAccess() { isMayAccess = true } @@ -233,6 +249,8 @@ class AllNonLocalMemory extends TAllNonLocalMemory, MemoryLocation { final override IRFunction getIRFunction() { result = irFunc } + final override Location getLocation() { result = irFunc.getLocation() } + final override string getUniqueId() { result = "{AllNonLocal}" } final override predicate isMayAccess() { isMayAccess = true } @@ -255,6 +273,8 @@ class AllAliasedMemory extends TAllAliasedMemory, MemoryLocation { final override IRFunction getIRFunction() { result = irFunc } + final override Location getLocation() { result = irFunc.getLocation() } + final override string getUniqueId() { result = " " + toString() } final override VirtualVariable getVirtualVariable() { result = TAllAliasedMemory(irFunc, false) } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstruction.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstruction.qll index c4cacede9cf..845304f2c56 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstruction.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstruction.qll @@ -885,4 +885,13 @@ module SSASanity { message = "Operand has " + locationCount.toString() + " memory accesses in function '$@'." ) } + + query predicate missingVirtualVariableForMemoryLocation( + Alias::MemoryLocation location, string message, OldIR::IRFunction func, string funcText + ) { + not exists(location.getVirtualVariable()) and + func = location.getIRFunction() and + funcText = Language::getIdentityString(func.getFunction()) and + message = "Memory location has no virtual variable in function '$@'." + } } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Instruction.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Instruction.qll index a4a9718ab95..a370888c895 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Instruction.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Instruction.qll @@ -260,6 +260,19 @@ module InstructionSanity { } } +/** + * Gets an `Instruction` that is contained in `IRFunction`, and has a location with the specified + * `File` and line number. Used for assigning register names when printing IR. + */ +private Instruction getAnInstructionAtLine(IRFunction irFunc, Language::File file, int line) { + exists(Language::Location location | + irFunc = result.getEnclosingIRFunction() and + location = result.getLocation() and + file = location.getFile() and + line = location.getStartLine() + ) +} + /** * Represents a single operation in the IR. */ @@ -324,8 +337,8 @@ class Instruction extends Construction::TInstruction { private int getLineRank() { this = rank[result](Instruction instr | - instr.getAST().getFile() = getAST().getFile() and - instr.getAST().getLocation().getStartLine() = getAST().getLocation().getStartLine() + instr = getAnInstructionAtLine(getEnclosingIRFunction(), getLocation().getFile(), + getLocation().getStartLine()) | instr order by instr.getBlock().getDisplayIndex(), instr.getDisplayIndexInBlock() ) diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll index a4a9718ab95..a370888c895 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Instruction.qll @@ -260,6 +260,19 @@ module InstructionSanity { } } +/** + * Gets an `Instruction` that is contained in `IRFunction`, and has a location with the specified + * `File` and line number. Used for assigning register names when printing IR. + */ +private Instruction getAnInstructionAtLine(IRFunction irFunc, Language::File file, int line) { + exists(Language::Location location | + irFunc = result.getEnclosingIRFunction() and + location = result.getLocation() and + file = location.getFile() and + line = location.getStartLine() + ) +} + /** * Represents a single operation in the IR. */ @@ -324,8 +337,8 @@ class Instruction extends Construction::TInstruction { private int getLineRank() { this = rank[result](Instruction instr | - instr.getAST().getFile() = getAST().getFile() and - instr.getAST().getLocation().getStartLine() = getAST().getLocation().getStartLine() + instr = getAnInstructionAtLine(getEnclosingIRFunction(), getLocation().getFile(), + getLocation().getStartLine()) | instr order by instr.getBlock().getDisplayIndex(), instr.getDisplayIndexInBlock() ) diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstruction.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstruction.qll index c4cacede9cf..845304f2c56 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstruction.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SSAConstruction.qll @@ -885,4 +885,13 @@ module SSASanity { message = "Operand has " + locationCount.toString() + " memory accesses in function '$@'." ) } + + query predicate missingVirtualVariableForMemoryLocation( + Alias::MemoryLocation location, string message, OldIR::IRFunction func, string funcText + ) { + not exists(location.getVirtualVariable()) and + func = location.getIRFunction() and + funcText = Language::getIdentityString(func.getFunction()) and + message = "Memory location has no virtual variable in function '$@'." + } } diff --git a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SimpleSSA.qll b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SimpleSSA.qll index 3d3243efc2b..ddff6444b90 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SimpleSSA.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/SimpleSSA.qll @@ -55,6 +55,10 @@ class MemoryLocation extends TMemoryLocation { final string toString() { result = var.toString() } + final Language::Location getLocation() { result = var.getLocation() } + + final IRFunction getIRFunction() { result = var.getEnclosingIRFunction() } + final IRVariable getIRVariable() { result = var } final VirtualVariable getVirtualVariable() { result = this } diff --git a/cpp/ql/src/semmle/code/cpp/ir/internal/IRCppLanguage.qll b/cpp/ql/src/semmle/code/cpp/ir/internal/IRCppLanguage.qll index cc41429489f..2adea27afb4 100644 --- a/cpp/ql/src/semmle/code/cpp/ir/internal/IRCppLanguage.qll +++ b/cpp/ql/src/semmle/code/cpp/ir/internal/IRCppLanguage.qll @@ -13,6 +13,8 @@ class Function = Cpp::Function; class Location = Cpp::Location; +class File = Cpp::File; + class AST = Cpp::Locatable; class Type = Cpp::Type; diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_ssa_sanity.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_ssa_sanity.expected index e69de29bb2d..7c2d1faf639 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_ssa_sanity.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_ssa_sanity.expected @@ -0,0 +1,2 @@ +multipleOperandMemoryLocations +missingVirtualVariableForMemoryLocation diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 3e60fb5d60a..94c1a433eb8 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -9,8 +9,8 @@ bad_asts.cpp: # 9| mu9_6(int) = InitializeParameter[y] : &:r9_5 # 10| r10_1(glval) = VariableAddress[#return] : # 10| r10_2(int) = Constant[6] : -#-----| r0_29(S *) = CopyValue : r9_4 -# 10| r10_3(glval) = FieldAddress[x] : r0_29 +#-----| r0_1(S *) = CopyValue : r9_4 +# 10| r10_3(glval) = FieldAddress[x] : r0_1 # 10| r10_4(int) = Load : &:r10_3, ~mu9_3 # 10| r10_5(int) = Add : r10_2, r10_4 # 10| r10_6(glval) = VariableAddress[y] : @@ -92,10 +92,10 @@ bad_asts.cpp: # 32| r32_1(glval) = VariableAddress[x] : # 32| r32_2(error) = Error : # 32| mu32_3(int) = Store : &:r32_1, r32_2 -#-----| r0_40(glval) = Error : -#-----| r0_48(error) = Load : &:r0_40, ~mu30_3 +#-----| r0_1(glval) = Error : +#-----| r0_2(error) = Load : &:r0_1, ~mu30_3 # 33| r33_1(glval) = VariableAddress[x] : -# 33| mu33_2(int) = Store : &:r33_1, r0_48 +# 33| mu33_2(int) = Store : &:r33_1, r0_2 # 34| v34_1(void) = NoOp : # 30| v30_4(void) = ReturnVoid : # 30| v30_5(void) = UnmodeledUse : mu* @@ -2986,8 +2986,8 @@ ir.cpp: # 644| r644_4(glval) = FieldAddress[m_a] : r644_3 # 644| mu644_5(int) = Store : &:r644_4, r644_1 # 645| r645_1(int) = Constant[2] : -#-----| r0_62(C *) = CopyValue : r642_4 -# 645| r645_2(glval) = FieldAddress[m_a] : r0_62 +#-----| r0_1(C *) = CopyValue : r642_4 +# 645| r645_2(glval) = FieldAddress[m_a] : r0_1 # 645| mu645_3(int) = Store : &:r645_2, r645_1 # 646| r646_1(glval) = VariableAddress[x] : # 646| mu646_2(int) = Uninitialized[x] : &:r646_1 @@ -3002,8 +3002,8 @@ ir.cpp: # 648| r648_4(int) = Load : &:r648_3, ~mu642_3 # 648| r648_5(glval) = VariableAddress[x] : # 648| mu648_6(int) = Store : &:r648_5, r648_4 -#-----| r0_134(C *) = CopyValue : r642_4 -# 649| r649_1(glval) = FieldAddress[m_a] : r0_134 +#-----| r0_2(C *) = CopyValue : r642_4 +# 649| r649_1(glval) = FieldAddress[m_a] : r0_2 # 649| r649_2(int) = Load : &:r649_1, ~mu642_3 # 649| r649_3(glval) = VariableAddress[x] : # 649| mu649_4(int) = Store : &:r649_3, r649_2 @@ -3034,13 +3034,13 @@ ir.cpp: # 654| mu654_6(unknown) = ^CallSideEffect : ~mu652_3 # 654| v654_7(void) = ^BufferReadSideEffect[-1] : &:r654_2, ~mu652_3 # 654| mu654_8(C) = ^IndirectMayWriteSideEffect[-1] : &:r654_2 -#-----| r0_90(C *) = CopyValue : r652_4 +#-----| r0_1(C *) = CopyValue : r652_4 # 655| r655_1(glval) = FunctionAddress[InstanceMemberFunction] : # 655| r655_2(int) = Constant[2] : -# 655| r655_3(int) = Call : func:r655_1, this:r0_90, 0:r655_2 +# 655| r655_3(int) = Call : func:r655_1, this:r0_1, 0:r655_2 # 655| mu655_4(unknown) = ^CallSideEffect : ~mu652_3 -#-----| v0_110(void) = ^BufferReadSideEffect[-1] : &:r0_90, ~mu652_3 -#-----| mu0_115(C) = ^IndirectMayWriteSideEffect[-1] : &:r0_90 +#-----| v0_2(void) = ^BufferReadSideEffect[-1] : &:r0_1, ~mu652_3 +#-----| mu0_3(C) = ^IndirectMayWriteSideEffect[-1] : &:r0_1 # 656| v656_1(void) = NoOp : # 652| v652_5(void) = ReturnVoid : # 652| v652_6(void) = UnmodeledUse : mu* @@ -3435,63 +3435,63 @@ ir.cpp: # 745| Base& Base::operator=(Base const&) # 745| Block 0 -# 745| v745_1(void) = EnterFunction : -# 745| mu745_3(unknown) = AliasedDefinition : -# 745| mu745_5(unknown) = UnmodeledDefinition : -# 745| r745_7(glval) = InitializeThis : -#-----| r0_1(glval) = VariableAddress[p#0] : -#-----| mu0_8(Base &) = InitializeParameter[p#0] : &:r0_1 -#-----| r0_13(Base &) = Load : &:r0_1, ~mu0_8 -#-----| mu0_18(unknown) = InitializeIndirection[p#0] : &:r0_13 -#-----| r0_29(Base *) = CopyValue : r745_7 -#-----| r0_40(glval) = FieldAddress[base_s] : r0_29 -#-----| r0_48(String *) = CopyValue : r0_40 -# 745| r745_12(glval) = FunctionAddress[operator=] : -#-----| r0_52(glval) = VariableAddress[p#0] : -#-----| r0_57(Base &) = Load : &:r0_52, ~mu745_5 -#-----| r0_62(glval) = CopyValue : r0_57 -#-----| r0_69(glval) = FieldAddress[base_s] : r0_62 -#-----| r0_74(String &) = CopyValue : r0_69 -# 745| r745_18(String &) = Call : func:r745_12, this:r0_48, 0:r0_74 -# 745| mu745_20(unknown) = ^CallSideEffect : ~mu745_5 -#-----| v0_90(void) = ^BufferReadSideEffect[-1] : &:r0_48, ~mu745_5 -#-----| v0_94(void) = ^BufferReadSideEffect[0] : &:r0_74, ~mu745_5 -#-----| mu0_99(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_48 -#-----| mu0_103(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_74 -#-----| r0_106(glval) = CopyValue : r745_18 -#-----| r0_110(glval) = VariableAddress[#return] : -#-----| r0_115(Base *) = CopyValue : r745_7 -#-----| r0_121(glval) = CopyValue : r0_115 -#-----| r0_126(Base &) = CopyValue : r0_121 -#-----| mu0_130(Base &) = Store : &:r0_110, r0_126 -#-----| v0_131(void) = ReturnIndirection : &:r0_13, ~mu745_5 -# 745| r745_22(glval) = VariableAddress[#return] : -# 745| v745_23(void) = ReturnValue : &:r745_22, ~mu745_5 -# 745| v745_24(void) = UnmodeledUse : mu* -# 745| v745_25(void) = AliasedUse : ~mu745_5 -# 745| v745_26(void) = ExitFunction : +# 745| v745_1(void) = EnterFunction : +# 745| mu745_2(unknown) = AliasedDefinition : +# 745| mu745_3(unknown) = UnmodeledDefinition : +# 745| r745_4(glval) = InitializeThis : +#-----| r0_1(glval) = VariableAddress[p#0] : +#-----| mu0_2(Base &) = InitializeParameter[p#0] : &:r0_1 +#-----| r0_3(Base &) = Load : &:r0_1, ~mu0_2 +#-----| mu0_4(unknown) = InitializeIndirection[p#0] : &:r0_3 +#-----| r0_5(Base *) = CopyValue : r745_4 +#-----| r0_6(glval) = FieldAddress[base_s] : r0_5 +#-----| r0_7(String *) = CopyValue : r0_6 +# 745| r745_5(glval) = FunctionAddress[operator=] : +#-----| r0_8(glval) = VariableAddress[p#0] : +#-----| r0_9(Base &) = Load : &:r0_8, ~mu745_3 +#-----| r0_10(glval) = CopyValue : r0_9 +#-----| r0_11(glval) = FieldAddress[base_s] : r0_10 +#-----| r0_12(String &) = CopyValue : r0_11 +# 745| r745_6(String &) = Call : func:r745_5, this:r0_7, 0:r0_12 +# 745| mu745_7(unknown) = ^CallSideEffect : ~mu745_3 +#-----| v0_13(void) = ^BufferReadSideEffect[-1] : &:r0_7, ~mu745_3 +#-----| v0_14(void) = ^BufferReadSideEffect[0] : &:r0_12, ~mu745_3 +#-----| mu0_15(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_7 +#-----| mu0_16(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_12 +#-----| r0_17(glval) = CopyValue : r745_6 +#-----| r0_18(glval) = VariableAddress[#return] : +#-----| r0_19(Base *) = CopyValue : r745_4 +#-----| r0_20(glval) = CopyValue : r0_19 +#-----| r0_21(Base &) = CopyValue : r0_20 +#-----| mu0_22(Base &) = Store : &:r0_18, r0_21 +#-----| v0_23(void) = ReturnIndirection : &:r0_3, ~mu745_3 +# 745| r745_8(glval) = VariableAddress[#return] : +# 745| v745_9(void) = ReturnValue : &:r745_8, ~mu745_3 +# 745| v745_10(void) = UnmodeledUse : mu* +# 745| v745_11(void) = AliasedUse : ~mu745_3 +# 745| v745_12(void) = ExitFunction : # 745| void Base::Base(Base const&) # 745| Block 0 -# 745| v745_1(void) = EnterFunction : -# 745| mu745_3(unknown) = AliasedDefinition : -# 745| mu745_5(unknown) = UnmodeledDefinition : -# 745| r745_7(glval) = InitializeThis : -#-----| r0_1(glval) = VariableAddress[p#0] : -#-----| mu0_8(Base &) = InitializeParameter[p#0] : &:r0_1 -#-----| r0_13(Base &) = Load : &:r0_1, ~mu0_8 -#-----| mu0_18(unknown) = InitializeIndirection[p#0] : &:r0_13 -# 745| r745_9(glval) = FieldAddress[base_s] : r745_7 -# 745| r745_10(glval) = FunctionAddress[String] : -# 745| v745_11(void) = Call : func:r745_10, this:r745_9 -# 745| mu745_12(unknown) = ^CallSideEffect : ~mu745_5 -# 745| mu745_14(String) = ^IndirectMayWriteSideEffect[-1] : &:r745_9 -# 745| v745_15(void) = NoOp : -#-----| v0_62(void) = ReturnIndirection : &:r0_13, ~mu745_5 -# 745| v745_16(void) = ReturnVoid : -# 745| v745_17(void) = UnmodeledUse : mu* -# 745| v745_18(void) = AliasedUse : ~mu745_5 -# 745| v745_20(void) = ExitFunction : +# 745| v745_1(void) = EnterFunction : +# 745| mu745_2(unknown) = AliasedDefinition : +# 745| mu745_3(unknown) = UnmodeledDefinition : +# 745| r745_4(glval) = InitializeThis : +#-----| r0_1(glval) = VariableAddress[p#0] : +#-----| mu0_2(Base &) = InitializeParameter[p#0] : &:r0_1 +#-----| r0_3(Base &) = Load : &:r0_1, ~mu0_2 +#-----| mu0_4(unknown) = InitializeIndirection[p#0] : &:r0_3 +# 745| r745_5(glval) = FieldAddress[base_s] : r745_4 +# 745| r745_6(glval) = FunctionAddress[String] : +# 745| v745_7(void) = Call : func:r745_6, this:r745_5 +# 745| mu745_8(unknown) = ^CallSideEffect : ~mu745_3 +# 745| mu745_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r745_5 +# 745| v745_10(void) = NoOp : +#-----| v0_5(void) = ReturnIndirection : &:r0_3, ~mu745_3 +# 745| v745_11(void) = ReturnVoid : +# 745| v745_12(void) = UnmodeledUse : mu* +# 745| v745_13(void) = AliasedUse : ~mu745_3 +# 745| v745_14(void) = ExitFunction : # 748| void Base::Base() # 748| Block 0 @@ -3533,48 +3533,48 @@ ir.cpp: # 754| mu754_3(unknown) = UnmodeledDefinition : # 754| r754_4(glval) = InitializeThis : #-----| r0_1(glval) = VariableAddress[p#0] : -#-----| mu0_8(Middle &) = InitializeParameter[p#0] : &:r0_1 -#-----| r0_13(Middle &) = Load : &:r0_1, ~mu0_8 -#-----| mu0_18(unknown) = InitializeIndirection[p#0] : &:r0_13 -#-----| r0_29(Middle *) = CopyValue : r754_4 -#-----| r0_40(Base *) = ConvertToNonVirtualBase[Middle : Base] : r0_29 +#-----| mu0_2(Middle &) = InitializeParameter[p#0] : &:r0_1 +#-----| r0_3(Middle &) = Load : &:r0_1, ~mu0_2 +#-----| mu0_4(unknown) = InitializeIndirection[p#0] : &:r0_3 +#-----| r0_5(Middle *) = CopyValue : r754_4 +#-----| r0_6(Base *) = ConvertToNonVirtualBase[Middle : Base] : r0_5 # 754| r754_5(glval) = FunctionAddress[operator=] : -#-----| r0_50(glval) = VariableAddress[p#0] : -#-----| r0_52(Middle &) = Load : &:r0_50, ~mu754_3 -#-----| r0_57(glval) = CopyValue : r0_52 -#-----| r0_62(Middle *) = CopyValue : r0_57 -#-----| r0_69(Base *) = ConvertToNonVirtualBase[Middle : Base] : r0_62 -#-----| r0_74(glval) = CopyValue : r0_69 -#-----| r0_82(Base &) = CopyValue : r0_74 -# 754| r754_6(Base &) = Call : func:r754_5, this:r0_40, 0:r0_82 +#-----| r0_7(glval) = VariableAddress[p#0] : +#-----| r0_8(Middle &) = Load : &:r0_7, ~mu754_3 +#-----| r0_9(glval) = CopyValue : r0_8 +#-----| r0_10(Middle *) = CopyValue : r0_9 +#-----| r0_11(Base *) = ConvertToNonVirtualBase[Middle : Base] : r0_10 +#-----| r0_12(glval) = CopyValue : r0_11 +#-----| r0_13(Base &) = CopyValue : r0_12 +# 754| r754_6(Base &) = Call : func:r754_5, this:r0_6, 0:r0_13 # 754| mu754_7(unknown) = ^CallSideEffect : ~mu754_3 -#-----| v0_94(void) = ^BufferReadSideEffect[-1] : &:r0_40, ~mu754_3 -#-----| v0_99(void) = ^BufferReadSideEffect[0] : &:r0_82, ~mu754_3 -#-----| mu0_103(Base) = ^IndirectMayWriteSideEffect[-1] : &:r0_40 -#-----| mu0_106(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_82 -#-----| r0_110(glval) = CopyValue : r754_6 -#-----| r0_115(Middle *) = CopyValue : r754_4 -#-----| r0_121(glval) = FieldAddress[middle_s] : r0_115 -#-----| r0_126(String *) = CopyValue : r0_121 +#-----| v0_14(void) = ^BufferReadSideEffect[-1] : &:r0_6, ~mu754_3 +#-----| v0_15(void) = ^BufferReadSideEffect[0] : &:r0_13, ~mu754_3 +#-----| mu0_16(Base) = ^IndirectMayWriteSideEffect[-1] : &:r0_6 +#-----| mu0_17(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_13 +#-----| r0_18(glval) = CopyValue : r754_6 +#-----| r0_19(Middle *) = CopyValue : r754_4 +#-----| r0_20(glval) = FieldAddress[middle_s] : r0_19 +#-----| r0_21(String *) = CopyValue : r0_20 # 754| r754_8(glval) = FunctionAddress[operator=] : -#-----| r0_131(glval) = VariableAddress[p#0] : -#-----| r0_134(Middle &) = Load : &:r0_131, ~mu754_3 -#-----| r0_138(glval) = CopyValue : r0_134 -#-----| r0_141(glval) = FieldAddress[middle_s] : r0_138 -#-----| r0_143(String &) = CopyValue : r0_141 -# 754| r754_9(String &) = Call : func:r754_8, this:r0_126, 0:r0_143 +#-----| r0_22(glval) = VariableAddress[p#0] : +#-----| r0_23(Middle &) = Load : &:r0_22, ~mu754_3 +#-----| r0_24(glval) = CopyValue : r0_23 +#-----| r0_25(glval) = FieldAddress[middle_s] : r0_24 +#-----| r0_26(String &) = CopyValue : r0_25 +# 754| r754_9(String &) = Call : func:r754_8, this:r0_21, 0:r0_26 # 754| mu754_10(unknown) = ^CallSideEffect : ~mu754_3 -#-----| v0_145(void) = ^BufferReadSideEffect[-1] : &:r0_126, ~mu754_3 -#-----| v0_147(void) = ^BufferReadSideEffect[0] : &:r0_143, ~mu754_3 -#-----| mu0_149(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_126 -#-----| mu0_151(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_143 -#-----| r0_153(glval) = CopyValue : r754_9 -#-----| r0_155(glval) = VariableAddress[#return] : -#-----| r0_157(Middle *) = CopyValue : r754_4 -#-----| r0_161(glval) = CopyValue : r0_157 -#-----| r0_164(Middle &) = CopyValue : r0_161 -#-----| mu0_167(Middle &) = Store : &:r0_155, r0_164 -#-----| v0_170(void) = ReturnIndirection : &:r0_13, ~mu754_3 +#-----| v0_27(void) = ^BufferReadSideEffect[-1] : &:r0_21, ~mu754_3 +#-----| v0_28(void) = ^BufferReadSideEffect[0] : &:r0_26, ~mu754_3 +#-----| mu0_29(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_21 +#-----| mu0_30(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_26 +#-----| r0_31(glval) = CopyValue : r754_9 +#-----| r0_32(glval) = VariableAddress[#return] : +#-----| r0_33(Middle *) = CopyValue : r754_4 +#-----| r0_34(glval) = CopyValue : r0_33 +#-----| r0_35(Middle &) = CopyValue : r0_34 +#-----| mu0_36(Middle &) = Store : &:r0_32, r0_35 +#-----| v0_37(void) = ReturnIndirection : &:r0_3, ~mu754_3 # 754| r754_11(glval) = VariableAddress[#return] : # 754| v754_12(void) = ReturnValue : &:r754_11, ~mu754_3 # 754| v754_13(void) = UnmodeledUse : mu* @@ -3630,48 +3630,48 @@ ir.cpp: # 763| mu763_3(unknown) = UnmodeledDefinition : # 763| r763_4(glval) = InitializeThis : #-----| r0_1(glval) = VariableAddress[p#0] : -#-----| mu0_8(Derived &) = InitializeParameter[p#0] : &:r0_1 -#-----| r0_13(Derived &) = Load : &:r0_1, ~mu0_8 -#-----| mu0_18(unknown) = InitializeIndirection[p#0] : &:r0_13 -#-----| r0_29(Derived *) = CopyValue : r763_4 -#-----| r0_40(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r0_29 +#-----| mu0_2(Derived &) = InitializeParameter[p#0] : &:r0_1 +#-----| r0_3(Derived &) = Load : &:r0_1, ~mu0_2 +#-----| mu0_4(unknown) = InitializeIndirection[p#0] : &:r0_3 +#-----| r0_5(Derived *) = CopyValue : r763_4 +#-----| r0_6(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r0_5 # 763| r763_5(glval) = FunctionAddress[operator=] : -#-----| r0_50(glval) = VariableAddress[p#0] : -#-----| r0_52(Derived &) = Load : &:r0_50, ~mu763_3 -#-----| r0_57(glval) = CopyValue : r0_52 -#-----| r0_62(Derived *) = CopyValue : r0_57 -#-----| r0_69(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r0_62 -#-----| r0_74(glval) = CopyValue : r0_69 -#-----| r0_82(Middle &) = CopyValue : r0_74 -# 763| r763_6(Middle &) = Call : func:r763_5, this:r0_40, 0:r0_82 +#-----| r0_7(glval) = VariableAddress[p#0] : +#-----| r0_8(Derived &) = Load : &:r0_7, ~mu763_3 +#-----| r0_9(glval) = CopyValue : r0_8 +#-----| r0_10(Derived *) = CopyValue : r0_9 +#-----| r0_11(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r0_10 +#-----| r0_12(glval) = CopyValue : r0_11 +#-----| r0_13(Middle &) = CopyValue : r0_12 +# 763| r763_6(Middle &) = Call : func:r763_5, this:r0_6, 0:r0_13 # 763| mu763_7(unknown) = ^CallSideEffect : ~mu763_3 -#-----| v0_94(void) = ^BufferReadSideEffect[-1] : &:r0_40, ~mu763_3 -#-----| v0_99(void) = ^BufferReadSideEffect[0] : &:r0_82, ~mu763_3 -#-----| mu0_103(Middle) = ^IndirectMayWriteSideEffect[-1] : &:r0_40 -#-----| mu0_106(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_82 -#-----| r0_110(glval) = CopyValue : r763_6 -#-----| r0_115(Derived *) = CopyValue : r763_4 -#-----| r0_121(glval) = FieldAddress[derived_s] : r0_115 -#-----| r0_126(String *) = CopyValue : r0_121 +#-----| v0_14(void) = ^BufferReadSideEffect[-1] : &:r0_6, ~mu763_3 +#-----| v0_15(void) = ^BufferReadSideEffect[0] : &:r0_13, ~mu763_3 +#-----| mu0_16(Middle) = ^IndirectMayWriteSideEffect[-1] : &:r0_6 +#-----| mu0_17(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_13 +#-----| r0_18(glval) = CopyValue : r763_6 +#-----| r0_19(Derived *) = CopyValue : r763_4 +#-----| r0_20(glval) = FieldAddress[derived_s] : r0_19 +#-----| r0_21(String *) = CopyValue : r0_20 # 763| r763_8(glval) = FunctionAddress[operator=] : -#-----| r0_131(glval) = VariableAddress[p#0] : -#-----| r0_134(Derived &) = Load : &:r0_131, ~mu763_3 -#-----| r0_138(glval) = CopyValue : r0_134 -#-----| r0_141(glval) = FieldAddress[derived_s] : r0_138 -#-----| r0_143(String &) = CopyValue : r0_141 -# 763| r763_9(String &) = Call : func:r763_8, this:r0_126, 0:r0_143 +#-----| r0_22(glval) = VariableAddress[p#0] : +#-----| r0_23(Derived &) = Load : &:r0_22, ~mu763_3 +#-----| r0_24(glval) = CopyValue : r0_23 +#-----| r0_25(glval) = FieldAddress[derived_s] : r0_24 +#-----| r0_26(String &) = CopyValue : r0_25 +# 763| r763_9(String &) = Call : func:r763_8, this:r0_21, 0:r0_26 # 763| mu763_10(unknown) = ^CallSideEffect : ~mu763_3 -#-----| v0_145(void) = ^BufferReadSideEffect[-1] : &:r0_126, ~mu763_3 -#-----| v0_147(void) = ^BufferReadSideEffect[0] : &:r0_143, ~mu763_3 -#-----| mu0_149(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_126 -#-----| mu0_151(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_143 -#-----| r0_153(glval) = CopyValue : r763_9 -#-----| r0_155(glval) = VariableAddress[#return] : -#-----| r0_157(Derived *) = CopyValue : r763_4 -#-----| r0_161(glval) = CopyValue : r0_157 -#-----| r0_164(Derived &) = CopyValue : r0_161 -#-----| mu0_167(Derived &) = Store : &:r0_155, r0_164 -#-----| v0_170(void) = ReturnIndirection : &:r0_13, ~mu763_3 +#-----| v0_27(void) = ^BufferReadSideEffect[-1] : &:r0_21, ~mu763_3 +#-----| v0_28(void) = ^BufferReadSideEffect[0] : &:r0_26, ~mu763_3 +#-----| mu0_29(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_21 +#-----| mu0_30(unknown) = ^BufferMayWriteSideEffect[0] : &:r0_26 +#-----| r0_31(glval) = CopyValue : r763_9 +#-----| r0_32(glval) = VariableAddress[#return] : +#-----| r0_33(Derived *) = CopyValue : r763_4 +#-----| r0_34(glval) = CopyValue : r0_33 +#-----| r0_35(Derived &) = CopyValue : r0_34 +#-----| mu0_36(Derived &) = Store : &:r0_32, r0_35 +#-----| v0_37(void) = ReturnIndirection : &:r0_3, ~mu763_3 # 763| r763_11(glval) = VariableAddress[#return] : # 763| v763_12(void) = ReturnValue : &:r763_11, ~mu763_3 # 763| v763_13(void) = UnmodeledUse : mu* @@ -4172,35 +4172,35 @@ ir.cpp: # 846| void PolymorphicDerived::PolymorphicDerived() # 846| Block 0 # 846| v846_1(void) = EnterFunction : -# 846| mu846_3(unknown) = AliasedDefinition : -# 846| mu846_5(unknown) = UnmodeledDefinition : -# 846| r846_7(glval) = InitializeThis : -# 846| r846_9(glval) = ConvertToNonVirtualBase[PolymorphicDerived : PolymorphicBase] : r846_7 -# 846| r846_10(glval) = FunctionAddress[PolymorphicBase] : -# 846| v846_12(void) = Call : func:r846_10, this:r846_9 -# 846| mu846_14(unknown) = ^CallSideEffect : ~mu846_5 -# 846| mu846_16(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r846_9 -# 846| v846_18(void) = NoOp : -# 846| v846_20(void) = ReturnVoid : -# 846| v846_22(void) = UnmodeledUse : mu* -# 846| v846_24(void) = AliasedUse : ~mu846_5 -# 846| v846_26(void) = ExitFunction : +# 846| mu846_2(unknown) = AliasedDefinition : +# 846| mu846_3(unknown) = UnmodeledDefinition : +# 846| r846_4(glval) = InitializeThis : +# 846| r846_5(glval) = ConvertToNonVirtualBase[PolymorphicDerived : PolymorphicBase] : r846_4 +# 846| r846_6(glval) = FunctionAddress[PolymorphicBase] : +# 846| v846_7(void) = Call : func:r846_6, this:r846_5 +# 846| mu846_8(unknown) = ^CallSideEffect : ~mu846_3 +# 846| mu846_9(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r846_5 +# 846| v846_10(void) = NoOp : +# 846| v846_11(void) = ReturnVoid : +# 846| v846_12(void) = UnmodeledUse : mu* +# 846| v846_13(void) = AliasedUse : ~mu846_3 +# 846| v846_14(void) = ExitFunction : # 846| void PolymorphicDerived::~PolymorphicDerived() # 846| Block 0 # 846| v846_1(void) = EnterFunction : -# 846| mu846_3(unknown) = AliasedDefinition : -# 846| mu846_5(unknown) = UnmodeledDefinition : -# 846| r846_7(glval) = InitializeThis : +# 846| mu846_2(unknown) = AliasedDefinition : +# 846| mu846_3(unknown) = UnmodeledDefinition : +# 846| r846_4(glval) = InitializeThis : #-----| v0_1(void) = NoOp : -# 846| r846_10(glval) = ConvertToNonVirtualBase[PolymorphicDerived : PolymorphicBase] : r846_7 -# 846| r846_12(glval) = FunctionAddress[~PolymorphicBase] : -# 846| v846_14(void) = Call : func:r846_12, this:r846_10 -# 846| mu846_16(unknown) = ^CallSideEffect : ~mu846_5 -# 846| v846_18(void) = ReturnVoid : -# 846| v846_20(void) = UnmodeledUse : mu* -# 846| v846_22(void) = AliasedUse : ~mu846_5 -# 846| v846_24(void) = ExitFunction : +# 846| r846_5(glval) = ConvertToNonVirtualBase[PolymorphicDerived : PolymorphicBase] : r846_4 +# 846| r846_6(glval) = FunctionAddress[~PolymorphicBase] : +# 846| v846_7(void) = Call : func:r846_6, this:r846_5 +# 846| mu846_8(unknown) = ^CallSideEffect : ~mu846_3 +# 846| v846_9(void) = ReturnVoid : +# 846| v846_10(void) = UnmodeledUse : mu* +# 846| v846_11(void) = AliasedUse : ~mu846_3 +# 846| v846_12(void) = ExitFunction : # 849| void DynamicCast() # 849| Block 0 @@ -4209,10 +4209,10 @@ ir.cpp: # 849| mu849_3(unknown) = UnmodeledDefinition : # 850| r850_1(glval) = VariableAddress[b] : # 850| mu850_2(PolymorphicBase) = Uninitialized[b] : &:r850_1 -#-----| r0_8(glval) = FunctionAddress[PolymorphicBase] : -#-----| v0_13(void) = Call : func:r0_8, this:r850_1 -#-----| mu0_18(unknown) = ^CallSideEffect : ~mu849_3 -#-----| mu0_29(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r850_1 +#-----| r0_1(glval) = FunctionAddress[PolymorphicBase] : +#-----| v0_2(void) = Call : func:r0_1, this:r850_1 +#-----| mu0_3(unknown) = ^CallSideEffect : ~mu849_3 +#-----| mu0_4(PolymorphicBase) = ^IndirectMayWriteSideEffect[-1] : &:r850_1 # 851| r851_1(glval) = VariableAddress[d] : # 851| mu851_2(PolymorphicDerived) = Uninitialized[d] : &:r851_1 # 851| r851_3(glval) = FunctionAddress[PolymorphicDerived] : @@ -4951,443 +4951,443 @@ ir.cpp: # 1029| void (lambda [] type at line 1029, col. 12)::operator()() const # 1029| Block 0 # 1029| v1029_1(void) = EnterFunction : -# 1029| mu1029_3(unknown) = AliasedDefinition : -# 1029| mu1029_5(unknown) = UnmodeledDefinition : -# 1029| r1029_7(glval) = InitializeThis : -# 1029| v1029_9(void) = NoOp : -# 1029| v1029_11(void) = ReturnVoid : -# 1029| v1029_13(void) = UnmodeledUse : mu* -# 1029| v1029_15(void) = AliasedUse : ~mu1029_5 -# 1029| v1029_17(void) = ExitFunction : +# 1029| mu1029_2(unknown) = AliasedDefinition : +# 1029| mu1029_3(unknown) = UnmodeledDefinition : +# 1029| r1029_4(glval) = InitializeThis : +# 1029| v1029_5(void) = NoOp : +# 1029| v1029_6(void) = ReturnVoid : +# 1029| v1029_7(void) = UnmodeledUse : mu* +# 1029| v1029_8(void) = AliasedUse : ~mu1029_3 +# 1029| v1029_9(void) = ExitFunction : # 1029| void(* (lambda [] type at line 1029, col. 12)::operator void (*)()() const)() # 1029| Block 0 # 1029| v1029_1(void) = EnterFunction : -# 1029| mu1029_3(unknown) = AliasedDefinition : -# 1029| mu1029_5(unknown) = UnmodeledDefinition : -# 1029| r1029_7(glval) = InitializeThis : -# 1029| r1029_9(glval<..(*)(..)>) = VariableAddress[#return] : -# 1029| r1029_11(..(*)(..)) = FunctionAddress[_FUN] : -# 1029| mu1029_13(..(*)(..)) = Store : &:r1029_9, r1029_11 -# 1029| r1029_15(glval<..(*)(..)>) = VariableAddress[#return] : -# 1029| v1029_17(void) = ReturnValue : &:r1029_15, ~mu1029_5 -# 1029| v1029_19(void) = UnmodeledUse : mu* -# 1029| v1029_20(void) = AliasedUse : ~mu1029_5 -# 1029| v1029_21(void) = ExitFunction : +# 1029| mu1029_2(unknown) = AliasedDefinition : +# 1029| mu1029_3(unknown) = UnmodeledDefinition : +# 1029| r1029_4(glval) = InitializeThis : +# 1029| r1029_5(glval<..(*)(..)>) = VariableAddress[#return] : +# 1029| r1029_6(..(*)(..)) = FunctionAddress[_FUN] : +# 1029| mu1029_7(..(*)(..)) = Store : &:r1029_5, r1029_6 +# 1029| r1029_8(glval<..(*)(..)>) = VariableAddress[#return] : +# 1029| v1029_9(void) = ReturnValue : &:r1029_8, ~mu1029_3 +# 1029| v1029_10(void) = UnmodeledUse : mu* +# 1029| v1029_11(void) = AliasedUse : ~mu1029_3 +# 1029| v1029_12(void) = ExitFunction : # 1031| void Lambda(int, String const&) # 1031| Block 0 -# 1031| v1031_1(void) = EnterFunction : -# 1031| mu1031_2(unknown) = AliasedDefinition : -# 1031| mu1031_3(unknown) = UnmodeledDefinition : -# 1031| r1031_4(glval) = VariableAddress[x] : -# 1031| mu1031_5(int) = InitializeParameter[x] : &:r1031_4 -# 1031| r1031_6(glval) = VariableAddress[s] : -# 1031| mu1031_7(String &) = InitializeParameter[s] : &:r1031_6 -# 1031| r1031_8(String &) = Load : &:r1031_6, ~mu1031_7 -# 1031| mu1031_9(unknown) = InitializeIndirection[s] : &:r1031_8 -# 1032| r1032_19(glval) = VariableAddress[lambda_empty] : -# 1032| r1032_22(glval) = VariableAddress[#temp1032:23] : -# 1032| mu1032_25(decltype([...](...){...})) = Uninitialized[#temp1032:23] : &:r1032_22 -# 1032| r1032_28(decltype([...](...){...})) = Load : &:r1032_22, ~mu1031_3 -# 1032| mu1032_30(decltype([...](...){...})) = Store : &:r1032_19, r1032_28 -# 1033| r1033_1(char) = Constant[65] : -# 1034| r1034_13(glval) = VariableAddress[lambda_ref] : -# 1034| r1034_15(glval) = VariableAddress[#temp1034:20] : -# 1034| mu1034_16(decltype([...](...){...})) = Uninitialized[#temp1034:20] : &:r1034_15 -# 1034| r1034_17(glval) = FieldAddress[s] : r1034_15 -#-----| r0_90(glval) = VariableAddress[s] : -#-----| r0_94(String &) = Load : &:r0_90, ~mu1031_3 -# 1034| r1034_20(glval) = CopyValue : r0_94 -# 1034| r1034_22(String &) = CopyValue : r1034_20 -# 1034| mu1034_24(String &) = Store : &:r1034_17, r1034_22 -# 1034| r1034_26(glval) = FieldAddress[x] : r1034_15 -#-----| r0_115(glval) = VariableAddress[x] : -#-----| r0_121(int &) = CopyValue : r0_115 -#-----| mu0_126(int &) = Store : &:r1034_26, r0_121 -# 1034| r1034_31(decltype([...](...){...})) = Load : &:r1034_15, ~mu1031_3 -# 1034| mu1034_32(decltype([...](...){...})) = Store : &:r1034_13, r1034_31 -# 1035| r1035_1(glval) = VariableAddress[lambda_ref] : -# 1035| r1035_2(glval) = Convert : r1035_1 -# 1035| r1035_3(glval) = FunctionAddress[operator()] : -# 1035| r1035_4(float) = Constant[1.0] : -# 1035| r1035_5(char) = Call : func:r1035_3, this:r1035_2, 0:r1035_4 -# 1035| mu1035_6(unknown) = ^CallSideEffect : ~mu1031_3 -# 1035| v1035_7(void) = ^BufferReadSideEffect[-1] : &:r1035_2, ~mu1031_3 -# 1035| mu1035_8(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1035_2 -# 1036| r1036_31(glval) = VariableAddress[lambda_val] : -# 1036| r1036_32(glval) = VariableAddress[#temp1036:20] : -# 1036| mu1036_33(decltype([...](...){...})) = Uninitialized[#temp1036:20] : &:r1036_32 -# 1036| r1036_34(glval) = FieldAddress[s] : r1036_32 -#-----| r0_157(glval) = FunctionAddress[String] : -#-----| v0_161(void) = Call : func:r0_157, this:r1036_34 -#-----| mu0_164(unknown) = ^CallSideEffect : ~mu1031_3 -#-----| mu0_167(String) = ^IndirectMayWriteSideEffect[-1] : &:r1036_34 -# 1036| r1036_35(glval) = FieldAddress[x] : r1036_32 -#-----| r0_172(glval) = VariableAddress[x] : -#-----| r0_173(int) = Load : &:r0_172, ~mu1031_3 -#-----| mu0_174(int) = Store : &:r1036_35, r0_173 -# 1036| r1036_36(decltype([...](...){...})) = Load : &:r1036_32, ~mu1031_3 -# 1036| mu1036_37(decltype([...](...){...})) = Store : &:r1036_31, r1036_36 -# 1037| r1037_1(glval) = VariableAddress[lambda_val] : -# 1037| r1037_2(glval) = Convert : r1037_1 -# 1037| r1037_3(glval) = FunctionAddress[operator()] : -# 1037| r1037_4(float) = Constant[2.0] : -# 1037| r1037_5(char) = Call : func:r1037_3, this:r1037_2, 0:r1037_4 -# 1037| mu1037_6(unknown) = ^CallSideEffect : ~mu1031_3 -# 1037| v1037_7(void) = ^BufferReadSideEffect[-1] : &:r1037_2, ~mu1031_3 -# 1037| mu1037_8(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1037_2 -# 1038| r1038_23(glval) = VariableAddress[lambda_ref_explicit] : -# 1038| r1038_24(glval) = VariableAddress[#temp1038:29] : -# 1038| mu1038_25(decltype([...](...){...})) = Uninitialized[#temp1038:29] : &:r1038_24 -# 1038| r1038_26(glval) = FieldAddress[s] : r1038_24 -# 1038| r1038_27(glval) = VariableAddress[s] : -# 1038| r1038_28(String &) = Load : &:r1038_27, ~mu1031_3 -# 1038| r1038_29(glval) = CopyValue : r1038_28 -# 1038| r1038_30(String &) = CopyValue : r1038_29 -# 1038| mu1038_31(String &) = Store : &:r1038_26, r1038_30 -# 1038| r1038_32(decltype([...](...){...})) = Load : &:r1038_24, ~mu1031_3 -# 1038| mu1038_33(decltype([...](...){...})) = Store : &:r1038_23, r1038_32 -# 1039| r1039_1(glval) = VariableAddress[lambda_ref_explicit] : -# 1039| r1039_2(glval) = Convert : r1039_1 -# 1039| r1039_3(glval) = FunctionAddress[operator()] : -# 1039| r1039_4(float) = Constant[3.0] : -# 1039| r1039_5(char) = Call : func:r1039_3, this:r1039_2, 0:r1039_4 -# 1039| mu1039_6(unknown) = ^CallSideEffect : ~mu1031_3 -# 1039| v1039_7(void) = ^BufferReadSideEffect[-1] : &:r1039_2, ~mu1031_3 -# 1039| mu1039_8(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1039_2 -# 1040| r1040_32(glval) = VariableAddress[lambda_val_explicit] : -# 1040| r1040_33(glval) = VariableAddress[#temp1040:29] : -# 1040| mu1040_34(decltype([...](...){...})) = Uninitialized[#temp1040:29] : &:r1040_33 -# 1040| r1040_35(glval) = FieldAddress[s] : r1040_33 -#-----| r0_175(glval) = FunctionAddress[String] : -#-----| v0_176(void) = Call : func:r0_175, this:r1040_35 -#-----| mu0_177(unknown) = ^CallSideEffect : ~mu1031_3 -#-----| mu0_178(String) = ^IndirectMayWriteSideEffect[-1] : &:r1040_35 -# 1040| r1040_36(decltype([...](...){...})) = Load : &:r1040_33, ~mu1031_3 -# 1040| mu1040_37(decltype([...](...){...})) = Store : &:r1040_32, r1040_36 -# 1041| r1041_1(glval) = VariableAddress[lambda_val_explicit] : -# 1041| r1041_2(glval) = Convert : r1041_1 -# 1041| r1041_3(glval) = FunctionAddress[operator()] : -# 1041| r1041_4(float) = Constant[4.0] : -# 1041| r1041_5(char) = Call : func:r1041_3, this:r1041_2, 0:r1041_4 -# 1041| mu1041_6(unknown) = ^CallSideEffect : ~mu1031_3 -# 1041| v1041_7(void) = ^BufferReadSideEffect[-1] : &:r1041_2, ~mu1031_3 -# 1041| mu1041_8(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1041_2 -# 1042| r1042_22(glval) = VariableAddress[lambda_mixed_explicit] : -# 1042| r1042_23(glval) = VariableAddress[#temp1042:31] : -# 1042| mu1042_24(decltype([...](...){...})) = Uninitialized[#temp1042:31] : &:r1042_23 -# 1042| r1042_25(glval) = FieldAddress[s] : r1042_23 -# 1042| r1042_26(glval) = VariableAddress[s] : -# 1042| r1042_27(String &) = Load : &:r1042_26, ~mu1031_3 -# 1042| r1042_28(glval) = CopyValue : r1042_27 -# 1042| r1042_29(String &) = CopyValue : r1042_28 -# 1042| mu1042_30(String &) = Store : &:r1042_25, r1042_29 -# 1042| r1042_31(glval) = FieldAddress[x] : r1042_23 -# 1042| r1042_32(glval) = VariableAddress[x] : -# 1042| r1042_33(int) = Load : &:r1042_32, ~mu1031_3 -# 1042| mu1042_34(int) = Store : &:r1042_31, r1042_33 -# 1042| r1042_35(decltype([...](...){...})) = Load : &:r1042_23, ~mu1031_3 -# 1042| mu1042_36(decltype([...](...){...})) = Store : &:r1042_22, r1042_35 -# 1043| r1043_1(glval) = VariableAddress[lambda_mixed_explicit] : -# 1043| r1043_2(glval) = Convert : r1043_1 -# 1043| r1043_3(glval) = FunctionAddress[operator()] : -# 1043| r1043_4(float) = Constant[5.0] : -# 1043| r1043_5(char) = Call : func:r1043_3, this:r1043_2, 0:r1043_4 -# 1043| mu1043_6(unknown) = ^CallSideEffect : ~mu1031_3 -# 1043| v1043_7(void) = ^BufferReadSideEffect[-1] : &:r1043_2, ~mu1031_3 -# 1043| mu1043_8(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1043_2 -# 1044| r1044_1(glval) = VariableAddress[r] : -# 1044| r1044_2(glval) = VariableAddress[x] : -# 1044| r1044_3(int) = Load : &:r1044_2, ~mu1031_3 -# 1044| r1044_4(int) = Constant[1] : -# 1044| r1044_5(int) = Sub : r1044_3, r1044_4 -# 1044| mu1044_6(int) = Store : &:r1044_1, r1044_5 -# 1045| r1045_29(glval) = VariableAddress[lambda_inits] : -# 1045| r1045_30(glval) = VariableAddress[#temp1045:22] : -# 1045| mu1045_31(decltype([...](...){...})) = Uninitialized[#temp1045:22] : &:r1045_30 -# 1045| r1045_32(glval) = FieldAddress[s] : r1045_30 -# 1045| r1045_33(glval) = VariableAddress[s] : -# 1045| r1045_34(String &) = Load : &:r1045_33, ~mu1031_3 -# 1045| r1045_35(glval) = CopyValue : r1045_34 -# 1045| r1045_36(String &) = CopyValue : r1045_35 -# 1045| mu1045_37(String &) = Store : &:r1045_32, r1045_36 -# 1045| r1045_38(glval) = FieldAddress[x] : r1045_30 -# 1045| r1045_39(glval) = VariableAddress[x] : -# 1045| r1045_40(int) = Load : &:r1045_39, ~mu1031_3 -# 1045| mu1045_41(int) = Store : &:r1045_38, r1045_40 -# 1045| r1045_42(glval) = FieldAddress[i] : r1045_30 -# 1045| r1045_43(glval) = VariableAddress[x] : -# 1045| r1045_44(int) = Load : &:r1045_43, ~mu1031_3 -# 1045| r1045_45(int) = Constant[1] : -# 1045| r1045_46(int) = Add : r1045_44, r1045_45 -# 1045| mu1045_47(int) = Store : &:r1045_42, r1045_46 -# 1045| r1045_48(glval) = FieldAddress[j] : r1045_30 -# 1045| r1045_49(glval) = VariableAddress[r] : -# 1045| r1045_50(int &) = CopyValue : r1045_49 -# 1045| mu1045_51(int &) = Store : &:r1045_48, r1045_50 -# 1045| r1045_52(decltype([...](...){...})) = Load : &:r1045_30, ~mu1031_3 -# 1045| mu1045_53(decltype([...](...){...})) = Store : &:r1045_29, r1045_52 -# 1046| r1046_1(glval) = VariableAddress[lambda_inits] : -# 1046| r1046_2(glval) = Convert : r1046_1 -# 1046| r1046_3(glval) = FunctionAddress[operator()] : -# 1046| r1046_4(float) = Constant[6.0] : -# 1046| r1046_5(char) = Call : func:r1046_3, this:r1046_2, 0:r1046_4 -# 1046| mu1046_6(unknown) = ^CallSideEffect : ~mu1031_3 -# 1046| v1046_7(void) = ^BufferReadSideEffect[-1] : &:r1046_2, ~mu1031_3 -# 1046| mu1046_8(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1046_2 -# 1047| v1047_1(void) = NoOp : -# 1031| v1031_10(void) = ReturnIndirection : &:r1031_8, ~mu1031_3 -# 1031| v1031_11(void) = ReturnVoid : -# 1031| v1031_12(void) = UnmodeledUse : mu* -# 1031| v1031_13(void) = AliasedUse : ~mu1031_3 -# 1031| v1031_14(void) = ExitFunction : +# 1031| v1031_1(void) = EnterFunction : +# 1031| mu1031_2(unknown) = AliasedDefinition : +# 1031| mu1031_3(unknown) = UnmodeledDefinition : +# 1031| r1031_4(glval) = VariableAddress[x] : +# 1031| mu1031_5(int) = InitializeParameter[x] : &:r1031_4 +# 1031| r1031_6(glval) = VariableAddress[s] : +# 1031| mu1031_7(String &) = InitializeParameter[s] : &:r1031_6 +# 1031| r1031_8(String &) = Load : &:r1031_6, ~mu1031_7 +# 1031| mu1031_9(unknown) = InitializeIndirection[s] : &:r1031_8 +# 1032| r1032_1(glval) = VariableAddress[lambda_empty] : +# 1032| r1032_2(glval) = VariableAddress[#temp1032:23] : +# 1032| mu1032_3(decltype([...](...){...})) = Uninitialized[#temp1032:23] : &:r1032_2 +# 1032| r1032_4(decltype([...](...){...})) = Load : &:r1032_2, ~mu1031_3 +# 1032| mu1032_5(decltype([...](...){...})) = Store : &:r1032_1, r1032_4 +# 1033| r1033_1(char) = Constant[65] : +# 1034| r1034_1(glval) = VariableAddress[lambda_ref] : +# 1034| r1034_2(glval) = VariableAddress[#temp1034:20] : +# 1034| mu1034_3(decltype([...](...){...})) = Uninitialized[#temp1034:20] : &:r1034_2 +# 1034| r1034_4(glval) = FieldAddress[s] : r1034_2 +#-----| r0_1(glval) = VariableAddress[s] : +#-----| r0_2(String &) = Load : &:r0_1, ~mu1031_3 +# 1034| r1034_5(glval) = CopyValue : r0_2 +# 1034| r1034_6(String &) = CopyValue : r1034_5 +# 1034| mu1034_7(String &) = Store : &:r1034_4, r1034_6 +# 1034| r1034_8(glval) = FieldAddress[x] : r1034_2 +#-----| r0_3(glval) = VariableAddress[x] : +#-----| r0_4(int &) = CopyValue : r0_3 +#-----| mu0_5(int &) = Store : &:r1034_8, r0_4 +# 1034| r1034_9(decltype([...](...){...})) = Load : &:r1034_2, ~mu1031_3 +# 1034| mu1034_10(decltype([...](...){...})) = Store : &:r1034_1, r1034_9 +# 1035| r1035_1(glval) = VariableAddress[lambda_ref] : +# 1035| r1035_2(glval) = Convert : r1035_1 +# 1035| r1035_3(glval) = FunctionAddress[operator()] : +# 1035| r1035_4(float) = Constant[1.0] : +# 1035| r1035_5(char) = Call : func:r1035_3, this:r1035_2, 0:r1035_4 +# 1035| mu1035_6(unknown) = ^CallSideEffect : ~mu1031_3 +# 1035| v1035_7(void) = ^BufferReadSideEffect[-1] : &:r1035_2, ~mu1031_3 +# 1035| mu1035_8(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1035_2 +# 1036| r1036_1(glval) = VariableAddress[lambda_val] : +# 1036| r1036_2(glval) = VariableAddress[#temp1036:20] : +# 1036| mu1036_3(decltype([...](...){...})) = Uninitialized[#temp1036:20] : &:r1036_2 +# 1036| r1036_4(glval) = FieldAddress[s] : r1036_2 +#-----| r0_6(glval) = FunctionAddress[String] : +#-----| v0_7(void) = Call : func:r0_6, this:r1036_4 +#-----| mu0_8(unknown) = ^CallSideEffect : ~mu1031_3 +#-----| mu0_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r1036_4 +# 1036| r1036_5(glval) = FieldAddress[x] : r1036_2 +#-----| r0_10(glval) = VariableAddress[x] : +#-----| r0_11(int) = Load : &:r0_10, ~mu1031_3 +#-----| mu0_12(int) = Store : &:r1036_5, r0_11 +# 1036| r1036_6(decltype([...](...){...})) = Load : &:r1036_2, ~mu1031_3 +# 1036| mu1036_7(decltype([...](...){...})) = Store : &:r1036_1, r1036_6 +# 1037| r1037_1(glval) = VariableAddress[lambda_val] : +# 1037| r1037_2(glval) = Convert : r1037_1 +# 1037| r1037_3(glval) = FunctionAddress[operator()] : +# 1037| r1037_4(float) = Constant[2.0] : +# 1037| r1037_5(char) = Call : func:r1037_3, this:r1037_2, 0:r1037_4 +# 1037| mu1037_6(unknown) = ^CallSideEffect : ~mu1031_3 +# 1037| v1037_7(void) = ^BufferReadSideEffect[-1] : &:r1037_2, ~mu1031_3 +# 1037| mu1037_8(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1037_2 +# 1038| r1038_1(glval) = VariableAddress[lambda_ref_explicit] : +# 1038| r1038_2(glval) = VariableAddress[#temp1038:29] : +# 1038| mu1038_3(decltype([...](...){...})) = Uninitialized[#temp1038:29] : &:r1038_2 +# 1038| r1038_4(glval) = FieldAddress[s] : r1038_2 +# 1038| r1038_5(glval) = VariableAddress[s] : +# 1038| r1038_6(String &) = Load : &:r1038_5, ~mu1031_3 +# 1038| r1038_7(glval) = CopyValue : r1038_6 +# 1038| r1038_8(String &) = CopyValue : r1038_7 +# 1038| mu1038_9(String &) = Store : &:r1038_4, r1038_8 +# 1038| r1038_10(decltype([...](...){...})) = Load : &:r1038_2, ~mu1031_3 +# 1038| mu1038_11(decltype([...](...){...})) = Store : &:r1038_1, r1038_10 +# 1039| r1039_1(glval) = VariableAddress[lambda_ref_explicit] : +# 1039| r1039_2(glval) = Convert : r1039_1 +# 1039| r1039_3(glval) = FunctionAddress[operator()] : +# 1039| r1039_4(float) = Constant[3.0] : +# 1039| r1039_5(char) = Call : func:r1039_3, this:r1039_2, 0:r1039_4 +# 1039| mu1039_6(unknown) = ^CallSideEffect : ~mu1031_3 +# 1039| v1039_7(void) = ^BufferReadSideEffect[-1] : &:r1039_2, ~mu1031_3 +# 1039| mu1039_8(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1039_2 +# 1040| r1040_1(glval) = VariableAddress[lambda_val_explicit] : +# 1040| r1040_2(glval) = VariableAddress[#temp1040:29] : +# 1040| mu1040_3(decltype([...](...){...})) = Uninitialized[#temp1040:29] : &:r1040_2 +# 1040| r1040_4(glval) = FieldAddress[s] : r1040_2 +#-----| r0_13(glval) = FunctionAddress[String] : +#-----| v0_14(void) = Call : func:r0_13, this:r1040_4 +#-----| mu0_15(unknown) = ^CallSideEffect : ~mu1031_3 +#-----| mu0_16(String) = ^IndirectMayWriteSideEffect[-1] : &:r1040_4 +# 1040| r1040_5(decltype([...](...){...})) = Load : &:r1040_2, ~mu1031_3 +# 1040| mu1040_6(decltype([...](...){...})) = Store : &:r1040_1, r1040_5 +# 1041| r1041_1(glval) = VariableAddress[lambda_val_explicit] : +# 1041| r1041_2(glval) = Convert : r1041_1 +# 1041| r1041_3(glval) = FunctionAddress[operator()] : +# 1041| r1041_4(float) = Constant[4.0] : +# 1041| r1041_5(char) = Call : func:r1041_3, this:r1041_2, 0:r1041_4 +# 1041| mu1041_6(unknown) = ^CallSideEffect : ~mu1031_3 +# 1041| v1041_7(void) = ^BufferReadSideEffect[-1] : &:r1041_2, ~mu1031_3 +# 1041| mu1041_8(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1041_2 +# 1042| r1042_1(glval) = VariableAddress[lambda_mixed_explicit] : +# 1042| r1042_2(glval) = VariableAddress[#temp1042:31] : +# 1042| mu1042_3(decltype([...](...){...})) = Uninitialized[#temp1042:31] : &:r1042_2 +# 1042| r1042_4(glval) = FieldAddress[s] : r1042_2 +# 1042| r1042_5(glval) = VariableAddress[s] : +# 1042| r1042_6(String &) = Load : &:r1042_5, ~mu1031_3 +# 1042| r1042_7(glval) = CopyValue : r1042_6 +# 1042| r1042_8(String &) = CopyValue : r1042_7 +# 1042| mu1042_9(String &) = Store : &:r1042_4, r1042_8 +# 1042| r1042_10(glval) = FieldAddress[x] : r1042_2 +# 1042| r1042_11(glval) = VariableAddress[x] : +# 1042| r1042_12(int) = Load : &:r1042_11, ~mu1031_3 +# 1042| mu1042_13(int) = Store : &:r1042_10, r1042_12 +# 1042| r1042_14(decltype([...](...){...})) = Load : &:r1042_2, ~mu1031_3 +# 1042| mu1042_15(decltype([...](...){...})) = Store : &:r1042_1, r1042_14 +# 1043| r1043_1(glval) = VariableAddress[lambda_mixed_explicit] : +# 1043| r1043_2(glval) = Convert : r1043_1 +# 1043| r1043_3(glval) = FunctionAddress[operator()] : +# 1043| r1043_4(float) = Constant[5.0] : +# 1043| r1043_5(char) = Call : func:r1043_3, this:r1043_2, 0:r1043_4 +# 1043| mu1043_6(unknown) = ^CallSideEffect : ~mu1031_3 +# 1043| v1043_7(void) = ^BufferReadSideEffect[-1] : &:r1043_2, ~mu1031_3 +# 1043| mu1043_8(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1043_2 +# 1044| r1044_1(glval) = VariableAddress[r] : +# 1044| r1044_2(glval) = VariableAddress[x] : +# 1044| r1044_3(int) = Load : &:r1044_2, ~mu1031_3 +# 1044| r1044_4(int) = Constant[1] : +# 1044| r1044_5(int) = Sub : r1044_3, r1044_4 +# 1044| mu1044_6(int) = Store : &:r1044_1, r1044_5 +# 1045| r1045_1(glval) = VariableAddress[lambda_inits] : +# 1045| r1045_2(glval) = VariableAddress[#temp1045:22] : +# 1045| mu1045_3(decltype([...](...){...})) = Uninitialized[#temp1045:22] : &:r1045_2 +# 1045| r1045_4(glval) = FieldAddress[s] : r1045_2 +# 1045| r1045_5(glval) = VariableAddress[s] : +# 1045| r1045_6(String &) = Load : &:r1045_5, ~mu1031_3 +# 1045| r1045_7(glval) = CopyValue : r1045_6 +# 1045| r1045_8(String &) = CopyValue : r1045_7 +# 1045| mu1045_9(String &) = Store : &:r1045_4, r1045_8 +# 1045| r1045_10(glval) = FieldAddress[x] : r1045_2 +# 1045| r1045_11(glval) = VariableAddress[x] : +# 1045| r1045_12(int) = Load : &:r1045_11, ~mu1031_3 +# 1045| mu1045_13(int) = Store : &:r1045_10, r1045_12 +# 1045| r1045_14(glval) = FieldAddress[i] : r1045_2 +# 1045| r1045_15(glval) = VariableAddress[x] : +# 1045| r1045_16(int) = Load : &:r1045_15, ~mu1031_3 +# 1045| r1045_17(int) = Constant[1] : +# 1045| r1045_18(int) = Add : r1045_16, r1045_17 +# 1045| mu1045_19(int) = Store : &:r1045_14, r1045_18 +# 1045| r1045_20(glval) = FieldAddress[j] : r1045_2 +# 1045| r1045_21(glval) = VariableAddress[r] : +# 1045| r1045_22(int &) = CopyValue : r1045_21 +# 1045| mu1045_23(int &) = Store : &:r1045_20, r1045_22 +# 1045| r1045_24(decltype([...](...){...})) = Load : &:r1045_2, ~mu1031_3 +# 1045| mu1045_25(decltype([...](...){...})) = Store : &:r1045_1, r1045_24 +# 1046| r1046_1(glval) = VariableAddress[lambda_inits] : +# 1046| r1046_2(glval) = Convert : r1046_1 +# 1046| r1046_3(glval) = FunctionAddress[operator()] : +# 1046| r1046_4(float) = Constant[6.0] : +# 1046| r1046_5(char) = Call : func:r1046_3, this:r1046_2, 0:r1046_4 +# 1046| mu1046_6(unknown) = ^CallSideEffect : ~mu1031_3 +# 1046| v1046_7(void) = ^BufferReadSideEffect[-1] : &:r1046_2, ~mu1031_3 +# 1046| mu1046_8(decltype([...](...){...})) = ^IndirectMayWriteSideEffect[-1] : &:r1046_2 +# 1047| v1047_1(void) = NoOp : +# 1031| v1031_10(void) = ReturnIndirection : &:r1031_8, ~mu1031_3 +# 1031| v1031_11(void) = ReturnVoid : +# 1031| v1031_12(void) = UnmodeledUse : mu* +# 1031| v1031_13(void) = AliasedUse : ~mu1031_3 +# 1031| v1031_14(void) = ExitFunction : # 1032| char (void Lambda(int, String const&))::(lambda [] type at line 1032, col. 23)::operator()(float) const # 1032| Block 0 # 1032| v1032_1(void) = EnterFunction : -# 1032| mu1032_3(unknown) = AliasedDefinition : -# 1032| mu1032_5(unknown) = UnmodeledDefinition : -# 1032| r1032_7(glval) = InitializeThis : -# 1032| r1032_9(glval) = VariableAddress[f] : -# 1032| mu1032_11(float) = InitializeParameter[f] : &:r1032_9 -# 1032| r1032_13(glval) = VariableAddress[#return] : -# 1032| r1032_15(char) = Constant[65] : -# 1032| mu1032_17(char) = Store : &:r1032_13, r1032_15 -# 1032| r1032_19(glval) = VariableAddress[#return] : -# 1032| v1032_22(void) = ReturnValue : &:r1032_19, ~mu1032_5 -# 1032| v1032_25(void) = UnmodeledUse : mu* -# 1032| v1032_28(void) = AliasedUse : ~mu1032_5 -# 1032| v1032_30(void) = ExitFunction : +# 1032| mu1032_2(unknown) = AliasedDefinition : +# 1032| mu1032_3(unknown) = UnmodeledDefinition : +# 1032| r1032_4(glval) = InitializeThis : +# 1032| r1032_5(glval) = VariableAddress[f] : +# 1032| mu1032_6(float) = InitializeParameter[f] : &:r1032_5 +# 1032| r1032_7(glval) = VariableAddress[#return] : +# 1032| r1032_8(char) = Constant[65] : +# 1032| mu1032_9(char) = Store : &:r1032_7, r1032_8 +# 1032| r1032_10(glval) = VariableAddress[#return] : +# 1032| v1032_11(void) = ReturnValue : &:r1032_10, ~mu1032_3 +# 1032| v1032_12(void) = UnmodeledUse : mu* +# 1032| v1032_13(void) = AliasedUse : ~mu1032_3 +# 1032| v1032_14(void) = ExitFunction : # 1032| char(* (void Lambda(int, String const&))::(lambda [] type at line 1032, col. 23)::operator char (*)(float)() const)(float) # 1032| Block 0 # 1032| v1032_1(void) = EnterFunction : -# 1032| mu1032_3(unknown) = AliasedDefinition : -# 1032| mu1032_5(unknown) = UnmodeledDefinition : -# 1032| r1032_7(glval) = InitializeThis : -# 1032| r1032_9(glval<..(*)(..)>) = VariableAddress[#return] : -# 1032| r1032_11(..(*)(..)) = FunctionAddress[_FUN] : -# 1032| mu1032_13(..(*)(..)) = Store : &:r1032_9, r1032_11 -# 1032| r1032_15(glval<..(*)(..)>) = VariableAddress[#return] : -# 1032| v1032_17(void) = ReturnValue : &:r1032_15, ~mu1032_5 -# 1032| v1032_19(void) = UnmodeledUse : mu* -# 1032| v1032_22(void) = AliasedUse : ~mu1032_5 -# 1032| v1032_25(void) = ExitFunction : +# 1032| mu1032_2(unknown) = AliasedDefinition : +# 1032| mu1032_3(unknown) = UnmodeledDefinition : +# 1032| r1032_4(glval) = InitializeThis : +# 1032| r1032_5(glval<..(*)(..)>) = VariableAddress[#return] : +# 1032| r1032_6(..(*)(..)) = FunctionAddress[_FUN] : +# 1032| mu1032_7(..(*)(..)) = Store : &:r1032_5, r1032_6 +# 1032| r1032_8(glval<..(*)(..)>) = VariableAddress[#return] : +# 1032| v1032_9(void) = ReturnValue : &:r1032_8, ~mu1032_3 +# 1032| v1032_10(void) = UnmodeledUse : mu* +# 1032| v1032_11(void) = AliasedUse : ~mu1032_3 +# 1032| v1032_12(void) = ExitFunction : # 1034| char (void Lambda(int, String const&))::(lambda [] type at line 1034, col. 21)::operator()(float) const # 1034| Block 0 -# 1034| v1034_1(void) = EnterFunction : -# 1034| mu1034_2(unknown) = AliasedDefinition : -# 1034| mu1034_3(unknown) = UnmodeledDefinition : -# 1034| r1034_4(glval) = InitializeThis : -# 1034| r1034_5(glval) = VariableAddress[f] : -# 1034| mu1034_6(float) = InitializeParameter[f] : &:r1034_5 -# 1034| r1034_7(glval) = VariableAddress[#return] : -#-----| r0_18(lambda [] type at line 1034, col. 21 *) = CopyValue : r1034_4 -#-----| r0_29(glval) = FieldAddress[s] : r0_18 -#-----| r0_40(String &) = Load : &:r0_29, ~mu1034_3 -# 1034| r1034_8(glval) = CopyValue : r0_40 -# 1034| r1034_9(glval) = FunctionAddress[c_str] : -# 1034| r1034_10(char *) = Call : func:r1034_9, this:r1034_8 -# 1034| mu1034_11(unknown) = ^CallSideEffect : ~mu1034_3 -# 1034| v1034_12(void) = ^BufferReadSideEffect[-1] : &:r1034_8, ~mu1034_3 -# 1034| mu1034_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r1034_8 -#-----| r0_74(lambda [] type at line 1034, col. 21 *) = CopyValue : r1034_4 -#-----| r0_82(glval) = FieldAddress[x] : r0_74 -#-----| r0_87(int &) = Load : &:r0_82, ~mu1034_3 -# 1034| r1034_18(int) = Load : &:r0_87, ~mu1034_3 -# 1034| r1034_19(glval) = PointerAdd[1] : r1034_10, r1034_18 -# 1034| r1034_20(char) = Load : &:r1034_19, ~mu1034_3 -# 1034| mu1034_22(char) = Store : &:r1034_7, r1034_20 -# 1034| r1034_24(glval) = VariableAddress[#return] : -# 1034| v1034_26(void) = ReturnValue : &:r1034_24, ~mu1034_3 -# 1034| v1034_28(void) = UnmodeledUse : mu* -# 1034| v1034_29(void) = AliasedUse : ~mu1034_3 -# 1034| v1034_30(void) = ExitFunction : +# 1034| v1034_1(void) = EnterFunction : +# 1034| mu1034_2(unknown) = AliasedDefinition : +# 1034| mu1034_3(unknown) = UnmodeledDefinition : +# 1034| r1034_4(glval) = InitializeThis : +# 1034| r1034_5(glval) = VariableAddress[f] : +# 1034| mu1034_6(float) = InitializeParameter[f] : &:r1034_5 +# 1034| r1034_7(glval) = VariableAddress[#return] : +#-----| r0_1(lambda [] type at line 1034, col. 21 *) = CopyValue : r1034_4 +#-----| r0_2(glval) = FieldAddress[s] : r0_1 +#-----| r0_3(String &) = Load : &:r0_2, ~mu1034_3 +# 1034| r1034_8(glval) = CopyValue : r0_3 +# 1034| r1034_9(glval) = FunctionAddress[c_str] : +# 1034| r1034_10(char *) = Call : func:r1034_9, this:r1034_8 +# 1034| mu1034_11(unknown) = ^CallSideEffect : ~mu1034_3 +# 1034| v1034_12(void) = ^BufferReadSideEffect[-1] : &:r1034_8, ~mu1034_3 +# 1034| mu1034_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r1034_8 +#-----| r0_4(lambda [] type at line 1034, col. 21 *) = CopyValue : r1034_4 +#-----| r0_5(glval) = FieldAddress[x] : r0_4 +#-----| r0_6(int &) = Load : &:r0_5, ~mu1034_3 +# 1034| r1034_14(int) = Load : &:r0_6, ~mu1034_3 +# 1034| r1034_15(glval) = PointerAdd[1] : r1034_10, r1034_14 +# 1034| r1034_16(char) = Load : &:r1034_15, ~mu1034_3 +# 1034| mu1034_17(char) = Store : &:r1034_7, r1034_16 +# 1034| r1034_18(glval) = VariableAddress[#return] : +# 1034| v1034_19(void) = ReturnValue : &:r1034_18, ~mu1034_3 +# 1034| v1034_20(void) = UnmodeledUse : mu* +# 1034| v1034_21(void) = AliasedUse : ~mu1034_3 +# 1034| v1034_22(void) = ExitFunction : # 1036| void (void Lambda(int, String const&))::(lambda [] type at line 1036, col. 21)::~() # 1036| Block 0 # 1036| v1036_1(void) = EnterFunction : -# 1036| mu1036_3(unknown) = AliasedDefinition : -# 1036| mu1036_5(unknown) = UnmodeledDefinition : -# 1036| r1036_7(glval) = InitializeThis : +# 1036| mu1036_2(unknown) = AliasedDefinition : +# 1036| mu1036_3(unknown) = UnmodeledDefinition : +# 1036| r1036_4(glval) = InitializeThis : #-----| v0_1(void) = NoOp : -# 1036| r1036_10(glval) = FieldAddress[s] : r1036_7 -# 1036| r1036_12(glval) = FunctionAddress[~String] : -# 1036| v1036_14(void) = Call : func:r1036_12, this:r1036_10 -# 1036| mu1036_15(unknown) = ^CallSideEffect : ~mu1036_5 -# 1036| v1036_16(void) = ReturnVoid : -# 1036| v1036_18(void) = UnmodeledUse : mu* -# 1036| v1036_20(void) = AliasedUse : ~mu1036_5 -# 1036| v1036_22(void) = ExitFunction : +# 1036| r1036_5(glval) = FieldAddress[s] : r1036_4 +# 1036| r1036_6(glval) = FunctionAddress[~String] : +# 1036| v1036_7(void) = Call : func:r1036_6, this:r1036_5 +# 1036| mu1036_8(unknown) = ^CallSideEffect : ~mu1036_3 +# 1036| v1036_9(void) = ReturnVoid : +# 1036| v1036_10(void) = UnmodeledUse : mu* +# 1036| v1036_11(void) = AliasedUse : ~mu1036_3 +# 1036| v1036_12(void) = ExitFunction : # 1036| char (void Lambda(int, String const&))::(lambda [] type at line 1036, col. 21)::operator()(float) const # 1036| Block 0 -# 1036| v1036_1(void) = EnterFunction : -# 1036| mu1036_3(unknown) = AliasedDefinition : -# 1036| mu1036_5(unknown) = UnmodeledDefinition : -# 1036| r1036_7(glval) = InitializeThis : -# 1036| r1036_9(glval) = VariableAddress[f] : -# 1036| mu1036_10(float) = InitializeParameter[f] : &:r1036_9 -# 1036| r1036_12(glval) = VariableAddress[#return] : -#-----| r0_18(lambda [] type at line 1036, col. 21 *) = CopyValue : r1036_7 -#-----| r0_29(glval) = FieldAddress[s] : r0_18 -# 1036| r1036_16(glval) = FunctionAddress[c_str] : -# 1036| r1036_18(char *) = Call : func:r1036_16, this:r0_29 -# 1036| mu1036_20(unknown) = ^CallSideEffect : ~mu1036_5 -#-----| v0_52(void) = ^BufferReadSideEffect[-1] : &:r0_29, ~mu1036_5 -#-----| mu0_57(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_29 -#-----| r0_62(lambda [] type at line 1036, col. 21 *) = CopyValue : r1036_7 -#-----| r0_69(glval) = FieldAddress[x] : r0_62 -#-----| r0_74(int) = Load : &:r0_69, ~mu1036_5 -# 1036| r1036_23(glval) = PointerAdd[1] : r1036_18, r0_74 -# 1036| r1036_24(char) = Load : &:r1036_23, ~mu1036_5 -# 1036| mu1036_25(char) = Store : &:r1036_12, r1036_24 -# 1036| r1036_26(glval) = VariableAddress[#return] : -# 1036| v1036_27(void) = ReturnValue : &:r1036_26, ~mu1036_5 -# 1036| v1036_28(void) = UnmodeledUse : mu* -# 1036| v1036_29(void) = AliasedUse : ~mu1036_5 -# 1036| v1036_30(void) = ExitFunction : +# 1036| v1036_1(void) = EnterFunction : +# 1036| mu1036_2(unknown) = AliasedDefinition : +# 1036| mu1036_3(unknown) = UnmodeledDefinition : +# 1036| r1036_4(glval) = InitializeThis : +# 1036| r1036_5(glval) = VariableAddress[f] : +# 1036| mu1036_6(float) = InitializeParameter[f] : &:r1036_5 +# 1036| r1036_7(glval) = VariableAddress[#return] : +#-----| r0_1(lambda [] type at line 1036, col. 21 *) = CopyValue : r1036_4 +#-----| r0_2(glval) = FieldAddress[s] : r0_1 +# 1036| r1036_8(glval) = FunctionAddress[c_str] : +# 1036| r1036_9(char *) = Call : func:r1036_8, this:r0_2 +# 1036| mu1036_10(unknown) = ^CallSideEffect : ~mu1036_3 +#-----| v0_3(void) = ^BufferReadSideEffect[-1] : &:r0_2, ~mu1036_3 +#-----| mu0_4(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_2 +#-----| r0_5(lambda [] type at line 1036, col. 21 *) = CopyValue : r1036_4 +#-----| r0_6(glval) = FieldAddress[x] : r0_5 +#-----| r0_7(int) = Load : &:r0_6, ~mu1036_3 +# 1036| r1036_11(glval) = PointerAdd[1] : r1036_9, r0_7 +# 1036| r1036_12(char) = Load : &:r1036_11, ~mu1036_3 +# 1036| mu1036_13(char) = Store : &:r1036_7, r1036_12 +# 1036| r1036_14(glval) = VariableAddress[#return] : +# 1036| v1036_15(void) = ReturnValue : &:r1036_14, ~mu1036_3 +# 1036| v1036_16(void) = UnmodeledUse : mu* +# 1036| v1036_17(void) = AliasedUse : ~mu1036_3 +# 1036| v1036_18(void) = ExitFunction : # 1038| char (void Lambda(int, String const&))::(lambda [] type at line 1038, col. 30)::operator()(float) const # 1038| Block 0 -# 1038| v1038_1(void) = EnterFunction : -# 1038| mu1038_2(unknown) = AliasedDefinition : -# 1038| mu1038_3(unknown) = UnmodeledDefinition : -# 1038| r1038_4(glval) = InitializeThis : -# 1038| r1038_5(glval) = VariableAddress[f] : -# 1038| mu1038_6(float) = InitializeParameter[f] : &:r1038_5 -# 1038| r1038_7(glval) = VariableAddress[#return] : -#-----| r0_18(lambda [] type at line 1038, col. 30 *) = CopyValue : r1038_4 -#-----| r0_29(glval) = FieldAddress[s] : r0_18 -#-----| r0_40(String &) = Load : &:r0_29, ~mu1038_3 -# 1038| r1038_8(glval) = CopyValue : r0_40 -# 1038| r1038_9(glval) = FunctionAddress[c_str] : -# 1038| r1038_10(char *) = Call : func:r1038_9, this:r1038_8 -# 1038| mu1038_11(unknown) = ^CallSideEffect : ~mu1038_3 -# 1038| v1038_12(void) = ^BufferReadSideEffect[-1] : &:r1038_8, ~mu1038_3 -# 1038| mu1038_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r1038_8 -# 1038| r1038_14(int) = Constant[0] : -# 1038| r1038_15(glval) = PointerAdd[1] : r1038_10, r1038_14 -# 1038| r1038_16(char) = Load : &:r1038_15, ~mu1038_3 -# 1038| mu1038_17(char) = Store : &:r1038_7, r1038_16 -# 1038| r1038_18(glval) = VariableAddress[#return] : -# 1038| v1038_19(void) = ReturnValue : &:r1038_18, ~mu1038_3 -# 1038| v1038_20(void) = UnmodeledUse : mu* -# 1038| v1038_21(void) = AliasedUse : ~mu1038_3 -# 1038| v1038_22(void) = ExitFunction : +# 1038| v1038_1(void) = EnterFunction : +# 1038| mu1038_2(unknown) = AliasedDefinition : +# 1038| mu1038_3(unknown) = UnmodeledDefinition : +# 1038| r1038_4(glval) = InitializeThis : +# 1038| r1038_5(glval) = VariableAddress[f] : +# 1038| mu1038_6(float) = InitializeParameter[f] : &:r1038_5 +# 1038| r1038_7(glval) = VariableAddress[#return] : +#-----| r0_1(lambda [] type at line 1038, col. 30 *) = CopyValue : r1038_4 +#-----| r0_2(glval) = FieldAddress[s] : r0_1 +#-----| r0_3(String &) = Load : &:r0_2, ~mu1038_3 +# 1038| r1038_8(glval) = CopyValue : r0_3 +# 1038| r1038_9(glval) = FunctionAddress[c_str] : +# 1038| r1038_10(char *) = Call : func:r1038_9, this:r1038_8 +# 1038| mu1038_11(unknown) = ^CallSideEffect : ~mu1038_3 +# 1038| v1038_12(void) = ^BufferReadSideEffect[-1] : &:r1038_8, ~mu1038_3 +# 1038| mu1038_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r1038_8 +# 1038| r1038_14(int) = Constant[0] : +# 1038| r1038_15(glval) = PointerAdd[1] : r1038_10, r1038_14 +# 1038| r1038_16(char) = Load : &:r1038_15, ~mu1038_3 +# 1038| mu1038_17(char) = Store : &:r1038_7, r1038_16 +# 1038| r1038_18(glval) = VariableAddress[#return] : +# 1038| v1038_19(void) = ReturnValue : &:r1038_18, ~mu1038_3 +# 1038| v1038_20(void) = UnmodeledUse : mu* +# 1038| v1038_21(void) = AliasedUse : ~mu1038_3 +# 1038| v1038_22(void) = ExitFunction : # 1040| void (void Lambda(int, String const&))::(lambda [] type at line 1040, col. 30)::~() # 1040| Block 0 # 1040| v1040_1(void) = EnterFunction : -# 1040| mu1040_3(unknown) = AliasedDefinition : -# 1040| mu1040_5(unknown) = UnmodeledDefinition : -# 1040| r1040_7(glval) = InitializeThis : +# 1040| mu1040_2(unknown) = AliasedDefinition : +# 1040| mu1040_3(unknown) = UnmodeledDefinition : +# 1040| r1040_4(glval) = InitializeThis : #-----| v0_1(void) = NoOp : -# 1040| r1040_10(glval) = FieldAddress[s] : r1040_7 -# 1040| r1040_12(glval) = FunctionAddress[~String] : -# 1040| v1040_14(void) = Call : func:r1040_12, this:r1040_10 -# 1040| mu1040_15(unknown) = ^CallSideEffect : ~mu1040_5 -# 1040| v1040_16(void) = ReturnVoid : -# 1040| v1040_18(void) = UnmodeledUse : mu* -# 1040| v1040_20(void) = AliasedUse : ~mu1040_5 -# 1040| v1040_22(void) = ExitFunction : +# 1040| r1040_5(glval) = FieldAddress[s] : r1040_4 +# 1040| r1040_6(glval) = FunctionAddress[~String] : +# 1040| v1040_7(void) = Call : func:r1040_6, this:r1040_5 +# 1040| mu1040_8(unknown) = ^CallSideEffect : ~mu1040_3 +# 1040| v1040_9(void) = ReturnVoid : +# 1040| v1040_10(void) = UnmodeledUse : mu* +# 1040| v1040_11(void) = AliasedUse : ~mu1040_3 +# 1040| v1040_12(void) = ExitFunction : # 1040| char (void Lambda(int, String const&))::(lambda [] type at line 1040, col. 30)::operator()(float) const # 1040| Block 0 -# 1040| v1040_1(void) = EnterFunction : -# 1040| mu1040_3(unknown) = AliasedDefinition : -# 1040| mu1040_5(unknown) = UnmodeledDefinition : -# 1040| r1040_7(glval) = InitializeThis : -# 1040| r1040_9(glval) = VariableAddress[f] : -# 1040| mu1040_10(float) = InitializeParameter[f] : &:r1040_9 -# 1040| r1040_12(glval) = VariableAddress[#return] : -#-----| r0_18(lambda [] type at line 1040, col. 30 *) = CopyValue : r1040_7 -#-----| r0_29(glval) = FieldAddress[s] : r0_18 -# 1040| r1040_16(glval) = FunctionAddress[c_str] : -# 1040| r1040_18(char *) = Call : func:r1040_16, this:r0_29 -# 1040| mu1040_20(unknown) = ^CallSideEffect : ~mu1040_5 -#-----| v0_52(void) = ^BufferReadSideEffect[-1] : &:r0_29, ~mu1040_5 -#-----| mu0_57(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_29 -# 1040| r1040_23(int) = Constant[0] : -# 1040| r1040_24(glval) = PointerAdd[1] : r1040_18, r1040_23 -# 1040| r1040_25(char) = Load : &:r1040_24, ~mu1040_5 -# 1040| mu1040_26(char) = Store : &:r1040_12, r1040_25 -# 1040| r1040_27(glval) = VariableAddress[#return] : -# 1040| v1040_28(void) = ReturnValue : &:r1040_27, ~mu1040_5 -# 1040| v1040_29(void) = UnmodeledUse : mu* -# 1040| v1040_30(void) = AliasedUse : ~mu1040_5 -# 1040| v1040_31(void) = ExitFunction : +# 1040| v1040_1(void) = EnterFunction : +# 1040| mu1040_2(unknown) = AliasedDefinition : +# 1040| mu1040_3(unknown) = UnmodeledDefinition : +# 1040| r1040_4(glval) = InitializeThis : +# 1040| r1040_5(glval) = VariableAddress[f] : +# 1040| mu1040_6(float) = InitializeParameter[f] : &:r1040_5 +# 1040| r1040_7(glval) = VariableAddress[#return] : +#-----| r0_1(lambda [] type at line 1040, col. 30 *) = CopyValue : r1040_4 +#-----| r0_2(glval) = FieldAddress[s] : r0_1 +# 1040| r1040_8(glval) = FunctionAddress[c_str] : +# 1040| r1040_9(char *) = Call : func:r1040_8, this:r0_2 +# 1040| mu1040_10(unknown) = ^CallSideEffect : ~mu1040_3 +#-----| v0_3(void) = ^BufferReadSideEffect[-1] : &:r0_2, ~mu1040_3 +#-----| mu0_4(String) = ^IndirectMayWriteSideEffect[-1] : &:r0_2 +# 1040| r1040_11(int) = Constant[0] : +# 1040| r1040_12(glval) = PointerAdd[1] : r1040_9, r1040_11 +# 1040| r1040_13(char) = Load : &:r1040_12, ~mu1040_3 +# 1040| mu1040_14(char) = Store : &:r1040_7, r1040_13 +# 1040| r1040_15(glval) = VariableAddress[#return] : +# 1040| v1040_16(void) = ReturnValue : &:r1040_15, ~mu1040_3 +# 1040| v1040_17(void) = UnmodeledUse : mu* +# 1040| v1040_18(void) = AliasedUse : ~mu1040_3 +# 1040| v1040_19(void) = ExitFunction : # 1042| char (void Lambda(int, String const&))::(lambda [] type at line 1042, col. 32)::operator()(float) const # 1042| Block 0 -# 1042| v1042_1(void) = EnterFunction : -# 1042| mu1042_2(unknown) = AliasedDefinition : -# 1042| mu1042_3(unknown) = UnmodeledDefinition : -# 1042| r1042_4(glval) = InitializeThis : -# 1042| r1042_5(glval) = VariableAddress[f] : -# 1042| mu1042_6(float) = InitializeParameter[f] : &:r1042_5 -# 1042| r1042_7(glval) = VariableAddress[#return] : -#-----| r0_18(lambda [] type at line 1042, col. 32 *) = CopyValue : r1042_4 -#-----| r0_29(glval) = FieldAddress[s] : r0_18 -#-----| r0_40(String &) = Load : &:r0_29, ~mu1042_3 -# 1042| r1042_8(glval) = CopyValue : r0_40 -# 1042| r1042_9(glval) = FunctionAddress[c_str] : -# 1042| r1042_10(char *) = Call : func:r1042_9, this:r1042_8 -# 1042| mu1042_11(unknown) = ^CallSideEffect : ~mu1042_3 -# 1042| v1042_12(void) = ^BufferReadSideEffect[-1] : &:r1042_8, ~mu1042_3 -# 1042| mu1042_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r1042_8 -#-----| r0_74(lambda [] type at line 1042, col. 32 *) = CopyValue : r1042_4 -#-----| r0_82(glval) = FieldAddress[x] : r0_74 -#-----| r0_87(int) = Load : &:r0_82, ~mu1042_3 -# 1042| r1042_14(glval) = PointerAdd[1] : r1042_10, r0_87 -# 1042| r1042_15(char) = Load : &:r1042_14, ~mu1042_3 -# 1042| mu1042_16(char) = Store : &:r1042_7, r1042_15 -# 1042| r1042_17(glval) = VariableAddress[#return] : -# 1042| v1042_18(void) = ReturnValue : &:r1042_17, ~mu1042_3 -# 1042| v1042_19(void) = UnmodeledUse : mu* -# 1042| v1042_20(void) = AliasedUse : ~mu1042_3 -# 1042| v1042_21(void) = ExitFunction : +# 1042| v1042_1(void) = EnterFunction : +# 1042| mu1042_2(unknown) = AliasedDefinition : +# 1042| mu1042_3(unknown) = UnmodeledDefinition : +# 1042| r1042_4(glval) = InitializeThis : +# 1042| r1042_5(glval) = VariableAddress[f] : +# 1042| mu1042_6(float) = InitializeParameter[f] : &:r1042_5 +# 1042| r1042_7(glval) = VariableAddress[#return] : +#-----| r0_1(lambda [] type at line 1042, col. 32 *) = CopyValue : r1042_4 +#-----| r0_2(glval) = FieldAddress[s] : r0_1 +#-----| r0_3(String &) = Load : &:r0_2, ~mu1042_3 +# 1042| r1042_8(glval) = CopyValue : r0_3 +# 1042| r1042_9(glval) = FunctionAddress[c_str] : +# 1042| r1042_10(char *) = Call : func:r1042_9, this:r1042_8 +# 1042| mu1042_11(unknown) = ^CallSideEffect : ~mu1042_3 +# 1042| v1042_12(void) = ^BufferReadSideEffect[-1] : &:r1042_8, ~mu1042_3 +# 1042| mu1042_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r1042_8 +#-----| r0_4(lambda [] type at line 1042, col. 32 *) = CopyValue : r1042_4 +#-----| r0_5(glval) = FieldAddress[x] : r0_4 +#-----| r0_6(int) = Load : &:r0_5, ~mu1042_3 +# 1042| r1042_14(glval) = PointerAdd[1] : r1042_10, r0_6 +# 1042| r1042_15(char) = Load : &:r1042_14, ~mu1042_3 +# 1042| mu1042_16(char) = Store : &:r1042_7, r1042_15 +# 1042| r1042_17(glval) = VariableAddress[#return] : +# 1042| v1042_18(void) = ReturnValue : &:r1042_17, ~mu1042_3 +# 1042| v1042_19(void) = UnmodeledUse : mu* +# 1042| v1042_20(void) = AliasedUse : ~mu1042_3 +# 1042| v1042_21(void) = ExitFunction : # 1045| char (void Lambda(int, String const&))::(lambda [] type at line 1045, col. 23)::operator()(float) const # 1045| Block 0 -# 1045| v1045_1(void) = EnterFunction : -# 1045| mu1045_2(unknown) = AliasedDefinition : -# 1045| mu1045_3(unknown) = UnmodeledDefinition : -# 1045| r1045_4(glval) = InitializeThis : -# 1045| r1045_5(glval) = VariableAddress[f] : -# 1045| mu1045_6(float) = InitializeParameter[f] : &:r1045_5 -# 1045| r1045_7(glval) = VariableAddress[#return] : -#-----| r0_18(lambda [] type at line 1045, col. 23 *) = CopyValue : r1045_4 -#-----| r0_29(glval) = FieldAddress[s] : r0_18 -#-----| r0_40(String &) = Load : &:r0_29, ~mu1045_3 -# 1045| r1045_8(glval) = CopyValue : r0_40 -# 1045| r1045_9(glval) = FunctionAddress[c_str] : -# 1045| r1045_10(char *) = Call : func:r1045_9, this:r1045_8 -# 1045| mu1045_11(unknown) = ^CallSideEffect : ~mu1045_3 -# 1045| v1045_12(void) = ^BufferReadSideEffect[-1] : &:r1045_8, ~mu1045_3 -# 1045| mu1045_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r1045_8 -#-----| r0_74(lambda [] type at line 1045, col. 23 *) = CopyValue : r1045_4 -#-----| r0_82(glval) = FieldAddress[x] : r0_74 -#-----| r0_87(int) = Load : &:r0_82, ~mu1045_3 -#-----| r0_90(lambda [] type at line 1045, col. 23 *) = CopyValue : r1045_4 -# 1045| r1045_14(glval) = FieldAddress[i] : r0_90 -# 1045| r1045_15(int) = Load : &:r1045_14, ~mu1045_3 -# 1045| r1045_16(int) = Add : r0_87, r1045_15 -#-----| r0_106(lambda [] type at line 1045, col. 23 *) = CopyValue : r1045_4 -# 1045| r1045_17(glval) = FieldAddress[j] : r0_106 -# 1045| r1045_18(int &) = Load : &:r1045_17, ~mu1045_3 -# 1045| r1045_19(int) = Load : &:r1045_18, ~mu1045_3 -# 1045| r1045_20(int) = Sub : r1045_16, r1045_19 -# 1045| r1045_21(glval) = PointerAdd[1] : r1045_10, r1045_20 -# 1045| r1045_22(char) = Load : &:r1045_21, ~mu1045_3 -# 1045| mu1045_23(char) = Store : &:r1045_7, r1045_22 -# 1045| r1045_24(glval) = VariableAddress[#return] : -# 1045| v1045_25(void) = ReturnValue : &:r1045_24, ~mu1045_3 -# 1045| v1045_26(void) = UnmodeledUse : mu* -# 1045| v1045_27(void) = AliasedUse : ~mu1045_3 -# 1045| v1045_28(void) = ExitFunction : +# 1045| v1045_1(void) = EnterFunction : +# 1045| mu1045_2(unknown) = AliasedDefinition : +# 1045| mu1045_3(unknown) = UnmodeledDefinition : +# 1045| r1045_4(glval) = InitializeThis : +# 1045| r1045_5(glval) = VariableAddress[f] : +# 1045| mu1045_6(float) = InitializeParameter[f] : &:r1045_5 +# 1045| r1045_7(glval) = VariableAddress[#return] : +#-----| r0_1(lambda [] type at line 1045, col. 23 *) = CopyValue : r1045_4 +#-----| r0_2(glval) = FieldAddress[s] : r0_1 +#-----| r0_3(String &) = Load : &:r0_2, ~mu1045_3 +# 1045| r1045_8(glval) = CopyValue : r0_3 +# 1045| r1045_9(glval) = FunctionAddress[c_str] : +# 1045| r1045_10(char *) = Call : func:r1045_9, this:r1045_8 +# 1045| mu1045_11(unknown) = ^CallSideEffect : ~mu1045_3 +# 1045| v1045_12(void) = ^BufferReadSideEffect[-1] : &:r1045_8, ~mu1045_3 +# 1045| mu1045_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r1045_8 +#-----| r0_4(lambda [] type at line 1045, col. 23 *) = CopyValue : r1045_4 +#-----| r0_5(glval) = FieldAddress[x] : r0_4 +#-----| r0_6(int) = Load : &:r0_5, ~mu1045_3 +#-----| r0_7(lambda [] type at line 1045, col. 23 *) = CopyValue : r1045_4 +# 1045| r1045_14(glval) = FieldAddress[i] : r0_7 +# 1045| r1045_15(int) = Load : &:r1045_14, ~mu1045_3 +# 1045| r1045_16(int) = Add : r0_6, r1045_15 +#-----| r0_8(lambda [] type at line 1045, col. 23 *) = CopyValue : r1045_4 +# 1045| r1045_17(glval) = FieldAddress[j] : r0_8 +# 1045| r1045_18(int &) = Load : &:r1045_17, ~mu1045_3 +# 1045| r1045_19(int) = Load : &:r1045_18, ~mu1045_3 +# 1045| r1045_20(int) = Sub : r1045_16, r1045_19 +# 1045| r1045_21(glval) = PointerAdd[1] : r1045_10, r1045_20 +# 1045| r1045_22(char) = Load : &:r1045_21, ~mu1045_3 +# 1045| mu1045_23(char) = Store : &:r1045_7, r1045_22 +# 1045| r1045_24(glval) = VariableAddress[#return] : +# 1045| v1045_25(void) = ReturnValue : &:r1045_24, ~mu1045_3 +# 1045| v1045_26(void) = UnmodeledUse : mu* +# 1045| v1045_27(void) = AliasedUse : ~mu1045_3 +# 1045| v1045_28(void) = ExitFunction : # 1068| void RangeBasedFor(vector const&) # 1068| Block 0 @@ -5405,60 +5405,60 @@ ir.cpp: # 1069| r1069_5(vector &) = CopyValue : r1069_4 # 1069| mu1069_6(vector &) = Store : &:r1069_1, r1069_5 # 1069| r1069_7(glval) = VariableAddress[(__begin)] : -#-----| r0_62(glval &>) = VariableAddress[(__range)] : -#-----| r0_69(vector &) = Load : &:r0_62, ~mu1068_3 -#-----| r0_74(glval>) = CopyValue : r0_69 +#-----| r0_1(glval &>) = VariableAddress[(__range)] : +#-----| r0_2(vector &) = Load : &:r0_1, ~mu1068_3 +#-----| r0_3(glval>) = CopyValue : r0_2 # 1069| r1069_8(glval) = FunctionAddress[begin] : -# 1069| r1069_9(iterator) = Call : func:r1069_8, this:r0_74 +# 1069| r1069_9(iterator) = Call : func:r1069_8, this:r0_3 # 1069| mu1069_10(unknown) = ^CallSideEffect : ~mu1068_3 -#-----| v0_94(void) = ^BufferReadSideEffect[-1] : &:r0_74, ~mu1068_3 -#-----| mu0_99(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_74 +#-----| v0_4(void) = ^BufferReadSideEffect[-1] : &:r0_3, ~mu1068_3 +#-----| mu0_5(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_3 # 1069| mu1069_11(iterator) = Store : &:r1069_7, r1069_9 # 1069| r1069_12(glval) = VariableAddress[(__end)] : -#-----| r0_110(glval &>) = VariableAddress[(__range)] : -#-----| r0_115(vector &) = Load : &:r0_110, ~mu1068_3 -#-----| r0_121(glval>) = CopyValue : r0_115 +#-----| r0_6(glval &>) = VariableAddress[(__range)] : +#-----| r0_7(vector &) = Load : &:r0_6, ~mu1068_3 +#-----| r0_8(glval>) = CopyValue : r0_7 # 1069| r1069_13(glval) = FunctionAddress[end] : -# 1069| r1069_14(iterator) = Call : func:r1069_13, this:r0_121 +# 1069| r1069_14(iterator) = Call : func:r1069_13, this:r0_8 # 1069| mu1069_15(unknown) = ^CallSideEffect : ~mu1068_3 -#-----| v0_134(void) = ^BufferReadSideEffect[-1] : &:r0_121, ~mu1068_3 -#-----| mu0_138(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_121 +#-----| v0_9(void) = ^BufferReadSideEffect[-1] : &:r0_8, ~mu1068_3 +#-----| mu0_10(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_8 # 1069| mu1069_16(iterator) = Store : &:r1069_12, r1069_14 #-----| Goto -> Block 6 #-----| Block 1 -#-----| r0_179(glval) = VariableAddress[(__begin)] : -#-----| r0_180(glval) = Convert : r0_179 +#-----| r0_11(glval) = VariableAddress[(__begin)] : +#-----| r0_12(glval) = Convert : r0_11 # 1075| r1075_1(glval) = FunctionAddress[operator!=] : -#-----| r0_181(glval) = VariableAddress[(__end)] : -#-----| r0_182(iterator) = Load : &:r0_181, ~mu1068_3 -# 1075| r1075_2(bool) = Call : func:r1075_1, this:r0_180, 0:r0_182 +#-----| r0_13(glval) = VariableAddress[(__end)] : +#-----| r0_14(iterator) = Load : &:r0_13, ~mu1068_3 +# 1075| r1075_2(bool) = Call : func:r1075_1, this:r0_12, 0:r0_14 # 1075| mu1075_3(unknown) = ^CallSideEffect : ~mu1068_3 -#-----| v0_183(void) = ^BufferReadSideEffect[-1] : &:r0_180, ~mu1068_3 -#-----| mu0_184(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_180 +#-----| v0_15(void) = ^BufferReadSideEffect[-1] : &:r0_12, ~mu1068_3 +#-----| mu0_16(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_12 # 1075| v1075_4(void) = ConditionalBranch : r1075_2 #-----| False -> Block 5 #-----| True -> Block 3 #-----| Block 2 -#-----| r0_185(glval) = VariableAddress[(__begin)] : +#-----| r0_17(glval) = VariableAddress[(__begin)] : # 1075| r1075_5(glval) = FunctionAddress[operator++] : -# 1075| r1075_6(iterator &) = Call : func:r1075_5, this:r0_185 +# 1075| r1075_6(iterator &) = Call : func:r1075_5, this:r0_17 # 1075| mu1075_7(unknown) = ^CallSideEffect : ~mu1068_3 -#-----| v0_186(void) = ^BufferReadSideEffect[-1] : &:r0_185, ~mu1068_3 -#-----| mu0_187(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_185 +#-----| v0_18(void) = ^BufferReadSideEffect[-1] : &:r0_17, ~mu1068_3 +#-----| mu0_19(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_17 # 1075| r1075_8(glval) = CopyValue : r1075_6 #-----| Goto (back edge) -> Block 1 # 1075| Block 3 # 1075| r1075_9(glval) = VariableAddress[e] : -#-----| r0_188(glval) = VariableAddress[(__begin)] : -#-----| r0_189(glval) = Convert : r0_188 +#-----| r0_20(glval) = VariableAddress[(__begin)] : +#-----| r0_21(glval) = Convert : r0_20 # 1075| r1075_10(glval) = FunctionAddress[operator*] : -# 1075| r1075_11(int &) = Call : func:r1075_10, this:r0_189 +# 1075| r1075_11(int &) = Call : func:r1075_10, this:r0_21 # 1075| mu1075_12(unknown) = ^CallSideEffect : ~mu1068_3 -#-----| v0_190(void) = ^BufferReadSideEffect[-1] : &:r0_189, ~mu1068_3 -#-----| mu0_191(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_189 +#-----| v0_22(void) = ^BufferReadSideEffect[-1] : &:r0_21, ~mu1068_3 +#-----| mu0_23(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_21 # 1075| r1075_13(glval) = CopyValue : r1075_11 # 1075| r1075_14(glval) = Convert : r1075_13 # 1075| r1075_15(int &) = CopyValue : r1075_14 @@ -5486,28 +5486,28 @@ ir.cpp: # 1068| v1068_12(void) = ExitFunction : #-----| Block 6 -#-----| r0_192(glval) = VariableAddress[(__begin)] : -#-----| r0_193(glval) = Convert : r0_192 +#-----| r0_24(glval) = VariableAddress[(__begin)] : +#-----| r0_25(glval) = Convert : r0_24 # 1069| r1069_17(glval) = FunctionAddress[operator!=] : -#-----| r0_194(glval) = VariableAddress[(__end)] : -#-----| r0_195(iterator) = Load : &:r0_194, ~mu1068_3 -# 1069| r1069_18(bool) = Call : func:r1069_17, this:r0_193, 0:r0_195 +#-----| r0_26(glval) = VariableAddress[(__end)] : +#-----| r0_27(iterator) = Load : &:r0_26, ~mu1068_3 +# 1069| r1069_18(bool) = Call : func:r1069_17, this:r0_25, 0:r0_27 # 1069| mu1069_19(unknown) = ^CallSideEffect : ~mu1068_3 -#-----| v0_196(void) = ^BufferReadSideEffect[-1] : &:r0_193, ~mu1068_3 -#-----| mu0_197(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_193 +#-----| v0_28(void) = ^BufferReadSideEffect[-1] : &:r0_25, ~mu1068_3 +#-----| mu0_29(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_25 # 1069| v1069_20(void) = ConditionalBranch : r1069_18 #-----| False -> Block 10 #-----| True -> Block 7 # 1069| Block 7 # 1069| r1069_21(glval) = VariableAddress[e] : -#-----| r0_198(glval) = VariableAddress[(__begin)] : -#-----| r0_199(glval) = Convert : r0_198 +#-----| r0_30(glval) = VariableAddress[(__begin)] : +#-----| r0_31(glval) = Convert : r0_30 # 1069| r1069_22(glval) = FunctionAddress[operator*] : -# 1069| r1069_23(int &) = Call : func:r1069_22, this:r0_199 +# 1069| r1069_23(int &) = Call : func:r1069_22, this:r0_31 # 1069| mu1069_24(unknown) = ^CallSideEffect : ~mu1068_3 -#-----| v0_200(void) = ^BufferReadSideEffect[-1] : &:r0_199, ~mu1068_3 -#-----| mu0_201(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_199 +#-----| v0_32(void) = ^BufferReadSideEffect[-1] : &:r0_31, ~mu1068_3 +#-----| mu0_33(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_31 # 1069| r1069_25(int) = Load : &:r1069_23, ~mu1068_3 # 1069| mu1069_26(int) = Store : &:r1069_21, r1069_25 # 1070| r1070_1(glval) = VariableAddress[e] : @@ -5524,12 +5524,12 @@ ir.cpp: # 1069| Block 9 # 1069| v1069_27(void) = NoOp : -#-----| r0_202(glval) = VariableAddress[(__begin)] : +#-----| r0_34(glval) = VariableAddress[(__begin)] : # 1069| r1069_28(glval) = FunctionAddress[operator++] : -# 1069| r1069_29(iterator &) = Call : func:r1069_28, this:r0_202 +# 1069| r1069_29(iterator &) = Call : func:r1069_28, this:r0_34 # 1069| mu1069_30(unknown) = ^CallSideEffect : ~mu1068_3 -#-----| v0_203(void) = ^BufferReadSideEffect[-1] : &:r0_202, ~mu1068_3 -#-----| mu0_204(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_202 +#-----| v0_35(void) = ^BufferReadSideEffect[-1] : &:r0_34, ~mu1068_3 +#-----| mu0_36(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_34 # 1069| r1069_31(glval) = CopyValue : r1069_29 #-----| Goto (back edge) -> Block 6 @@ -5541,24 +5541,24 @@ ir.cpp: # 1075| r1075_21(vector &) = CopyValue : r1075_20 # 1075| mu1075_22(vector &) = Store : &:r1075_17, r1075_21 # 1075| r1075_23(glval) = VariableAddress[(__begin)] : -#-----| r0_205(glval &>) = VariableAddress[(__range)] : -#-----| r0_206(vector &) = Load : &:r0_205, ~mu1068_3 -#-----| r0_207(glval>) = CopyValue : r0_206 +#-----| r0_37(glval &>) = VariableAddress[(__range)] : +#-----| r0_38(vector &) = Load : &:r0_37, ~mu1068_3 +#-----| r0_39(glval>) = CopyValue : r0_38 # 1075| r1075_24(glval) = FunctionAddress[begin] : -# 1075| r1075_25(iterator) = Call : func:r1075_24, this:r0_207 +# 1075| r1075_25(iterator) = Call : func:r1075_24, this:r0_39 # 1075| mu1075_26(unknown) = ^CallSideEffect : ~mu1068_3 -#-----| v0_208(void) = ^BufferReadSideEffect[-1] : &:r0_207, ~mu1068_3 -#-----| mu0_209(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_207 +#-----| v0_40(void) = ^BufferReadSideEffect[-1] : &:r0_39, ~mu1068_3 +#-----| mu0_41(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_39 # 1075| mu1075_27(iterator) = Store : &:r1075_23, r1075_25 # 1075| r1075_28(glval) = VariableAddress[(__end)] : -#-----| r0_210(glval &>) = VariableAddress[(__range)] : -#-----| r0_211(vector &) = Load : &:r0_210, ~mu1068_3 -#-----| r0_212(glval>) = CopyValue : r0_211 +#-----| r0_42(glval &>) = VariableAddress[(__range)] : +#-----| r0_43(vector &) = Load : &:r0_42, ~mu1068_3 +#-----| r0_44(glval>) = CopyValue : r0_43 # 1075| r1075_29(glval) = FunctionAddress[end] : -# 1075| r1075_30(iterator) = Call : func:r1075_29, this:r0_212 +# 1075| r1075_30(iterator) = Call : func:r1075_29, this:r0_44 # 1075| mu1075_31(unknown) = ^CallSideEffect : ~mu1068_3 -#-----| v0_213(void) = ^BufferReadSideEffect[-1] : &:r0_212, ~mu1068_3 -#-----| mu0_214(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_212 +#-----| v0_45(void) = ^BufferReadSideEffect[-1] : &:r0_44, ~mu1068_3 +#-----| mu0_46(vector) = ^IndirectMayWriteSideEffect[-1] : &:r0_44 # 1075| mu1075_32(iterator) = Store : &:r1075_28, r1075_30 #-----| Goto -> Block 1 @@ -5829,11 +5829,11 @@ ir.cpp: # 1157| r1157_3(__attribute((vector_size(16UL))) int) = Load : &:r1157_2, ~mu1153_3 # 1157| r1157_4(glval<__attribute((vector_size(16UL))) int>) = VariableAddress[vi4] : # 1157| r1157_5(__attribute((vector_size(16UL))) int) = Load : &:r1157_4, ~mu1153_3 -#-----| r0_157(int) = Constant[3] : +#-----| r0_1(int) = Constant[3] : # 1157| r1157_6(int) = Constant[2] : # 1157| r1157_7(int) = Constant[1] : # 1157| r1157_8(int) = Constant[0] : -# 1157| r1157_9(__attribute((vector_size(16))) int) = BuiltIn[__builtin_shufflevector] : 0:r1157_3, 1:r1157_5, 2:r0_157, 3:r1157_6, 4:r1157_7, 5:r1157_8 +# 1157| r1157_9(__attribute((vector_size(16))) int) = BuiltIn[__builtin_shufflevector] : 0:r1157_3, 1:r1157_5, 2:r0_1, 3:r1157_6, 4:r1157_7, 5:r1157_8 # 1157| mu1157_10(__attribute((vector_size(16UL))) int) = Store : &:r1157_1, r1157_9 # 1158| r1158_1(glval<__attribute((vector_size(16UL))) int>) = VariableAddress[vi4] : # 1158| r1158_2(__attribute((vector_size(16UL))) int) = Load : &:r1158_1, ~mu1153_3 diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_ssa_sanity.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_ssa_sanity.expected index e69de29bb2d..7c2d1faf639 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_ssa_sanity.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_ssa_sanity.expected @@ -0,0 +1,2 @@ +multipleOperandMemoryLocations +missingVirtualVariableForMemoryLocation diff --git a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ssa_sanity.expected b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ssa_sanity.expected index e69de29bb2d..7c2d1faf639 100644 --- a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ssa_sanity.expected +++ b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ssa_sanity.expected @@ -0,0 +1,2 @@ +multipleOperandMemoryLocations +missingVirtualVariableForMemoryLocation diff --git a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ssa_sanity.expected b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ssa_sanity.expected index e69de29bb2d..7c2d1faf639 100644 --- a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ssa_sanity.expected +++ b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_ssa_sanity.expected @@ -0,0 +1,2 @@ +multipleOperandMemoryLocations +missingVirtualVariableForMemoryLocation diff --git a/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/Instruction.qll b/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/Instruction.qll index a4a9718ab95..a370888c895 100644 --- a/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/Instruction.qll +++ b/csharp/ql/src/semmle/code/csharp/ir/implementation/raw/Instruction.qll @@ -260,6 +260,19 @@ module InstructionSanity { } } +/** + * Gets an `Instruction` that is contained in `IRFunction`, and has a location with the specified + * `File` and line number. Used for assigning register names when printing IR. + */ +private Instruction getAnInstructionAtLine(IRFunction irFunc, Language::File file, int line) { + exists(Language::Location location | + irFunc = result.getEnclosingIRFunction() and + location = result.getLocation() and + file = location.getFile() and + line = location.getStartLine() + ) +} + /** * Represents a single operation in the IR. */ @@ -324,8 +337,8 @@ class Instruction extends Construction::TInstruction { private int getLineRank() { this = rank[result](Instruction instr | - instr.getAST().getFile() = getAST().getFile() and - instr.getAST().getLocation().getStartLine() = getAST().getLocation().getStartLine() + instr = getAnInstructionAtLine(getEnclosingIRFunction(), getLocation().getFile(), + getLocation().getStartLine()) | instr order by instr.getBlock().getDisplayIndex(), instr.getDisplayIndexInBlock() ) diff --git a/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/Instruction.qll b/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/Instruction.qll index a4a9718ab95..a370888c895 100644 --- a/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/Instruction.qll +++ b/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/Instruction.qll @@ -260,6 +260,19 @@ module InstructionSanity { } } +/** + * Gets an `Instruction` that is contained in `IRFunction`, and has a location with the specified + * `File` and line number. Used for assigning register names when printing IR. + */ +private Instruction getAnInstructionAtLine(IRFunction irFunc, Language::File file, int line) { + exists(Language::Location location | + irFunc = result.getEnclosingIRFunction() and + location = result.getLocation() and + file = location.getFile() and + line = location.getStartLine() + ) +} + /** * Represents a single operation in the IR. */ @@ -324,8 +337,8 @@ class Instruction extends Construction::TInstruction { private int getLineRank() { this = rank[result](Instruction instr | - instr.getAST().getFile() = getAST().getFile() and - instr.getAST().getLocation().getStartLine() = getAST().getLocation().getStartLine() + instr = getAnInstructionAtLine(getEnclosingIRFunction(), getLocation().getFile(), + getLocation().getStartLine()) | instr order by instr.getBlock().getDisplayIndex(), instr.getDisplayIndexInBlock() ) diff --git a/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/internal/SSAConstruction.qll b/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/internal/SSAConstruction.qll index c4cacede9cf..845304f2c56 100644 --- a/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/internal/SSAConstruction.qll +++ b/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/internal/SSAConstruction.qll @@ -885,4 +885,13 @@ module SSASanity { message = "Operand has " + locationCount.toString() + " memory accesses in function '$@'." ) } + + query predicate missingVirtualVariableForMemoryLocation( + Alias::MemoryLocation location, string message, OldIR::IRFunction func, string funcText + ) { + not exists(location.getVirtualVariable()) and + func = location.getIRFunction() and + funcText = Language::getIdentityString(func.getFunction()) and + message = "Memory location has no virtual variable in function '$@'." + } } diff --git a/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/internal/SimpleSSA.qll b/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/internal/SimpleSSA.qll index 3d3243efc2b..ddff6444b90 100644 --- a/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/internal/SimpleSSA.qll +++ b/csharp/ql/src/semmle/code/csharp/ir/implementation/unaliased_ssa/internal/SimpleSSA.qll @@ -55,6 +55,10 @@ class MemoryLocation extends TMemoryLocation { final string toString() { result = var.toString() } + final Language::Location getLocation() { result = var.getLocation() } + + final IRFunction getIRFunction() { result = var.getEnclosingIRFunction() } + final IRVariable getIRVariable() { result = var } final VirtualVariable getVirtualVariable() { result = this } diff --git a/csharp/ql/src/semmle/code/csharp/ir/internal/IRCSharpLanguage.qll b/csharp/ql/src/semmle/code/csharp/ir/internal/IRCSharpLanguage.qll index 70f3e38ade7..97121f46453 100644 --- a/csharp/ql/src/semmle/code/csharp/ir/internal/IRCSharpLanguage.qll +++ b/csharp/ql/src/semmle/code/csharp/ir/internal/IRCSharpLanguage.qll @@ -10,6 +10,8 @@ class Function = CSharp::Callable; class Location = CSharp::Location; +class File = CSharp::File; + class AST = CSharp::Element; class Type = CSharp::Type; diff --git a/csharp/ql/test/library-tests/ir/ir/raw_ir.expected b/csharp/ql/test/library-tests/ir/ir/raw_ir.expected index 1a588756ecc..b95d27bd8e2 100644 --- a/csharp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/csharp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -733,7 +733,7 @@ indexers.cs: # 8| mu8_3() = UnmodeledDefinition : # 8| r8_4(glval) = InitializeThis : # 6| r6_1(glval) = VariableAddress[index] : -# 6| mu6_3(Int32) = InitializeParameter[index] : &:r6_1 +# 6| mu6_2(Int32) = InitializeParameter[index] : &:r6_1 # 10| r10_1(glval) = VariableAddress[#return] : # 10| r10_2(MyClass) = CopyValue : r8_4 # 10| r10_3(glval) = FieldAddress[address] : r10_2 @@ -756,7 +756,7 @@ indexers.cs: # 12| mu12_3() = UnmodeledDefinition : # 12| r12_4(glval) = InitializeThis : # 6| r6_1(glval) = VariableAddress[index] : -# 6| mu6_3(Int32) = InitializeParameter[index] : &:r6_1 +# 6| mu6_2(Int32) = InitializeParameter[index] : &:r6_1 # 12| r12_5(glval) = VariableAddress[value] : # 12| mu12_6(String) = InitializeParameter[value] : &:r12_5 # 14| r14_1(glval) = VariableAddress[value] : diff --git a/csharp/ql/test/library-tests/ir/ir/unaliased_ssa_ssa_sanity.expected b/csharp/ql/test/library-tests/ir/ir/unaliased_ssa_ssa_sanity.expected index e69de29bb2d..7c2d1faf639 100644 --- a/csharp/ql/test/library-tests/ir/ir/unaliased_ssa_ssa_sanity.expected +++ b/csharp/ql/test/library-tests/ir/ir/unaliased_ssa_ssa_sanity.expected @@ -0,0 +1,2 @@ +multipleOperandMemoryLocations +missingVirtualVariableForMemoryLocation