From 46bc311111794e685ece8764beecaf8eb726e701 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 14 Feb 2024 12:01:17 +0100 Subject: [PATCH] C++: Support `constexpr if` in the IR --- .../raw/internal/TranslatedElement.qll | 2 + .../raw/internal/TranslatedStmt.qll | 66 +++++++ .../library-tests/ir/ir/aliased_ir.expected | 165 ++++++++++++++++++ .../ir/ir/aliased_ssa_consistency.expected | 2 +- .../aliased_ssa_consistency_unsound.expected | 2 +- .../ir/ir/operand_locations.expected | 149 ++++++++++++++++ .../ir/ir/raw_consistency.expected | 4 - .../test/library-tests/ir/ir/raw_ir.expected | 70 ++++---- .../ir/ir/unaliased_ssa_consistency.expected | 2 +- ...unaliased_ssa_consistency_unsound.expected | 2 +- 10 files changed, 423 insertions(+), 41 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll index 08908c29bca..c83aea863e0 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll @@ -209,6 +209,8 @@ private predicate usedAsCondition(Expr expr) { or exists(IfStmt ifStmt | ifStmt.getCondition().getFullyConverted() = expr) or + exists(ConstexprIfStmt ifStmt | ifStmt.getCondition().getFullyConverted() = expr) + or exists(ConditionalExpr condExpr | // The two-operand form of `ConditionalExpr` treats its condition as a value, since it needs to // be reused as a value if the condition is true. diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll index 67a7a8aa83b..eff4593b335 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll @@ -774,6 +774,72 @@ class TranslatedIfStmt extends TranslatedStmt, ConditionContext { } } +class TranslatedConstExprIfStmt extends TranslatedStmt, ConditionContext { + override ConstexprIfStmt stmt; + + override Instruction getFirstInstruction(EdgeKind kind) { + if this.hasInitialization() + then result = this.getInitialization().getFirstInstruction(kind) + else result = this.getFirstConditionInstruction(kind) + } + + override TranslatedElement getChild(int id) { + id = 0 and result = this.getInitialization() + or + id = 1 and result = this.getCondition() + or + id = 2 and result = this.getThen() + or + id = 3 and result = this.getElse() + } + + private predicate hasInitialization() { exists(stmt.getInitialization()) } + + private TranslatedStmt getInitialization() { + result = getTranslatedStmt(stmt.getInitialization()) + } + + private TranslatedCondition getCondition() { + result = getTranslatedCondition(stmt.getCondition().getFullyConverted()) + } + + private Instruction getFirstConditionInstruction(EdgeKind kind) { + result = this.getCondition().getFirstInstruction(kind) + } + + private TranslatedStmt getThen() { result = getTranslatedStmt(stmt.getThen()) } + + private TranslatedStmt getElse() { result = getTranslatedStmt(stmt.getElse()) } + + private predicate hasElse() { exists(stmt.getElse()) } + + override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() } + + override Instruction getChildTrueSuccessor(TranslatedCondition child, EdgeKind kind) { + child = this.getCondition() and + result = this.getThen().getFirstInstruction(kind) + } + + override Instruction getChildFalseSuccessor(TranslatedCondition child, EdgeKind kind) { + child = this.getCondition() and + if this.hasElse() + then result = this.getElse().getFirstInstruction(kind) + else result = this.getParent().getChildSuccessor(this, kind) + } + + override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) { + child = this.getInitialization() and + result = this.getFirstConditionInstruction(kind) + or + (child = this.getThen() or child = this.getElse()) and + result = this.getParent().getChildSuccessor(this, kind) + } + + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { + none() + } +} + abstract class TranslatedLoop extends TranslatedStmt, ConditionContext { override Loop stmt; diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index 458ab279ff2..cc972e38fc1 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -12614,6 +12614,7 @@ ir.cpp: # 2137| r2137_9(glval) = VariableAddress[b] : # 2137| r2137_10(bool) = Load[b] : &:r2137_9, m2136_6 # 2137| v2137_11(void) = ConditionalBranch : r2137_10 +#-----| False -> Block 2 #-----| True -> Block 1 # 2138| Block 1 @@ -12626,6 +12627,170 @@ ir.cpp: # 2138| v2138_7(void) = ^IndirectReadSideEffect[-1] : &:r2138_1, m2137_8 # 2138| m2138_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2138_1 # 2138| m2138_9(ClassWithDestructor) = Chi : total:m2137_8, partial:m2138_8 +#-----| Goto -> Block 2 + +# 2140| Block 2 +# 2140| m2140_1(unknown) = Phi : from 0:~m2137_6, from 1:~m2138_6 +# 2140| r2140_2(glval) = VariableAddress[x] : +# 2140| m2140_3(ClassWithDestructor) = Uninitialized[x] : &:r2140_2 +# 2140| r2140_4(glval) = FunctionAddress[ClassWithDestructor] : +# 2140| v2140_5(void) = Call[ClassWithDestructor] : func:r2140_4, this:r2140_2 +# 2140| m2140_6(unknown) = ^CallSideEffect : ~m2140_1 +# 2140| m2140_7(unknown) = Chi : total:m2140_1, partial:m2140_6 +# 2140| m2140_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2140_2 +# 2140| m2140_9(ClassWithDestructor) = Chi : total:m2140_3, partial:m2140_8 +# 2140| r2140_10(bool) = Constant[1] : +# 2140| v2140_11(void) = ConditionalBranch : r2140_10 +#-----| False -> Block 10 +#-----| True -> Block 3 + +# 2141| Block 3 +# 2141| r2141_1(glval) = VariableAddress[x] : +# 2141| r2141_2(glval) = FunctionAddress[set_x] : +# 2141| r2141_3(char) = Constant[97] : +# 2141| v2141_4(void) = Call[set_x] : func:r2141_2, this:r2141_1, 0:r2141_3 +# 2141| m2141_5(unknown) = ^CallSideEffect : ~m2140_7 +# 2141| m2141_6(unknown) = Chi : total:m2140_7, partial:m2141_5 +# 2141| v2141_7(void) = ^IndirectReadSideEffect[-1] : &:r2141_1, m2140_9 +# 2141| m2141_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2141_1 +# 2141| m2141_9(ClassWithDestructor) = Chi : total:m2140_9, partial:m2141_8 +# 2143| r2143_1(glval) = VariableAddress[x] : +# 2143| m2143_2(ClassWithDestructor) = Uninitialized[x] : &:r2143_1 +# 2143| r2143_3(glval) = FunctionAddress[ClassWithDestructor] : +# 2143| v2143_4(void) = Call[ClassWithDestructor] : func:r2143_3, this:r2143_1 +# 2143| m2143_5(unknown) = ^CallSideEffect : ~m2141_6 +# 2143| m2143_6(unknown) = Chi : total:m2141_6, partial:m2143_5 +# 2143| m2143_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2143_1 +# 2143| m2143_8(ClassWithDestructor) = Chi : total:m2143_2, partial:m2143_7 +# 2143| r2143_9(glval) = VariableAddress[c] : +# 2143| r2143_10(char) = Load[c] : &:r2143_9, m2136_8 +# 2143| r2143_11(int) = Convert : r2143_10 +# 2143| v2143_12(void) = Switch : r2143_11 +#-----| Case[97] -> Block 4 +#-----| Default -> Block 5 + +# 2144| Block 4 +# 2144| v2144_1(void) = NoOp : +# 2145| r2145_1(glval) = VariableAddress[x] : +# 2145| r2145_2(glval) = FunctionAddress[set_x] : +# 2145| r2145_3(char) = Constant[97] : +# 2145| v2145_4(void) = Call[set_x] : func:r2145_2, this:r2145_1, 0:r2145_3 +# 2145| m2145_5(unknown) = ^CallSideEffect : ~m2143_6 +# 2145| m2145_6(unknown) = Chi : total:m2143_6, partial:m2145_5 +# 2145| v2145_7(void) = ^IndirectReadSideEffect[-1] : &:r2145_1, m2143_8 +# 2145| m2145_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2145_1 +# 2145| m2145_9(ClassWithDestructor) = Chi : total:m2143_8, partial:m2145_8 +# 2146| v2146_1(void) = NoOp : +#-----| Goto -> Block 6 + +# 2147| Block 5 +# 2147| v2147_1(void) = NoOp : +# 2148| r2148_1(glval) = VariableAddress[x] : +# 2148| r2148_2(glval) = FunctionAddress[set_x] : +# 2148| r2148_3(char) = Constant[98] : +# 2148| v2148_4(void) = Call[set_x] : func:r2148_2, this:r2148_1, 0:r2148_3 +# 2148| m2148_5(unknown) = ^CallSideEffect : ~m2143_6 +# 2148| m2148_6(unknown) = Chi : total:m2143_6, partial:m2148_5 +# 2148| v2148_7(void) = ^IndirectReadSideEffect[-1] : &:r2148_1, m2143_8 +# 2148| m2148_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2148_1 +# 2148| m2148_9(ClassWithDestructor) = Chi : total:m2143_8, partial:m2148_8 +# 2149| v2149_1(void) = NoOp : +#-----| Goto -> Block 6 + +# 2150| Block 6 +# 2150| m2150_1(unknown) = Phi : from 4:~m2145_6, from 5:~m2148_6 +# 2150| v2150_2(void) = NoOp : +# 2152| r2152_1(glval) = VariableAddress[x] : +# 2152| m2152_2(ClassWithDestructor) = Uninitialized[x] : &:r2152_1 +# 2152| r2152_3(glval) = FunctionAddress[ClassWithDestructor] : +# 2152| v2152_4(void) = Call[ClassWithDestructor] : func:r2152_3, this:r2152_1 +# 2152| m2152_5(unknown) = ^CallSideEffect : ~m2150_1 +# 2152| m2152_6(unknown) = Chi : total:m2150_1, partial:m2152_5 +# 2152| m2152_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2152_1 +# 2152| m2152_8(ClassWithDestructor) = Chi : total:m2152_2, partial:m2152_7 +# 2153| r2153_1(glval &>) = VariableAddress[(__range)] : +# 2153| r2153_2(glval>) = VariableAddress : +# 2153| r2153_3(vector &) = CopyValue : r2153_2 +# 2153| m2153_4(vector &) = Store[(__range)] : &:r2153_1, r2153_3 +# 2153| r2153_5(glval) = VariableAddress[(__begin)] : +# 2153| r2153_6(glval &>) = VariableAddress[(__range)] : +# 2153| r2153_7(vector &) = Load[(__range)] : &:r2153_6, m2153_4 +#-----| r0_1(glval>) = CopyValue : r2153_7 +#-----| r0_2(glval>) = Convert : r0_1 +# 2153| r2153_8(glval) = FunctionAddress[begin] : +# 2153| r2153_9(iterator) = Call[begin] : func:r2153_8, this:r0_2 +# 2153| m2153_10(unknown) = ^CallSideEffect : ~m2152_6 +# 2153| m2153_11(unknown) = Chi : total:m2152_6, partial:m2153_10 +#-----| v0_3(void) = ^IndirectReadSideEffect[-1] : &:r0_2, ~m2153_11 +# 2153| m2153_12(iterator) = Store[(__begin)] : &:r2153_5, r2153_9 +# 2153| r2153_13(glval) = VariableAddress[(__end)] : +# 2153| r2153_14(glval &>) = VariableAddress[(__range)] : +# 2153| r2153_15(vector &) = Load[(__range)] : &:r2153_14, m2153_4 +#-----| r0_4(glval>) = CopyValue : r2153_15 +#-----| r0_5(glval>) = Convert : r0_4 +# 2153| r2153_16(glval) = FunctionAddress[end] : +# 2153| r2153_17(iterator) = Call[end] : func:r2153_16, this:r0_5 +# 2153| m2153_18(unknown) = ^CallSideEffect : ~m2153_11 +# 2153| m2153_19(unknown) = Chi : total:m2153_11, partial:m2153_18 +#-----| v0_6(void) = ^IndirectReadSideEffect[-1] : &:r0_5, ~m2153_19 +# 2153| m2153_20(iterator) = Store[(__end)] : &:r2153_13, r2153_17 +#-----| Goto -> Block 7 + +# 2153| Block 7 +# 2153| m2153_21(iterator) = Phi : from 6:m2153_12, from 8:m2153_46 +# 2153| m2153_22(unknown) = Phi : from 6:~m2153_19, from 8:~m2153_43 +# 2153| r2153_23(glval) = VariableAddress[(__begin)] : +#-----| r0_7(glval) = Convert : r2153_23 +# 2153| r2153_24(glval) = FunctionAddress[operator!=] : +# 2153| r2153_25(glval) = VariableAddress[(__end)] : +# 2153| r2153_26(iterator) = Load[(__end)] : &:r2153_25, m2153_20 +# 2153| r2153_27(bool) = Call[operator!=] : func:r2153_24, this:r0_7, 0:r2153_26 +# 2153| m2153_28(unknown) = ^CallSideEffect : ~m2153_22 +# 2153| m2153_29(unknown) = Chi : total:m2153_22, partial:m2153_28 +#-----| v0_8(void) = ^IndirectReadSideEffect[-1] : &:r0_7, m2153_21 +# 2153| v2153_30(void) = ConditionalBranch : r2153_27 +#-----| False -> Block 9 +#-----| True -> Block 8 + +# 2153| Block 8 +# 2153| r2153_31(glval) = VariableAddress[y] : +# 2153| r2153_32(glval) = VariableAddress[(__begin)] : +#-----| r0_9(glval) = Convert : r2153_32 +# 2153| r2153_33(glval) = FunctionAddress[operator*] : +# 2153| r2153_34(ClassWithDestructor &) = Call[operator*] : func:r2153_33, this:r0_9 +# 2153| m2153_35(unknown) = ^CallSideEffect : ~m2153_29 +# 2153| m2153_36(unknown) = Chi : total:m2153_29, partial:m2153_35 +#-----| v0_10(void) = ^IndirectReadSideEffect[-1] : &:r0_9, m2153_21 +# 2153| r2153_37(ClassWithDestructor) = Load[?] : &:r2153_34, ~m2153_36 +# 2153| m2153_38(ClassWithDestructor) = Store[y] : &:r2153_31, r2153_37 +# 2154| r2154_1(glval) = VariableAddress[y] : +# 2154| r2154_2(glval) = FunctionAddress[set_x] : +# 2154| r2154_3(char) = Constant[97] : +# 2154| v2154_4(void) = Call[set_x] : func:r2154_2, this:r2154_1, 0:r2154_3 +# 2154| m2154_5(unknown) = ^CallSideEffect : ~m2153_36 +# 2154| m2154_6(unknown) = Chi : total:m2153_36, partial:m2154_5 +# 2154| v2154_7(void) = ^IndirectReadSideEffect[-1] : &:r2154_1, m2153_38 +# 2154| m2154_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2154_1 +# 2154| m2154_9(ClassWithDestructor) = Chi : total:m2153_38, partial:m2154_8 +# 2153| r2153_39(glval) = VariableAddress[(__begin)] : +# 2153| r2153_40(glval) = FunctionAddress[operator++] : +# 2153| r2153_41(iterator &) = Call[operator++] : func:r2153_40, this:r2153_39 +# 2153| m2153_42(unknown) = ^CallSideEffect : ~m2154_6 +# 2153| m2153_43(unknown) = Chi : total:m2154_6, partial:m2153_42 +# 2153| v2153_44(void) = ^IndirectReadSideEffect[-1] : &:r2153_39, m2153_21 +# 2153| m2153_45(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2153_39 +# 2153| m2153_46(iterator) = Chi : total:m2153_21, partial:m2153_45 +# 2153| r2153_47(glval) = CopyValue : r2153_41 +#-----| Goto (back edge) -> Block 7 + +# 2155| Block 9 +# 2155| v2155_1(void) = NoOp : +# 2136| v2136_9(void) = ReturnVoid : +# 2136| v2136_10(void) = AliasedUse : ~m2153_29 +# 2136| v2136_11(void) = ExitFunction : + +# 2136| Block 10 +# 2136| v2136_12(void) = Unreached : perf-regression.cpp: # 6| void Big::Big() diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected index b027437d48a..6e9be083ee0 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected @@ -6,7 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:2138:9:2138:9 | Chi: x | Instruction 'Chi: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction @@ -29,4 +28,5 @@ nonUniqueEnclosingIRFunction fieldAddressOnNonPointer thisArgumentIsNonPointer nonUniqueIRVariable +| ir.cpp:2153:68:2153:69 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | missingCppType diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected index b027437d48a..6e9be083ee0 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected @@ -6,7 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:2138:9:2138:9 | Chi: x | Instruction 'Chi: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction @@ -29,4 +28,5 @@ nonUniqueEnclosingIRFunction fieldAddressOnNonPointer thisArgumentIsNonPointer nonUniqueIRVariable +| ir.cpp:2153:68:2153:69 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | missingCppType diff --git a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected index eba7196785f..e9ea1e95943 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -691,6 +691,7 @@ | file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_2 | +| file://:0:0:0:0 | Address | &:r0_2 | | file://:0:0:0:0 | Address | &:r0_3 | | file://:0:0:0:0 | Address | &:r0_3 | | file://:0:0:0:0 | Address | &:r0_3 | @@ -736,12 +737,14 @@ | file://:0:0:0:0 | Address | &:r0_5 | | file://:0:0:0:0 | Address | &:r0_5 | | file://:0:0:0:0 | Address | &:r0_5 | +| file://:0:0:0:0 | Address | &:r0_5 | | file://:0:0:0:0 | Address | &:r0_6 | | file://:0:0:0:0 | Address | &:r0_6 | | file://:0:0:0:0 | Address | &:r0_7 | | file://:0:0:0:0 | Address | &:r0_7 | | file://:0:0:0:0 | Address | &:r0_7 | | file://:0:0:0:0 | Address | &:r0_7 | +| file://:0:0:0:0 | Address | &:r0_7 | | file://:0:0:0:0 | Address | &:r0_8 | | file://:0:0:0:0 | Address | &:r0_8 | | file://:0:0:0:0 | Address | &:r0_8 | @@ -751,6 +754,7 @@ | file://:0:0:0:0 | Address | &:r0_8 | | file://:0:0:0:0 | Address | &:r0_9 | | file://:0:0:0:0 | Address | &:r0_9 | +| file://:0:0:0:0 | Address | &:r0_9 | | file://:0:0:0:0 | Address | &:r0_10 | | file://:0:0:0:0 | Address | &:r0_10 | | file://:0:0:0:0 | Address | &:r0_10 | @@ -870,6 +874,8 @@ | file://:0:0:0:0 | SideEffect | m1080_23 | | file://:0:0:0:0 | SideEffect | m1086_23 | | file://:0:0:0:0 | SideEffect | m1086_23 | +| file://:0:0:0:0 | SideEffect | m2153_21 | +| file://:0:0:0:0 | SideEffect | m2153_21 | | file://:0:0:0:0 | SideEffect | ~m0_4 | | file://:0:0:0:0 | SideEffect | ~m0_4 | | file://:0:0:0:0 | SideEffect | ~m0_4 | @@ -886,6 +892,8 @@ | file://:0:0:0:0 | SideEffect | ~m1242_4 | | file://:0:0:0:0 | SideEffect | ~m1449_6 | | file://:0:0:0:0 | SideEffect | ~m1841_8 | +| file://:0:0:0:0 | SideEffect | ~m2153_11 | +| file://:0:0:0:0 | SideEffect | ~m2153_19 | | file://:0:0:0:0 | StoreValue | r0_1 | | file://:0:0:0:0 | StoreValue | r0_1 | | file://:0:0:0:0 | StoreValue | r0_1 | @@ -915,8 +923,10 @@ | file://:0:0:0:0 | StoreValue | r0_22 | | file://:0:0:0:0 | Unary | r0_1 | | file://:0:0:0:0 | Unary | r0_1 | +| file://:0:0:0:0 | Unary | r0_1 | | file://:0:0:0:0 | Unary | r0_2 | | file://:0:0:0:0 | Unary | r0_3 | +| file://:0:0:0:0 | Unary | r0_4 | | file://:0:0:0:0 | Unary | r0_5 | | file://:0:0:0:0 | Unary | r0_5 | | file://:0:0:0:0 | Unary | r0_6 | @@ -10184,6 +10194,7 @@ | ir.cpp:2134:54:2134:57 | StoreValue | r2134_4 | | ir.cpp:2136:6:2136:35 | ChiPartial | partial:m2136_3 | | ir.cpp:2136:6:2136:35 | ChiTotal | total:m2136_2 | +| ir.cpp:2136:6:2136:35 | SideEffect | ~m2153_29 | | ir.cpp:2136:42:2136:42 | Address | &:r2136_5 | | ir.cpp:2136:50:2136:50 | Address | &:r2136_7 | | ir.cpp:2137:29:2137:29 | Address | &:r2137_1 | @@ -10209,6 +10220,144 @@ | ir.cpp:2138:11:2138:15 | ChiTotal | total:m2137_6 | | ir.cpp:2138:11:2138:15 | SideEffect | ~m2137_6 | | ir.cpp:2138:17:2138:19 | Arg(0) | 0:r2138_3 | +| ir.cpp:2140:39:2140:39 | Address | &:r2140_2 | +| ir.cpp:2140:39:2140:39 | Address | &:r2140_2 | +| ir.cpp:2140:39:2140:39 | Arg(this) | this:r2140_2 | +| ir.cpp:2140:39:2140:39 | CallTarget | func:r2140_4 | +| ir.cpp:2140:39:2140:39 | ChiPartial | partial:m2140_6 | +| ir.cpp:2140:39:2140:39 | ChiPartial | partial:m2140_8 | +| ir.cpp:2140:39:2140:39 | ChiTotal | total:m2140_1 | +| ir.cpp:2140:39:2140:39 | ChiTotal | total:m2140_3 | +| ir.cpp:2140:39:2140:39 | Phi | from 0:~m2137_6 | +| ir.cpp:2140:39:2140:39 | Phi | from 1:~m2138_6 | +| ir.cpp:2140:39:2140:39 | SideEffect | ~m2140_1 | +| ir.cpp:2140:42:2140:76 | Condition | r2140_10 | +| ir.cpp:2141:9:2141:9 | Address | &:r2141_1 | +| ir.cpp:2141:9:2141:9 | Address | &:r2141_1 | +| ir.cpp:2141:9:2141:9 | Arg(this) | this:r2141_1 | +| ir.cpp:2141:9:2141:9 | ChiPartial | partial:m2141_8 | +| ir.cpp:2141:9:2141:9 | ChiTotal | total:m2140_9 | +| ir.cpp:2141:9:2141:9 | SideEffect | m2140_9 | +| ir.cpp:2141:11:2141:15 | CallTarget | func:r2141_2 | +| ir.cpp:2141:11:2141:15 | ChiPartial | partial:m2141_5 | +| ir.cpp:2141:11:2141:15 | ChiTotal | total:m2140_7 | +| ir.cpp:2141:11:2141:15 | SideEffect | ~m2140_7 | +| ir.cpp:2141:17:2141:19 | Arg(0) | 0:r2141_3 | +| ir.cpp:2143:32:2143:32 | Address | &:r2143_1 | +| ir.cpp:2143:32:2143:32 | Address | &:r2143_1 | +| ir.cpp:2143:32:2143:32 | Arg(this) | this:r2143_1 | +| ir.cpp:2143:32:2143:32 | CallTarget | func:r2143_3 | +| ir.cpp:2143:32:2143:32 | ChiPartial | partial:m2143_5 | +| ir.cpp:2143:32:2143:32 | ChiPartial | partial:m2143_7 | +| ir.cpp:2143:32:2143:32 | ChiTotal | total:m2141_6 | +| ir.cpp:2143:32:2143:32 | ChiTotal | total:m2143_2 | +| ir.cpp:2143:32:2143:32 | SideEffect | ~m2141_6 | +| ir.cpp:2143:35:2143:35 | Address | &:r2143_9 | +| ir.cpp:2143:35:2143:35 | Condition | r2143_11 | +| ir.cpp:2143:35:2143:35 | Load | m2136_8 | +| ir.cpp:2143:35:2143:35 | Unary | r2143_10 | +| ir.cpp:2145:11:2145:11 | Address | &:r2145_1 | +| ir.cpp:2145:11:2145:11 | Address | &:r2145_1 | +| ir.cpp:2145:11:2145:11 | Arg(this) | this:r2145_1 | +| ir.cpp:2145:11:2145:11 | ChiPartial | partial:m2145_8 | +| ir.cpp:2145:11:2145:11 | ChiTotal | total:m2143_8 | +| ir.cpp:2145:11:2145:11 | SideEffect | m2143_8 | +| ir.cpp:2145:13:2145:17 | CallTarget | func:r2145_2 | +| ir.cpp:2145:13:2145:17 | ChiPartial | partial:m2145_5 | +| ir.cpp:2145:13:2145:17 | ChiTotal | total:m2143_6 | +| ir.cpp:2145:13:2145:17 | SideEffect | ~m2143_6 | +| ir.cpp:2145:19:2145:21 | Arg(0) | 0:r2145_3 | +| ir.cpp:2148:11:2148:11 | Address | &:r2148_1 | +| ir.cpp:2148:11:2148:11 | Address | &:r2148_1 | +| ir.cpp:2148:11:2148:11 | Arg(this) | this:r2148_1 | +| ir.cpp:2148:11:2148:11 | ChiPartial | partial:m2148_8 | +| ir.cpp:2148:11:2148:11 | ChiTotal | total:m2143_8 | +| ir.cpp:2148:11:2148:11 | SideEffect | m2143_8 | +| ir.cpp:2148:13:2148:17 | CallTarget | func:r2148_2 | +| ir.cpp:2148:13:2148:17 | ChiPartial | partial:m2148_5 | +| ir.cpp:2148:13:2148:17 | ChiTotal | total:m2143_6 | +| ir.cpp:2148:13:2148:17 | SideEffect | ~m2143_6 | +| ir.cpp:2148:19:2148:21 | Arg(0) | 0:r2148_3 | +| ir.cpp:2150:5:2150:5 | Phi | from 4:~m2145_6 | +| ir.cpp:2150:5:2150:5 | Phi | from 5:~m2148_6 | +| ir.cpp:2152:25:2152:25 | Address | &:r2152_1 | +| ir.cpp:2152:25:2152:25 | Address | &:r2152_1 | +| ir.cpp:2152:25:2152:25 | Arg(this) | this:r2152_1 | +| ir.cpp:2152:25:2152:25 | CallTarget | func:r2152_3 | +| ir.cpp:2152:25:2152:25 | ChiPartial | partial:m2152_5 | +| ir.cpp:2152:25:2152:25 | ChiPartial | partial:m2152_7 | +| ir.cpp:2152:25:2152:25 | ChiTotal | total:m2150_1 | +| ir.cpp:2152:25:2152:25 | ChiTotal | total:m2152_2 | +| ir.cpp:2152:25:2152:25 | SideEffect | ~m2150_1 | +| ir.cpp:2153:5:2153:5 | Address | &:r2153_1 | +| ir.cpp:2153:5:2153:5 | Address | &:r2153_5 | +| ir.cpp:2153:5:2153:5 | Address | &:r2153_13 | +| ir.cpp:2153:64:2153:64 | Address | &:r2153_31 | +| ir.cpp:2153:68:2153:68 | Address | &:r2153_6 | +| ir.cpp:2153:68:2153:68 | Address | &:r2153_14 | +| ir.cpp:2153:68:2153:68 | Address | &:r2153_25 | +| ir.cpp:2153:68:2153:68 | Address | &:r2153_34 | +| ir.cpp:2153:68:2153:68 | Address | &:r2153_39 | +| ir.cpp:2153:68:2153:68 | Address | &:r2153_39 | +| ir.cpp:2153:68:2153:68 | Arg(0) | 0:r2153_26 | +| ir.cpp:2153:68:2153:68 | Arg(this) | this:r0_2 | +| ir.cpp:2153:68:2153:68 | Arg(this) | this:r0_5 | +| ir.cpp:2153:68:2153:68 | Arg(this) | this:r0_7 | +| ir.cpp:2153:68:2153:68 | Arg(this) | this:r0_9 | +| ir.cpp:2153:68:2153:68 | Arg(this) | this:r2153_39 | +| ir.cpp:2153:68:2153:68 | CallTarget | func:r2153_8 | +| ir.cpp:2153:68:2153:68 | CallTarget | func:r2153_16 | +| ir.cpp:2153:68:2153:68 | CallTarget | func:r2153_24 | +| ir.cpp:2153:68:2153:68 | CallTarget | func:r2153_33 | +| ir.cpp:2153:68:2153:68 | CallTarget | func:r2153_40 | +| ir.cpp:2153:68:2153:68 | ChiPartial | partial:m2153_10 | +| ir.cpp:2153:68:2153:68 | ChiPartial | partial:m2153_18 | +| ir.cpp:2153:68:2153:68 | ChiPartial | partial:m2153_28 | +| ir.cpp:2153:68:2153:68 | ChiPartial | partial:m2153_35 | +| ir.cpp:2153:68:2153:68 | ChiPartial | partial:m2153_42 | +| ir.cpp:2153:68:2153:68 | ChiPartial | partial:m2153_45 | +| ir.cpp:2153:68:2153:68 | ChiTotal | total:m2152_6 | +| ir.cpp:2153:68:2153:68 | ChiTotal | total:m2153_11 | +| ir.cpp:2153:68:2153:68 | ChiTotal | total:m2153_21 | +| ir.cpp:2153:68:2153:68 | ChiTotal | total:m2153_22 | +| ir.cpp:2153:68:2153:68 | ChiTotal | total:m2153_29 | +| ir.cpp:2153:68:2153:68 | ChiTotal | total:m2154_6 | +| ir.cpp:2153:68:2153:68 | Condition | r2153_27 | +| ir.cpp:2153:68:2153:68 | Load | m2153_4 | +| ir.cpp:2153:68:2153:68 | Load | m2153_4 | +| ir.cpp:2153:68:2153:68 | Load | m2153_20 | +| ir.cpp:2153:68:2153:68 | Phi | from 6:m2153_12 | +| ir.cpp:2153:68:2153:68 | Phi | from 6:~m2153_19 | +| ir.cpp:2153:68:2153:68 | Phi | from 8:m2153_46 | +| ir.cpp:2153:68:2153:68 | Phi | from 8:~m2153_43 | +| ir.cpp:2153:68:2153:68 | SideEffect | m2153_21 | +| ir.cpp:2153:68:2153:68 | SideEffect | ~m2152_6 | +| ir.cpp:2153:68:2153:68 | SideEffect | ~m2153_11 | +| ir.cpp:2153:68:2153:68 | SideEffect | ~m2153_22 | +| ir.cpp:2153:68:2153:68 | SideEffect | ~m2153_29 | +| ir.cpp:2153:68:2153:68 | SideEffect | ~m2154_6 | +| ir.cpp:2153:68:2153:68 | StoreValue | r2153_9 | +| ir.cpp:2153:68:2153:68 | StoreValue | r2153_17 | +| ir.cpp:2153:68:2153:68 | Unary | r2153_7 | +| ir.cpp:2153:68:2153:68 | Unary | r2153_15 | +| ir.cpp:2153:68:2153:68 | Unary | r2153_23 | +| ir.cpp:2153:68:2153:68 | Unary | r2153_32 | +| ir.cpp:2153:68:2153:68 | Unary | r2153_41 | +| ir.cpp:2153:68:2153:69 | StoreValue | r2153_3 | +| ir.cpp:2153:68:2153:69 | Unary | r2153_2 | +| ir.cpp:2153:68:2153:70 | Load | ~m2153_36 | +| ir.cpp:2153:68:2153:70 | StoreValue | r2153_37 | +| ir.cpp:2154:7:2154:7 | Address | &:r2154_1 | +| ir.cpp:2154:7:2154:7 | Address | &:r2154_1 | +| ir.cpp:2154:7:2154:7 | Arg(this) | this:r2154_1 | +| ir.cpp:2154:7:2154:7 | ChiPartial | partial:m2154_8 | +| ir.cpp:2154:7:2154:7 | ChiTotal | total:m2153_38 | +| ir.cpp:2154:7:2154:7 | SideEffect | m2153_38 | +| ir.cpp:2154:9:2154:13 | CallTarget | func:r2154_2 | +| ir.cpp:2154:9:2154:13 | ChiPartial | partial:m2154_5 | +| ir.cpp:2154:9:2154:13 | ChiTotal | total:m2153_36 | +| ir.cpp:2154:9:2154:13 | SideEffect | ~m2153_36 | +| ir.cpp:2154:15:2154:17 | Arg(0) | 0:r2154_3 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_7 | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index c7c7ad6f53a..2b8214652d6 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -6,10 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:2138:9:2138:9 | IndirectMayWriteSideEffect: x | Instruction 'IndirectMayWriteSideEffect: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | -| ir.cpp:2140:39:2140:39 | IndirectMayWriteSideEffect: call to ClassWithDestructor | Instruction 'IndirectMayWriteSideEffect: call to ClassWithDestructor' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | -| ir.cpp:2140:42:2140:76 | Constant: initialization_with_destructor_bool | Instruction 'Constant: initialization_with_destructor_bool' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | -| ir.cpp:2141:9:2141:9 | IndirectMayWriteSideEffect: x | Instruction 'IndirectMayWriteSideEffect: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction 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 6ef4a69e0db..852241041c3 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -11804,18 +11804,30 @@ ir.cpp: # 2137| r2137_7(glval) = VariableAddress[b] : # 2137| r2137_8(bool) = Load[b] : &:r2137_7, ~m? # 2137| v2137_9(void) = ConditionalBranch : r2137_8 -#-----| True -> Block 4 +#-----| False -> Block 2 +#-----| True -> Block 1 -# 2140| Block 1 -# 2140| r2140_1(bool) = Constant[1] : +# 2138| Block 1 +# 2138| r2138_1(glval) = VariableAddress[x] : +# 2138| r2138_2(glval) = FunctionAddress[set_x] : +# 2138| r2138_3(char) = Constant[97] : +# 2138| v2138_4(void) = Call[set_x] : func:r2138_2, this:r2138_1, 0:r2138_3 +# 2138| mu2138_5(unknown) = ^CallSideEffect : ~m? +# 2138| v2138_6(void) = ^IndirectReadSideEffect[-1] : &:r2138_1, ~m? +# 2138| mu2138_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2138_1 +#-----| Goto -> Block 2 # 2140| Block 2 -# 2140| r2140_2(glval) = VariableAddress[x] : -# 2140| mu2140_3(ClassWithDestructor) = Uninitialized[x] : &:r2140_2 -# 2140| r2140_4(glval) = FunctionAddress[ClassWithDestructor] : -# 2140| v2140_5(void) = Call[ClassWithDestructor] : func:r2140_4, this:r2140_2 -# 2140| mu2140_6(unknown) = ^CallSideEffect : ~m? -# 2140| mu2140_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2140_2 +# 2140| r2140_1(glval) = VariableAddress[x] : +# 2140| mu2140_2(ClassWithDestructor) = Uninitialized[x] : &:r2140_1 +# 2140| r2140_3(glval) = FunctionAddress[ClassWithDestructor] : +# 2140| v2140_4(void) = Call[ClassWithDestructor] : func:r2140_3, this:r2140_1 +# 2140| mu2140_5(unknown) = ^CallSideEffect : ~m? +# 2140| mu2140_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2140_1 +# 2140| r2140_7(bool) = Constant[1] : +# 2140| v2140_8(void) = ConditionalBranch : r2140_7 +#-----| False -> Block 4 +#-----| True -> Block 3 # 2141| Block 3 # 2141| r2141_1(glval) = VariableAddress[x] : @@ -11825,17 +11837,9 @@ ir.cpp: # 2141| mu2141_5(unknown) = ^CallSideEffect : ~m? # 2141| v2141_6(void) = ^IndirectReadSideEffect[-1] : &:r2141_1, ~m? # 2141| mu2141_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2141_1 +#-----| Goto -> Block 4 -# 2138| Block 4 -# 2138| r2138_1(glval) = VariableAddress[x] : -# 2138| r2138_2(glval) = FunctionAddress[set_x] : -# 2138| r2138_3(char) = Constant[97] : -# 2138| v2138_4(void) = Call[set_x] : func:r2138_2, this:r2138_1, 0:r2138_3 -# 2138| mu2138_5(unknown) = ^CallSideEffect : ~m? -# 2138| v2138_6(void) = ^IndirectReadSideEffect[-1] : &:r2138_1, ~m? -# 2138| mu2138_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2138_1 - -# 2143| Block 5 +# 2143| Block 4 # 2143| r2143_1(glval) = VariableAddress[x] : # 2143| mu2143_2(ClassWithDestructor) = Uninitialized[x] : &:r2143_1 # 2143| r2143_3(glval) = FunctionAddress[ClassWithDestructor] : @@ -11846,10 +11850,10 @@ ir.cpp: # 2143| r2143_8(char) = Load[c] : &:r2143_7, ~m? # 2143| r2143_9(int) = Convert : r2143_8 # 2143| v2143_10(void) = Switch : r2143_9 -#-----| Case[97] -> Block 6 -#-----| Default -> Block 7 +#-----| Case[97] -> Block 5 +#-----| Default -> Block 6 -# 2144| Block 6 +# 2144| Block 5 # 2144| v2144_1(void) = NoOp : # 2145| r2145_1(glval) = VariableAddress[x] : # 2145| r2145_2(glval) = FunctionAddress[set_x] : @@ -11859,9 +11863,9 @@ ir.cpp: # 2145| v2145_6(void) = ^IndirectReadSideEffect[-1] : &:r2145_1, ~m? # 2145| mu2145_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2145_1 # 2146| v2146_1(void) = NoOp : -#-----| Goto -> Block 8 +#-----| Goto -> Block 7 -# 2147| Block 7 +# 2147| Block 6 # 2147| v2147_1(void) = NoOp : # 2148| r2148_1(glval) = VariableAddress[x] : # 2148| r2148_2(glval) = FunctionAddress[set_x] : @@ -11871,9 +11875,9 @@ ir.cpp: # 2148| v2148_6(void) = ^IndirectReadSideEffect[-1] : &:r2148_1, ~m? # 2148| mu2148_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2148_1 # 2149| v2149_1(void) = NoOp : -#-----| Goto -> Block 8 +#-----| Goto -> Block 7 -# 2150| Block 8 +# 2150| Block 7 # 2150| v2150_1(void) = NoOp : # 2152| r2152_1(glval) = VariableAddress[x] : # 2152| mu2152_2(ClassWithDestructor) = Uninitialized[x] : &:r2152_1 @@ -11905,9 +11909,9 @@ ir.cpp: # 2153| mu2153_17(unknown) = ^CallSideEffect : ~m? #-----| v0_6(void) = ^IndirectReadSideEffect[-1] : &:r0_5, ~m? # 2153| mu2153_18(iterator) = Store[(__end)] : &:r2153_12, r2153_16 -#-----| Goto -> Block 9 +#-----| Goto -> Block 8 -# 2153| Block 9 +# 2153| Block 8 # 2153| r2153_19(glval) = VariableAddress[(__begin)] : #-----| r0_7(glval) = Convert : r2153_19 # 2153| r2153_20(glval) = FunctionAddress[operator!=] : @@ -11917,10 +11921,10 @@ ir.cpp: # 2153| mu2153_24(unknown) = ^CallSideEffect : ~m? #-----| v0_8(void) = ^IndirectReadSideEffect[-1] : &:r0_7, ~m? # 2153| v2153_25(void) = ConditionalBranch : r2153_23 -#-----| False -> Block 11 -#-----| True -> Block 10 +#-----| False -> Block 10 +#-----| True -> Block 9 -# 2153| Block 10 +# 2153| Block 9 # 2153| r2153_26(glval) = VariableAddress[y] : # 2153| r2153_27(glval) = VariableAddress[(__begin)] : #-----| r0_9(glval) = Convert : r2153_27 @@ -11944,9 +11948,9 @@ ir.cpp: # 2153| v2153_37(void) = ^IndirectReadSideEffect[-1] : &:r2153_33, ~m? # 2153| mu2153_38(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2153_33 # 2153| r2153_39(glval) = CopyValue : r2153_35 -#-----| Goto (back edge) -> Block 9 +#-----| Goto (back edge) -> Block 8 -# 2155| Block 11 +# 2155| Block 10 # 2155| v2155_1(void) = NoOp : # 2136| v2136_8(void) = ReturnVoid : # 2136| v2136_9(void) = AliasedUse : ~m? diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index bdc0ef3463e..6e9be083ee0 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected @@ -6,7 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:2138:9:2138:9 | IndirectMayWriteSideEffect: x | Instruction 'IndirectMayWriteSideEffect: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction @@ -29,4 +28,5 @@ nonUniqueEnclosingIRFunction fieldAddressOnNonPointer thisArgumentIsNonPointer nonUniqueIRVariable +| ir.cpp:2153:68:2153:69 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | missingCppType diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected index bdc0ef3463e..6e9be083ee0 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected @@ -6,7 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:2138:9:2138:9 | IndirectMayWriteSideEffect: x | Instruction 'IndirectMayWriteSideEffect: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction @@ -29,4 +28,5 @@ nonUniqueEnclosingIRFunction fieldAddressOnNonPointer thisArgumentIsNonPointer nonUniqueIRVariable +| ir.cpp:2153:68:2153:69 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) | missingCppType