From 75c453fd3054d0e1b4a8f32daab658c352e0fd33 Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Tue, 5 Mar 2024 22:26:08 +0000 Subject: [PATCH 01/35] C++: Unsuppress temporary destructors in IR --- .../raw/internal/TranslatedElement.qll | 3 --- .../implementation/raw/internal/TranslatedExpr.qll | 13 +++++++++++++ 2 files changed, 13 insertions(+), 3 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 d6ad6b8fde49..6f8cfe93507b 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 @@ -127,9 +127,6 @@ private predicate ignoreExprAndDescendants(Expr expr) { exists(BuiltInVarArgsStart vaStartExpr | vaStartExpr.getLastNamedParameter().getFullyConverted() = expr ) - or - // suppress destructors of temporary variables until proper support is added for them. - exists(Expr parent | parent.getAnImplicitDestructorCall() = expr) } /** diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll index 1a668ad6c23a..2b6a22d0e452 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll @@ -97,6 +97,19 @@ abstract class TranslatedExpr extends TranslatedElement { ) } + final override predicate hasAnImplicitDestructorCall() { + exists(expr.getAnImplicitDestructorCall()) + } + + final override int getFirstDestructorCallIndex() { + not this.handlesDestructorsExplicitly() and + ( + result = max(int childId | exists(this.getChildInternal(childId))) + 1 + or + not exists(this.getChildInternal(_)) and result = 0 + ) + } + final override Locatable getAst() { result = expr } final override Declaration getFunction() { result = getEnclosingDeclaration(expr) } From 894d934de85ea81d96a88ccd4845f70d1c4f5ba0 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 4 Apr 2024 10:36:05 +0100 Subject: [PATCH 02/35] C++: Accept test changes. --- .../library-tests/ir/ir/aliased_ir.expected | 2815 ++++++++++------- .../ir/ir/aliased_ssa_consistency.expected | 62 + .../aliased_ssa_consistency_unsound.expected | 75 + .../ir/ir/operand_locations.expected | 1806 +++++++---- .../ir/ir/raw_consistency.expected | 49 + .../test/library-tests/ir/ir/raw_ir.expected | 2314 ++++++++------ .../ir/ir/unaliased_ssa_consistency.expected | 48 + ...unaliased_ssa_consistency_unsound.expected | 48 + 8 files changed, 4403 insertions(+), 2814 deletions(-) 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 cb7eb8386d06..5f591651a2f4 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -762,132 +762,172 @@ destructors_for_temps.cpp: # 14| char temp_test() # 14| Block 0 -# 14| v14_1(void) = EnterFunction : -# 14| m14_2(unknown) = AliasedDefinition : -# 14| m14_3(unknown) = InitializeNonLocal : -# 14| m14_4(unknown) = Chi : total:m14_2, partial:m14_3 -# 15| r15_1(glval) = VariableAddress[x] : -# 15| r15_2(glval) = VariableAddress[#temp15:14] : -# 15| m15_3(ClassWithDestructor2) = Uninitialized[#temp15:14] : &:r15_2 -# 15| r15_4(glval) = FunctionAddress[ClassWithDestructor2] : -# 15| v15_5(void) = Call[ClassWithDestructor2] : func:r15_4, this:r15_2 -# 15| m15_6(unknown) = ^CallSideEffect : ~m14_4 -# 15| m15_7(unknown) = Chi : total:m14_4, partial:m15_6 -# 15| m15_8(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r15_2 -# 15| m15_9(ClassWithDestructor2) = Chi : total:m15_3, partial:m15_8 -# 15| r15_10(glval) = FunctionAddress[get_x] : -# 15| r15_11(char) = Call[get_x] : func:r15_10, this:r15_2 -# 15| m15_12(unknown) = ^CallSideEffect : ~m15_7 -# 15| m15_13(unknown) = Chi : total:m15_7, partial:m15_12 -# 15| v15_14(void) = ^IndirectReadSideEffect[-1] : &:r15_2, m15_9 -# 15| m15_15(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r15_2 -# 15| m15_16(ClassWithDestructor2) = Chi : total:m15_9, partial:m15_15 -# 15| m15_17(char) = Store[x] : &:r15_1, r15_11 -# 16| r16_1(glval) = VariableAddress[y] : -# 16| m16_2(ClassWithConstructor) = Uninitialized[y] : &:r16_1 -# 16| r16_3(glval) = FunctionAddress[ClassWithConstructor] : -# 16| r16_4(char) = Constant[97] : -# 16| r16_5(glval) = VariableAddress[#temp16:33] : -# 16| m16_6(ClassWithDestructor2) = Uninitialized[#temp16:33] : &:r16_5 -# 16| r16_7(glval) = FunctionAddress[ClassWithDestructor2] : -# 16| v16_8(void) = Call[ClassWithDestructor2] : func:r16_7, this:r16_5 -# 16| m16_9(unknown) = ^CallSideEffect : ~m15_13 -# 16| m16_10(unknown) = Chi : total:m15_13, partial:m16_9 -# 16| m16_11(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r16_5 -# 16| m16_12(ClassWithDestructor2) = Chi : total:m16_6, partial:m16_11 -# 16| r16_13(glval) = FunctionAddress[get_x] : -# 16| r16_14(char) = Call[get_x] : func:r16_13, this:r16_5 -# 16| m16_15(unknown) = ^CallSideEffect : ~m16_10 -# 16| m16_16(unknown) = Chi : total:m16_10, partial:m16_15 -# 16| v16_17(void) = ^IndirectReadSideEffect[-1] : &:r16_5, m16_12 -# 16| m16_18(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r16_5 -# 16| m16_19(ClassWithDestructor2) = Chi : total:m16_12, partial:m16_18 -# 16| v16_20(void) = Call[ClassWithConstructor] : func:r16_3, this:r16_1, 0:r16_4, 1:r16_14 -# 16| m16_21(unknown) = ^CallSideEffect : ~m16_16 -# 16| m16_22(unknown) = Chi : total:m16_16, partial:m16_21 -# 16| m16_23(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r16_1 -# 16| m16_24(ClassWithConstructor) = Chi : total:m16_2, partial:m16_23 -# 17| r17_1(glval) = VariableAddress[#return] : -# 17| r17_2(glval) = VariableAddress[#temp17:12] : -# 17| m17_3(ClassWithDestructor2) = Uninitialized[#temp17:12] : &:r17_2 -# 17| r17_4(glval) = FunctionAddress[ClassWithDestructor2] : -# 17| v17_5(void) = Call[ClassWithDestructor2] : func:r17_4, this:r17_2 -# 17| m17_6(unknown) = ^CallSideEffect : ~m16_22 -# 17| m17_7(unknown) = Chi : total:m16_22, partial:m17_6 -# 17| m17_8(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r17_2 -# 17| m17_9(ClassWithDestructor2) = Chi : total:m17_3, partial:m17_8 -# 17| r17_10(glval) = FunctionAddress[get_x] : -# 17| r17_11(char) = Call[get_x] : func:r17_10, this:r17_2 -# 17| m17_12(unknown) = ^CallSideEffect : ~m17_7 -# 17| m17_13(unknown) = Chi : total:m17_7, partial:m17_12 -# 17| v17_14(void) = ^IndirectReadSideEffect[-1] : &:r17_2, m17_9 -# 17| m17_15(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r17_2 -# 17| m17_16(ClassWithDestructor2) = Chi : total:m17_9, partial:m17_15 -# 17| m17_17(char) = Store[#return] : &:r17_1, r17_11 -# 14| r14_5(glval) = VariableAddress[#return] : -# 14| v14_6(void) = ReturnValue : &:r14_5, m17_17 -# 14| v14_7(void) = AliasedUse : ~m17_13 -# 14| v14_8(void) = ExitFunction : +# 14| v14_1(void) = EnterFunction : +# 14| m14_2(unknown) = AliasedDefinition : +# 14| m14_3(unknown) = InitializeNonLocal : +# 14| m14_4(unknown) = Chi : total:m14_2, partial:m14_3 +# 15| r15_1(glval) = VariableAddress[x] : +# 15| r15_2(glval) = VariableAddress[#temp15:14] : +# 15| m15_3(ClassWithDestructor2) = Uninitialized[#temp15:14] : &:r15_2 +# 15| r15_4(glval) = FunctionAddress[ClassWithDestructor2] : +# 15| v15_5(void) = Call[ClassWithDestructor2] : func:r15_4, this:r15_2 +# 15| m15_6(unknown) = ^CallSideEffect : ~m14_4 +# 15| m15_7(unknown) = Chi : total:m14_4, partial:m15_6 +# 15| m15_8(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r15_2 +# 15| m15_9(ClassWithDestructor2) = Chi : total:m15_3, partial:m15_8 +# 15| r15_10(glval) = FunctionAddress[get_x] : +# 15| r15_11(char) = Call[get_x] : func:r15_10, this:r15_2 +# 15| m15_12(unknown) = ^CallSideEffect : ~m15_7 +# 15| m15_13(unknown) = Chi : total:m15_7, partial:m15_12 +# 15| v15_14(void) = ^IndirectReadSideEffect[-1] : &:r15_2, m15_9 +# 15| m15_15(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r15_2 +# 15| m15_16(ClassWithDestructor2) = Chi : total:m15_9, partial:m15_15 +# 15| r15_17(glval) = CopyValue : r15_2 +# 15| r15_18(glval) = FunctionAddress[~ClassWithDestructor2] : +# 15| v15_19(void) = Call[~ClassWithDestructor2] : func:r15_18, this:r15_17 +# 15| m15_20(unknown) = ^CallSideEffect : ~m15_13 +# 15| m15_21(unknown) = Chi : total:m15_13, partial:m15_20 +# 15| v15_22(void) = ^IndirectReadSideEffect[-1] : &:r15_17, m15_16 +# 15| m15_23(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r15_17 +# 15| m15_24(ClassWithDestructor2) = Chi : total:m15_16, partial:m15_23 +# 15| m15_25(char) = Store[x] : &:r15_1, r15_11 +# 16| r16_1(glval) = VariableAddress[y] : +# 16| m16_2(ClassWithConstructor) = Uninitialized[y] : &:r16_1 +# 16| r16_3(glval) = FunctionAddress[ClassWithConstructor] : +# 16| r16_4(char) = Constant[97] : +# 16| r16_5(glval) = VariableAddress[#temp16:33] : +# 16| m16_6(ClassWithDestructor2) = Uninitialized[#temp16:33] : &:r16_5 +# 16| r16_7(glval) = FunctionAddress[ClassWithDestructor2] : +# 16| v16_8(void) = Call[ClassWithDestructor2] : func:r16_7, this:r16_5 +# 16| m16_9(unknown) = ^CallSideEffect : ~m15_21 +# 16| m16_10(unknown) = Chi : total:m15_21, partial:m16_9 +# 16| m16_11(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r16_5 +# 16| m16_12(ClassWithDestructor2) = Chi : total:m16_6, partial:m16_11 +# 16| r16_13(glval) = FunctionAddress[get_x] : +# 16| r16_14(char) = Call[get_x] : func:r16_13, this:r16_5 +# 16| m16_15(unknown) = ^CallSideEffect : ~m16_10 +# 16| m16_16(unknown) = Chi : total:m16_10, partial:m16_15 +# 16| v16_17(void) = ^IndirectReadSideEffect[-1] : &:r16_5, m16_12 +# 16| m16_18(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r16_5 +# 16| m16_19(ClassWithDestructor2) = Chi : total:m16_12, partial:m16_18 +# 16| v16_20(void) = Call[ClassWithConstructor] : func:r16_3, this:r16_1, 0:r16_4, 1:r16_14 +# 16| m16_21(unknown) = ^CallSideEffect : ~m16_16 +# 16| m16_22(unknown) = Chi : total:m16_16, partial:m16_21 +# 16| m16_23(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r16_1 +# 16| m16_24(ClassWithConstructor) = Chi : total:m16_2, partial:m16_23 +# 16| r16_25(glval) = CopyValue : r16_5 +# 16| r16_26(glval) = FunctionAddress[~ClassWithDestructor2] : +# 16| v16_27(void) = Call[~ClassWithDestructor2] : func:r16_26, this:r16_25 +# 16| m16_28(unknown) = ^CallSideEffect : ~m16_22 +# 16| m16_29(unknown) = Chi : total:m16_22, partial:m16_28 +# 16| v16_30(void) = ^IndirectReadSideEffect[-1] : &:r16_25, m16_19 +# 16| m16_31(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r16_25 +# 16| m16_32(ClassWithDestructor2) = Chi : total:m16_19, partial:m16_31 +# 17| r17_1(glval) = VariableAddress[#return] : +# 17| r17_2(glval) = VariableAddress[#temp17:12] : +# 17| m17_3(ClassWithDestructor2) = Uninitialized[#temp17:12] : &:r17_2 +# 17| r17_4(glval) = FunctionAddress[ClassWithDestructor2] : +# 17| v17_5(void) = Call[ClassWithDestructor2] : func:r17_4, this:r17_2 +# 17| m17_6(unknown) = ^CallSideEffect : ~m16_29 +# 17| m17_7(unknown) = Chi : total:m16_29, partial:m17_6 +# 17| m17_8(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r17_2 +# 17| m17_9(ClassWithDestructor2) = Chi : total:m17_3, partial:m17_8 +# 17| r17_10(glval) = FunctionAddress[get_x] : +# 17| r17_11(char) = Call[get_x] : func:r17_10, this:r17_2 +# 17| m17_12(unknown) = ^CallSideEffect : ~m17_7 +# 17| m17_13(unknown) = Chi : total:m17_7, partial:m17_12 +# 17| v17_14(void) = ^IndirectReadSideEffect[-1] : &:r17_2, m17_9 +# 17| m17_15(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r17_2 +# 17| m17_16(ClassWithDestructor2) = Chi : total:m17_9, partial:m17_15 +# 17| r17_17(glval) = CopyValue : r17_2 +# 17| r17_18(glval) = FunctionAddress[~ClassWithDestructor2] : +# 17| v17_19(void) = Call[~ClassWithDestructor2] : func:r17_18, this:r17_17 +# 17| m17_20(unknown) = ^CallSideEffect : ~m17_13 +# 17| m17_21(unknown) = Chi : total:m17_13, partial:m17_20 +# 17| v17_22(void) = ^IndirectReadSideEffect[-1] : &:r17_17, m17_16 +# 17| m17_23(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r17_17 +# 17| m17_24(ClassWithDestructor2) = Chi : total:m17_16, partial:m17_23 +# 17| m17_25(char) = Store[#return] : &:r17_1, r17_11 +# 14| r14_5(glval) = VariableAddress[#return] : +# 14| v14_6(void) = ReturnValue : &:r14_5, m17_25 +# 14| v14_7(void) = AliasedUse : ~m17_21 +# 14| v14_8(void) = ExitFunction : # 21| char temp_test2() # 21| Block 0 -# 21| v21_1(void) = EnterFunction : -# 21| m21_2(unknown) = AliasedDefinition : -# 21| m21_3(unknown) = InitializeNonLocal : -# 21| m21_4(unknown) = Chi : total:m21_2, partial:m21_3 -# 22| r22_1(glval) = FunctionAddress[operator new] : -# 22| r22_2(unsigned long) = Constant[1] : -# 22| r22_3(void *) = Call[operator new] : func:r22_1, 0:r22_2 -# 22| m22_4(unknown) = ^CallSideEffect : ~m21_4 -# 22| m22_5(unknown) = Chi : total:m21_4, partial:m22_4 -# 22| m22_6(unknown) = ^InitializeDynamicAllocation : &:r22_3 -# 22| r22_7(ClassWithDestructor2 *) = Convert : r22_3 -# 22| r22_8(glval) = FunctionAddress[ClassWithDestructor2] : -# 22| v22_9(void) = Call[ClassWithDestructor2] : func:r22_8, this:r22_7 -# 22| m22_10(unknown) = ^CallSideEffect : ~m22_5 -# 22| m22_11(unknown) = Chi : total:m22_5, partial:m22_10 -# 22| m22_12(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r22_7 -# 22| m22_13(unknown) = Chi : total:m22_6, partial:m22_12 -# 23| r23_1(glval) = VariableAddress[#return] : -# 23| r23_2(glval) = VariableAddress[#temp23:12] : -# 23| m23_3(ClassWithDestructor2) = Uninitialized[#temp23:12] : &:r23_2 -# 23| r23_4(glval) = FunctionAddress[ClassWithDestructor2] : -# 23| v23_5(void) = Call[ClassWithDestructor2] : func:r23_4, this:r23_2 -# 23| m23_6(unknown) = ^CallSideEffect : ~m22_11 -# 23| m23_7(unknown) = Chi : total:m22_11, partial:m23_6 -# 23| m23_8(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r23_2 -# 23| m23_9(ClassWithDestructor2) = Chi : total:m23_3, partial:m23_8 -# 23| r23_10(glval) = FunctionAddress[get_x] : -# 23| r23_11(char) = Call[get_x] : func:r23_10, this:r23_2 -# 23| m23_12(unknown) = ^CallSideEffect : ~m23_7 -# 23| m23_13(unknown) = Chi : total:m23_7, partial:m23_12 -# 23| v23_14(void) = ^IndirectReadSideEffect[-1] : &:r23_2, m23_9 -# 23| m23_15(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r23_2 -# 23| m23_16(ClassWithDestructor2) = Chi : total:m23_9, partial:m23_15 -# 23| r23_17(int) = Convert : r23_11 -# 23| r23_18(glval) = VariableAddress[#temp23:45] : -# 23| m23_19(ClassWithDestructor2) = Uninitialized[#temp23:45] : &:r23_18 -# 23| r23_20(glval) = FunctionAddress[ClassWithDestructor2] : -# 23| v23_21(void) = Call[ClassWithDestructor2] : func:r23_20, this:r23_18 -# 23| m23_22(unknown) = ^CallSideEffect : ~m23_13 -# 23| m23_23(unknown) = Chi : total:m23_13, partial:m23_22 -# 23| m23_24(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r23_18 -# 23| m23_25(ClassWithDestructor2) = Chi : total:m23_19, partial:m23_24 -# 23| r23_26(glval) = FunctionAddress[get_x] : -# 23| r23_27(char) = Call[get_x] : func:r23_26, this:r23_18 -# 23| m23_28(unknown) = ^CallSideEffect : ~m23_23 -# 23| m23_29(unknown) = Chi : total:m23_23, partial:m23_28 -# 23| v23_30(void) = ^IndirectReadSideEffect[-1] : &:r23_18, m23_25 -# 23| m23_31(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r23_18 -# 23| m23_32(ClassWithDestructor2) = Chi : total:m23_25, partial:m23_31 -# 23| r23_33(int) = Convert : r23_27 -# 23| r23_34(int) = Add : r23_17, r23_33 -# 23| r23_35(char) = Convert : r23_34 -# 23| m23_36(char) = Store[#return] : &:r23_1, r23_35 -# 21| r21_5(glval) = VariableAddress[#return] : -# 21| v21_6(void) = ReturnValue : &:r21_5, m23_36 -# 21| v21_7(void) = AliasedUse : ~m23_29 -# 21| v21_8(void) = ExitFunction : +# 21| v21_1(void) = EnterFunction : +# 21| m21_2(unknown) = AliasedDefinition : +# 21| m21_3(unknown) = InitializeNonLocal : +# 21| m21_4(unknown) = Chi : total:m21_2, partial:m21_3 +# 22| r22_1(glval) = FunctionAddress[operator new] : +# 22| r22_2(unsigned long) = Constant[1] : +# 22| r22_3(void *) = Call[operator new] : func:r22_1, 0:r22_2 +# 22| m22_4(unknown) = ^CallSideEffect : ~m21_4 +# 22| m22_5(unknown) = Chi : total:m21_4, partial:m22_4 +# 22| m22_6(unknown) = ^InitializeDynamicAllocation : &:r22_3 +# 22| r22_7(ClassWithDestructor2 *) = Convert : r22_3 +# 22| r22_8(glval) = FunctionAddress[ClassWithDestructor2] : +# 22| v22_9(void) = Call[ClassWithDestructor2] : func:r22_8, this:r22_7 +# 22| m22_10(unknown) = ^CallSideEffect : ~m22_5 +# 22| m22_11(unknown) = Chi : total:m22_5, partial:m22_10 +# 22| m22_12(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r22_7 +# 22| m22_13(unknown) = Chi : total:m22_6, partial:m22_12 +# 23| r23_1(glval) = VariableAddress[#return] : +# 23| r23_2(glval) = VariableAddress[#temp23:12] : +# 23| m23_3(ClassWithDestructor2) = Uninitialized[#temp23:12] : &:r23_2 +# 23| r23_4(glval) = FunctionAddress[ClassWithDestructor2] : +# 23| v23_5(void) = Call[ClassWithDestructor2] : func:r23_4, this:r23_2 +# 23| m23_6(unknown) = ^CallSideEffect : ~m22_11 +# 23| m23_7(unknown) = Chi : total:m22_11, partial:m23_6 +# 23| m23_8(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r23_2 +# 23| m23_9(ClassWithDestructor2) = Chi : total:m23_3, partial:m23_8 +# 23| r23_10(glval) = FunctionAddress[get_x] : +# 23| r23_11(char) = Call[get_x] : func:r23_10, this:r23_2 +# 23| m23_12(unknown) = ^CallSideEffect : ~m23_7 +# 23| m23_13(unknown) = Chi : total:m23_7, partial:m23_12 +# 23| v23_14(void) = ^IndirectReadSideEffect[-1] : &:r23_2, m23_9 +# 23| m23_15(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r23_2 +# 23| m23_16(ClassWithDestructor2) = Chi : total:m23_9, partial:m23_15 +# 23| r23_17(int) = Convert : r23_11 +# 23| r23_18(glval) = VariableAddress[#temp23:45] : +# 23| m23_19(ClassWithDestructor2) = Uninitialized[#temp23:45] : &:r23_18 +# 23| r23_20(glval) = FunctionAddress[ClassWithDestructor2] : +# 23| v23_21(void) = Call[ClassWithDestructor2] : func:r23_20, this:r23_18 +# 23| m23_22(unknown) = ^CallSideEffect : ~m23_13 +# 23| m23_23(unknown) = Chi : total:m23_13, partial:m23_22 +# 23| m23_24(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r23_18 +# 23| m23_25(ClassWithDestructor2) = Chi : total:m23_19, partial:m23_24 +# 23| r23_26(glval) = FunctionAddress[get_x] : +# 23| r23_27(char) = Call[get_x] : func:r23_26, this:r23_18 +# 23| m23_28(unknown) = ^CallSideEffect : ~m23_23 +# 23| m23_29(unknown) = Chi : total:m23_23, partial:m23_28 +# 23| v23_30(void) = ^IndirectReadSideEffect[-1] : &:r23_18, m23_25 +# 23| m23_31(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r23_18 +# 23| m23_32(ClassWithDestructor2) = Chi : total:m23_25, partial:m23_31 +# 23| r23_33(int) = Convert : r23_27 +# 23| r23_34(int) = Add : r23_17, r23_33 +# 23| r23_35(glval) = CopyValue : r23_18 +# 23| r23_36(glval) = FunctionAddress[~ClassWithDestructor2] : +# 23| v23_37(void) = Call[~ClassWithDestructor2] : func:r23_36, this:r23_35 +# 23| m23_38(unknown) = ^CallSideEffect : ~m23_29 +# 23| m23_39(unknown) = Chi : total:m23_29, partial:m23_38 +# 23| v23_40(void) = ^IndirectReadSideEffect[-1] : &:r23_35, m23_32 +# 23| m23_41(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r23_35 +# 23| m23_42(ClassWithDestructor2) = Chi : total:m23_32, partial:m23_41 +# 23| r23_43(glval) = CopyValue : r23_2 +# 23| r23_44(glval) = FunctionAddress[~ClassWithDestructor2] : +# 23| v23_45(void) = Call[~ClassWithDestructor2] : func:r23_44, this:r23_43 +# 23| m23_46(unknown) = ^CallSideEffect : ~m23_39 +# 23| m23_47(unknown) = Chi : total:m23_39, partial:m23_46 +# 23| v23_48(void) = ^IndirectReadSideEffect[-1] : &:r23_43, m23_16 +# 23| m23_49(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r23_43 +# 23| m23_50(ClassWithDestructor2) = Chi : total:m23_16, partial:m23_49 +# 23| r23_51(char) = Convert : r23_34 +# 23| m23_52(char) = Store[#return] : &:r23_1, r23_51 +# 21| r21_5(glval) = VariableAddress[#return] : +# 21| v21_6(void) = ReturnValue : &:r21_5, m23_52 +# 21| v21_7(void) = AliasedUse : ~m23_47 +# 21| v21_8(void) = ExitFunction : # 29| void temp_test3() # 29| Block 0 @@ -979,42 +1019,50 @@ destructors_for_temps.cpp: #-----| True -> Block 2 # 39| Block 1 -# 39| m39_5(unknown) = Phi : from 2:~m39_15, from 3:~m39_26 -# 39| m39_6(ClassWithDestructor2) = Phi : from 2:m39_20, from 3:m39_31 -# 39| r39_7(glval) = VariableAddress[#temp39:3] : -# 39| r39_8(ClassWithDestructor2) = Load[#temp39:3] : &:r39_7, m39_6 -# 39| m39_9(ClassWithDestructor2) = Store[#temp39:3] : &:r39_1, r39_8 -# 40| v40_1(void) = NoOp : -# 38| v38_7(void) = ReturnVoid : -# 38| v38_8(void) = AliasedUse : ~m39_5 -# 38| v38_9(void) = ExitFunction : +# 39| m39_5(unknown) = Phi : from 2:~m39_23, from 3:~m39_34 +# 39| m39_6(ClassWithDestructor2) = Phi : from 2:m39_28, from 3:m39_39 +# 39| r39_7(glval) = VariableAddress[#temp39:3] : +# 39| r39_8(ClassWithDestructor2) = Load[#temp39:3] : &:r39_7, m39_6 +# 39| r39_9(glval) = CopyValue : r39_1 +# 39| r39_10(glval) = FunctionAddress[~ClassWithDestructor2] : +# 39| v39_11(void) = Call[~ClassWithDestructor2] : func:r39_10, this:r39_9 +# 39| m39_12(unknown) = ^CallSideEffect : ~m39_5 +# 39| m39_13(unknown) = Chi : total:m39_5, partial:m39_12 +# 39| v39_14(void) = ^IndirectReadSideEffect[-1] : &:r39_9, ~m? +# 39| m39_15(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r39_9 +# 39| m39_16(ClassWithDestructor2) = Chi : total:~m?, partial:m39_15 +# 39| m39_17(ClassWithDestructor2) = Store[#temp39:3] : &:r39_1, r39_8 +# 40| v40_1(void) = NoOp : +# 38| v38_7(void) = ReturnVoid : +# 38| v38_8(void) = AliasedUse : ~m39_13 +# 38| v38_9(void) = ExitFunction : # 39| Block 2 -# 39| r39_10(glval) = VariableAddress[#temp39:7] : -# 39| m39_11(ClassWithDestructor2) = Uninitialized[#temp39:7] : &:r39_10 -# 39| r39_12(glval) = FunctionAddress[ClassWithDestructor2] : -# 39| v39_13(void) = Call[ClassWithDestructor2] : func:r39_12, this:r39_10 -# 39| m39_14(unknown) = ^CallSideEffect : ~m38_4 -# 39| m39_15(unknown) = Chi : total:m38_4, partial:m39_14 -# 39| m39_16(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r39_10 -# 39| m39_17(ClassWithDestructor2) = Chi : total:m39_11, partial:m39_16 -# 39| r39_18(ClassWithDestructor2) = Load[#temp39:7] : &:r39_10, m39_17 -# 39| r39_19(glval) = VariableAddress[#temp39:3] : -# 39| m39_20(ClassWithDestructor2) = Store[#temp39:3] : &:r39_19, r39_18 +# 39| r39_18(glval) = VariableAddress[#temp39:7] : +# 39| m39_19(ClassWithDestructor2) = Uninitialized[#temp39:7] : &:r39_18 +# 39| r39_20(glval) = FunctionAddress[ClassWithDestructor2] : +# 39| v39_21(void) = Call[ClassWithDestructor2] : func:r39_20, this:r39_18 +# 39| m39_22(unknown) = ^CallSideEffect : ~m38_4 +# 39| m39_23(unknown) = Chi : total:m38_4, partial:m39_22 +# 39| m39_24(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r39_18 +# 39| m39_25(ClassWithDestructor2) = Chi : total:m39_19, partial:m39_24 +# 39| r39_26(ClassWithDestructor2) = Load[#temp39:7] : &:r39_18, m39_25 +# 39| r39_27(glval) = VariableAddress[#temp39:3] : +# 39| m39_28(ClassWithDestructor2) = Store[#temp39:3] : &:r39_27, r39_26 #-----| Goto -> Block 1 # 39| Block 3 -# 39| r39_21(glval) = VariableAddress[#temp39:32] : -# 39| m39_22(ClassWithDestructor2) = Uninitialized[#temp39:32] : &:r39_21 -# 39| r39_23(glval) = FunctionAddress[ClassWithDestructor2] : -# 39| v39_24(void) = Call[ClassWithDestructor2] : func:r39_23, this:r39_21 -# 39| m39_25(unknown) = ^CallSideEffect : ~m38_4 -# 39| m39_26(unknown) = Chi : total:m38_4, partial:m39_25 -# 39| m39_27(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r39_21 -# 39| m39_28(ClassWithDestructor2) = Chi : total:m39_22, partial:m39_27 -# 39| r39_29(ClassWithDestructor2) = Load[#temp39:32] : &:r39_21, m39_28 -# 39| r39_30(glval) = VariableAddress[#temp39:3] : -# 39| m39_31(ClassWithDestructor2) = Store[#temp39:3] : &:r39_30, r39_29 +# 39| r39_29(glval) = VariableAddress[#temp39:32] : +# 39| m39_30(ClassWithDestructor2) = Uninitialized[#temp39:32] : &:r39_29 +# 39| r39_31(glval) = FunctionAddress[ClassWithDestructor2] : +# 39| v39_32(void) = Call[ClassWithDestructor2] : func:r39_31, this:r39_29 +# 39| m39_33(unknown) = ^CallSideEffect : ~m38_4 +# 39| m39_34(unknown) = Chi : total:m38_4, partial:m39_33 +# 39| m39_35(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r39_29 +# 39| m39_36(ClassWithDestructor2) = Chi : total:m39_30, partial:m39_35 +# 39| r39_37(ClassWithDestructor2) = Load[#temp39:32] : &:r39_29, m39_36 +# 39| r39_38(glval) = VariableAddress[#temp39:3] : +# 39| m39_39(ClassWithDestructor2) = Store[#temp39:3] : &:r39_38, r39_37 #-----| Goto -> Block 1 # 42| void temp_test6(bool) @@ -1109,11 +1157,11 @@ destructors_for_temps.cpp: # 51| r51_2(glval) = VariableAddress[b] : # 51| r51_3(bool) = Load[b] : &:r51_2, m49_6 # 51| v51_4(void) = ConditionalBranch : r51_3 -#-----| False -> Block 4 -#-----| True -> Block 3 +#-----| False -> Block 6 +#-----| True -> Block 5 # 49| Block 1 -# 49| m49_7(unknown) = Phi : from 2:~m51_26, from 4:~m52_6 +# 49| m49_7(unknown) = Phi : from 2:~m51_28, from 3:~m52_6 # 49| v49_8(void) = AliasedUse : ~m49_7 # 49| v49_9(void) = ExitFunction : @@ -1122,59 +1170,103 @@ destructors_for_temps.cpp: #-----| Goto -> Block 1 # 51| Block 3 -# 51| r51_5(glval) = VariableAddress[#throw51:9] : -# 51| m51_6(ClassWithConstructor) = Uninitialized[#throw51:9] : &:r51_5 -# 51| r51_7(glval) = FunctionAddress[ClassWithConstructor] : -# 51| r51_8(char) = Constant[120] : -# 51| r51_9(glval) = VariableAddress[#temp51:41] : -# 51| m51_10(ClassWithDestructor2) = Uninitialized[#temp51:41] : &:r51_9 -# 51| r51_11(glval) = FunctionAddress[ClassWithDestructor2] : -# 51| v51_12(void) = Call[ClassWithDestructor2] : func:r51_11, this:r51_9 -# 51| m51_13(unknown) = ^CallSideEffect : ~m50_6 -# 51| m51_14(unknown) = Chi : total:m50_6, partial:m51_13 -# 51| m51_15(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_9 -# 51| m51_16(ClassWithDestructor2) = Chi : total:m51_10, partial:m51_15 -# 51| r51_17(glval) = FunctionAddress[get_x] : -# 51| r51_18(char) = Call[get_x] : func:r51_17, this:r51_9 -# 51| m51_19(unknown) = ^CallSideEffect : ~m51_14 -# 51| m51_20(unknown) = Chi : total:m51_14, partial:m51_19 -# 51| v51_21(void) = ^IndirectReadSideEffect[-1] : &:r51_9, m51_16 -# 51| m51_22(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_9 -# 51| m51_23(ClassWithDestructor2) = Chi : total:m51_16, partial:m51_22 -# 51| v51_24(void) = Call[ClassWithConstructor] : func:r51_7, this:r51_5, 0:r51_8, 1:r51_18 -# 51| m51_25(unknown) = ^CallSideEffect : ~m51_20 -# 51| m51_26(unknown) = Chi : total:m51_20, partial:m51_25 -# 51| m51_27(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r51_5 -# 51| m51_28(ClassWithConstructor) = Chi : total:m51_6, partial:m51_27 -# 51| v51_29(void) = ThrowValue : &:r51_5, m51_28 -#-----| Exception -> Block 2 +# 51| m51_5(ClassWithDestructor2) = Store[#temp51:5] : &:r51_1, r51_6 +# 52| v52_1(void) = NoOp : +# 52| r52_2(glval) = VariableAddress[c] : +# 52| r52_3(glval) = FunctionAddress[~ClassWithDestructor2] : +# 52| v52_4(void) = Call[~ClassWithDestructor2] : func:r52_3, this:r52_2 +# 52| m52_5(unknown) = ^CallSideEffect : ~m51_104, ~m51_72 +# 52| m52_6(unknown) = Chi : total:m51_104, total:m51_72, partial:m52_5 +# 52| v52_7(void) = ^IndirectReadSideEffect[-1] : &:r52_2, m50_8 +# 52| m52_8(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r52_2 +# 52| m52_9(ClassWithDestructor2) = Chi : total:m50_8, partial:m52_8 +# 49| v49_11(void) = ReturnVoid : +#-----| Goto -> Block 1 # 51| Block 4 -# 51| r51_30(glval) = VariableAddress[#temp51:75] : -# 51| m51_31(ClassWithDestructor2) = Uninitialized[#temp51:75] : &:r51_30 -# 51| r51_32(glval) = FunctionAddress[ClassWithDestructor2] : -# 51| v51_33(void) = Call[ClassWithDestructor2] : func:r51_32, this:r51_30 -# 51| m51_34(unknown) = ^CallSideEffect : ~m50_6 -# 51| m51_35(unknown) = Chi : total:m50_6, partial:m51_34 -# 51| m51_36(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_30 -# 51| m51_37(ClassWithDestructor2) = Chi : total:m51_31, partial:m51_36 -# 51| r51_38(ClassWithDestructor2) = Load[#temp51:75] : &:r51_30, m51_37 -# 51| r51_39(glval) = VariableAddress[#temp51:5] : -# 51| m51_40(ClassWithDestructor2) = Store[#temp51:5] : &:r51_39, r51_38 -# 51| r51_41(glval) = VariableAddress[#temp51:5] : -# 51| r51_42(ClassWithDestructor2) = Load[#temp51:5] : &:r51_41, m51_40 -# 51| m51_43(ClassWithDestructor2) = Store[#temp51:5] : &:r51_1, r51_42 -# 52| v52_1(void) = NoOp : -# 52| r52_2(glval) = VariableAddress[c] : -# 52| r52_3(glval) = FunctionAddress[~ClassWithDestructor2] : -# 52| v52_4(void) = Call[~ClassWithDestructor2] : func:r52_3, this:r52_2 -# 52| m52_5(unknown) = ^CallSideEffect : ~m51_35 -# 52| m52_6(unknown) = Chi : total:m51_35, partial:m52_5 -# 52| v52_7(void) = ^IndirectReadSideEffect[-1] : &:r52_2, m50_8 -# 52| m52_8(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r52_2 -# 52| m52_9(ClassWithDestructor2) = Chi : total:m50_8, partial:m52_8 -# 49| v49_11(void) = ReturnVoid : -#-----| Goto -> Block 1 +# 51| r51_6(ClassWithDestructor2) = Load[#temp51:5] : &:r51_43, m51_42 +#-----| Goto (back edge) -> Block 8 +#-----| Goto (back edge) -> Block 8 + +# 51| Block 5 +# 51| r51_7(glval) = VariableAddress[#throw51:9] : +# 51| m51_8(ClassWithConstructor) = Uninitialized[#throw51:9] : &:r51_7 +# 51| r51_9(glval) = FunctionAddress[ClassWithConstructor] : +# 51| r51_10(char) = Constant[120] : +# 51| r51_11(glval) = VariableAddress[#temp51:41] : +# 51| m51_12(ClassWithDestructor2) = Uninitialized[#temp51:41] : &:r51_11 +# 51| r51_13(glval) = FunctionAddress[ClassWithDestructor2] : +# 51| v51_14(void) = Call[ClassWithDestructor2] : func:r51_13, this:r51_11 +# 51| m51_15(unknown) = ^CallSideEffect : ~m50_6 +# 51| m51_16(unknown) = Chi : total:m50_6, partial:m51_15 +# 51| m51_17(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_11 +# 51| m51_18(ClassWithDestructor2) = Chi : total:m51_12, partial:m51_17 +# 51| r51_19(glval) = FunctionAddress[get_x] : +# 51| r51_20(char) = Call[get_x] : func:r51_19, this:r51_11 +# 51| m51_21(unknown) = ^CallSideEffect : ~m51_16 +# 51| m51_22(unknown) = Chi : total:m51_16, partial:m51_21 +# 51| v51_23(void) = ^IndirectReadSideEffect[-1] : &:r51_11, m51_18 +# 51| m51_24(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_11 +# 51| m51_25(ClassWithDestructor2) = Chi : total:m51_18, partial:m51_24 +# 51| v51_26(void) = Call[ClassWithConstructor] : func:r51_9, this:r51_7, 0:r51_10, 1:r51_20 +# 51| m51_27(unknown) = ^CallSideEffect : ~m51_22 +# 51| m51_28(unknown) = Chi : total:m51_22, partial:m51_27 +# 51| m51_29(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r51_7 +# 51| m51_30(ClassWithConstructor) = Chi : total:m51_8, partial:m51_29 +# 51| v51_31(void) = ThrowValue : &:r51_7, m51_30 +#-----| Exception -> Block 2 + +# 51| Block 6 +# 51| r51_32(glval) = VariableAddress[#temp51:75] : +# 51| m51_33(ClassWithDestructor2) = Uninitialized[#temp51:75] : &:r51_32 +# 51| r51_34(glval) = FunctionAddress[ClassWithDestructor2] : +# 51| v51_35(void) = Call[ClassWithDestructor2] : func:r51_34, this:r51_32 +# 51| m51_36(unknown) = ^CallSideEffect : ~m50_6 +# 51| m51_37(unknown) = Chi : total:m50_6, partial:m51_36 +# 51| m51_38(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_32 +# 51| m51_39(ClassWithDestructor2) = Chi : total:m51_33, partial:m51_38 +# 51| r51_40(ClassWithDestructor2) = Load[#temp51:75] : &:r51_32, m51_39 +# 51| r51_41(glval) = VariableAddress[#temp51:5] : +# 51| m51_42(ClassWithDestructor2) = Store[#temp51:5] : &:r51_41, r51_40 +# 51| r51_43(glval) = VariableAddress[#temp51:5] : +#-----| Goto -> Block 8 +#-----| Goto -> Block 8 + +# 51| Block 8 +# 51| m51_82(ClassWithDestructor2) = Phi : from 4:m51_59, from 4:m51_91 +# 51| m51_83(unknown) = Phi : from 4:~m51_104, from 4:~m51_72, from 6:~m51_37 +# 51| m51_80(ClassWithDestructor2) = Phi : from 4:m51_67, from 4:m51_99, from 6:m51_39 +# 51| m51_81(ClassWithDestructor2) = Phi : from 4:m51_107, from 4:m51_75 +# 51| r51_84(glval) = CopyValue : r51_1 +# 51| r51_85(glval) = FunctionAddress[~ClassWithDestructor2] : +# 51| v51_86(void) = Call[~ClassWithDestructor2] : func:r51_53, func:r51_85, this:r51_52, this:r51_84 +# 51| m51_87(unknown) = ^CallSideEffect : ~m51_47, ~m51_51, ~m51_79, ~m51_83 +# 51| m51_88(unknown) = Chi : total:m51_47, total:m51_51, total:m51_79, total:m51_83, partial:m51_55, partial:m51_87 +# 51| v51_89(void) = ^IndirectReadSideEffect[-1] : &:r51_52, &:r51_84, m51_46, m51_50, m51_78, m51_82 +# 51| m51_90(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_52, &:r51_84 +# 51| m51_91(ClassWithDestructor2) = Chi : total:m51_46, total:m51_50, total:m51_78, total:m51_82, partial:m51_58, partial:m51_90 +# 51| r51_92(glval) = CopyValue : r51_32 +# 51| r51_93(glval) = FunctionAddress[~ClassWithDestructor2] : +# 51| v51_94(void) = Call[~ClassWithDestructor2] : func:r51_61, func:r51_93, this:r51_60, this:r51_92 +# 51| m51_95(unknown) = ^CallSideEffect : ~m51_56, ~m51_88 +# 51| m51_96(unknown) = Chi : total:m51_56, total:m51_88, partial:m51_63, partial:m51_95 +# 51| v51_97(void) = ^IndirectReadSideEffect[-1] : &:r51_60, &:r51_92, m51_44, m51_48, m51_76, m51_80 +# 51| m51_98(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_60, &:r51_92 +# 51| m51_99(ClassWithDestructor2) = Chi : total:m51_44, total:m51_48, total:m51_76, total:m51_80, partial:m51_66, partial:m51_98 +# 51| r51_68(glval) = CopyValue : r51_11 +# 51| r51_69(glval) = FunctionAddress[~ClassWithDestructor2] : +# 51| v51_70(void) = Call[~ClassWithDestructor2] : func:r51_101, func:r51_69, this:r51_100, this:r51_68 +# 51| m51_71(unknown) = ^CallSideEffect : ~m51_64, ~m51_96 +# 51| m51_72(unknown) = Chi : total:m51_64, total:m51_96, partial:m51_103, partial:m51_71 +# 51| v51_73(void) = ^IndirectReadSideEffect[-1] : &:r51_100, &:r51_68, m51_45, m51_49, m51_77, m51_81 +# 51| m51_74(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_100, &:r51_68 +# 51| m51_75(ClassWithDestructor2) = Chi : total:m51_45, total:m51_49, total:m51_77, total:m51_81, partial:m51_106, partial:m51_74 +#-----| Goto (back edge) -> Block 4 +#-----| Goto (back edge) -> Block 3 + +# 51| Block 8 +#-----| Goto (back edge) -> Block 4 +#-----| Goto (back edge) -> Block 3 # 54| void temp_test8(bool) # 54| Block 0 @@ -1188,11 +1280,11 @@ destructors_for_temps.cpp: # 55| r55_2(glval) = VariableAddress[b] : # 55| r55_3(bool) = Load[b] : &:r55_2, m54_6 # 55| v55_4(void) = ConditionalBranch : r55_3 -#-----| False -> Block 4 -#-----| True -> Block 3 +#-----| False -> Block 6 +#-----| True -> Block 5 # 54| Block 1 -# 54| m54_7(unknown) = Phi : from 2:~m55_26, from 4:~m55_35 +# 54| m54_7(unknown) = Phi : from 2:~m55_28, from 3:~m55_104, from 3:~m55_72 # 54| v54_8(void) = AliasedUse : ~m54_7 # 54| v54_9(void) = ExitFunction : @@ -1201,51 +1293,95 @@ destructors_for_temps.cpp: #-----| Goto -> Block 1 # 55| Block 3 -# 55| r55_5(glval) = VariableAddress[#throw55:9] : -# 55| m55_6(ClassWithConstructor) = Uninitialized[#throw55:9] : &:r55_5 -# 55| r55_7(glval) = FunctionAddress[ClassWithConstructor] : -# 55| r55_8(char) = Constant[120] : -# 55| r55_9(glval) = VariableAddress[#temp55:41] : -# 55| m55_10(ClassWithDestructor2) = Uninitialized[#temp55:41] : &:r55_9 -# 55| r55_11(glval) = FunctionAddress[ClassWithDestructor2] : -# 55| v55_12(void) = Call[ClassWithDestructor2] : func:r55_11, this:r55_9 -# 55| m55_13(unknown) = ^CallSideEffect : ~m54_4 -# 55| m55_14(unknown) = Chi : total:m54_4, partial:m55_13 -# 55| m55_15(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_9 -# 55| m55_16(ClassWithDestructor2) = Chi : total:m55_10, partial:m55_15 -# 55| r55_17(glval) = FunctionAddress[get_x] : -# 55| r55_18(char) = Call[get_x] : func:r55_17, this:r55_9 -# 55| m55_19(unknown) = ^CallSideEffect : ~m55_14 -# 55| m55_20(unknown) = Chi : total:m55_14, partial:m55_19 -# 55| v55_21(void) = ^IndirectReadSideEffect[-1] : &:r55_9, m55_16 -# 55| m55_22(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_9 -# 55| m55_23(ClassWithDestructor2) = Chi : total:m55_16, partial:m55_22 -# 55| v55_24(void) = Call[ClassWithConstructor] : func:r55_7, this:r55_5, 0:r55_8, 1:r55_18 -# 55| m55_25(unknown) = ^CallSideEffect : ~m55_20 -# 55| m55_26(unknown) = Chi : total:m55_20, partial:m55_25 -# 55| m55_27(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r55_5 -# 55| m55_28(ClassWithConstructor) = Chi : total:m55_6, partial:m55_27 -# 55| v55_29(void) = ThrowValue : &:r55_5, m55_28 -#-----| Exception -> Block 2 +# 55| m55_5(ClassWithDestructor2) = Store[#temp55:5] : &:r55_1, r55_6 +# 56| v56_1(void) = NoOp : +# 54| v54_11(void) = ReturnVoid : +#-----| Goto -> Block 1 # 55| Block 4 -# 55| r55_30(glval) = VariableAddress[#temp55:75] : -# 55| m55_31(ClassWithDestructor2) = Uninitialized[#temp55:75] : &:r55_30 -# 55| r55_32(glval) = FunctionAddress[ClassWithDestructor2] : -# 55| v55_33(void) = Call[ClassWithDestructor2] : func:r55_32, this:r55_30 -# 55| m55_34(unknown) = ^CallSideEffect : ~m54_4 -# 55| m55_35(unknown) = Chi : total:m54_4, partial:m55_34 -# 55| m55_36(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_30 -# 55| m55_37(ClassWithDestructor2) = Chi : total:m55_31, partial:m55_36 -# 55| r55_38(ClassWithDestructor2) = Load[#temp55:75] : &:r55_30, m55_37 -# 55| r55_39(glval) = VariableAddress[#temp55:5] : -# 55| m55_40(ClassWithDestructor2) = Store[#temp55:5] : &:r55_39, r55_38 +# 55| r55_6(ClassWithDestructor2) = Load[#temp55:5] : &:r55_43, m55_42 +#-----| Goto (back edge) -> Block 8 +#-----| Goto (back edge) -> Block 8 + +# 55| Block 5 +# 55| r55_7(glval) = VariableAddress[#throw55:9] : +# 55| m55_8(ClassWithConstructor) = Uninitialized[#throw55:9] : &:r55_7 +# 55| r55_9(glval) = FunctionAddress[ClassWithConstructor] : +# 55| r55_10(char) = Constant[120] : +# 55| r55_11(glval) = VariableAddress[#temp55:41] : +# 55| m55_12(ClassWithDestructor2) = Uninitialized[#temp55:41] : &:r55_11 +# 55| r55_13(glval) = FunctionAddress[ClassWithDestructor2] : +# 55| v55_14(void) = Call[ClassWithDestructor2] : func:r55_13, this:r55_11 +# 55| m55_15(unknown) = ^CallSideEffect : ~m54_4 +# 55| m55_16(unknown) = Chi : total:m54_4, partial:m55_15 +# 55| m55_17(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_11 +# 55| m55_18(ClassWithDestructor2) = Chi : total:m55_12, partial:m55_17 +# 55| r55_19(glval) = FunctionAddress[get_x] : +# 55| r55_20(char) = Call[get_x] : func:r55_19, this:r55_11 +# 55| m55_21(unknown) = ^CallSideEffect : ~m55_16 +# 55| m55_22(unknown) = Chi : total:m55_16, partial:m55_21 +# 55| v55_23(void) = ^IndirectReadSideEffect[-1] : &:r55_11, m55_18 +# 55| m55_24(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_11 +# 55| m55_25(ClassWithDestructor2) = Chi : total:m55_18, partial:m55_24 +# 55| v55_26(void) = Call[ClassWithConstructor] : func:r55_9, this:r55_7, 0:r55_10, 1:r55_20 +# 55| m55_27(unknown) = ^CallSideEffect : ~m55_22 +# 55| m55_28(unknown) = Chi : total:m55_22, partial:m55_27 +# 55| m55_29(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r55_7 +# 55| m55_30(ClassWithConstructor) = Chi : total:m55_8, partial:m55_29 +# 55| v55_31(void) = ThrowValue : &:r55_7, m55_30 +#-----| Exception -> Block 2 + +# 55| Block 6 +# 55| r55_32(glval) = VariableAddress[#temp55:75] : +# 55| m55_33(ClassWithDestructor2) = Uninitialized[#temp55:75] : &:r55_32 +# 55| r55_34(glval) = FunctionAddress[ClassWithDestructor2] : +# 55| v55_35(void) = Call[ClassWithDestructor2] : func:r55_34, this:r55_32 +# 55| m55_36(unknown) = ^CallSideEffect : ~m54_4 +# 55| m55_37(unknown) = Chi : total:m54_4, partial:m55_36 +# 55| m55_38(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_32 +# 55| m55_39(ClassWithDestructor2) = Chi : total:m55_33, partial:m55_38 +# 55| r55_40(ClassWithDestructor2) = Load[#temp55:75] : &:r55_32, m55_39 # 55| r55_41(glval) = VariableAddress[#temp55:5] : -# 55| r55_42(ClassWithDestructor2) = Load[#temp55:5] : &:r55_41, m55_40 -# 55| m55_43(ClassWithDestructor2) = Store[#temp55:5] : &:r55_1, r55_42 -# 56| v56_1(void) = NoOp : -# 54| v54_11(void) = ReturnVoid : -#-----| Goto -> Block 1 +# 55| m55_42(ClassWithDestructor2) = Store[#temp55:5] : &:r55_41, r55_40 +# 55| r55_43(glval) = VariableAddress[#temp55:5] : +#-----| Goto -> Block 8 +#-----| Goto -> Block 8 + +# 55| Block 8 +# 55| m55_82(ClassWithDestructor2) = Phi : from 4:m55_107, from 4:m55_75 +# 55| m55_83(unknown) = Phi : from 4:~m55_104, from 4:~m55_72, from 6:~m55_37 +# 55| m55_80(ClassWithDestructor2) = Phi : from 4:m55_59, from 4:m55_91 +# 55| m55_81(ClassWithDestructor2) = Phi : from 4:m55_67, from 4:m55_99, from 6:m55_39 +# 55| r55_84(glval) = CopyValue : r55_1 +# 55| r55_85(glval) = FunctionAddress[~ClassWithDestructor2] : +# 55| v55_86(void) = Call[~ClassWithDestructor2] : func:r55_53, func:r55_85, this:r55_52, this:r55_84 +# 55| m55_87(unknown) = ^CallSideEffect : ~m55_47, ~m55_51, ~m55_79, ~m55_83 +# 55| m55_88(unknown) = Chi : total:m55_47, total:m55_51, total:m55_79, total:m55_83, partial:m55_55, partial:m55_87 +# 55| v55_89(void) = ^IndirectReadSideEffect[-1] : &:r55_52, &:r55_84, m55_44, m55_48, m55_76, m55_80 +# 55| m55_90(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_52, &:r55_84 +# 55| m55_91(ClassWithDestructor2) = Chi : total:m55_44, total:m55_48, total:m55_76, total:m55_80, partial:m55_58, partial:m55_90 +# 55| r55_92(glval) = CopyValue : r55_32 +# 55| r55_93(glval) = FunctionAddress[~ClassWithDestructor2] : +# 55| v55_94(void) = Call[~ClassWithDestructor2] : func:r55_61, func:r55_93, this:r55_60, this:r55_92 +# 55| m55_95(unknown) = ^CallSideEffect : ~m55_56, ~m55_88 +# 55| m55_96(unknown) = Chi : total:m55_56, total:m55_88, partial:m55_63, partial:m55_95 +# 55| v55_97(void) = ^IndirectReadSideEffect[-1] : &:r55_60, &:r55_92, m55_45, m55_49, m55_77, m55_81 +# 55| m55_98(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_60, &:r55_92 +# 55| m55_99(ClassWithDestructor2) = Chi : total:m55_45, total:m55_49, total:m55_77, total:m55_81, partial:m55_66, partial:m55_98 +# 55| r55_68(glval) = CopyValue : r55_11 +# 55| r55_69(glval) = FunctionAddress[~ClassWithDestructor2] : +# 55| v55_70(void) = Call[~ClassWithDestructor2] : func:r55_101, func:r55_69, this:r55_100, this:r55_68 +# 55| m55_71(unknown) = ^CallSideEffect : ~m55_64, ~m55_96 +# 55| m55_72(unknown) = Chi : total:m55_64, total:m55_96, partial:m55_103, partial:m55_71 +# 55| v55_73(void) = ^IndirectReadSideEffect[-1] : &:r55_100, &:r55_68, m55_46, m55_50, m55_78, m55_82 +# 55| m55_74(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_100, &:r55_68 +# 55| m55_75(ClassWithDestructor2) = Chi : total:m55_46, total:m55_50, total:m55_78, total:m55_82, partial:m55_106, partial:m55_74 +#-----| Goto (back edge) -> Block 4 +#-----| Goto (back edge) -> Block 3 + +# 55| Block 8 +#-----| Goto (back edge) -> Block 4 +#-----| Goto (back edge) -> Block 3 ir.c: # 7| void MyCoordsTest(int) @@ -5460,7 +5596,15 @@ ir.cpp: # 809| v809_21(void) = ^BufferReadSideEffect[0] : &:r809_16, ~m809_14 # 809| m809_22(Base) = ^IndirectMayWriteSideEffect[-1] : &:r809_1 # 809| m809_23(Base) = Chi : total:m808_12, partial:m809_22 -# 809| r809_24(glval) = CopyValue : r809_17 +# 809| r809_24(glval) = CopyValue : r809_3 +# 809| r809_25(glval) = FunctionAddress[~Base] : +# 809| v809_26(void) = Call[~Base] : func:r809_25, this:r809_24 +# 809| m809_27(unknown) = ^CallSideEffect : ~m809_19 +# 809| m809_28(unknown) = Chi : total:m809_19, partial:m809_27 +# 809| v809_29(void) = ^IndirectReadSideEffect[-1] : &:r809_24, m809_14 +# 809| m809_30(Base) = ^IndirectMayWriteSideEffect[-1] : &:r809_24 +# 809| m809_31(Base) = Chi : total:m809_14, partial:m809_30 +# 809| r809_32(glval) = CopyValue : r809_17 # 810| r810_1(glval) = VariableAddress[b] : # 810| r810_2(glval) = FunctionAddress[operator=] : # 810| r810_3(glval) = VariableAddress[#temp810:7] : @@ -5470,8 +5614,8 @@ ir.cpp: # 810| r810_7(glval) = ConvertToNonVirtualBase[Middle : Base] : r810_6 # 810| r810_8(Base &) = CopyValue : r810_7 # 810| v810_9(void) = Call[Base] : func:r810_5, this:r810_3, 0:r810_8 -# 810| m810_10(unknown) = ^CallSideEffect : ~m809_19 -# 810| m810_11(unknown) = Chi : total:m809_19, partial:m810_10 +# 810| m810_10(unknown) = ^CallSideEffect : ~m809_28 +# 810| m810_11(unknown) = Chi : total:m809_28, partial:m810_10 # 810| v810_12(void) = ^BufferReadSideEffect[0] : &:r810_8, ~m801_8 # 810| m810_13(Base) = ^IndirectMayWriteSideEffect[-1] : &:r810_3 # 810| m810_14(Base) = Chi : total:m810_4, partial:m810_13 @@ -5484,7 +5628,15 @@ ir.cpp: # 810| v810_21(void) = ^BufferReadSideEffect[0] : &:r810_16, ~m810_14 # 810| m810_22(Base) = ^IndirectMayWriteSideEffect[-1] : &:r810_1 # 810| m810_23(Base) = Chi : total:m809_23, partial:m810_22 -# 810| r810_24(glval) = CopyValue : r810_17 +# 810| r810_24(glval) = CopyValue : r810_3 +# 810| r810_25(glval) = FunctionAddress[~Base] : +# 810| v810_26(void) = Call[~Base] : func:r810_25, this:r810_24 +# 810| m810_27(unknown) = ^CallSideEffect : ~m810_19 +# 810| m810_28(unknown) = Chi : total:m810_19, partial:m810_27 +# 810| v810_29(void) = ^IndirectReadSideEffect[-1] : &:r810_24, m810_14 +# 810| m810_30(Base) = ^IndirectMayWriteSideEffect[-1] : &:r810_24 +# 810| m810_31(Base) = Chi : total:m810_14, partial:m810_30 +# 810| r810_32(glval) = CopyValue : r810_17 # 811| r811_1(glval) = VariableAddress[pm] : # 811| r811_2(Middle *) = Load[pm] : &:r811_1, m805_4 # 811| r811_3(Base *) = ConvertToNonVirtualBase[Middle : Base] : r811_2 @@ -5512,8 +5664,8 @@ ir.cpp: # 816| r816_5(glval) = Convert : r816_4 # 816| r816_6(Middle &) = CopyValue : r816_5 # 816| r816_7(Middle &) = Call[operator=] : func:r816_2, this:r816_1, 0:r816_6 -# 816| m816_8(unknown) = ^CallSideEffect : ~m810_19 -# 816| m816_9(unknown) = Chi : total:m810_19, partial:m816_8 +# 816| m816_8(unknown) = ^CallSideEffect : ~m810_28 +# 816| m816_9(unknown) = Chi : total:m810_28, partial:m816_8 # 816| v816_10(void) = ^IndirectReadSideEffect[-1] : &:r816_1, m801_8 # 816| v816_11(void) = ^BufferReadSideEffect[0] : &:r816_6, ~m810_23 # 816| m816_12(Middle) = ^IndirectMayWriteSideEffect[-1] : &:r816_1 @@ -5586,7 +5738,15 @@ ir.cpp: # 823| v823_22(void) = ^BufferReadSideEffect[0] : &:r823_17, ~m823_15 # 823| m823_23(Base) = ^IndirectMayWriteSideEffect[-1] : &:r823_1 # 823| m823_24(Base) = Chi : total:m822_13, partial:m823_23 -# 823| r823_25(glval) = CopyValue : r823_18 +# 823| r823_25(glval) = CopyValue : r823_3 +# 823| r823_26(glval) = FunctionAddress[~Base] : +# 823| v823_27(void) = Call[~Base] : func:r823_26, this:r823_25 +# 823| m823_28(unknown) = ^CallSideEffect : ~m823_20 +# 823| m823_29(unknown) = Chi : total:m823_20, partial:m823_28 +# 823| v823_30(void) = ^IndirectReadSideEffect[-1] : &:r823_25, m823_15 +# 823| m823_31(Base) = ^IndirectMayWriteSideEffect[-1] : &:r823_25 +# 823| m823_32(Base) = Chi : total:m823_15, partial:m823_31 +# 823| r823_33(glval) = CopyValue : r823_18 # 824| r824_1(glval) = VariableAddress[b] : # 824| r824_2(glval) = FunctionAddress[operator=] : # 824| r824_3(glval) = VariableAddress[#temp824:7] : @@ -5597,8 +5757,8 @@ ir.cpp: # 824| r824_8(glval) = ConvertToNonVirtualBase[Middle : Base] : r824_7 # 824| r824_9(Base &) = CopyValue : r824_8 # 824| v824_10(void) = Call[Base] : func:r824_5, this:r824_3, 0:r824_9 -# 824| m824_11(unknown) = ^CallSideEffect : ~m823_20 -# 824| m824_12(unknown) = Chi : total:m823_20, partial:m824_11 +# 824| m824_11(unknown) = ^CallSideEffect : ~m823_29 +# 824| m824_12(unknown) = Chi : total:m823_29, partial:m824_11 # 824| v824_13(void) = ^BufferReadSideEffect[0] : &:r824_9, ~m802_8 # 824| m824_14(Base) = ^IndirectMayWriteSideEffect[-1] : &:r824_3 # 824| m824_15(Base) = Chi : total:m824_4, partial:m824_14 @@ -5611,7 +5771,15 @@ ir.cpp: # 824| v824_22(void) = ^BufferReadSideEffect[0] : &:r824_17, ~m824_15 # 824| m824_23(Base) = ^IndirectMayWriteSideEffect[-1] : &:r824_1 # 824| m824_24(Base) = Chi : total:m823_24, partial:m824_23 -# 824| r824_25(glval) = CopyValue : r824_18 +# 824| r824_25(glval) = CopyValue : r824_3 +# 824| r824_26(glval) = FunctionAddress[~Base] : +# 824| v824_27(void) = Call[~Base] : func:r824_26, this:r824_25 +# 824| m824_28(unknown) = ^CallSideEffect : ~m824_20 +# 824| m824_29(unknown) = Chi : total:m824_20, partial:m824_28 +# 824| v824_30(void) = ^IndirectReadSideEffect[-1] : &:r824_25, m824_15 +# 824| m824_31(Base) = ^IndirectMayWriteSideEffect[-1] : &:r824_25 +# 824| m824_32(Base) = Chi : total:m824_15, partial:m824_31 +# 824| r824_33(glval) = CopyValue : r824_18 # 825| r825_1(glval) = VariableAddress[pd] : # 825| r825_2(Derived *) = Load[pd] : &:r825_1, m806_4 # 825| r825_3(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r825_2 @@ -5643,8 +5811,8 @@ ir.cpp: # 830| r830_6(glval) = Convert : r830_5 # 830| r830_7(Derived &) = CopyValue : r830_6 # 830| r830_8(Derived &) = Call[operator=] : func:r830_2, this:r830_1, 0:r830_7 -# 830| m830_9(unknown) = ^CallSideEffect : ~m824_20 -# 830| m830_10(unknown) = Chi : total:m824_20, partial:m830_9 +# 830| m830_9(unknown) = ^CallSideEffect : ~m824_29 +# 830| m830_10(unknown) = Chi : total:m824_29, partial:m830_9 # 830| v830_11(void) = ^IndirectReadSideEffect[-1] : &:r830_1, m802_8 # 830| v830_12(void) = ^BufferReadSideEffect[0] : &:r830_7, ~m824_24 # 830| m830_13(Derived) = ^IndirectMayWriteSideEffect[-1] : &:r830_1 @@ -8864,6 +9032,14 @@ ir.cpp: # 1419| m1419_15(unknown) = ^CallSideEffect : ~m1419_9 # 1419| m1419_16(unknown) = Chi : total:m1419_9, partial:m1419_15 # 1419| v1419_17(void) = ^BufferReadSideEffect[0] : &:r1419_13, ~m1419_12 +# 1419| r1419_18(glval) = CopyValue : r1419_2 +# 1419| r1419_19(glval) = FunctionAddress[~String] : +# 1419| v1419_20(void) = Call[~String] : func:r1419_19, this:r1419_18 +# 1419| m1419_21(unknown) = ^CallSideEffect : ~m1419_16 +# 1419| m1419_22(unknown) = Chi : total:m1419_16, partial:m1419_21 +# 1419| v1419_23(void) = ^IndirectReadSideEffect[-1] : &:r1419_18, m1419_12 +# 1419| m1419_24(String) = ^IndirectMayWriteSideEffect[-1] : &:r1419_18 +# 1419| m1419_25(String) = Chi : total:m1419_12, partial:m1419_24 # 1420| r1420_1(glval) = FunctionAddress[acceptValue] : # 1420| r1420_2(glval) = VariableAddress[#temp1420:17] : # 1420| m1420_3(String) = Uninitialized[#temp1420:17] : &:r1420_2 @@ -8872,8 +9048,8 @@ ir.cpp: # 1420| r1420_6(glval) = Convert : r1420_5 # 1420| r1420_7(String &) = CopyValue : r1420_6 # 1420| v1420_8(void) = Call[String] : func:r1420_4, this:r1420_2, 0:r1420_7 -# 1420| m1420_9(unknown) = ^CallSideEffect : ~m1419_16 -# 1420| m1420_10(unknown) = Chi : total:m1419_16, partial:m1420_9 +# 1420| m1420_9(unknown) = ^CallSideEffect : ~m1419_22 +# 1420| m1420_10(unknown) = Chi : total:m1419_22, partial:m1420_9 # 1420| v1420_11(void) = ^BufferReadSideEffect[0] : &:r1420_7, ~m1415_6 # 1420| m1420_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r1420_2 # 1420| m1420_13(String) = Chi : total:m1420_3, partial:m1420_12 @@ -8881,6 +9057,14 @@ ir.cpp: # 1420| v1420_15(void) = Call[acceptValue] : func:r1420_1, 0:r1420_14 # 1420| m1420_16(unknown) = ^CallSideEffect : ~m1420_10 # 1420| m1420_17(unknown) = Chi : total:m1420_10, partial:m1420_16 +# 1420| r1420_18(glval) = CopyValue : r1420_2 +# 1420| r1420_19(glval) = FunctionAddress[~String] : +# 1420| v1420_20(void) = Call[~String] : func:r1420_19, this:r1420_18 +# 1420| m1420_21(unknown) = ^CallSideEffect : ~m1420_17 +# 1420| m1420_22(unknown) = Chi : total:m1420_17, partial:m1420_21 +# 1420| v1420_23(void) = ^IndirectReadSideEffect[-1] : &:r1420_18, m1420_13 +# 1420| m1420_24(String) = ^IndirectMayWriteSideEffect[-1] : &:r1420_18 +# 1420| m1420_25(String) = Chi : total:m1420_13, partial:m1420_24 # 1421| r1421_1(glval) = FunctionAddress[acceptValue] : # 1421| r1421_2(glval) = VariableAddress[#temp1421:25] : # 1421| m1421_3(String) = Uninitialized[#temp1421:25] : &:r1421_2 @@ -8888,8 +9072,8 @@ ir.cpp: # 1421| r1421_5(glval) = StringConstant["foo"] : # 1421| r1421_6(char *) = Convert : r1421_5 # 1421| v1421_7(void) = Call[String] : func:r1421_4, this:r1421_2, 0:r1421_6 -# 1421| m1421_8(unknown) = ^CallSideEffect : ~m1420_17 -# 1421| m1421_9(unknown) = Chi : total:m1420_17, partial:m1421_8 +# 1421| m1421_8(unknown) = ^CallSideEffect : ~m1420_22 +# 1421| m1421_9(unknown) = Chi : total:m1420_22, partial:m1421_8 # 1421| v1421_10(void) = ^BufferReadSideEffect[0] : &:r1421_6, ~m1414_3 # 1421| m1421_11(String) = ^IndirectMayWriteSideEffect[-1] : &:r1421_2 # 1421| m1421_12(String) = Chi : total:m1421_3, partial:m1421_11 @@ -8897,12 +9081,20 @@ ir.cpp: # 1421| v1421_14(void) = Call[acceptValue] : func:r1421_1, 0:r1421_13 # 1421| m1421_15(unknown) = ^CallSideEffect : ~m1421_9 # 1421| m1421_16(unknown) = Chi : total:m1421_9, partial:m1421_15 +# 1421| r1421_17(glval) = CopyValue : r1421_2 +# 1421| r1421_18(glval) = FunctionAddress[~String] : +# 1421| v1421_19(void) = Call[~String] : func:r1421_18, this:r1421_17 +# 1421| m1421_20(unknown) = ^CallSideEffect : ~m1421_16 +# 1421| m1421_21(unknown) = Chi : total:m1421_16, partial:m1421_20 +# 1421| v1421_22(void) = ^IndirectReadSideEffect[-1] : &:r1421_17, m1421_12 +# 1421| m1421_23(String) = ^IndirectMayWriteSideEffect[-1] : &:r1421_17 +# 1421| m1421_24(String) = Chi : total:m1421_12, partial:m1421_23 # 1422| r1422_1(glval) = VariableAddress[#temp1422:5] : # 1422| m1422_2(String) = Uninitialized[#temp1422:5] : &:r1422_1 # 1422| r1422_3(glval) = FunctionAddress[String] : # 1422| v1422_4(void) = Call[String] : func:r1422_3, this:r1422_1 -# 1422| m1422_5(unknown) = ^CallSideEffect : ~m1421_16 -# 1422| m1422_6(unknown) = Chi : total:m1421_16, partial:m1422_5 +# 1422| m1422_5(unknown) = ^CallSideEffect : ~m1421_21 +# 1422| m1422_6(unknown) = Chi : total:m1421_21, partial:m1422_5 # 1422| m1422_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r1422_1 # 1422| m1422_8(String) = Chi : total:m1422_2, partial:m1422_7 # 1422| r1422_9(glval) = Convert : r1422_1 @@ -8911,11 +9103,19 @@ ir.cpp: # 1422| m1422_12(unknown) = ^CallSideEffect : ~m1422_6 # 1422| m1422_13(unknown) = Chi : total:m1422_6, partial:m1422_12 # 1422| v1422_14(void) = ^IndirectReadSideEffect[-1] : &:r1422_9, m1422_8 +# 1422| r1422_15(glval) = CopyValue : r1422_1 +# 1422| r1422_16(glval) = FunctionAddress[~String] : +# 1422| v1422_17(void) = Call[~String] : func:r1422_16, this:r1422_15 +# 1422| m1422_18(unknown) = ^CallSideEffect : ~m1422_13 +# 1422| m1422_19(unknown) = Chi : total:m1422_13, partial:m1422_18 +# 1422| v1422_20(void) = ^IndirectReadSideEffect[-1] : &:r1422_15, m1422_8 +# 1422| m1422_21(String) = ^IndirectMayWriteSideEffect[-1] : &:r1422_15 +# 1422| m1422_22(String) = Chi : total:m1422_8, partial:m1422_21 # 1423| r1423_1(glval) = VariableAddress[#temp1423:5] : # 1423| r1423_2(glval) = FunctionAddress[returnValue] : # 1423| r1423_3(String) = Call[returnValue] : func:r1423_2 -# 1423| m1423_4(unknown) = ^CallSideEffect : ~m1422_13 -# 1423| m1423_5(unknown) = Chi : total:m1422_13, partial:m1423_4 +# 1423| m1423_4(unknown) = ^CallSideEffect : ~m1422_19 +# 1423| m1423_5(unknown) = Chi : total:m1422_19, partial:m1423_4 # 1423| m1423_6(String) = Store[#temp1423:5] : &:r1423_1, r1423_3 # 1423| r1423_7(glval) = Convert : r1423_1 # 1423| r1423_8(glval) = FunctionAddress[c_str] : @@ -8923,18 +9123,34 @@ ir.cpp: # 1423| m1423_10(unknown) = ^CallSideEffect : ~m1423_5 # 1423| m1423_11(unknown) = Chi : total:m1423_5, partial:m1423_10 # 1423| v1423_12(void) = ^IndirectReadSideEffect[-1] : &:r1423_7, m1423_6 +# 1423| r1423_13(glval) = CopyValue : r1423_1 +# 1423| r1423_14(glval) = FunctionAddress[~String] : +# 1423| v1423_15(void) = Call[~String] : func:r1423_14, this:r1423_13 +# 1423| m1423_16(unknown) = ^CallSideEffect : ~m1423_11 +# 1423| m1423_17(unknown) = Chi : total:m1423_11, partial:m1423_16 +# 1423| v1423_18(void) = ^IndirectReadSideEffect[-1] : &:r1423_13, m1423_6 +# 1423| m1423_19(String) = ^IndirectMayWriteSideEffect[-1] : &:r1423_13 +# 1423| m1423_20(String) = Chi : total:m1423_6, partial:m1423_19 # 1425| r1425_1(glval) = VariableAddress[#temp1425:5] : # 1425| r1425_2(glval) = FunctionAddress[defaultConstruct] : # 1425| r1425_3(String) = Call[defaultConstruct] : func:r1425_2 -# 1425| m1425_4(unknown) = ^CallSideEffect : ~m1423_11 -# 1425| m1425_5(unknown) = Chi : total:m1423_11, partial:m1425_4 -# 1425| m1425_6(String) = Store[#temp1425:5] : &:r1425_1, r1425_3 +# 1425| m1425_4(unknown) = ^CallSideEffect : ~m1423_17 +# 1425| m1425_5(unknown) = Chi : total:m1423_17, partial:m1425_4 +# 1425| r1425_6(glval) = CopyValue : r1425_1 +# 1425| r1425_7(glval) = FunctionAddress[~String] : +# 1425| v1425_8(void) = Call[~String] : func:r1425_7, this:r1425_6 +# 1425| m1425_9(unknown) = ^CallSideEffect : ~m1425_5 +# 1425| m1425_10(unknown) = Chi : total:m1425_5, partial:m1425_9 +# 1425| v1425_11(void) = ^IndirectReadSideEffect[-1] : &:r1425_6, ~m? +# 1425| m1425_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r1425_6 +# 1425| m1425_13(String) = Chi : total:~m?, partial:m1425_12 +# 1425| m1425_14(String) = Store[#temp1425:5] : &:r1425_1, r1425_3 # 1426| v1426_1(void) = NoOp : # 1426| r1426_2(glval) = CopyValue : r1416_2 # 1426| r1426_3(glval) = FunctionAddress[~String] : # 1426| v1426_4(void) = Call[~String] : func:r1426_3, this:r1426_2 -# 1426| m1426_5(unknown) = ^CallSideEffect : ~m1425_5 -# 1426| m1426_6(unknown) = Chi : total:m1425_5, partial:m1426_5 +# 1426| m1426_5(unknown) = ^CallSideEffect : ~m1425_10 +# 1426| m1426_6(unknown) = Chi : total:m1425_10, partial:m1426_5 # 1426| v1426_7(void) = ^IndirectReadSideEffect[-1] : &:r1426_2, m1416_7 # 1426| m1426_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r1426_2 # 1426| m1426_9(String) = Chi : total:m1416_7, partial:m1426_8 @@ -8991,21 +9207,37 @@ ir.cpp: # 1433| v1433_7(void) = Call[acceptValue] : func:r1433_1, 0:r1433_6 # 1433| m1433_8(unknown) = ^CallSideEffect : ~m1432_7 # 1433| m1433_9(unknown) = Chi : total:m1432_7, partial:m1433_8 +# 1433| r1433_10(glval) = CopyValue : r1433_2 +# 1433| r1433_11(glval) = FunctionAddress[~destructor_only] : +# 1433| v1433_12(void) = Call[~destructor_only] : func:r1433_11, this:r1433_10 +# 1433| m1433_13(unknown) = ^CallSideEffect : ~m1433_9 +# 1433| m1433_14(unknown) = Chi : total:m1433_9, partial:m1433_13 +# 1433| v1433_15(void) = ^IndirectReadSideEffect[-1] : &:r1433_10, m1433_5 +# 1433| m1433_16(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1433_10 +# 1433| m1433_17(destructor_only) = Chi : total:m1433_5, partial:m1433_16 # 1434| r1434_1(glval) = VariableAddress[#temp1434:5] : # 1434| r1434_2(destructor_only) = Constant[0] : # 1434| m1434_3(destructor_only) = Store[#temp1434:5] : &:r1434_1, r1434_2 # 1434| r1434_4(glval) = FunctionAddress[method] : # 1434| v1434_5(void) = Call[method] : func:r1434_4, this:r1434_1 -# 1434| m1434_6(unknown) = ^CallSideEffect : ~m1433_9 -# 1434| m1434_7(unknown) = Chi : total:m1433_9, partial:m1434_6 +# 1434| m1434_6(unknown) = ^CallSideEffect : ~m1433_14 +# 1434| m1434_7(unknown) = Chi : total:m1433_14, partial:m1434_6 # 1434| v1434_8(void) = ^IndirectReadSideEffect[-1] : &:r1434_1, m1434_3 # 1434| m1434_9(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1434_1 # 1434| m1434_10(destructor_only) = Chi : total:m1434_3, partial:m1434_9 +# 1434| r1434_11(glval) = CopyValue : r1434_1 +# 1434| r1434_12(glval) = FunctionAddress[~destructor_only] : +# 1434| v1434_13(void) = Call[~destructor_only] : func:r1434_12, this:r1434_11 +# 1434| m1434_14(unknown) = ^CallSideEffect : ~m1434_7 +# 1434| m1434_15(unknown) = Chi : total:m1434_7, partial:m1434_14 +# 1434| v1434_16(void) = ^IndirectReadSideEffect[-1] : &:r1434_11, m1434_10 +# 1434| m1434_17(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1434_11 +# 1434| m1434_18(destructor_only) = Chi : total:m1434_10, partial:m1434_17 # 1435| r1435_1(glval) = VariableAddress[#temp1435:5] : # 1435| r1435_2(glval) = FunctionAddress[returnValue] : # 1435| r1435_3(destructor_only) = Call[returnValue] : func:r1435_2 -# 1435| m1435_4(unknown) = ^CallSideEffect : ~m1434_7 -# 1435| m1435_5(unknown) = Chi : total:m1434_7, partial:m1435_4 +# 1435| m1435_4(unknown) = ^CallSideEffect : ~m1434_15 +# 1435| m1435_5(unknown) = Chi : total:m1434_15, partial:m1435_4 # 1435| m1435_6(destructor_only) = Store[#temp1435:5] : &:r1435_1, r1435_3 # 1435| r1435_7(glval) = FunctionAddress[method] : # 1435| v1435_8(void) = Call[method] : func:r1435_7, this:r1435_1 @@ -9014,18 +9246,34 @@ ir.cpp: # 1435| v1435_11(void) = ^IndirectReadSideEffect[-1] : &:r1435_1, m1435_6 # 1435| m1435_12(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1435_1 # 1435| m1435_13(destructor_only) = Chi : total:m1435_6, partial:m1435_12 +# 1435| r1435_14(glval) = CopyValue : r1435_1 +# 1435| r1435_15(glval) = FunctionAddress[~destructor_only] : +# 1435| v1435_16(void) = Call[~destructor_only] : func:r1435_15, this:r1435_14 +# 1435| m1435_17(unknown) = ^CallSideEffect : ~m1435_10 +# 1435| m1435_18(unknown) = Chi : total:m1435_10, partial:m1435_17 +# 1435| v1435_19(void) = ^IndirectReadSideEffect[-1] : &:r1435_14, m1435_13 +# 1435| m1435_20(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1435_14 +# 1435| m1435_21(destructor_only) = Chi : total:m1435_13, partial:m1435_20 # 1437| r1437_1(glval) = VariableAddress[#temp1437:5] : # 1437| r1437_2(glval) = FunctionAddress[defaultConstruct] : # 1437| r1437_3(destructor_only) = Call[defaultConstruct] : func:r1437_2 -# 1437| m1437_4(unknown) = ^CallSideEffect : ~m1435_10 -# 1437| m1437_5(unknown) = Chi : total:m1435_10, partial:m1437_4 -# 1437| m1437_6(destructor_only) = Store[#temp1437:5] : &:r1437_1, r1437_3 +# 1437| m1437_4(unknown) = ^CallSideEffect : ~m1435_18 +# 1437| m1437_5(unknown) = Chi : total:m1435_18, partial:m1437_4 +# 1437| r1437_6(glval) = CopyValue : r1437_1 +# 1437| r1437_7(glval) = FunctionAddress[~destructor_only] : +# 1437| v1437_8(void) = Call[~destructor_only] : func:r1437_7, this:r1437_6 +# 1437| m1437_9(unknown) = ^CallSideEffect : ~m1437_5 +# 1437| m1437_10(unknown) = Chi : total:m1437_5, partial:m1437_9 +# 1437| v1437_11(void) = ^IndirectReadSideEffect[-1] : &:r1437_6, ~m? +# 1437| m1437_12(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1437_6 +# 1437| m1437_13(destructor_only) = Chi : total:~m?, partial:m1437_12 +# 1437| m1437_14(destructor_only) = Store[#temp1437:5] : &:r1437_1, r1437_3 # 1438| v1438_1(void) = NoOp : # 1438| r1438_2(glval) = VariableAddress[d2] : # 1438| r1438_3(glval) = FunctionAddress[~destructor_only] : # 1438| v1438_4(void) = Call[~destructor_only] : func:r1438_3, this:r1438_2 -# 1438| m1438_5(unknown) = ^CallSideEffect : ~m1437_5 -# 1438| m1438_6(unknown) = Chi : total:m1437_5, partial:m1438_5 +# 1438| m1438_5(unknown) = ^CallSideEffect : ~m1437_10 +# 1438| m1438_6(unknown) = Chi : total:m1437_10, partial:m1438_5 # 1438| v1438_7(void) = ^IndirectReadSideEffect[-1] : &:r1438_2, m1431_2 # 1438| m1438_8(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1438_2 # 1438| m1438_9(destructor_only) = Chi : total:m1431_2, partial:m1438_8 @@ -12483,162 +12731,186 @@ ir.cpp: #-----| Goto -> Block 1 # 2068| Block 4 -# 2068| m2068_7(unknown) = Phi : from 5:~m2068_30, from 6:~m2068_42 -# 2068| m2068_8(TernaryNonPodObj) = Phi : from 5:m2068_36, from 6:m2068_47 -# 2068| r2068_9(glval) = VariableAddress[#temp2068:9] : -# 2068| r2068_10(TernaryNonPodObj) = Load[#temp2068:9] : &:r2068_9, m2068_8 -# 2068| m2068_11(TernaryNonPodObj) = Store[#temp2068:9] : &:r2068_3, r2068_10 -# 2068| r2068_12(glval) = Convert : r2068_3 -# 2068| r2068_13(TernaryNonPodObj &) = CopyValue : r2068_12 -# 2068| r2068_14(TernaryNonPodObj &) = Call[operator=] : func:r2068_2, this:r2068_1, 0:r2068_13 -# 2068| m2068_15(unknown) = ^CallSideEffect : ~m2068_7 -# 2068| m2068_16(unknown) = Chi : total:m2068_7, partial:m2068_15 -# 2068| v2068_17(void) = ^IndirectReadSideEffect[-1] : &:r2068_1, m2067_17 -# 2068| v2068_18(void) = ^BufferReadSideEffect[0] : &:r2068_13, ~m2068_11 -# 2068| m2068_19(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2068_1 -# 2068| m2068_20(TernaryNonPodObj) = Chi : total:m2067_17, partial:m2068_19 -# 2068| r2068_21(glval) = CopyValue : r2068_14 -# 2069| r2069_1(glval) = VariableAddress[z] : -# 2069| r2069_2(glval) = FunctionAddress[operator=] : -# 2069| r2069_3(glval) = VariableAddress[#temp2069:9] : -# 2069| r2069_4(glval) = VariableAddress[a] : -# 2069| r2069_5(bool) = Load[a] : &:r2069_4, m2066_6 -# 2069| v2069_6(void) = ConditionalBranch : r2069_5 +# 2068| m2068_7(unknown) = Phi : from 5:~m2068_38, from 6:~m2068_50 +# 2068| m2068_8(TernaryNonPodObj) = Phi : from 5:m2068_44, from 6:m2068_55 +# 2068| r2068_9(glval) = VariableAddress[#temp2068:9] : +# 2068| r2068_10(TernaryNonPodObj) = Load[#temp2068:9] : &:r2068_9, m2068_8 +# 2068| m2068_11(TernaryNonPodObj) = Store[#temp2068:9] : &:r2068_3, r2068_10 +# 2068| r2068_12(glval) = Convert : r2068_3 +# 2068| r2068_13(TernaryNonPodObj &) = CopyValue : r2068_12 +# 2068| r2068_14(TernaryNonPodObj &) = Call[operator=] : func:r2068_2, this:r2068_1, 0:r2068_13 +# 2068| m2068_15(unknown) = ^CallSideEffect : ~m2068_7 +# 2068| m2068_16(unknown) = Chi : total:m2068_7, partial:m2068_15 +# 2068| v2068_17(void) = ^IndirectReadSideEffect[-1] : &:r2068_1, m2067_17 +# 2068| v2068_18(void) = ^BufferReadSideEffect[0] : &:r2068_13, ~m2068_11 +# 2068| m2068_19(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2068_1 +# 2068| m2068_20(TernaryNonPodObj) = Chi : total:m2067_17, partial:m2068_19 +# 2068| r2068_21(glval) = CopyValue : r2068_3 +# 2068| r2068_22(glval) = FunctionAddress[~TernaryNonPodObj] : +# 2068| v2068_23(void) = Call[~TernaryNonPodObj] : func:r2068_22, this:r2068_21 +# 2068| m2068_24(unknown) = ^CallSideEffect : ~m2068_16 +# 2068| m2068_25(unknown) = Chi : total:m2068_16, partial:m2068_24 +# 2068| v2068_26(void) = ^IndirectReadSideEffect[-1] : &:r2068_21, m2068_11 +# 2068| m2068_27(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2068_21 +# 2068| m2068_28(TernaryNonPodObj) = Chi : total:m2068_11, partial:m2068_27 +# 2068| r2068_29(glval) = CopyValue : r2068_14 +# 2069| r2069_1(glval) = VariableAddress[z] : +# 2069| r2069_2(glval) = FunctionAddress[operator=] : +# 2069| r2069_3(glval) = VariableAddress[#temp2069:9] : +# 2069| r2069_4(glval) = VariableAddress[a] : +# 2069| r2069_5(bool) = Load[a] : &:r2069_4, m2066_6 +# 2069| v2069_6(void) = ConditionalBranch : r2069_5 #-----| False -> Block 9 #-----| True -> Block 8 # 2068| Block 5 -# 2068| r2068_22(glval) = VariableAddress[#temp2068:13] : -# 2068| m2068_23(TernaryNonPodObj) = Uninitialized[#temp2068:13] : &:r2068_22 -# 2068| r2068_24(glval) = FunctionAddress[TernaryNonPodObj] : -# 2068| r2068_25(glval) = VariableAddress[x] : -# 2068| r2068_26(glval) = Convert : r2068_25 -# 2068| r2068_27(TernaryNonPodObj &) = CopyValue : r2068_26 -# 2068| v2068_28(void) = Call[TernaryNonPodObj] : func:r2068_24, this:r2068_22, 0:r2068_27 -# 2068| m2068_29(unknown) = ^CallSideEffect : ~m2067_13 -# 2068| m2068_30(unknown) = Chi : total:m2067_13, partial:m2068_29 -# 2068| v2068_31(void) = ^BufferReadSideEffect[0] : &:r2068_27, ~m2066_8 -# 2068| m2068_32(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2068_22 -# 2068| m2068_33(TernaryNonPodObj) = Chi : total:m2068_23, partial:m2068_32 -# 2068| r2068_34(TernaryNonPodObj) = Load[#temp2068:13] : &:r2068_22, m2068_33 -# 2068| r2068_35(glval) = VariableAddress[#temp2068:9] : -# 2068| m2068_36(TernaryNonPodObj) = Store[#temp2068:9] : &:r2068_35, r2068_34 +# 2068| r2068_30(glval) = VariableAddress[#temp2068:13] : +# 2068| m2068_31(TernaryNonPodObj) = Uninitialized[#temp2068:13] : &:r2068_30 +# 2068| r2068_32(glval) = FunctionAddress[TernaryNonPodObj] : +# 2068| r2068_33(glval) = VariableAddress[x] : +# 2068| r2068_34(glval) = Convert : r2068_33 +# 2068| r2068_35(TernaryNonPodObj &) = CopyValue : r2068_34 +# 2068| v2068_36(void) = Call[TernaryNonPodObj] : func:r2068_32, this:r2068_30, 0:r2068_35 +# 2068| m2068_37(unknown) = ^CallSideEffect : ~m2067_13 +# 2068| m2068_38(unknown) = Chi : total:m2067_13, partial:m2068_37 +# 2068| v2068_39(void) = ^BufferReadSideEffect[0] : &:r2068_35, ~m2066_8 +# 2068| m2068_40(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2068_30 +# 2068| m2068_41(TernaryNonPodObj) = Chi : total:m2068_31, partial:m2068_40 +# 2068| r2068_42(TernaryNonPodObj) = Load[#temp2068:13] : &:r2068_30, m2068_41 +# 2068| r2068_43(glval) = VariableAddress[#temp2068:9] : +# 2068| m2068_44(TernaryNonPodObj) = Store[#temp2068:9] : &:r2068_43, r2068_42 #-----| Goto -> Block 4 # 2068| Block 6 -# 2068| r2068_37(glval) = VariableAddress[#temp2068:17] : -# 2068| m2068_38(TernaryNonPodObj) = Uninitialized[#temp2068:17] : &:r2068_37 -# 2068| r2068_39(glval) = FunctionAddress[TernaryNonPodObj] : -# 2068| v2068_40(void) = Call[TernaryNonPodObj] : func:r2068_39, this:r2068_37 -# 2068| m2068_41(unknown) = ^CallSideEffect : ~m2067_13 -# 2068| m2068_42(unknown) = Chi : total:m2067_13, partial:m2068_41 -# 2068| m2068_43(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2068_37 -# 2068| m2068_44(TernaryNonPodObj) = Chi : total:m2068_38, partial:m2068_43 -# 2068| r2068_45(TernaryNonPodObj) = Load[#temp2068:17] : &:r2068_37, m2068_44 -# 2068| r2068_46(glval) = VariableAddress[#temp2068:9] : -# 2068| m2068_47(TernaryNonPodObj) = Store[#temp2068:9] : &:r2068_46, r2068_45 +# 2068| r2068_45(glval) = VariableAddress[#temp2068:17] : +# 2068| m2068_46(TernaryNonPodObj) = Uninitialized[#temp2068:17] : &:r2068_45 +# 2068| r2068_47(glval) = FunctionAddress[TernaryNonPodObj] : +# 2068| v2068_48(void) = Call[TernaryNonPodObj] : func:r2068_47, this:r2068_45 +# 2068| m2068_49(unknown) = ^CallSideEffect : ~m2067_13 +# 2068| m2068_50(unknown) = Chi : total:m2067_13, partial:m2068_49 +# 2068| m2068_51(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2068_45 +# 2068| m2068_52(TernaryNonPodObj) = Chi : total:m2068_46, partial:m2068_51 +# 2068| r2068_53(TernaryNonPodObj) = Load[#temp2068:17] : &:r2068_45, m2068_52 +# 2068| r2068_54(glval) = VariableAddress[#temp2068:9] : +# 2068| m2068_55(TernaryNonPodObj) = Store[#temp2068:9] : &:r2068_54, r2068_53 #-----| Goto -> Block 4 # 2069| Block 7 -# 2069| m2069_7(unknown) = Phi : from 8:~m2069_27, from 9:~m2069_38 -# 2069| m2069_8(TernaryNonPodObj) = Phi : from 8:m2069_32, from 9:m2069_43 -# 2069| r2069_9(glval) = VariableAddress[#temp2069:9] : -# 2069| r2069_10(TernaryNonPodObj) = Load[#temp2069:9] : &:r2069_9, m2069_8 -# 2069| m2069_11(TernaryNonPodObj) = Store[#temp2069:9] : &:r2069_3, r2069_10 -# 2069| r2069_12(glval) = Convert : r2069_3 -# 2069| r2069_13(TernaryNonPodObj &) = CopyValue : r2069_12 -# 2069| r2069_14(TernaryNonPodObj &) = Call[operator=] : func:r2069_2, this:r2069_1, 0:r2069_13 -# 2069| m2069_15(unknown) = ^CallSideEffect : ~m2069_7 -# 2069| m2069_16(unknown) = Chi : total:m2069_7, partial:m2069_15 -# 2069| v2069_17(void) = ^IndirectReadSideEffect[-1] : &:r2069_1, m2068_20 -# 2069| v2069_18(void) = ^BufferReadSideEffect[0] : &:r2069_13, ~m2069_11 -# 2069| m2069_19(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2069_1 -# 2069| m2069_20(TernaryNonPodObj) = Chi : total:m2068_20, partial:m2069_19 -# 2069| r2069_21(glval) = CopyValue : r2069_14 -# 2070| r2070_1(glval) = VariableAddress[z] : -# 2070| r2070_2(glval) = FunctionAddress[operator=] : -# 2070| r2070_3(glval) = VariableAddress[a] : -# 2070| r2070_4(bool) = Load[a] : &:r2070_3, m2066_6 -# 2070| v2070_5(void) = ConditionalBranch : r2070_4 +# 2069| m2069_7(unknown) = Phi : from 8:~m2069_35, from 9:~m2069_46 +# 2069| m2069_8(TernaryNonPodObj) = Phi : from 8:m2069_40, from 9:m2069_51 +# 2069| r2069_9(glval) = VariableAddress[#temp2069:9] : +# 2069| r2069_10(TernaryNonPodObj) = Load[#temp2069:9] : &:r2069_9, m2069_8 +# 2069| m2069_11(TernaryNonPodObj) = Store[#temp2069:9] : &:r2069_3, r2069_10 +# 2069| r2069_12(glval) = Convert : r2069_3 +# 2069| r2069_13(TernaryNonPodObj &) = CopyValue : r2069_12 +# 2069| r2069_14(TernaryNonPodObj &) = Call[operator=] : func:r2069_2, this:r2069_1, 0:r2069_13 +# 2069| m2069_15(unknown) = ^CallSideEffect : ~m2069_7 +# 2069| m2069_16(unknown) = Chi : total:m2069_7, partial:m2069_15 +# 2069| v2069_17(void) = ^IndirectReadSideEffect[-1] : &:r2069_1, m2068_20 +# 2069| v2069_18(void) = ^BufferReadSideEffect[0] : &:r2069_13, ~m2069_11 +# 2069| m2069_19(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2069_1 +# 2069| m2069_20(TernaryNonPodObj) = Chi : total:m2068_20, partial:m2069_19 +# 2069| r2069_21(glval) = CopyValue : r2069_3 +# 2069| r2069_22(glval) = FunctionAddress[~TernaryNonPodObj] : +# 2069| v2069_23(void) = Call[~TernaryNonPodObj] : func:r2069_22, this:r2069_21 +# 2069| m2069_24(unknown) = ^CallSideEffect : ~m2069_16 +# 2069| m2069_25(unknown) = Chi : total:m2069_16, partial:m2069_24 +# 2069| v2069_26(void) = ^IndirectReadSideEffect[-1] : &:r2069_21, m2069_11 +# 2069| m2069_27(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2069_21 +# 2069| m2069_28(TernaryNonPodObj) = Chi : total:m2069_11, partial:m2069_27 +# 2069| r2069_29(glval) = CopyValue : r2069_14 +# 2070| r2070_1(glval) = VariableAddress[z] : +# 2070| r2070_2(glval) = FunctionAddress[operator=] : +# 2070| r2070_3(glval) = VariableAddress[a] : +# 2070| r2070_4(bool) = Load[a] : &:r2070_3, m2066_6 +# 2070| v2070_5(void) = ConditionalBranch : r2070_4 #-----| False -> Block 12 #-----| True -> Block 11 # 2069| Block 8 -# 2069| r2069_22(glval) = VariableAddress[#temp2069:13] : -# 2069| m2069_23(TernaryNonPodObj) = Uninitialized[#temp2069:13] : &:r2069_22 -# 2069| r2069_24(glval) = FunctionAddress[TernaryNonPodObj] : -# 2069| v2069_25(void) = Call[TernaryNonPodObj] : func:r2069_24, this:r2069_22 -# 2069| m2069_26(unknown) = ^CallSideEffect : ~m2068_16 -# 2069| m2069_27(unknown) = Chi : total:m2068_16, partial:m2069_26 -# 2069| m2069_28(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2069_22 -# 2069| m2069_29(TernaryNonPodObj) = Chi : total:m2069_23, partial:m2069_28 -# 2069| r2069_30(TernaryNonPodObj) = Load[#temp2069:13] : &:r2069_22, m2069_29 -# 2069| r2069_31(glval) = VariableAddress[#temp2069:9] : -# 2069| m2069_32(TernaryNonPodObj) = Store[#temp2069:9] : &:r2069_31, r2069_30 +# 2069| r2069_30(glval) = VariableAddress[#temp2069:13] : +# 2069| m2069_31(TernaryNonPodObj) = Uninitialized[#temp2069:13] : &:r2069_30 +# 2069| r2069_32(glval) = FunctionAddress[TernaryNonPodObj] : +# 2069| v2069_33(void) = Call[TernaryNonPodObj] : func:r2069_32, this:r2069_30 +# 2069| m2069_34(unknown) = ^CallSideEffect : ~m2068_25 +# 2069| m2069_35(unknown) = Chi : total:m2068_25, partial:m2069_34 +# 2069| m2069_36(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2069_30 +# 2069| m2069_37(TernaryNonPodObj) = Chi : total:m2069_31, partial:m2069_36 +# 2069| r2069_38(TernaryNonPodObj) = Load[#temp2069:13] : &:r2069_30, m2069_37 +# 2069| r2069_39(glval) = VariableAddress[#temp2069:9] : +# 2069| m2069_40(TernaryNonPodObj) = Store[#temp2069:9] : &:r2069_39, r2069_38 #-----| Goto -> Block 7 # 2069| Block 9 -# 2069| r2069_33(glval) = VariableAddress[#temp2069:34] : -# 2069| m2069_34(TernaryNonPodObj) = Uninitialized[#temp2069:34] : &:r2069_33 -# 2069| r2069_35(glval) = FunctionAddress[TernaryNonPodObj] : -# 2069| v2069_36(void) = Call[TernaryNonPodObj] : func:r2069_35, this:r2069_33 -# 2069| m2069_37(unknown) = ^CallSideEffect : ~m2068_16 -# 2069| m2069_38(unknown) = Chi : total:m2068_16, partial:m2069_37 -# 2069| m2069_39(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2069_33 -# 2069| m2069_40(TernaryNonPodObj) = Chi : total:m2069_34, partial:m2069_39 -# 2069| r2069_41(TernaryNonPodObj) = Load[#temp2069:34] : &:r2069_33, m2069_40 -# 2069| r2069_42(glval) = VariableAddress[#temp2069:9] : -# 2069| m2069_43(TernaryNonPodObj) = Store[#temp2069:9] : &:r2069_42, r2069_41 +# 2069| r2069_41(glval) = VariableAddress[#temp2069:34] : +# 2069| m2069_42(TernaryNonPodObj) = Uninitialized[#temp2069:34] : &:r2069_41 +# 2069| r2069_43(glval) = FunctionAddress[TernaryNonPodObj] : +# 2069| v2069_44(void) = Call[TernaryNonPodObj] : func:r2069_43, this:r2069_41 +# 2069| m2069_45(unknown) = ^CallSideEffect : ~m2068_25 +# 2069| m2069_46(unknown) = Chi : total:m2068_25, partial:m2069_45 +# 2069| m2069_47(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2069_41 +# 2069| m2069_48(TernaryNonPodObj) = Chi : total:m2069_42, partial:m2069_47 +# 2069| r2069_49(TernaryNonPodObj) = Load[#temp2069:34] : &:r2069_41, m2069_48 +# 2069| r2069_50(glval) = VariableAddress[#temp2069:9] : +# 2069| m2069_51(TernaryNonPodObj) = Store[#temp2069:9] : &:r2069_50, r2069_49 #-----| Goto -> Block 7 # 2070| Block 10 -# 2070| m2070_6(glval) = Phi : from 11:m2070_40, from 12:m2070_43 -# 2070| r2070_7(glval) = VariableAddress[#temp2070:10] : -# 2070| r2070_8(glval) = Load[#temp2070:10] : &:r2070_7, m2070_6 -# 2070| r2070_9(glval) = Convert : r2070_8 -# 2070| r2070_10(TernaryNonPodObj &) = CopyValue : r2070_9 -# 2070| r2070_11(TernaryNonPodObj &) = Call[operator=] : func:r2070_2, this:r2070_1, 0:r2070_10 -# 2070| m2070_12(unknown) = ^CallSideEffect : ~m2069_16 -# 2070| m2070_13(unknown) = Chi : total:m2069_16, partial:m2070_12 -# 2070| v2070_14(void) = ^IndirectReadSideEffect[-1] : &:r2070_1, m2069_20 -# 2070| v2070_15(void) = ^BufferReadSideEffect[0] : &:r2070_10, ~m2070_13 -# 2070| m2070_16(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2070_1 -# 2070| m2070_17(TernaryNonPodObj) = Chi : total:m2069_20, partial:m2070_16 -# 2070| r2070_18(glval) = CopyValue : r2070_11 -# 2070| r2070_19(glval) = FunctionAddress[operator=] : -# 2070| r2070_20(glval) = VariableAddress[#temp2070:23] : -# 2070| m2070_21(TernaryNonPodObj) = Uninitialized[#temp2070:23] : &:r2070_20 -# 2070| r2070_22(glval) = FunctionAddress[TernaryNonPodObj] : -# 2070| v2070_23(void) = Call[TernaryNonPodObj] : func:r2070_22, this:r2070_20 -# 2070| m2070_24(unknown) = ^CallSideEffect : ~m2070_13 -# 2070| m2070_25(unknown) = Chi : total:m2070_13, partial:m2070_24 -# 2070| m2070_26(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2070_20 -# 2070| m2070_27(TernaryNonPodObj) = Chi : total:m2070_21, partial:m2070_26 -# 2070| r2070_28(glval) = Convert : r2070_20 -# 2070| r2070_29(TernaryNonPodObj &) = CopyValue : r2070_28 -# 2070| r2070_30(TernaryNonPodObj &) = Call[operator=] : func:r2070_19, this:r2070_18, 0:r2070_29 -# 2070| m2070_31(unknown) = ^CallSideEffect : ~m2070_25 -# 2070| m2070_32(unknown) = Chi : total:m2070_25, partial:m2070_31 -# 2070| v2070_33(void) = ^IndirectReadSideEffect[-1] : &:r2070_18, m2070_17 -# 2070| v2070_34(void) = ^BufferReadSideEffect[0] : &:r2070_29, ~m2070_27 -# 2070| m2070_35(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2070_18 -# 2070| m2070_36(TernaryNonPodObj) = Chi : total:m2070_17, partial:m2070_35 -# 2070| r2070_37(glval) = CopyValue : r2070_30 -# 2071| v2071_1(void) = NoOp : -# 2066| v2066_13(void) = ReturnVoid : -# 2066| v2066_14(void) = AliasedUse : ~m2070_32 -# 2066| v2066_15(void) = ExitFunction : +# 2070| m2070_6(glval) = Phi : from 11:m2070_48, from 12:m2070_51 +# 2070| r2070_7(glval) = VariableAddress[#temp2070:10] : +# 2070| r2070_8(glval) = Load[#temp2070:10] : &:r2070_7, m2070_6 +# 2070| r2070_9(glval) = Convert : r2070_8 +# 2070| r2070_10(TernaryNonPodObj &) = CopyValue : r2070_9 +# 2070| r2070_11(TernaryNonPodObj &) = Call[operator=] : func:r2070_2, this:r2070_1, 0:r2070_10 +# 2070| m2070_12(unknown) = ^CallSideEffect : ~m2069_25 +# 2070| m2070_13(unknown) = Chi : total:m2069_25, partial:m2070_12 +# 2070| v2070_14(void) = ^IndirectReadSideEffect[-1] : &:r2070_1, m2069_20 +# 2070| v2070_15(void) = ^BufferReadSideEffect[0] : &:r2070_10, ~m2070_13 +# 2070| m2070_16(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2070_1 +# 2070| m2070_17(TernaryNonPodObj) = Chi : total:m2069_20, partial:m2070_16 +# 2070| r2070_18(glval) = CopyValue : r2070_11 +# 2070| r2070_19(glval) = FunctionAddress[operator=] : +# 2070| r2070_20(glval) = VariableAddress[#temp2070:23] : +# 2070| m2070_21(TernaryNonPodObj) = Uninitialized[#temp2070:23] : &:r2070_20 +# 2070| r2070_22(glval) = FunctionAddress[TernaryNonPodObj] : +# 2070| v2070_23(void) = Call[TernaryNonPodObj] : func:r2070_22, this:r2070_20 +# 2070| m2070_24(unknown) = ^CallSideEffect : ~m2070_13 +# 2070| m2070_25(unknown) = Chi : total:m2070_13, partial:m2070_24 +# 2070| m2070_26(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2070_20 +# 2070| m2070_27(TernaryNonPodObj) = Chi : total:m2070_21, partial:m2070_26 +# 2070| r2070_28(glval) = Convert : r2070_20 +# 2070| r2070_29(TernaryNonPodObj &) = CopyValue : r2070_28 +# 2070| r2070_30(TernaryNonPodObj &) = Call[operator=] : func:r2070_19, this:r2070_18, 0:r2070_29 +# 2070| m2070_31(unknown) = ^CallSideEffect : ~m2070_25 +# 2070| m2070_32(unknown) = Chi : total:m2070_25, partial:m2070_31 +# 2070| v2070_33(void) = ^IndirectReadSideEffect[-1] : &:r2070_18, m2070_17 +# 2070| v2070_34(void) = ^BufferReadSideEffect[0] : &:r2070_29, ~m2070_27 +# 2070| m2070_35(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2070_18 +# 2070| m2070_36(TernaryNonPodObj) = Chi : total:m2070_17, partial:m2070_35 +# 2070| r2070_37(glval) = CopyValue : r2070_20 +# 2070| r2070_38(glval) = FunctionAddress[~TernaryNonPodObj] : +# 2070| v2070_39(void) = Call[~TernaryNonPodObj] : func:r2070_38, this:r2070_37 +# 2070| m2070_40(unknown) = ^CallSideEffect : ~m2070_32 +# 2070| m2070_41(unknown) = Chi : total:m2070_32, partial:m2070_40 +# 2070| v2070_42(void) = ^IndirectReadSideEffect[-1] : &:r2070_37, m2070_27 +# 2070| m2070_43(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2070_37 +# 2070| m2070_44(TernaryNonPodObj) = Chi : total:m2070_27, partial:m2070_43 +# 2070| r2070_45(glval) = CopyValue : r2070_30 +# 2071| v2071_1(void) = NoOp : +# 2066| v2066_13(void) = ReturnVoid : +# 2066| v2066_14(void) = AliasedUse : ~m2070_41 +# 2066| v2066_15(void) = ExitFunction : # 2070| Block 11 -# 2070| r2070_38(glval) = VariableAddress[x] : -# 2070| r2070_39(glval) = VariableAddress[#temp2070:10] : -# 2070| m2070_40(glval) = Store[#temp2070:10] : &:r2070_39, r2070_38 +# 2070| r2070_46(glval) = VariableAddress[x] : +# 2070| r2070_47(glval) = VariableAddress[#temp2070:10] : +# 2070| m2070_48(glval) = Store[#temp2070:10] : &:r2070_47, r2070_46 #-----| Goto -> Block 10 # 2070| Block 12 -# 2070| r2070_41(glval) = VariableAddress[y] : -# 2070| r2070_42(glval) = VariableAddress[#temp2070:10] : -# 2070| m2070_43(glval) = Store[#temp2070:10] : &:r2070_42, r2070_41 +# 2070| r2070_49(glval) = VariableAddress[y] : +# 2070| r2070_50(glval) = VariableAddress[#temp2070:10] : +# 2070| m2070_51(glval) = Store[#temp2070:10] : &:r2070_50, r2070_49 #-----| Goto -> Block 10 # 2075| unsigned int CommaTest(unsigned int) @@ -13466,204 +13738,220 @@ ir.cpp: #-----| Goto -> Block 7 # 2198| Block 7 -# 2198| m2198_1(unknown) = Phi : from 5:~m2193_6, from 6:~m2196_6 -# 2198| v2198_2(void) = NoOp : -# 2200| r2200_1(glval) = VariableAddress[x] : -# 2200| m2200_2(ClassWithDestructor) = Uninitialized[x] : &:r2200_1 -# 2200| r2200_3(glval) = FunctionAddress[ClassWithDestructor] : -# 2200| v2200_4(void) = Call[ClassWithDestructor] : func:r2200_3, this:r2200_1 -# 2200| m2200_5(unknown) = ^CallSideEffect : ~m2198_1 -# 2200| m2200_6(unknown) = Chi : total:m2198_1, partial:m2200_5 -# 2200| m2200_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2200_1 -# 2200| m2200_8(ClassWithDestructor) = Chi : total:m2200_2, partial:m2200_7 -# 2201| r2201_1(glval>) = VariableAddress[ys] : -# 2201| m2201_2(vector) = Uninitialized[ys] : &:r2201_1 -# 2201| r2201_3(glval) = FunctionAddress[vector] : -# 2201| r2201_4(glval) = VariableAddress[#temp2201:45] : -# 2201| r2201_5(glval) = VariableAddress[x] : -# 2201| r2201_6(ClassWithDestructor) = Load[x] : &:r2201_5, m2200_8 -# 2201| m2201_7(ClassWithDestructor) = Store[#temp2201:45] : &:r2201_4, r2201_6 -# 2201| r2201_8(ClassWithDestructor) = Load[#temp2201:45] : &:r2201_4, m2201_7 -# 2201| v2201_9(void) = Call[vector] : func:r2201_3, this:r2201_1, 0:r2201_8 -# 2201| m2201_10(unknown) = ^CallSideEffect : ~m2200_6 -# 2201| m2201_11(unknown) = Chi : total:m2200_6, partial:m2201_10 -# 2201| m2201_12(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2201_1 -# 2201| m2201_13(vector) = Chi : total:m2201_2, partial:m2201_12 -# 2201| r2201_14(glval &>) = VariableAddress[(__range)] : -# 2201| r2201_15(glval>) = VariableAddress[ys] : -# 2201| r2201_16(vector &) = CopyValue : r2201_15 -# 2201| m2201_17(vector &) = Store[(__range)] : &:r2201_14, r2201_16 -# 2201| r2201_18(glval>) = VariableAddress[(__begin)] : -# 2201| r2201_19(glval &>) = VariableAddress[(__range)] : -# 2201| r2201_20(vector &) = Load[(__range)] : &:r2201_19, m2201_17 -#-----| r0_1(glval>) = CopyValue : r2201_20 -#-----| r0_2(glval>) = Convert : r0_1 -# 2201| r2201_21(glval) = FunctionAddress[begin] : -# 2201| r2201_22(iterator) = Call[begin] : func:r2201_21, this:r0_2 -#-----| v0_3(void) = ^IndirectReadSideEffect[-1] : &:r0_2, m2201_13 -# 2201| m2201_23(iterator) = Store[(__begin)] : &:r2201_18, r2201_22 -# 2201| r2201_24(glval>) = VariableAddress[(__end)] : -# 2201| r2201_25(glval &>) = VariableAddress[(__range)] : -# 2201| r2201_26(vector &) = Load[(__range)] : &:r2201_25, m2201_17 -#-----| r0_4(glval>) = CopyValue : r2201_26 -#-----| r0_5(glval>) = Convert : r0_4 -# 2201| r2201_27(glval) = FunctionAddress[end] : -# 2201| r2201_28(iterator) = Call[end] : func:r2201_27, this:r0_5 -#-----| v0_6(void) = ^IndirectReadSideEffect[-1] : &:r0_5, m2201_13 -# 2201| m2201_29(iterator) = Store[(__end)] : &:r2201_24, r2201_28 +# 2198| m2198_1(unknown) = Phi : from 5:~m2193_6, from 6:~m2196_6 +# 2198| v2198_2(void) = NoOp : +# 2200| r2200_1(glval) = VariableAddress[x] : +# 2200| m2200_2(ClassWithDestructor) = Uninitialized[x] : &:r2200_1 +# 2200| r2200_3(glval) = FunctionAddress[ClassWithDestructor] : +# 2200| v2200_4(void) = Call[ClassWithDestructor] : func:r2200_3, this:r2200_1 +# 2200| m2200_5(unknown) = ^CallSideEffect : ~m2198_1 +# 2200| m2200_6(unknown) = Chi : total:m2198_1, partial:m2200_5 +# 2200| m2200_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2200_1 +# 2200| m2200_8(ClassWithDestructor) = Chi : total:m2200_2, partial:m2200_7 +# 2201| r2201_1(glval>) = VariableAddress[ys] : +# 2201| m2201_2(vector) = Uninitialized[ys] : &:r2201_1 +# 2201| r2201_3(glval) = FunctionAddress[vector] : +# 2201| r2201_4(glval) = VariableAddress[#temp2201:45] : +# 2201| r2201_5(glval) = VariableAddress[x] : +# 2201| r2201_6(ClassWithDestructor) = Load[x] : &:r2201_5, m2200_8 +# 2201| m2201_7(ClassWithDestructor) = Store[#temp2201:45] : &:r2201_4, r2201_6 +# 2201| r2201_8(ClassWithDestructor) = Load[#temp2201:45] : &:r2201_4, m2201_7 +# 2201| v2201_9(void) = Call[vector] : func:r2201_3, this:r2201_1, 0:r2201_8 +# 2201| m2201_10(unknown) = ^CallSideEffect : ~m2200_6 +# 2201| m2201_11(unknown) = Chi : total:m2200_6, partial:m2201_10 +# 2201| m2201_12(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2201_1 +# 2201| m2201_13(vector) = Chi : total:m2201_2, partial:m2201_12 +# 2201| r2201_14(glval) = CopyValue : r2201_4 +# 2201| r2201_15(glval) = FunctionAddress[~ClassWithDestructor] : +# 2201| v2201_16(void) = Call[~ClassWithDestructor] : func:r2201_15, this:r2201_14 +# 2201| m2201_17(unknown) = ^CallSideEffect : ~m2201_11 +# 2201| m2201_18(unknown) = Chi : total:m2201_11, partial:m2201_17 +# 2201| v2201_19(void) = ^IndirectReadSideEffect[-1] : &:r2201_14, m2201_7 +# 2201| m2201_20(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2201_14 +# 2201| m2201_21(ClassWithDestructor) = Chi : total:m2201_7, partial:m2201_20 +# 2201| r2201_22(glval &>) = VariableAddress[(__range)] : +# 2201| r2201_23(glval>) = VariableAddress[ys] : +# 2201| r2201_24(vector &) = CopyValue : r2201_23 +# 2201| m2201_25(vector &) = Store[(__range)] : &:r2201_22, r2201_24 +# 2201| r2201_26(glval>) = VariableAddress[(__begin)] : +# 2201| r2201_27(glval &>) = VariableAddress[(__range)] : +# 2201| r2201_28(vector &) = Load[(__range)] : &:r2201_27, m2201_25 +#-----| r0_1(glval>) = CopyValue : r2201_28 +#-----| r0_2(glval>) = Convert : r0_1 +# 2201| r2201_29(glval) = FunctionAddress[begin] : +# 2201| r2201_30(iterator) = Call[begin] : func:r2201_29, this:r0_2 +#-----| v0_3(void) = ^IndirectReadSideEffect[-1] : &:r0_2, m2201_13 +# 2201| m2201_31(iterator) = Store[(__begin)] : &:r2201_26, r2201_30 +# 2201| r2201_32(glval>) = VariableAddress[(__end)] : +# 2201| r2201_33(glval &>) = VariableAddress[(__range)] : +# 2201| r2201_34(vector &) = Load[(__range)] : &:r2201_33, m2201_25 +#-----| r0_4(glval>) = CopyValue : r2201_34 +#-----| r0_5(glval>) = Convert : r0_4 +# 2201| r2201_35(glval) = FunctionAddress[end] : +# 2201| r2201_36(iterator) = Call[end] : func:r2201_35, this:r0_5 +#-----| v0_6(void) = ^IndirectReadSideEffect[-1] : &:r0_5, m2201_13 +# 2201| m2201_37(iterator) = Store[(__end)] : &:r2201_32, r2201_36 #-----| Goto -> Block 8 # 2201| Block 8 -# 2201| m2201_30(iterator) = Phi : from 7:m2201_23, from 9:m2201_68 -# 2201| m2201_31(unknown) = Phi : from 7:~m2201_11, from 9:~m2201_65 -# 2201| r2201_32(glval>) = VariableAddress[(__begin)] : -#-----| r0_7(glval>) = Convert : r2201_32 -# 2201| r2201_33(glval) = FunctionAddress[operator!=] : +# 2201| m2201_38(iterator) = Phi : from 7:m2201_31, from 9:m2201_76 +# 2201| m2201_39(unknown) = Phi : from 7:~m2201_18, from 9:~m2201_73 +# 2201| r2201_40(glval>) = VariableAddress[(__begin)] : +#-----| r0_7(glval>) = Convert : r2201_40 +# 2201| r2201_41(glval) = FunctionAddress[operator!=] : #-----| r0_8(glval>) = VariableAddress[#temp0:0] : #-----| m0_9(iterator) = Uninitialized[#temp0:0] : &:r0_8 -# 2201| r2201_34(glval) = FunctionAddress[iterator] : -# 2201| r2201_35(glval>) = VariableAddress[(__end)] : -#-----| r0_10(glval>) = Convert : r2201_35 +# 2201| r2201_42(glval) = FunctionAddress[iterator] : +# 2201| r2201_43(glval>) = VariableAddress[(__end)] : +#-----| r0_10(glval>) = Convert : r2201_43 #-----| r0_11(iterator &) = CopyValue : r0_10 -# 2201| v2201_36(void) = Call[iterator] : func:r2201_34, this:r0_8, 0:r0_11 -# 2201| m2201_37(unknown) = ^CallSideEffect : ~m2201_31 -# 2201| m2201_38(unknown) = Chi : total:m2201_31, partial:m2201_37 -#-----| v0_12(void) = ^BufferReadSideEffect[0] : &:r0_11, ~m2201_29 -# 2201| m2201_39(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_8 -# 2201| m2201_40(iterator) = Chi : total:m0_9, partial:m2201_39 -#-----| r0_13(iterator) = Load[#temp0:0] : &:r0_8, m2201_40 -# 2201| r2201_41(bool) = Call[operator!=] : func:r2201_33, this:r0_7, 0:r0_13 -# 2201| m2201_42(unknown) = ^CallSideEffect : ~m2201_38 -# 2201| m2201_43(unknown) = Chi : total:m2201_38, partial:m2201_42 -#-----| v0_14(void) = ^IndirectReadSideEffect[-1] : &:r0_7, m2201_30 -# 2201| v2201_44(void) = ConditionalBranch : r2201_41 +# 2201| v2201_44(void) = Call[iterator] : func:r2201_42, this:r0_8, 0:r0_11 +# 2201| m2201_45(unknown) = ^CallSideEffect : ~m2201_39 +# 2201| m2201_46(unknown) = Chi : total:m2201_39, partial:m2201_45 +#-----| v0_12(void) = ^BufferReadSideEffect[0] : &:r0_11, ~m2201_37 +# 2201| m2201_47(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_8 +# 2201| m2201_48(iterator) = Chi : total:m0_9, partial:m2201_47 +#-----| r0_13(iterator) = Load[#temp0:0] : &:r0_8, m2201_48 +# 2201| r2201_49(bool) = Call[operator!=] : func:r2201_41, this:r0_7, 0:r0_13 +# 2201| m2201_50(unknown) = ^CallSideEffect : ~m2201_46 +# 2201| m2201_51(unknown) = Chi : total:m2201_46, partial:m2201_50 +#-----| v0_14(void) = ^IndirectReadSideEffect[-1] : &:r0_7, m2201_38 +# 2201| v2201_52(void) = ConditionalBranch : r2201_49 #-----| False -> Block 10 #-----| True -> Block 9 # 2201| Block 9 -# 2201| r2201_45(glval) = VariableAddress[y] : -# 2201| r2201_46(glval>) = VariableAddress[(__begin)] : -#-----| r0_15(glval>) = Convert : r2201_46 -# 2201| r2201_47(glval) = FunctionAddress[operator*] : -# 2201| r2201_48(ClassWithDestructor &) = Call[operator*] : func:r2201_47, this:r0_15 -# 2201| m2201_49(unknown) = ^CallSideEffect : ~m2201_43 -# 2201| m2201_50(unknown) = Chi : total:m2201_43, partial:m2201_49 -#-----| v0_16(void) = ^IndirectReadSideEffect[-1] : &:r0_15, m2201_30 -# 2201| r2201_51(ClassWithDestructor) = Load[?] : &:r2201_48, ~m2201_50 -# 2201| m2201_52(ClassWithDestructor) = Store[y] : &:r2201_45, r2201_51 +# 2201| r2201_53(glval) = VariableAddress[y] : +# 2201| r2201_54(glval>) = VariableAddress[(__begin)] : +#-----| r0_15(glval>) = Convert : r2201_54 +# 2201| r2201_55(glval) = FunctionAddress[operator*] : +# 2201| r2201_56(ClassWithDestructor &) = Call[operator*] : func:r2201_55, this:r0_15 +# 2201| m2201_57(unknown) = ^CallSideEffect : ~m2201_51 +# 2201| m2201_58(unknown) = Chi : total:m2201_51, partial:m2201_57 +#-----| v0_16(void) = ^IndirectReadSideEffect[-1] : &:r0_15, m2201_38 +# 2201| r2201_59(ClassWithDestructor) = Load[?] : &:r2201_56, ~m2201_58 +# 2201| m2201_60(ClassWithDestructor) = Store[y] : &:r2201_53, r2201_59 # 2202| r2202_1(glval) = VariableAddress[y] : # 2202| r2202_2(glval) = FunctionAddress[set_x] : # 2202| r2202_3(char) = Constant[97] : # 2202| v2202_4(void) = Call[set_x] : func:r2202_2, this:r2202_1, 0:r2202_3 -# 2202| m2202_5(unknown) = ^CallSideEffect : ~m2201_50 -# 2202| m2202_6(unknown) = Chi : total:m2201_50, partial:m2202_5 -# 2202| v2202_7(void) = ^IndirectReadSideEffect[-1] : &:r2202_1, m2201_52 +# 2202| m2202_5(unknown) = ^CallSideEffect : ~m2201_58 +# 2202| m2202_6(unknown) = Chi : total:m2201_58, partial:m2202_5 +# 2202| v2202_7(void) = ^IndirectReadSideEffect[-1] : &:r2202_1, m2201_60 # 2202| m2202_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2202_1 -# 2202| m2202_9(ClassWithDestructor) = Chi : total:m2201_52, partial:m2202_8 -# 2201| r2201_53(glval) = VariableAddress[y] : -# 2201| r2201_54(glval) = FunctionAddress[~ClassWithDestructor] : -# 2201| v2201_55(void) = Call[~ClassWithDestructor] : func:r2201_54, this:r2201_53 -# 2201| m2201_56(unknown) = ^CallSideEffect : ~m2202_6 -# 2201| m2201_57(unknown) = Chi : total:m2202_6, partial:m2201_56 -# 2201| v2201_58(void) = ^IndirectReadSideEffect[-1] : &:r2201_53, m2202_9 -# 2201| m2201_59(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2201_53 -# 2201| m2201_60(ClassWithDestructor) = Chi : total:m2202_9, partial:m2201_59 -# 2201| r2201_61(glval>) = VariableAddress[(__begin)] : -# 2201| r2201_62(glval) = FunctionAddress[operator++] : -# 2201| r2201_63(iterator &) = Call[operator++] : func:r2201_62, this:r2201_61 -# 2201| m2201_64(unknown) = ^CallSideEffect : ~m2201_57 -# 2201| m2201_65(unknown) = Chi : total:m2201_57, partial:m2201_64 -# 2201| v2201_66(void) = ^IndirectReadSideEffect[-1] : &:r2201_61, m2201_30 -# 2201| m2201_67(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2201_61 -# 2201| m2201_68(iterator) = Chi : total:m2201_30, partial:m2201_67 -# 2201| r2201_69(glval>) = CopyValue : r2201_63 +# 2202| m2202_9(ClassWithDestructor) = Chi : total:m2201_60, partial:m2202_8 +# 2201| r2201_61(glval) = VariableAddress[y] : +# 2201| r2201_62(glval) = FunctionAddress[~ClassWithDestructor] : +# 2201| v2201_63(void) = Call[~ClassWithDestructor] : func:r2201_62, this:r2201_61 +# 2201| m2201_64(unknown) = ^CallSideEffect : ~m2202_6 +# 2201| m2201_65(unknown) = Chi : total:m2202_6, partial:m2201_64 +# 2201| v2201_66(void) = ^IndirectReadSideEffect[-1] : &:r2201_61, m2202_9 +# 2201| m2201_67(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2201_61 +# 2201| m2201_68(ClassWithDestructor) = Chi : total:m2202_9, partial:m2201_67 +# 2201| r2201_69(glval>) = VariableAddress[(__begin)] : +# 2201| r2201_70(glval) = FunctionAddress[operator++] : +# 2201| r2201_71(iterator &) = Call[operator++] : func:r2201_70, this:r2201_69 +# 2201| m2201_72(unknown) = ^CallSideEffect : ~m2201_65 +# 2201| m2201_73(unknown) = Chi : total:m2201_65, partial:m2201_72 +# 2201| v2201_74(void) = ^IndirectReadSideEffect[-1] : &:r2201_69, m2201_38 +# 2201| m2201_75(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2201_69 +# 2201| m2201_76(iterator) = Chi : total:m2201_38, partial:m2201_75 +# 2201| r2201_77(glval>) = CopyValue : r2201_71 #-----| Goto (back edge) -> Block 8 # 2204| Block 10 -# 2204| r2204_1(glval>) = VariableAddress[ys] : -# 2204| m2204_2(vector) = Uninitialized[ys] : &:r2204_1 -# 2204| r2204_3(glval) = FunctionAddress[vector] : -# 2204| r2204_4(glval) = VariableAddress[#temp2204:45] : -# 2204| r2204_5(glval) = VariableAddress[x] : -# 2204| r2204_6(ClassWithDestructor) = Load[x] : &:r2204_5, m2200_8 -# 2204| m2204_7(ClassWithDestructor) = Store[#temp2204:45] : &:r2204_4, r2204_6 -# 2204| r2204_8(ClassWithDestructor) = Load[#temp2204:45] : &:r2204_4, m2204_7 -# 2204| v2204_9(void) = Call[vector] : func:r2204_3, this:r2204_1, 0:r2204_8 -# 2204| m2204_10(unknown) = ^CallSideEffect : ~m2201_43 -# 2204| m2204_11(unknown) = Chi : total:m2201_43, partial:m2204_10 -# 2204| m2204_12(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2204_1 -# 2204| m2204_13(vector) = Chi : total:m2204_2, partial:m2204_12 -# 2204| r2204_14(glval &>) = VariableAddress[(__range)] : -# 2204| r2204_15(glval>) = VariableAddress[ys] : -# 2204| r2204_16(vector &) = CopyValue : r2204_15 -# 2204| m2204_17(vector &) = Store[(__range)] : &:r2204_14, r2204_16 -# 2204| r2204_18(glval>) = VariableAddress[(__begin)] : -# 2204| r2204_19(glval &>) = VariableAddress[(__range)] : -# 2204| r2204_20(vector &) = Load[(__range)] : &:r2204_19, m2204_17 -#-----| r0_17(glval>) = CopyValue : r2204_20 -#-----| r0_18(glval>) = Convert : r0_17 -# 2204| r2204_21(glval) = FunctionAddress[begin] : -# 2204| r2204_22(iterator) = Call[begin] : func:r2204_21, this:r0_18 -#-----| v0_19(void) = ^IndirectReadSideEffect[-1] : &:r0_18, m2204_13 -# 2204| m2204_23(iterator) = Store[(__begin)] : &:r2204_18, r2204_22 -# 2204| r2204_24(glval>) = VariableAddress[(__end)] : -# 2204| r2204_25(glval &>) = VariableAddress[(__range)] : -# 2204| r2204_26(vector &) = Load[(__range)] : &:r2204_25, m2204_17 -#-----| r0_20(glval>) = CopyValue : r2204_26 -#-----| r0_21(glval>) = Convert : r0_20 -# 2204| r2204_27(glval) = FunctionAddress[end] : -# 2204| r2204_28(iterator) = Call[end] : func:r2204_27, this:r0_21 -#-----| v0_22(void) = ^IndirectReadSideEffect[-1] : &:r0_21, m2204_13 -# 2204| m2204_29(iterator) = Store[(__end)] : &:r2204_24, r2204_28 +# 2204| r2204_1(glval>) = VariableAddress[ys] : +# 2204| m2204_2(vector) = Uninitialized[ys] : &:r2204_1 +# 2204| r2204_3(glval) = FunctionAddress[vector] : +# 2204| r2204_4(glval) = VariableAddress[#temp2204:45] : +# 2204| r2204_5(glval) = VariableAddress[x] : +# 2204| r2204_6(ClassWithDestructor) = Load[x] : &:r2204_5, m2200_8 +# 2204| m2204_7(ClassWithDestructor) = Store[#temp2204:45] : &:r2204_4, r2204_6 +# 2204| r2204_8(ClassWithDestructor) = Load[#temp2204:45] : &:r2204_4, m2204_7 +# 2204| v2204_9(void) = Call[vector] : func:r2204_3, this:r2204_1, 0:r2204_8 +# 2204| m2204_10(unknown) = ^CallSideEffect : ~m2201_51 +# 2204| m2204_11(unknown) = Chi : total:m2201_51, partial:m2204_10 +# 2204| m2204_12(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2204_1 +# 2204| m2204_13(vector) = Chi : total:m2204_2, partial:m2204_12 +# 2204| r2204_14(glval) = CopyValue : r2204_4 +# 2204| r2204_15(glval) = FunctionAddress[~ClassWithDestructor] : +# 2204| v2204_16(void) = Call[~ClassWithDestructor] : func:r2204_15, this:r2204_14 +# 2204| m2204_17(unknown) = ^CallSideEffect : ~m2204_11 +# 2204| m2204_18(unknown) = Chi : total:m2204_11, partial:m2204_17 +# 2204| v2204_19(void) = ^IndirectReadSideEffect[-1] : &:r2204_14, m2204_7 +# 2204| m2204_20(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2204_14 +# 2204| m2204_21(ClassWithDestructor) = Chi : total:m2204_7, partial:m2204_20 +# 2204| r2204_22(glval &>) = VariableAddress[(__range)] : +# 2204| r2204_23(glval>) = VariableAddress[ys] : +# 2204| r2204_24(vector &) = CopyValue : r2204_23 +# 2204| m2204_25(vector &) = Store[(__range)] : &:r2204_22, r2204_24 +# 2204| r2204_26(glval>) = VariableAddress[(__begin)] : +# 2204| r2204_27(glval &>) = VariableAddress[(__range)] : +# 2204| r2204_28(vector &) = Load[(__range)] : &:r2204_27, m2204_25 +#-----| r0_17(glval>) = CopyValue : r2204_28 +#-----| r0_18(glval>) = Convert : r0_17 +# 2204| r2204_29(glval) = FunctionAddress[begin] : +# 2204| r2204_30(iterator) = Call[begin] : func:r2204_29, this:r0_18 +#-----| v0_19(void) = ^IndirectReadSideEffect[-1] : &:r0_18, m2204_13 +# 2204| m2204_31(iterator) = Store[(__begin)] : &:r2204_26, r2204_30 +# 2204| r2204_32(glval>) = VariableAddress[(__end)] : +# 2204| r2204_33(glval &>) = VariableAddress[(__range)] : +# 2204| r2204_34(vector &) = Load[(__range)] : &:r2204_33, m2204_25 +#-----| r0_20(glval>) = CopyValue : r2204_34 +#-----| r0_21(glval>) = Convert : r0_20 +# 2204| r2204_35(glval) = FunctionAddress[end] : +# 2204| r2204_36(iterator) = Call[end] : func:r2204_35, this:r0_21 +#-----| v0_22(void) = ^IndirectReadSideEffect[-1] : &:r0_21, m2204_13 +# 2204| m2204_37(iterator) = Store[(__end)] : &:r2204_32, r2204_36 #-----| Goto -> Block 11 # 2204| Block 11 -# 2204| m2204_30(iterator) = Phi : from 10:m2204_23, from 14:m2204_84 -# 2204| m2204_31(unknown) = Phi : from 10:~m2204_11, from 14:~m2204_81 -# 2204| r2204_32(glval>) = VariableAddress[(__begin)] : -#-----| r0_23(glval>) = Convert : r2204_32 -# 2204| r2204_33(glval) = FunctionAddress[operator!=] : +# 2204| m2204_38(iterator) = Phi : from 10:m2204_31, from 14:m2204_92 +# 2204| m2204_39(unknown) = Phi : from 10:~m2204_18, from 14:~m2204_89 +# 2204| r2204_40(glval>) = VariableAddress[(__begin)] : +#-----| r0_23(glval>) = Convert : r2204_40 +# 2204| r2204_41(glval) = FunctionAddress[operator!=] : #-----| r0_24(glval>) = VariableAddress[#temp0:0] : #-----| m0_25(iterator) = Uninitialized[#temp0:0] : &:r0_24 -# 2204| r2204_34(glval) = FunctionAddress[iterator] : -# 2204| r2204_35(glval>) = VariableAddress[(__end)] : -#-----| r0_26(glval>) = Convert : r2204_35 +# 2204| r2204_42(glval) = FunctionAddress[iterator] : +# 2204| r2204_43(glval>) = VariableAddress[(__end)] : +#-----| r0_26(glval>) = Convert : r2204_43 #-----| r0_27(iterator &) = CopyValue : r0_26 -# 2204| v2204_36(void) = Call[iterator] : func:r2204_34, this:r0_24, 0:r0_27 -# 2204| m2204_37(unknown) = ^CallSideEffect : ~m2204_31 -# 2204| m2204_38(unknown) = Chi : total:m2204_31, partial:m2204_37 -#-----| v0_28(void) = ^BufferReadSideEffect[0] : &:r0_27, ~m2204_29 -# 2204| m2204_39(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_24 -# 2204| m2204_40(iterator) = Chi : total:m0_25, partial:m2204_39 -#-----| r0_29(iterator) = Load[#temp0:0] : &:r0_24, m2204_40 -# 2204| r2204_41(bool) = Call[operator!=] : func:r2204_33, this:r0_23, 0:r0_29 -# 2204| m2204_42(unknown) = ^CallSideEffect : ~m2204_38 -# 2204| m2204_43(unknown) = Chi : total:m2204_38, partial:m2204_42 -#-----| v0_30(void) = ^IndirectReadSideEffect[-1] : &:r0_23, m2204_30 -# 2204| v2204_44(void) = ConditionalBranch : r2204_41 +# 2204| v2204_44(void) = Call[iterator] : func:r2204_42, this:r0_24, 0:r0_27 +# 2204| m2204_45(unknown) = ^CallSideEffect : ~m2204_39 +# 2204| m2204_46(unknown) = Chi : total:m2204_39, partial:m2204_45 +#-----| v0_28(void) = ^BufferReadSideEffect[0] : &:r0_27, ~m2204_37 +# 2204| m2204_47(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_24 +# 2204| m2204_48(iterator) = Chi : total:m0_25, partial:m2204_47 +#-----| r0_29(iterator) = Load[#temp0:0] : &:r0_24, m2204_48 +# 2204| r2204_49(bool) = Call[operator!=] : func:r2204_41, this:r0_23, 0:r0_29 +# 2204| m2204_50(unknown) = ^CallSideEffect : ~m2204_46 +# 2204| m2204_51(unknown) = Chi : total:m2204_46, partial:m2204_50 +#-----| v0_30(void) = ^IndirectReadSideEffect[-1] : &:r0_23, m2204_38 +# 2204| v2204_52(void) = ConditionalBranch : r2204_49 #-----| False -> Block 15 #-----| True -> Block 12 # 2204| Block 12 -# 2204| r2204_45(glval) = VariableAddress[y] : -# 2204| r2204_46(glval>) = VariableAddress[(__begin)] : -#-----| r0_31(glval>) = Convert : r2204_46 -# 2204| r2204_47(glval) = FunctionAddress[operator*] : -# 2204| r2204_48(ClassWithDestructor &) = Call[operator*] : func:r2204_47, this:r0_31 -# 2204| m2204_49(unknown) = ^CallSideEffect : ~m2204_43 -# 2204| m2204_50(unknown) = Chi : total:m2204_43, partial:m2204_49 -#-----| v0_32(void) = ^IndirectReadSideEffect[-1] : &:r0_31, m2204_30 -# 2204| r2204_51(ClassWithDestructor) = Load[?] : &:r2204_48, ~m2204_50 -# 2204| m2204_52(ClassWithDestructor) = Store[y] : &:r2204_45, r2204_51 +# 2204| r2204_53(glval) = VariableAddress[y] : +# 2204| r2204_54(glval>) = VariableAddress[(__begin)] : +#-----| r0_31(glval>) = Convert : r2204_54 +# 2204| r2204_55(glval) = FunctionAddress[operator*] : +# 2204| r2204_56(ClassWithDestructor &) = Call[operator*] : func:r2204_55, this:r0_31 +# 2204| m2204_57(unknown) = ^CallSideEffect : ~m2204_51 +# 2204| m2204_58(unknown) = Chi : total:m2204_51, partial:m2204_57 +#-----| v0_32(void) = ^IndirectReadSideEffect[-1] : &:r0_31, m2204_38 +# 2204| r2204_59(ClassWithDestructor) = Load[?] : &:r2204_56, ~m2204_58 +# 2204| m2204_60(ClassWithDestructor) = Store[y] : &:r2204_53, r2204_59 # 2205| r2205_1(glval) = VariableAddress[y] : # 2205| r2205_2(glval) = FunctionAddress[set_x] : # 2205| r2205_3(char) = Constant[97] : # 2205| v2205_4(void) = Call[set_x] : func:r2205_2, this:r2205_1, 0:r2205_3 -# 2205| m2205_5(unknown) = ^CallSideEffect : ~m2204_50 -# 2205| m2205_6(unknown) = Chi : total:m2204_50, partial:m2205_5 -# 2205| v2205_7(void) = ^IndirectReadSideEffect[-1] : &:r2205_1, m2204_52 +# 2205| m2205_5(unknown) = ^CallSideEffect : ~m2204_58 +# 2205| m2205_6(unknown) = Chi : total:m2204_58, partial:m2205_5 +# 2205| v2205_7(void) = ^IndirectReadSideEffect[-1] : &:r2205_1, m2204_60 # 2205| m2205_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2205_1 -# 2205| m2205_9(ClassWithDestructor) = Chi : total:m2204_52, partial:m2205_8 +# 2205| m2205_9(ClassWithDestructor) = Chi : total:m2204_60, partial:m2205_8 # 2206| r2206_1(glval) = VariableAddress[y] : # 2206| r2206_2(glval) = FunctionAddress[get_x] : # 2206| r2206_3(char) = Call[get_x] : func:r2206_2, this:r2206_1 @@ -13681,50 +13969,50 @@ ir.cpp: # 2207| Block 13 # 2207| v2207_1(void) = NoOp : -# 2204| r2204_53(glval) = VariableAddress[y] : -# 2204| r2204_54(glval) = FunctionAddress[~ClassWithDestructor] : -# 2204| v2204_55(void) = Call[~ClassWithDestructor] : func:r2204_54, this:r2204_53 -# 2204| m2204_56(unknown) = ^CallSideEffect : ~m2206_5 -# 2204| m2204_57(unknown) = Chi : total:m2206_5, partial:m2204_56 -# 2204| v2204_58(void) = ^IndirectReadSideEffect[-1] : &:r2204_53, m2206_8 -# 2204| m2204_59(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2204_53 -# 2204| m2204_60(ClassWithDestructor) = Chi : total:m2206_8, partial:m2204_59 -# 2204| r2204_61(glval>) = VariableAddress[ys] : -# 2204| r2204_62(glval) = FunctionAddress[~vector] : -# 2204| v2204_63(void) = Call[~vector] : func:r2204_62, this:r2204_61 -# 2204| m2204_64(unknown) = ^CallSideEffect : ~m2204_57 -# 2204| m2204_65(unknown) = Chi : total:m2204_57, partial:m2204_64 -# 2204| v2204_66(void) = ^IndirectReadSideEffect[-1] : &:r2204_61, m2204_13 -# 2204| m2204_67(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2204_61 -# 2204| m2204_68(vector) = Chi : total:m2204_13, partial:m2204_67 +# 2204| r2204_61(glval) = VariableAddress[y] : +# 2204| r2204_62(glval) = FunctionAddress[~ClassWithDestructor] : +# 2204| v2204_63(void) = Call[~ClassWithDestructor] : func:r2204_62, this:r2204_61 +# 2204| m2204_64(unknown) = ^CallSideEffect : ~m2206_5 +# 2204| m2204_65(unknown) = Chi : total:m2206_5, partial:m2204_64 +# 2204| v2204_66(void) = ^IndirectReadSideEffect[-1] : &:r2204_61, m2206_8 +# 2204| m2204_67(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2204_61 +# 2204| m2204_68(ClassWithDestructor) = Chi : total:m2206_8, partial:m2204_67 +# 2204| r2204_69(glval>) = VariableAddress[ys] : +# 2204| r2204_70(glval) = FunctionAddress[~vector] : +# 2204| v2204_71(void) = Call[~vector] : func:r2204_70, this:r2204_69 +# 2204| m2204_72(unknown) = ^CallSideEffect : ~m2204_65 +# 2204| m2204_73(unknown) = Chi : total:m2204_65, partial:m2204_72 +# 2204| v2204_74(void) = ^IndirectReadSideEffect[-1] : &:r2204_69, m2204_13 +# 2204| m2204_75(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2204_69 +# 2204| m2204_76(vector) = Chi : total:m2204_13, partial:m2204_75 # 2219| r2219_1(glval) = VariableAddress[x] : # 2219| r2219_2(glval) = FunctionAddress[~ClassWithDestructor] : # 2219| v2219_3(void) = Call[~ClassWithDestructor] : func:r2219_2, this:r2219_1 -# 2219| m2219_4(unknown) = ^CallSideEffect : ~m2204_65 -# 2219| m2219_5(unknown) = Chi : total:m2204_65, partial:m2219_4 +# 2219| m2219_4(unknown) = ^CallSideEffect : ~m2204_73 +# 2219| m2219_5(unknown) = Chi : total:m2204_73, partial:m2219_4 # 2219| v2219_6(void) = ^IndirectReadSideEffect[-1] : &:r2219_1, m2200_8 # 2219| m2219_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2219_1 # 2219| m2219_8(ClassWithDestructor) = Chi : total:m2200_8, partial:m2219_7 #-----| Goto -> Block 1 # 2204| Block 14 -# 2204| r2204_69(glval) = VariableAddress[y] : -# 2204| r2204_70(glval) = FunctionAddress[~ClassWithDestructor] : -# 2204| v2204_71(void) = Call[~ClassWithDestructor] : func:r2204_70, this:r2204_69 -# 2204| m2204_72(unknown) = ^CallSideEffect : ~m2206_5 -# 2204| m2204_73(unknown) = Chi : total:m2206_5, partial:m2204_72 -# 2204| v2204_74(void) = ^IndirectReadSideEffect[-1] : &:r2204_69, m2206_8 -# 2204| m2204_75(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2204_69 -# 2204| m2204_76(ClassWithDestructor) = Chi : total:m2206_8, partial:m2204_75 -# 2204| r2204_77(glval>) = VariableAddress[(__begin)] : -# 2204| r2204_78(glval) = FunctionAddress[operator++] : -# 2204| r2204_79(iterator &) = Call[operator++] : func:r2204_78, this:r2204_77 -# 2204| m2204_80(unknown) = ^CallSideEffect : ~m2204_73 -# 2204| m2204_81(unknown) = Chi : total:m2204_73, partial:m2204_80 -# 2204| v2204_82(void) = ^IndirectReadSideEffect[-1] : &:r2204_77, m2204_30 -# 2204| m2204_83(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2204_77 -# 2204| m2204_84(iterator) = Chi : total:m2204_30, partial:m2204_83 -# 2204| r2204_85(glval>) = CopyValue : r2204_79 +# 2204| r2204_77(glval) = VariableAddress[y] : +# 2204| r2204_78(glval) = FunctionAddress[~ClassWithDestructor] : +# 2204| v2204_79(void) = Call[~ClassWithDestructor] : func:r2204_78, this:r2204_77 +# 2204| m2204_80(unknown) = ^CallSideEffect : ~m2206_5 +# 2204| m2204_81(unknown) = Chi : total:m2206_5, partial:m2204_80 +# 2204| v2204_82(void) = ^IndirectReadSideEffect[-1] : &:r2204_77, m2206_8 +# 2204| m2204_83(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2204_77 +# 2204| m2204_84(ClassWithDestructor) = Chi : total:m2206_8, partial:m2204_83 +# 2204| r2204_85(glval>) = VariableAddress[(__begin)] : +# 2204| r2204_86(glval) = FunctionAddress[operator++] : +# 2204| r2204_87(iterator &) = Call[operator++] : func:r2204_86, this:r2204_85 +# 2204| m2204_88(unknown) = ^CallSideEffect : ~m2204_81 +# 2204| m2204_89(unknown) = Chi : total:m2204_81, partial:m2204_88 +# 2204| v2204_90(void) = ^IndirectReadSideEffect[-1] : &:r2204_85, m2204_38 +# 2204| m2204_91(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2204_85 +# 2204| m2204_92(iterator) = Chi : total:m2204_38, partial:m2204_91 +# 2204| r2204_93(glval>) = CopyValue : r2204_87 #-----| Goto (back edge) -> Block 11 # 2210| Block 15 @@ -13733,8 +14021,8 @@ ir.cpp: # 2210| r2210_3(glval) = FunctionAddress[vector] : # 2210| r2210_4(int) = Constant[1] : # 2210| v2210_5(void) = Call[vector] : func:r2210_3, this:r2210_1, 0:r2210_4 -# 2210| m2210_6(unknown) = ^CallSideEffect : ~m2204_43 -# 2210| m2210_7(unknown) = Chi : total:m2204_43, partial:m2210_6 +# 2210| m2210_6(unknown) = ^CallSideEffect : ~m2204_51 +# 2210| m2210_7(unknown) = Chi : total:m2204_51, partial:m2210_6 # 2210| m2210_8(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2210_1 # 2210| m2210_9(vector) = Chi : total:m2210_2, partial:m2210_8 # 2210| r2210_10(glval &>) = VariableAddress[(__range)] : @@ -13840,87 +14128,95 @@ ir.cpp: #-----| Goto -> Block 1 # 2215| Block 20 -# 2215| r2215_1(glval>) = VariableAddress[ys] : -# 2215| m2215_2(vector) = Uninitialized[ys] : &:r2215_1 -# 2215| r2215_3(glval) = FunctionAddress[vector] : -# 2215| r2215_4(glval) = VariableAddress[#temp2215:45] : -# 2215| r2215_5(glval) = VariableAddress[x] : -# 2215| r2215_6(ClassWithDestructor) = Load[x] : &:r2215_5, m2200_8 -# 2215| m2215_7(ClassWithDestructor) = Store[#temp2215:45] : &:r2215_4, r2215_6 -# 2215| r2215_8(ClassWithDestructor) = Load[#temp2215:45] : &:r2215_4, m2215_7 -# 2215| v2215_9(void) = Call[vector] : func:r2215_3, this:r2215_1, 0:r2215_8 -# 2215| m2215_10(unknown) = ^CallSideEffect : ~m2210_39 -# 2215| m2215_11(unknown) = Chi : total:m2210_39, partial:m2215_10 -# 2215| m2215_12(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2215_1 -# 2215| m2215_13(vector) = Chi : total:m2215_2, partial:m2215_12 -# 2215| r2215_14(glval &>) = VariableAddress[(__range)] : -# 2215| r2215_15(glval>) = VariableAddress[ys] : -# 2215| r2215_16(vector &) = CopyValue : r2215_15 -# 2215| m2215_17(vector &) = Store[(__range)] : &:r2215_14, r2215_16 -# 2215| r2215_18(glval>) = VariableAddress[(__begin)] : -# 2215| r2215_19(glval &>) = VariableAddress[(__range)] : -# 2215| r2215_20(vector &) = Load[(__range)] : &:r2215_19, m2215_17 -#-----| r0_49(glval>) = CopyValue : r2215_20 -#-----| r0_50(glval>) = Convert : r0_49 -# 2215| r2215_21(glval) = FunctionAddress[begin] : -# 2215| r2215_22(iterator) = Call[begin] : func:r2215_21, this:r0_50 -#-----| v0_51(void) = ^IndirectReadSideEffect[-1] : &:r0_50, m2215_13 -# 2215| m2215_23(iterator) = Store[(__begin)] : &:r2215_18, r2215_22 -# 2215| r2215_24(glval>) = VariableAddress[(__end)] : -# 2215| r2215_25(glval &>) = VariableAddress[(__range)] : -# 2215| r2215_26(vector &) = Load[(__range)] : &:r2215_25, m2215_17 -#-----| r0_52(glval>) = CopyValue : r2215_26 -#-----| r0_53(glval>) = Convert : r0_52 -# 2215| r2215_27(glval) = FunctionAddress[end] : -# 2215| r2215_28(iterator) = Call[end] : func:r2215_27, this:r0_53 -#-----| v0_54(void) = ^IndirectReadSideEffect[-1] : &:r0_53, m2215_13 -# 2215| m2215_29(iterator) = Store[(__end)] : &:r2215_24, r2215_28 +# 2215| r2215_1(glval>) = VariableAddress[ys] : +# 2215| m2215_2(vector) = Uninitialized[ys] : &:r2215_1 +# 2215| r2215_3(glval) = FunctionAddress[vector] : +# 2215| r2215_4(glval) = VariableAddress[#temp2215:45] : +# 2215| r2215_5(glval) = VariableAddress[x] : +# 2215| r2215_6(ClassWithDestructor) = Load[x] : &:r2215_5, m2200_8 +# 2215| m2215_7(ClassWithDestructor) = Store[#temp2215:45] : &:r2215_4, r2215_6 +# 2215| r2215_8(ClassWithDestructor) = Load[#temp2215:45] : &:r2215_4, m2215_7 +# 2215| v2215_9(void) = Call[vector] : func:r2215_3, this:r2215_1, 0:r2215_8 +# 2215| m2215_10(unknown) = ^CallSideEffect : ~m2210_39 +# 2215| m2215_11(unknown) = Chi : total:m2210_39, partial:m2215_10 +# 2215| m2215_12(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2215_1 +# 2215| m2215_13(vector) = Chi : total:m2215_2, partial:m2215_12 +# 2215| r2215_14(glval) = CopyValue : r2215_4 +# 2215| r2215_15(glval) = FunctionAddress[~ClassWithDestructor] : +# 2215| v2215_16(void) = Call[~ClassWithDestructor] : func:r2215_15, this:r2215_14 +# 2215| m2215_17(unknown) = ^CallSideEffect : ~m2215_11 +# 2215| m2215_18(unknown) = Chi : total:m2215_11, partial:m2215_17 +# 2215| v2215_19(void) = ^IndirectReadSideEffect[-1] : &:r2215_14, m2215_7 +# 2215| m2215_20(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2215_14 +# 2215| m2215_21(ClassWithDestructor) = Chi : total:m2215_7, partial:m2215_20 +# 2215| r2215_22(glval &>) = VariableAddress[(__range)] : +# 2215| r2215_23(glval>) = VariableAddress[ys] : +# 2215| r2215_24(vector &) = CopyValue : r2215_23 +# 2215| m2215_25(vector &) = Store[(__range)] : &:r2215_22, r2215_24 +# 2215| r2215_26(glval>) = VariableAddress[(__begin)] : +# 2215| r2215_27(glval &>) = VariableAddress[(__range)] : +# 2215| r2215_28(vector &) = Load[(__range)] : &:r2215_27, m2215_25 +#-----| r0_49(glval>) = CopyValue : r2215_28 +#-----| r0_50(glval>) = Convert : r0_49 +# 2215| r2215_29(glval) = FunctionAddress[begin] : +# 2215| r2215_30(iterator) = Call[begin] : func:r2215_29, this:r0_50 +#-----| v0_51(void) = ^IndirectReadSideEffect[-1] : &:r0_50, m2215_13 +# 2215| m2215_31(iterator) = Store[(__begin)] : &:r2215_26, r2215_30 +# 2215| r2215_32(glval>) = VariableAddress[(__end)] : +# 2215| r2215_33(glval &>) = VariableAddress[(__range)] : +# 2215| r2215_34(vector &) = Load[(__range)] : &:r2215_33, m2215_25 +#-----| r0_52(glval>) = CopyValue : r2215_34 +#-----| r0_53(glval>) = Convert : r0_52 +# 2215| r2215_35(glval) = FunctionAddress[end] : +# 2215| r2215_36(iterator) = Call[end] : func:r2215_35, this:r0_53 +#-----| v0_54(void) = ^IndirectReadSideEffect[-1] : &:r0_53, m2215_13 +# 2215| m2215_37(iterator) = Store[(__end)] : &:r2215_32, r2215_36 #-----| Goto -> Block 21 # 2215| Block 21 -# 2215| m2215_30(iterator) = Phi : from 20:m2215_23, from 22:m2215_68 -# 2215| m2215_31(unknown) = Phi : from 20:~m2215_11, from 22:~m2215_65 -# 2215| r2215_32(glval>) = VariableAddress[(__begin)] : -#-----| r0_55(glval>) = Convert : r2215_32 -# 2215| r2215_33(glval) = FunctionAddress[operator!=] : +# 2215| m2215_38(iterator) = Phi : from 20:m2215_31, from 22:m2215_76 +# 2215| m2215_39(unknown) = Phi : from 20:~m2215_18, from 22:~m2215_73 +# 2215| r2215_40(glval>) = VariableAddress[(__begin)] : +#-----| r0_55(glval>) = Convert : r2215_40 +# 2215| r2215_41(glval) = FunctionAddress[operator!=] : #-----| r0_56(glval>) = VariableAddress[#temp0:0] : #-----| m0_57(iterator) = Uninitialized[#temp0:0] : &:r0_56 -# 2215| r2215_34(glval) = FunctionAddress[iterator] : -# 2215| r2215_35(glval>) = VariableAddress[(__end)] : -#-----| r0_58(glval>) = Convert : r2215_35 +# 2215| r2215_42(glval) = FunctionAddress[iterator] : +# 2215| r2215_43(glval>) = VariableAddress[(__end)] : +#-----| r0_58(glval>) = Convert : r2215_43 #-----| r0_59(iterator &) = CopyValue : r0_58 -# 2215| v2215_36(void) = Call[iterator] : func:r2215_34, this:r0_56, 0:r0_59 -# 2215| m2215_37(unknown) = ^CallSideEffect : ~m2215_31 -# 2215| m2215_38(unknown) = Chi : total:m2215_31, partial:m2215_37 -#-----| v0_60(void) = ^BufferReadSideEffect[0] : &:r0_59, ~m2215_29 -# 2215| m2215_39(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_56 -# 2215| m2215_40(iterator) = Chi : total:m0_57, partial:m2215_39 -#-----| r0_61(iterator) = Load[#temp0:0] : &:r0_56, m2215_40 -# 2215| r2215_41(bool) = Call[operator!=] : func:r2215_33, this:r0_55, 0:r0_61 -# 2215| m2215_42(unknown) = ^CallSideEffect : ~m2215_38 -# 2215| m2215_43(unknown) = Chi : total:m2215_38, partial:m2215_42 -#-----| v0_62(void) = ^IndirectReadSideEffect[-1] : &:r0_55, m2215_30 -# 2215| v2215_44(void) = ConditionalBranch : r2215_41 +# 2215| v2215_44(void) = Call[iterator] : func:r2215_42, this:r0_56, 0:r0_59 +# 2215| m2215_45(unknown) = ^CallSideEffect : ~m2215_39 +# 2215| m2215_46(unknown) = Chi : total:m2215_39, partial:m2215_45 +#-----| v0_60(void) = ^BufferReadSideEffect[0] : &:r0_59, ~m2215_37 +# 2215| m2215_47(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_56 +# 2215| m2215_48(iterator) = Chi : total:m0_57, partial:m2215_47 +#-----| r0_61(iterator) = Load[#temp0:0] : &:r0_56, m2215_48 +# 2215| r2215_49(bool) = Call[operator!=] : func:r2215_41, this:r0_55, 0:r0_61 +# 2215| m2215_50(unknown) = ^CallSideEffect : ~m2215_46 +# 2215| m2215_51(unknown) = Chi : total:m2215_46, partial:m2215_50 +#-----| v0_62(void) = ^IndirectReadSideEffect[-1] : &:r0_55, m2215_38 +# 2215| v2215_52(void) = ConditionalBranch : r2215_49 #-----| False -> Block 23 #-----| True -> Block 22 # 2215| Block 22 -# 2215| r2215_45(glval) = VariableAddress[y] : -# 2215| r2215_46(glval>) = VariableAddress[(__begin)] : -#-----| r0_63(glval>) = Convert : r2215_46 -# 2215| r2215_47(glval) = FunctionAddress[operator*] : -# 2215| r2215_48(ClassWithDestructor &) = Call[operator*] : func:r2215_47, this:r0_63 -# 2215| m2215_49(unknown) = ^CallSideEffect : ~m2215_43 -# 2215| m2215_50(unknown) = Chi : total:m2215_43, partial:m2215_49 -#-----| v0_64(void) = ^IndirectReadSideEffect[-1] : &:r0_63, m2215_30 -# 2215| r2215_51(ClassWithDestructor) = Load[?] : &:r2215_48, ~m2215_50 -# 2215| m2215_52(ClassWithDestructor) = Store[y] : &:r2215_45, r2215_51 +# 2215| r2215_53(glval) = VariableAddress[y] : +# 2215| r2215_54(glval>) = VariableAddress[(__begin)] : +#-----| r0_63(glval>) = Convert : r2215_54 +# 2215| r2215_55(glval) = FunctionAddress[operator*] : +# 2215| r2215_56(ClassWithDestructor &) = Call[operator*] : func:r2215_55, this:r0_63 +# 2215| m2215_57(unknown) = ^CallSideEffect : ~m2215_51 +# 2215| m2215_58(unknown) = Chi : total:m2215_51, partial:m2215_57 +#-----| v0_64(void) = ^IndirectReadSideEffect[-1] : &:r0_63, m2215_38 +# 2215| r2215_59(ClassWithDestructor) = Load[?] : &:r2215_56, ~m2215_58 +# 2215| m2215_60(ClassWithDestructor) = Store[y] : &:r2215_53, r2215_59 # 2216| r2216_1(glval) = VariableAddress[z1] : # 2216| m2216_2(ClassWithDestructor) = Uninitialized[z1] : &:r2216_1 # 2216| r2216_3(glval) = FunctionAddress[ClassWithDestructor] : # 2216| v2216_4(void) = Call[ClassWithDestructor] : func:r2216_3, this:r2216_1 -# 2216| m2216_5(unknown) = ^CallSideEffect : ~m2215_50 -# 2216| m2216_6(unknown) = Chi : total:m2215_50, partial:m2216_5 +# 2216| m2216_5(unknown) = ^CallSideEffect : ~m2215_58 +# 2216| m2216_6(unknown) = Chi : total:m2215_58, partial:m2216_5 # 2216| m2216_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2216_1 # 2216| m2216_8(ClassWithDestructor) = Chi : total:m2216_2, partial:m2216_7 # 2217| r2217_1(glval) = VariableAddress[z2] : @@ -13947,23 +14243,23 @@ ir.cpp: # 2218| v2218_14(void) = ^IndirectReadSideEffect[-1] : &:r2218_9, m2216_8 # 2218| m2218_15(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2218_9 # 2218| m2218_16(ClassWithDestructor) = Chi : total:m2216_8, partial:m2218_15 -# 2215| r2215_53(glval) = VariableAddress[y] : -# 2215| r2215_54(glval) = FunctionAddress[~ClassWithDestructor] : -# 2215| v2215_55(void) = Call[~ClassWithDestructor] : func:r2215_54, this:r2215_53 -# 2215| m2215_56(unknown) = ^CallSideEffect : ~m2218_13 -# 2215| m2215_57(unknown) = Chi : total:m2218_13, partial:m2215_56 -# 2215| v2215_58(void) = ^IndirectReadSideEffect[-1] : &:r2215_53, m2215_52 -# 2215| m2215_59(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2215_53 -# 2215| m2215_60(ClassWithDestructor) = Chi : total:m2215_52, partial:m2215_59 -# 2215| r2215_61(glval>) = VariableAddress[(__begin)] : -# 2215| r2215_62(glval) = FunctionAddress[operator++] : -# 2215| r2215_63(iterator &) = Call[operator++] : func:r2215_62, this:r2215_61 -# 2215| m2215_64(unknown) = ^CallSideEffect : ~m2215_57 -# 2215| m2215_65(unknown) = Chi : total:m2215_57, partial:m2215_64 -# 2215| v2215_66(void) = ^IndirectReadSideEffect[-1] : &:r2215_61, m2215_30 -# 2215| m2215_67(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2215_61 -# 2215| m2215_68(iterator) = Chi : total:m2215_30, partial:m2215_67 -# 2215| r2215_69(glval>) = CopyValue : r2215_63 +# 2215| r2215_61(glval) = VariableAddress[y] : +# 2215| r2215_62(glval) = FunctionAddress[~ClassWithDestructor] : +# 2215| v2215_63(void) = Call[~ClassWithDestructor] : func:r2215_62, this:r2215_61 +# 2215| m2215_64(unknown) = ^CallSideEffect : ~m2218_13 +# 2215| m2215_65(unknown) = Chi : total:m2218_13, partial:m2215_64 +# 2215| v2215_66(void) = ^IndirectReadSideEffect[-1] : &:r2215_61, m2215_60 +# 2215| m2215_67(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2215_61 +# 2215| m2215_68(ClassWithDestructor) = Chi : total:m2215_60, partial:m2215_67 +# 2215| r2215_69(glval>) = VariableAddress[(__begin)] : +# 2215| r2215_70(glval) = FunctionAddress[operator++] : +# 2215| r2215_71(iterator &) = Call[operator++] : func:r2215_70, this:r2215_69 +# 2215| m2215_72(unknown) = ^CallSideEffect : ~m2215_65 +# 2215| m2215_73(unknown) = Chi : total:m2215_65, partial:m2215_72 +# 2215| v2215_74(void) = ^IndirectReadSideEffect[-1] : &:r2215_69, m2215_38 +# 2215| m2215_75(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2215_69 +# 2215| m2215_76(iterator) = Chi : total:m2215_38, partial:m2215_75 +# 2215| r2215_77(glval>) = CopyValue : r2215_71 #-----| Goto (back edge) -> Block 21 # 2219| Block 23 @@ -13971,8 +14267,8 @@ ir.cpp: # 2219| r2219_18(glval) = VariableAddress[x] : # 2219| r2219_19(glval) = FunctionAddress[~ClassWithDestructor] : # 2219| v2219_20(void) = Call[~ClassWithDestructor] : func:r2219_19, this:r2219_18 -# 2219| m2219_21(unknown) = ^CallSideEffect : ~m2215_43 -# 2219| m2219_22(unknown) = Chi : total:m2215_43, partial:m2219_21 +# 2219| m2219_21(unknown) = ^CallSideEffect : ~m2215_51 +# 2219| m2219_22(unknown) = Chi : total:m2215_51, partial:m2219_21 # 2219| v2219_23(void) = ^IndirectReadSideEffect[-1] : &:r2219_18, m2200_8 # 2219| m2219_24(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2219_18 # 2219| m2219_25(ClassWithDestructor) = Chi : total:m2200_8, partial:m2219_24 @@ -14621,81 +14917,89 @@ ir.cpp: # 2293| m2293_19(unknown) = Chi : total:m2293_12, partial:m2293_18 # 2293| m2293_20(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2293_2 # 2293| m2293_21(vector) = Chi : total:m2293_3, partial:m2293_20 -# 2293| r2293_22(vector &) = CopyValue : r2293_2 -# 2293| m2293_23(vector &&) = Store[(__range)] : &:r2293_1, r2293_22 -# 2293| r2293_24(glval>) = VariableAddress[(__begin)] : -# 2293| r2293_25(glval &&>) = VariableAddress[(__range)] : -# 2293| r2293_26(vector &&) = Load[(__range)] : &:r2293_25, m2293_23 -#-----| r0_1(glval>) = CopyValue : r2293_26 +# 2293| r2293_22(glval) = CopyValue : r2293_5 +# 2293| r2293_23(glval) = FunctionAddress[~String] : +# 2293| v2293_24(void) = Call[~String] : func:r2293_23, this:r2293_22 +# 2293| m2293_25(unknown) = ^CallSideEffect : ~m2293_19 +# 2293| m2293_26(unknown) = Chi : total:m2293_19, partial:m2293_25 +# 2293| v2293_27(void) = ^IndirectReadSideEffect[-1] : &:r2293_22, m2293_15 +# 2293| m2293_28(String) = ^IndirectMayWriteSideEffect[-1] : &:r2293_22 +# 2293| m2293_29(String) = Chi : total:m2293_15, partial:m2293_28 +# 2293| r2293_30(vector &) = CopyValue : r2293_2 +# 2293| m2293_31(vector &&) = Store[(__range)] : &:r2293_1, r2293_30 +# 2293| r2293_32(glval>) = VariableAddress[(__begin)] : +# 2293| r2293_33(glval &&>) = VariableAddress[(__range)] : +# 2293| r2293_34(vector &&) = Load[(__range)] : &:r2293_33, m2293_31 +#-----| r0_1(glval>) = CopyValue : r2293_34 #-----| r0_2(glval>) = Convert : r0_1 -# 2293| r2293_27(glval) = FunctionAddress[begin] : -# 2293| r2293_28(iterator) = Call[begin] : func:r2293_27, this:r0_2 +# 2293| r2293_35(glval) = FunctionAddress[begin] : +# 2293| r2293_36(iterator) = Call[begin] : func:r2293_35, this:r0_2 #-----| v0_3(void) = ^IndirectReadSideEffect[-1] : &:r0_2, m2293_21 -# 2293| m2293_29(iterator) = Store[(__begin)] : &:r2293_24, r2293_28 -# 2293| r2293_30(glval>) = VariableAddress[(__end)] : -# 2293| r2293_31(glval &&>) = VariableAddress[(__range)] : -# 2293| r2293_32(vector &&) = Load[(__range)] : &:r2293_31, m2293_23 -#-----| r0_4(glval>) = CopyValue : r2293_32 +# 2293| m2293_37(iterator) = Store[(__begin)] : &:r2293_32, r2293_36 +# 2293| r2293_38(glval>) = VariableAddress[(__end)] : +# 2293| r2293_39(glval &&>) = VariableAddress[(__range)] : +# 2293| r2293_40(vector &&) = Load[(__range)] : &:r2293_39, m2293_31 +#-----| r0_4(glval>) = CopyValue : r2293_40 #-----| r0_5(glval>) = Convert : r0_4 -# 2293| r2293_33(glval) = FunctionAddress[end] : -# 2293| r2293_34(iterator) = Call[end] : func:r2293_33, this:r0_5 +# 2293| r2293_41(glval) = FunctionAddress[end] : +# 2293| r2293_42(iterator) = Call[end] : func:r2293_41, this:r0_5 #-----| v0_6(void) = ^IndirectReadSideEffect[-1] : &:r0_5, m2293_21 -# 2293| m2293_35(iterator) = Store[(__end)] : &:r2293_30, r2293_34 +# 2293| m2293_43(iterator) = Store[(__end)] : &:r2293_38, r2293_42 #-----| Goto -> Block 4 # 2293| Block 4 -# 2293| m2293_36(iterator) = Phi : from 3:m2293_29, from 5:m2293_83 -# 2293| m2293_37(unknown) = Phi : from 3:~m2293_19, from 5:~m2293_80 -# 2293| r2293_38(glval>) = VariableAddress[(__begin)] : -#-----| r0_7(glval>) = Convert : r2293_38 -# 2293| r2293_39(glval) = FunctionAddress[operator!=] : +# 2293| m2293_44(iterator) = Phi : from 3:m2293_37, from 5:m2293_91 +# 2293| m2293_45(unknown) = Phi : from 3:~m2293_26, from 5:~m2293_88 +# 2293| r2293_46(glval>) = VariableAddress[(__begin)] : +#-----| r0_7(glval>) = Convert : r2293_46 +# 2293| r2293_47(glval) = FunctionAddress[operator!=] : #-----| r0_8(glval>) = VariableAddress[#temp0:0] : #-----| m0_9(iterator) = Uninitialized[#temp0:0] : &:r0_8 -# 2293| r2293_40(glval) = FunctionAddress[iterator] : -# 2293| r2293_41(glval>) = VariableAddress[(__end)] : -#-----| r0_10(glval>) = Convert : r2293_41 +# 2293| r2293_48(glval) = FunctionAddress[iterator] : +# 2293| r2293_49(glval>) = VariableAddress[(__end)] : +#-----| r0_10(glval>) = Convert : r2293_49 #-----| r0_11(iterator &) = CopyValue : r0_10 -# 2293| v2293_42(void) = Call[iterator] : func:r2293_40, this:r0_8, 0:r0_11 -# 2293| m2293_43(unknown) = ^CallSideEffect : ~m2293_37 -# 2293| m2293_44(unknown) = Chi : total:m2293_37, partial:m2293_43 -#-----| v0_12(void) = ^BufferReadSideEffect[0] : &:r0_11, ~m2293_35 -# 2293| m2293_45(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_8 -# 2293| m2293_46(iterator) = Chi : total:m0_9, partial:m2293_45 -#-----| r0_13(iterator) = Load[#temp0:0] : &:r0_8, m2293_46 -# 2293| r2293_47(bool) = Call[operator!=] : func:r2293_39, this:r0_7, 0:r0_13 -# 2293| m2293_48(unknown) = ^CallSideEffect : ~m2293_44 -# 2293| m2293_49(unknown) = Chi : total:m2293_44, partial:m2293_48 -#-----| v0_14(void) = ^IndirectReadSideEffect[-1] : &:r0_7, m2293_36 -# 2293| v2293_50(void) = ConditionalBranch : r2293_47 +# 2293| v2293_50(void) = Call[iterator] : func:r2293_48, this:r0_8, 0:r0_11 +# 2293| m2293_51(unknown) = ^CallSideEffect : ~m2293_45 +# 2293| m2293_52(unknown) = Chi : total:m2293_45, partial:m2293_51 +#-----| v0_12(void) = ^BufferReadSideEffect[0] : &:r0_11, ~m2293_43 +# 2293| m2293_53(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_8 +# 2293| m2293_54(iterator) = Chi : total:m0_9, partial:m2293_53 +#-----| r0_13(iterator) = Load[#temp0:0] : &:r0_8, m2293_54 +# 2293| r2293_55(bool) = Call[operator!=] : func:r2293_47, this:r0_7, 0:r0_13 +# 2293| m2293_56(unknown) = ^CallSideEffect : ~m2293_52 +# 2293| m2293_57(unknown) = Chi : total:m2293_52, partial:m2293_56 +#-----| v0_14(void) = ^IndirectReadSideEffect[-1] : &:r0_7, m2293_44 +# 2293| v2293_58(void) = ConditionalBranch : r2293_55 #-----| False -> Block 6 #-----| True -> Block 5 # 2293| Block 5 -# 2293| r2293_51(glval) = VariableAddress[s] : -# 2293| m2293_52(String) = Uninitialized[s] : &:r2293_51 -# 2293| r2293_53(glval) = FunctionAddress[String] : -# 2293| r2293_54(glval>) = VariableAddress[(__begin)] : -#-----| r0_15(glval>) = Convert : r2293_54 -# 2293| r2293_55(glval) = FunctionAddress[operator*] : -# 2293| r2293_56(String &) = Call[operator*] : func:r2293_55, this:r0_15 -# 2293| m2293_57(unknown) = ^CallSideEffect : ~m2293_49 -# 2293| m2293_58(unknown) = Chi : total:m2293_49, partial:m2293_57 -#-----| v0_16(void) = ^IndirectReadSideEffect[-1] : &:r0_15, m2293_36 -# 2293| r2293_59(glval) = CopyValue : r2293_56 -# 2293| r2293_60(glval) = Convert : r2293_59 -# 2293| r2293_61(String &) = CopyValue : r2293_60 -# 2293| v2293_62(void) = Call[String] : func:r2293_53, this:r2293_51, 0:r2293_61 -# 2293| m2293_63(unknown) = ^CallSideEffect : ~m2293_58 -# 2293| m2293_64(unknown) = Chi : total:m2293_58, partial:m2293_63 -# 2293| v2293_65(void) = ^BufferReadSideEffect[0] : &:r2293_61, ~m2293_64 -# 2293| m2293_66(String) = ^IndirectMayWriteSideEffect[-1] : &:r2293_51 -# 2293| m2293_67(String) = Chi : total:m2293_52, partial:m2293_66 +# 2293| r2293_59(glval) = VariableAddress[s] : +# 2293| m2293_60(String) = Uninitialized[s] : &:r2293_59 +# 2293| r2293_61(glval) = FunctionAddress[String] : +# 2293| r2293_62(glval>) = VariableAddress[(__begin)] : +#-----| r0_15(glval>) = Convert : r2293_62 +# 2293| r2293_63(glval) = FunctionAddress[operator*] : +# 2293| r2293_64(String &) = Call[operator*] : func:r2293_63, this:r0_15 +# 2293| m2293_65(unknown) = ^CallSideEffect : ~m2293_57 +# 2293| m2293_66(unknown) = Chi : total:m2293_57, partial:m2293_65 +#-----| v0_16(void) = ^IndirectReadSideEffect[-1] : &:r0_15, m2293_44 +# 2293| r2293_67(glval) = CopyValue : r2293_64 +# 2293| r2293_68(glval) = Convert : r2293_67 +# 2293| r2293_69(String &) = CopyValue : r2293_68 +# 2293| v2293_70(void) = Call[String] : func:r2293_61, this:r2293_59, 0:r2293_69 +# 2293| m2293_71(unknown) = ^CallSideEffect : ~m2293_66 +# 2293| m2293_72(unknown) = Chi : total:m2293_66, partial:m2293_71 +# 2293| v2293_73(void) = ^BufferReadSideEffect[0] : &:r2293_69, ~m2293_72 +# 2293| m2293_74(String) = ^IndirectMayWriteSideEffect[-1] : &:r2293_59 +# 2293| m2293_75(String) = Chi : total:m2293_60, partial:m2293_74 # 2294| r2294_1(glval) = VariableAddress[s2] : # 2294| m2294_2(String) = Uninitialized[s2] : &:r2294_1 # 2294| r2294_3(glval) = FunctionAddress[String] : # 2294| v2294_4(void) = Call[String] : func:r2294_3, this:r2294_1 -# 2294| m2294_5(unknown) = ^CallSideEffect : ~m2293_64 -# 2294| m2294_6(unknown) = Chi : total:m2293_64, partial:m2294_5 +# 2294| m2294_5(unknown) = ^CallSideEffect : ~m2293_72 +# 2294| m2294_6(unknown) = Chi : total:m2293_72, partial:m2294_5 # 2294| m2294_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2294_1 # 2294| m2294_8(String) = Chi : total:m2294_2, partial:m2294_7 # 2295| r2295_1(glval) = VariableAddress[s2] : @@ -14706,23 +15010,23 @@ ir.cpp: # 2295| v2295_6(void) = ^IndirectReadSideEffect[-1] : &:r2295_1, m2294_8 # 2295| m2295_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2295_1 # 2295| m2295_8(String) = Chi : total:m2294_8, partial:m2295_7 -# 2293| r2293_68(glval) = VariableAddress[s] : -# 2293| r2293_69(glval) = FunctionAddress[~String] : -# 2293| v2293_70(void) = Call[~String] : func:r2293_69, this:r2293_68 -# 2293| m2293_71(unknown) = ^CallSideEffect : ~m2295_5 -# 2293| m2293_72(unknown) = Chi : total:m2295_5, partial:m2293_71 -# 2293| v2293_73(void) = ^IndirectReadSideEffect[-1] : &:r2293_68, m2293_67 -# 2293| m2293_74(String) = ^IndirectMayWriteSideEffect[-1] : &:r2293_68 -# 2293| m2293_75(String) = Chi : total:m2293_67, partial:m2293_74 -# 2293| r2293_76(glval>) = VariableAddress[(__begin)] : -# 2293| r2293_77(glval) = FunctionAddress[operator++] : -# 2293| r2293_78(iterator &) = Call[operator++] : func:r2293_77, this:r2293_76 -# 2293| m2293_79(unknown) = ^CallSideEffect : ~m2293_72 -# 2293| m2293_80(unknown) = Chi : total:m2293_72, partial:m2293_79 -# 2293| v2293_81(void) = ^IndirectReadSideEffect[-1] : &:r2293_76, m2293_36 -# 2293| m2293_82(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2293_76 -# 2293| m2293_83(iterator) = Chi : total:m2293_36, partial:m2293_82 -# 2293| r2293_84(glval>) = CopyValue : r2293_78 +# 2293| r2293_76(glval) = VariableAddress[s] : +# 2293| r2293_77(glval) = FunctionAddress[~String] : +# 2293| v2293_78(void) = Call[~String] : func:r2293_77, this:r2293_76 +# 2293| m2293_79(unknown) = ^CallSideEffect : ~m2295_5 +# 2293| m2293_80(unknown) = Chi : total:m2295_5, partial:m2293_79 +# 2293| v2293_81(void) = ^IndirectReadSideEffect[-1] : &:r2293_76, m2293_75 +# 2293| m2293_82(String) = ^IndirectMayWriteSideEffect[-1] : &:r2293_76 +# 2293| m2293_83(String) = Chi : total:m2293_75, partial:m2293_82 +# 2293| r2293_84(glval>) = VariableAddress[(__begin)] : +# 2293| r2293_85(glval) = FunctionAddress[operator++] : +# 2293| r2293_86(iterator &) = Call[operator++] : func:r2293_85, this:r2293_84 +# 2293| m2293_87(unknown) = ^CallSideEffect : ~m2293_80 +# 2293| m2293_88(unknown) = Chi : total:m2293_80, partial:m2293_87 +# 2293| v2293_89(void) = ^IndirectReadSideEffect[-1] : &:r2293_84, m2293_44 +# 2293| m2293_90(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2293_84 +# 2293| m2293_91(iterator) = Chi : total:m2293_44, partial:m2293_90 +# 2293| r2293_92(glval>) = CopyValue : r2293_86 #-----| Goto (back edge) -> Block 4 # 2297| Block 6 @@ -14732,8 +15036,8 @@ ir.cpp: # 2297| r2297_4(glval) = StringConstant["hello"] : # 2297| r2297_5(char *) = Convert : r2297_4 # 2297| v2297_6(void) = Call[String] : func:r2297_3, this:r2297_1, 0:r2297_5 -# 2297| m2297_7(unknown) = ^CallSideEffect : ~m2293_49 -# 2297| m2297_8(unknown) = Chi : total:m2293_49, partial:m2297_7 +# 2297| m2297_7(unknown) = ^CallSideEffect : ~m2293_57 +# 2297| m2297_8(unknown) = Chi : total:m2293_57, partial:m2297_7 # 2297| v2297_9(void) = ^BufferReadSideEffect[0] : &:r2297_5, ~m2287_3 # 2297| m2297_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r2297_1 # 2297| m2297_11(String) = Chi : total:m2297_2, partial:m2297_10 @@ -15255,288 +15559,336 @@ ir.cpp: # 2396| void initialization_with_temp_destructor() # 2396| Block 0 -# 2396| v2396_1(void) = EnterFunction : -# 2396| m2396_2(unknown) = AliasedDefinition : -# 2396| m2396_3(unknown) = InitializeNonLocal : -# 2396| m2396_4(unknown) = Chi : total:m2396_2, partial:m2396_3 -# 2397| r2397_1(glval) = VariableAddress[x] : -# 2397| r2397_2(glval) = VariableAddress[#temp2397:18] : -# 2397| m2397_3(ClassWithDestructor) = Uninitialized[#temp2397:18] : &:r2397_2 -# 2397| r2397_4(glval) = FunctionAddress[ClassWithDestructor] : -# 2397| v2397_5(void) = Call[ClassWithDestructor] : func:r2397_4, this:r2397_2 -# 2397| m2397_6(unknown) = ^CallSideEffect : ~m2396_4 -# 2397| m2397_7(unknown) = Chi : total:m2396_4, partial:m2397_6 -# 2397| m2397_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2397_2 -# 2397| m2397_9(ClassWithDestructor) = Chi : total:m2397_3, partial:m2397_8 -# 2397| r2397_10(glval) = FunctionAddress[get_x] : -# 2397| r2397_11(char) = Call[get_x] : func:r2397_10, this:r2397_2 -# 2397| m2397_12(unknown) = ^CallSideEffect : ~m2397_7 -# 2397| m2397_13(unknown) = Chi : total:m2397_7, partial:m2397_12 -# 2397| v2397_14(void) = ^IndirectReadSideEffect[-1] : &:r2397_2, m2397_9 -# 2397| m2397_15(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2397_2 -# 2397| m2397_16(ClassWithDestructor) = Chi : total:m2397_9, partial:m2397_15 -# 2397| m2397_17(char) = Store[x] : &:r2397_1, r2397_11 -# 2397| r2397_18(glval) = VariableAddress[x] : -# 2397| r2397_19(char) = Load[x] : &:r2397_18, m2397_17 -# 2397| r2397_20(char) = Constant[0] : -# 2397| r2397_21(bool) = CompareNE : r2397_19, r2397_20 -# 2397| r2397_22(bool) = CopyValue : r2397_21 -# 2397| v2397_23(void) = ConditionalBranch : r2397_22 +# 2396| v2396_1(void) = EnterFunction : +# 2396| m2396_2(unknown) = AliasedDefinition : +# 2396| m2396_3(unknown) = InitializeNonLocal : +# 2396| m2396_4(unknown) = Chi : total:m2396_2, partial:m2396_3 +# 2397| r2397_1(glval) = VariableAddress[x] : +# 2397| r2397_2(glval) = VariableAddress[#temp2397:18] : +# 2397| m2397_3(ClassWithDestructor) = Uninitialized[#temp2397:18] : &:r2397_2 +# 2397| r2397_4(glval) = FunctionAddress[ClassWithDestructor] : +# 2397| v2397_5(void) = Call[ClassWithDestructor] : func:r2397_4, this:r2397_2 +# 2397| m2397_6(unknown) = ^CallSideEffect : ~m2396_4 +# 2397| m2397_7(unknown) = Chi : total:m2396_4, partial:m2397_6 +# 2397| m2397_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2397_2 +# 2397| m2397_9(ClassWithDestructor) = Chi : total:m2397_3, partial:m2397_8 +# 2397| r2397_10(glval) = FunctionAddress[get_x] : +# 2397| r2397_11(char) = Call[get_x] : func:r2397_10, this:r2397_2 +# 2397| m2397_12(unknown) = ^CallSideEffect : ~m2397_7 +# 2397| m2397_13(unknown) = Chi : total:m2397_7, partial:m2397_12 +# 2397| v2397_14(void) = ^IndirectReadSideEffect[-1] : &:r2397_2, m2397_9 +# 2397| m2397_15(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2397_2 +# 2397| m2397_16(ClassWithDestructor) = Chi : total:m2397_9, partial:m2397_15 +# 2397| r2397_17(glval) = CopyValue : r2397_2 +# 2397| r2397_18(glval) = FunctionAddress[~ClassWithDestructor] : +# 2397| v2397_19(void) = Call[~ClassWithDestructor] : func:r2397_18, this:r2397_17 +# 2397| m2397_20(unknown) = ^CallSideEffect : ~m2397_13 +# 2397| m2397_21(unknown) = Chi : total:m2397_13, partial:m2397_20 +# 2397| v2397_22(void) = ^IndirectReadSideEffect[-1] : &:r2397_17, m2397_16 +# 2397| m2397_23(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2397_17 +# 2397| m2397_24(ClassWithDestructor) = Chi : total:m2397_16, partial:m2397_23 +# 2397| m2397_25(char) = Store[x] : &:r2397_1, r2397_11 +# 2397| r2397_26(glval) = VariableAddress[x] : +# 2397| r2397_27(char) = Load[x] : &:r2397_26, m2397_25 +# 2397| r2397_28(char) = Constant[0] : +# 2397| r2397_29(bool) = CompareNE : r2397_27, r2397_28 +# 2397| r2397_30(bool) = CopyValue : r2397_29 +# 2397| v2397_31(void) = ConditionalBranch : r2397_30 #-----| False -> Block 2 #-----| True -> Block 1 # 2398| Block 1 # 2398| r2398_1(glval) = VariableAddress[x] : -# 2398| r2398_2(char) = Load[x] : &:r2398_1, m2397_17 +# 2398| r2398_2(char) = Load[x] : &:r2398_1, m2397_25 # 2398| r2398_3(char) = Constant[1] : # 2398| r2398_4(char) = Add : r2398_2, r2398_3 # 2398| m2398_5(char) = Store[x] : &:r2398_1, r2398_4 #-----| Goto -> Block 2 # 2400| Block 2 -# 2400| r2400_1(glval) = VariableAddress[x] : -# 2400| r2400_2(glval) = VariableAddress[#temp2400:18] : -# 2400| m2400_3(ClassWithDestructor) = Uninitialized[#temp2400:18] : &:r2400_2 -# 2400| r2400_4(glval) = FunctionAddress[ClassWithDestructor] : -# 2400| v2400_5(void) = Call[ClassWithDestructor] : func:r2400_4, this:r2400_2 -# 2400| m2400_6(unknown) = ^CallSideEffect : ~m2397_13 -# 2400| m2400_7(unknown) = Chi : total:m2397_13, partial:m2400_6 -# 2400| m2400_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2400_2 -# 2400| m2400_9(ClassWithDestructor) = Chi : total:m2400_3, partial:m2400_8 -# 2400| r2400_10(glval) = FunctionAddress[get_x] : -# 2400| r2400_11(char) = Call[get_x] : func:r2400_10, this:r2400_2 -# 2400| m2400_12(unknown) = ^CallSideEffect : ~m2400_7 -# 2400| m2400_13(unknown) = Chi : total:m2400_7, partial:m2400_12 -# 2400| v2400_14(void) = ^IndirectReadSideEffect[-1] : &:r2400_2, m2400_9 -# 2400| m2400_15(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2400_2 -# 2400| m2400_16(ClassWithDestructor) = Chi : total:m2400_9, partial:m2400_15 -# 2400| m2400_17(char) = Store[x] : &:r2400_1, r2400_11 -# 2400| r2400_18(glval) = VariableAddress[x] : -# 2400| r2400_19(char) = Load[x] : &:r2400_18, m2400_17 -# 2400| r2400_20(char) = Constant[0] : -# 2400| r2400_21(bool) = CompareNE : r2400_19, r2400_20 -# 2400| v2400_22(void) = ConditionalBranch : r2400_21 +# 2400| r2400_1(glval) = VariableAddress[x] : +# 2400| r2400_2(glval) = VariableAddress[#temp2400:18] : +# 2400| m2400_3(ClassWithDestructor) = Uninitialized[#temp2400:18] : &:r2400_2 +# 2400| r2400_4(glval) = FunctionAddress[ClassWithDestructor] : +# 2400| v2400_5(void) = Call[ClassWithDestructor] : func:r2400_4, this:r2400_2 +# 2400| m2400_6(unknown) = ^CallSideEffect : ~m2397_21 +# 2400| m2400_7(unknown) = Chi : total:m2397_21, partial:m2400_6 +# 2400| m2400_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2400_2 +# 2400| m2400_9(ClassWithDestructor) = Chi : total:m2400_3, partial:m2400_8 +# 2400| r2400_10(glval) = FunctionAddress[get_x] : +# 2400| r2400_11(char) = Call[get_x] : func:r2400_10, this:r2400_2 +# 2400| m2400_12(unknown) = ^CallSideEffect : ~m2400_7 +# 2400| m2400_13(unknown) = Chi : total:m2400_7, partial:m2400_12 +# 2400| v2400_14(void) = ^IndirectReadSideEffect[-1] : &:r2400_2, m2400_9 +# 2400| m2400_15(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2400_2 +# 2400| m2400_16(ClassWithDestructor) = Chi : total:m2400_9, partial:m2400_15 +# 2400| r2400_17(glval) = CopyValue : r2400_2 +# 2400| r2400_18(glval) = FunctionAddress[~ClassWithDestructor] : +# 2400| v2400_19(void) = Call[~ClassWithDestructor] : func:r2400_18, this:r2400_17 +# 2400| m2400_20(unknown) = ^CallSideEffect : ~m2400_13 +# 2400| m2400_21(unknown) = Chi : total:m2400_13, partial:m2400_20 +# 2400| v2400_22(void) = ^IndirectReadSideEffect[-1] : &:r2400_17, m2400_16 +# 2400| m2400_23(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2400_17 +# 2400| m2400_24(ClassWithDestructor) = Chi : total:m2400_16, partial:m2400_23 +# 2400| m2400_25(char) = Store[x] : &:r2400_1, r2400_11 +# 2400| r2400_26(glval) = VariableAddress[x] : +# 2400| r2400_27(char) = Load[x] : &:r2400_26, m2400_25 +# 2400| r2400_28(char) = Constant[0] : +# 2400| r2400_29(bool) = CompareNE : r2400_27, r2400_28 +# 2400| v2400_30(void) = ConditionalBranch : r2400_29 #-----| False -> Block 4 #-----| True -> Block 3 # 2401| Block 3 # 2401| r2401_1(glval) = VariableAddress[x] : -# 2401| r2401_2(char) = Load[x] : &:r2401_1, m2400_17 +# 2401| r2401_2(char) = Load[x] : &:r2401_1, m2400_25 # 2401| r2401_3(char) = Constant[1] : # 2401| r2401_4(char) = Add : r2401_2, r2401_3 # 2401| m2401_5(char) = Store[x] : &:r2401_1, r2401_4 #-----| Goto -> Block 4 # 2403| Block 4 -# 2403| r2403_1(glval) = VariableAddress[x] : -# 2403| r2403_2(glval) = VariableAddress[#temp2403:28] : -# 2403| m2403_3(ClassWithDestructor) = Uninitialized[#temp2403:28] : &:r2403_2 -# 2403| r2403_4(glval) = FunctionAddress[ClassWithDestructor] : -# 2403| v2403_5(void) = Call[ClassWithDestructor] : func:r2403_4, this:r2403_2 -# 2403| m2403_6(unknown) = ^CallSideEffect : ~m2400_13 -# 2403| m2403_7(unknown) = Chi : total:m2400_13, partial:m2403_6 -# 2403| m2403_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2403_2 -# 2403| m2403_9(ClassWithDestructor) = Chi : total:m2403_3, partial:m2403_8 -# 2403| r2403_10(glval) = FunctionAddress[get_x] : -# 2403| r2403_11(char) = Call[get_x] : func:r2403_10, this:r2403_2 -# 2403| m2403_12(unknown) = ^CallSideEffect : ~m2403_7 -# 2403| m2403_13(unknown) = Chi : total:m2403_7, partial:m2403_12 -# 2403| v2403_14(void) = ^IndirectReadSideEffect[-1] : &:r2403_2, m2403_9 -# 2403| m2403_15(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2403_2 -# 2403| m2403_16(ClassWithDestructor) = Chi : total:m2403_9, partial:m2403_15 -# 2403| m2403_17(char) = Store[x] : &:r2403_1, r2403_11 -# 2403| r2403_18(bool) = Constant[1] : -# 2403| v2403_19(void) = ConditionalBranch : r2403_18 +# 2403| r2403_1(glval) = VariableAddress[x] : +# 2403| r2403_2(glval) = VariableAddress[#temp2403:28] : +# 2403| m2403_3(ClassWithDestructor) = Uninitialized[#temp2403:28] : &:r2403_2 +# 2403| r2403_4(glval) = FunctionAddress[ClassWithDestructor] : +# 2403| v2403_5(void) = Call[ClassWithDestructor] : func:r2403_4, this:r2403_2 +# 2403| m2403_6(unknown) = ^CallSideEffect : ~m2400_21 +# 2403| m2403_7(unknown) = Chi : total:m2400_21, partial:m2403_6 +# 2403| m2403_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2403_2 +# 2403| m2403_9(ClassWithDestructor) = Chi : total:m2403_3, partial:m2403_8 +# 2403| r2403_10(glval) = FunctionAddress[get_x] : +# 2403| r2403_11(char) = Call[get_x] : func:r2403_10, this:r2403_2 +# 2403| m2403_12(unknown) = ^CallSideEffect : ~m2403_7 +# 2403| m2403_13(unknown) = Chi : total:m2403_7, partial:m2403_12 +# 2403| v2403_14(void) = ^IndirectReadSideEffect[-1] : &:r2403_2, m2403_9 +# 2403| m2403_15(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2403_2 +# 2403| m2403_16(ClassWithDestructor) = Chi : total:m2403_9, partial:m2403_15 +# 2403| r2403_17(glval) = CopyValue : r2403_2 +# 2403| r2403_18(glval) = FunctionAddress[~ClassWithDestructor] : +# 2403| v2403_19(void) = Call[~ClassWithDestructor] : func:r2403_18, this:r2403_17 +# 2403| m2403_20(unknown) = ^CallSideEffect : ~m2403_13 +# 2403| m2403_21(unknown) = Chi : total:m2403_13, partial:m2403_20 +# 2403| v2403_22(void) = ^IndirectReadSideEffect[-1] : &:r2403_17, m2403_16 +# 2403| m2403_23(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2403_17 +# 2403| m2403_24(ClassWithDestructor) = Chi : total:m2403_16, partial:m2403_23 +# 2403| m2403_25(char) = Store[x] : &:r2403_1, r2403_11 +# 2403| r2403_26(bool) = Constant[1] : +# 2403| v2403_27(void) = ConditionalBranch : r2403_26 #-----| False -> Block 13 #-----| True -> Block 5 # 2404| Block 5 -# 2404| r2404_1(glval) = VariableAddress[x] : -# 2404| r2404_2(char) = Load[x] : &:r2404_1, m2403_17 -# 2404| r2404_3(char) = Constant[1] : -# 2404| r2404_4(char) = Add : r2404_2, r2404_3 -# 2404| m2404_5(char) = Store[x] : &:r2404_1, r2404_4 -# 2406| r2406_1(glval) = VariableAddress[x] : -# 2406| r2406_2(glval) = VariableAddress[#temp2406:21] : -# 2406| m2406_3(ClassWithDestructor) = Uninitialized[#temp2406:21] : &:r2406_2 -# 2406| r2406_4(glval) = FunctionAddress[ClassWithDestructor] : -# 2406| v2406_5(void) = Call[ClassWithDestructor] : func:r2406_4, this:r2406_2 -# 2406| m2406_6(unknown) = ^CallSideEffect : ~m2403_13 -# 2406| m2406_7(unknown) = Chi : total:m2403_13, partial:m2406_6 -# 2406| m2406_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2406_2 -# 2406| m2406_9(ClassWithDestructor) = Chi : total:m2406_3, partial:m2406_8 -# 2406| r2406_10(glval) = FunctionAddress[get_x] : -# 2406| r2406_11(char) = Call[get_x] : func:r2406_10, this:r2406_2 -# 2406| m2406_12(unknown) = ^CallSideEffect : ~m2406_7 -# 2406| m2406_13(unknown) = Chi : total:m2406_7, partial:m2406_12 -# 2406| v2406_14(void) = ^IndirectReadSideEffect[-1] : &:r2406_2, m2406_9 -# 2406| m2406_15(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2406_2 -# 2406| m2406_16(ClassWithDestructor) = Chi : total:m2406_9, partial:m2406_15 -# 2406| m2406_17(char) = Store[x] : &:r2406_1, r2406_11 -# 2406| r2406_18(glval) = VariableAddress[x] : -# 2406| r2406_19(char) = Load[x] : &:r2406_18, m2406_17 -# 2406| r2406_20(int) = Convert : r2406_19 -# 2406| r2406_21(int) = CopyValue : r2406_20 -# 2406| v2406_22(void) = Switch : r2406_21 +# 2404| r2404_1(glval) = VariableAddress[x] : +# 2404| r2404_2(char) = Load[x] : &:r2404_1, m2403_25 +# 2404| r2404_3(char) = Constant[1] : +# 2404| r2404_4(char) = Add : r2404_2, r2404_3 +# 2404| m2404_5(char) = Store[x] : &:r2404_1, r2404_4 +# 2406| r2406_1(glval) = VariableAddress[x] : +# 2406| r2406_2(glval) = VariableAddress[#temp2406:21] : +# 2406| m2406_3(ClassWithDestructor) = Uninitialized[#temp2406:21] : &:r2406_2 +# 2406| r2406_4(glval) = FunctionAddress[ClassWithDestructor] : +# 2406| v2406_5(void) = Call[ClassWithDestructor] : func:r2406_4, this:r2406_2 +# 2406| m2406_6(unknown) = ^CallSideEffect : ~m2403_21 +# 2406| m2406_7(unknown) = Chi : total:m2403_21, partial:m2406_6 +# 2406| m2406_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2406_2 +# 2406| m2406_9(ClassWithDestructor) = Chi : total:m2406_3, partial:m2406_8 +# 2406| r2406_10(glval) = FunctionAddress[get_x] : +# 2406| r2406_11(char) = Call[get_x] : func:r2406_10, this:r2406_2 +# 2406| m2406_12(unknown) = ^CallSideEffect : ~m2406_7 +# 2406| m2406_13(unknown) = Chi : total:m2406_7, partial:m2406_12 +# 2406| v2406_14(void) = ^IndirectReadSideEffect[-1] : &:r2406_2, m2406_9 +# 2406| m2406_15(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2406_2 +# 2406| m2406_16(ClassWithDestructor) = Chi : total:m2406_9, partial:m2406_15 +# 2406| r2406_17(glval) = CopyValue : r2406_2 +# 2406| r2406_18(glval) = FunctionAddress[~ClassWithDestructor] : +# 2406| v2406_19(void) = Call[~ClassWithDestructor] : func:r2406_18, this:r2406_17 +# 2406| m2406_20(unknown) = ^CallSideEffect : ~m2406_13 +# 2406| m2406_21(unknown) = Chi : total:m2406_13, partial:m2406_20 +# 2406| v2406_22(void) = ^IndirectReadSideEffect[-1] : &:r2406_17, m2406_16 +# 2406| m2406_23(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2406_17 +# 2406| m2406_24(ClassWithDestructor) = Chi : total:m2406_16, partial:m2406_23 +# 2406| m2406_25(char) = Store[x] : &:r2406_1, r2406_11 +# 2406| r2406_26(glval) = VariableAddress[x] : +# 2406| r2406_27(char) = Load[x] : &:r2406_26, m2406_25 +# 2406| r2406_28(int) = Convert : r2406_27 +# 2406| r2406_29(int) = CopyValue : r2406_28 +# 2406| v2406_30(void) = Switch : r2406_29 #-----| Case[97] -> Block 6 #-----| Default -> Block 7 # 2407| Block 6 # 2407| v2407_1(void) = NoOp : # 2408| r2408_1(glval) = VariableAddress[x] : -# 2408| r2408_2(char) = Load[x] : &:r2408_1, m2406_17 +# 2408| r2408_2(char) = Load[x] : &:r2408_1, m2406_25 # 2408| r2408_3(char) = Constant[1] : # 2408| r2408_4(char) = Add : r2408_2, r2408_3 # 2408| m2408_5(char) = Store[x] : &:r2408_1, r2408_4 #-----| Goto -> Block 7 # 2411| Block 7 -# 2411| r2411_1(glval) = VariableAddress[x] : -# 2411| r2411_2(glval) = VariableAddress[#temp2411:21] : -# 2411| m2411_3(ClassWithDestructor) = Uninitialized[#temp2411:21] : &:r2411_2 -# 2411| r2411_4(glval) = FunctionAddress[ClassWithDestructor] : -# 2411| v2411_5(void) = Call[ClassWithDestructor] : func:r2411_4, this:r2411_2 -# 2411| m2411_6(unknown) = ^CallSideEffect : ~m2406_13 -# 2411| m2411_7(unknown) = Chi : total:m2406_13, partial:m2411_6 -# 2411| m2411_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2411_2 -# 2411| m2411_9(ClassWithDestructor) = Chi : total:m2411_3, partial:m2411_8 -# 2411| r2411_10(glval) = FunctionAddress[get_x] : -# 2411| r2411_11(char) = Call[get_x] : func:r2411_10, this:r2411_2 -# 2411| m2411_12(unknown) = ^CallSideEffect : ~m2411_7 -# 2411| m2411_13(unknown) = Chi : total:m2411_7, partial:m2411_12 -# 2411| v2411_14(void) = ^IndirectReadSideEffect[-1] : &:r2411_2, m2411_9 -# 2411| m2411_15(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2411_2 -# 2411| m2411_16(ClassWithDestructor) = Chi : total:m2411_9, partial:m2411_15 -# 2411| m2411_17(char) = Store[x] : &:r2411_1, r2411_11 -# 2411| r2411_18(glval) = VariableAddress[x] : -# 2411| r2411_19(char) = Load[x] : &:r2411_18, m2411_17 -# 2411| r2411_20(int) = Convert : r2411_19 -# 2411| v2411_21(void) = Switch : r2411_20 +# 2411| r2411_1(glval) = VariableAddress[x] : +# 2411| r2411_2(glval) = VariableAddress[#temp2411:21] : +# 2411| m2411_3(ClassWithDestructor) = Uninitialized[#temp2411:21] : &:r2411_2 +# 2411| r2411_4(glval) = FunctionAddress[ClassWithDestructor] : +# 2411| v2411_5(void) = Call[ClassWithDestructor] : func:r2411_4, this:r2411_2 +# 2411| m2411_6(unknown) = ^CallSideEffect : ~m2406_21 +# 2411| m2411_7(unknown) = Chi : total:m2406_21, partial:m2411_6 +# 2411| m2411_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2411_2 +# 2411| m2411_9(ClassWithDestructor) = Chi : total:m2411_3, partial:m2411_8 +# 2411| r2411_10(glval) = FunctionAddress[get_x] : +# 2411| r2411_11(char) = Call[get_x] : func:r2411_10, this:r2411_2 +# 2411| m2411_12(unknown) = ^CallSideEffect : ~m2411_7 +# 2411| m2411_13(unknown) = Chi : total:m2411_7, partial:m2411_12 +# 2411| v2411_14(void) = ^IndirectReadSideEffect[-1] : &:r2411_2, m2411_9 +# 2411| m2411_15(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2411_2 +# 2411| m2411_16(ClassWithDestructor) = Chi : total:m2411_9, partial:m2411_15 +# 2411| r2411_17(glval) = CopyValue : r2411_2 +# 2411| r2411_18(glval) = FunctionAddress[~ClassWithDestructor] : +# 2411| v2411_19(void) = Call[~ClassWithDestructor] : func:r2411_18, this:r2411_17 +# 2411| m2411_20(unknown) = ^CallSideEffect : ~m2411_13 +# 2411| m2411_21(unknown) = Chi : total:m2411_13, partial:m2411_20 +# 2411| v2411_22(void) = ^IndirectReadSideEffect[-1] : &:r2411_17, m2411_16 +# 2411| m2411_23(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2411_17 +# 2411| m2411_24(ClassWithDestructor) = Chi : total:m2411_16, partial:m2411_23 +# 2411| m2411_25(char) = Store[x] : &:r2411_1, r2411_11 +# 2411| r2411_26(glval) = VariableAddress[x] : +# 2411| r2411_27(char) = Load[x] : &:r2411_26, m2411_25 +# 2411| r2411_28(int) = Convert : r2411_27 +# 2411| v2411_29(void) = Switch : r2411_28 #-----| Case[97] -> Block 8 #-----| Default -> Block 9 # 2412| Block 8 # 2412| v2412_1(void) = NoOp : # 2413| r2413_1(glval) = VariableAddress[x] : -# 2413| r2413_2(char) = Load[x] : &:r2413_1, m2411_17 +# 2413| r2413_2(char) = Load[x] : &:r2413_1, m2411_25 # 2413| r2413_3(char) = Constant[1] : # 2413| r2413_4(char) = Add : r2413_2, r2413_3 # 2413| m2413_5(char) = Store[x] : &:r2413_1, r2413_4 #-----| Goto -> Block 9 # 2416| Block 9 -# 2416| r2416_1(glval) = VariableAddress[x] : -# 2416| r2416_2(glval) = VariableAddress[#temp2416:18] : -# 2416| m2416_3(ClassWithDestructor) = Uninitialized[#temp2416:18] : &:r2416_2 -# 2416| r2416_4(glval) = FunctionAddress[ClassWithDestructor] : -# 2416| v2416_5(void) = Call[ClassWithDestructor] : func:r2416_4, this:r2416_2 -# 2416| m2416_6(unknown) = ^CallSideEffect : ~m2411_13 -# 2416| m2416_7(unknown) = Chi : total:m2411_13, partial:m2416_6 -# 2416| m2416_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2416_2 -# 2416| m2416_9(ClassWithDestructor) = Chi : total:m2416_3, partial:m2416_8 -# 2416| r2416_10(glval) = FunctionAddress[get_x] : -# 2416| r2416_11(char) = Call[get_x] : func:r2416_10, this:r2416_2 -# 2416| m2416_12(unknown) = ^CallSideEffect : ~m2416_7 -# 2416| m2416_13(unknown) = Chi : total:m2416_7, partial:m2416_12 -# 2416| v2416_14(void) = ^IndirectReadSideEffect[-1] : &:r2416_2, m2416_9 -# 2416| m2416_15(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2416_2 -# 2416| m2416_16(ClassWithDestructor) = Chi : total:m2416_9, partial:m2416_15 -# 2416| m2416_17(char) = Store[x] : &:r2416_1, r2416_11 -# 2416| r2416_18(glval &&>) = VariableAddress[(__range)] : -# 2416| r2416_19(glval>) = VariableAddress[#temp2416:58] : -# 2416| m2416_20(vector) = Uninitialized[#temp2416:58] : &:r2416_19 -# 2416| r2416_21(glval) = FunctionAddress[vector] : -# 2416| r2416_22(glval) = VariableAddress[x] : -# 2416| r2416_23(char) = Load[x] : &:r2416_22, m2416_17 -# 2416| v2416_24(void) = Call[vector] : func:r2416_21, this:r2416_19, 0:r2416_23 -# 2416| m2416_25(unknown) = ^CallSideEffect : ~m2416_13 -# 2416| m2416_26(unknown) = Chi : total:m2416_13, partial:m2416_25 -# 2416| m2416_27(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2416_19 -# 2416| m2416_28(vector) = Chi : total:m2416_20, partial:m2416_27 -# 2416| r2416_29(vector &) = CopyValue : r2416_19 -# 2416| m2416_30(vector &&) = Store[(__range)] : &:r2416_18, r2416_29 -# 2416| r2416_31(glval>) = VariableAddress[(__begin)] : -# 2416| r2416_32(glval &&>) = VariableAddress[(__range)] : -# 2416| r2416_33(vector &&) = Load[(__range)] : &:r2416_32, m2416_30 -#-----| r0_1(glval>) = CopyValue : r2416_33 -#-----| r0_2(glval>) = Convert : r0_1 -# 2416| r2416_34(glval) = FunctionAddress[begin] : -# 2416| r2416_35(iterator) = Call[begin] : func:r2416_34, this:r0_2 -#-----| v0_3(void) = ^IndirectReadSideEffect[-1] : &:r0_2, m2416_28 -# 2416| m2416_36(iterator) = Store[(__begin)] : &:r2416_31, r2416_35 -# 2416| r2416_37(glval>) = VariableAddress[(__end)] : -# 2416| r2416_38(glval &&>) = VariableAddress[(__range)] : -# 2416| r2416_39(vector &&) = Load[(__range)] : &:r2416_38, m2416_30 -#-----| r0_4(glval>) = CopyValue : r2416_39 -#-----| r0_5(glval>) = Convert : r0_4 -# 2416| r2416_40(glval) = FunctionAddress[end] : -# 2416| r2416_41(iterator) = Call[end] : func:r2416_40, this:r0_5 -#-----| v0_6(void) = ^IndirectReadSideEffect[-1] : &:r0_5, m2416_28 -# 2416| m2416_42(iterator) = Store[(__end)] : &:r2416_37, r2416_41 +# 2416| r2416_1(glval) = VariableAddress[x] : +# 2416| r2416_2(glval) = VariableAddress[#temp2416:18] : +# 2416| m2416_3(ClassWithDestructor) = Uninitialized[#temp2416:18] : &:r2416_2 +# 2416| r2416_4(glval) = FunctionAddress[ClassWithDestructor] : +# 2416| v2416_5(void) = Call[ClassWithDestructor] : func:r2416_4, this:r2416_2 +# 2416| m2416_6(unknown) = ^CallSideEffect : ~m2411_21 +# 2416| m2416_7(unknown) = Chi : total:m2411_21, partial:m2416_6 +# 2416| m2416_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2416_2 +# 2416| m2416_9(ClassWithDestructor) = Chi : total:m2416_3, partial:m2416_8 +# 2416| r2416_10(glval) = FunctionAddress[get_x] : +# 2416| r2416_11(char) = Call[get_x] : func:r2416_10, this:r2416_2 +# 2416| m2416_12(unknown) = ^CallSideEffect : ~m2416_7 +# 2416| m2416_13(unknown) = Chi : total:m2416_7, partial:m2416_12 +# 2416| v2416_14(void) = ^IndirectReadSideEffect[-1] : &:r2416_2, m2416_9 +# 2416| m2416_15(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2416_2 +# 2416| m2416_16(ClassWithDestructor) = Chi : total:m2416_9, partial:m2416_15 +# 2416| r2416_17(glval) = CopyValue : r2416_2 +# 2416| r2416_18(glval) = FunctionAddress[~ClassWithDestructor] : +# 2416| v2416_19(void) = Call[~ClassWithDestructor] : func:r2416_18, this:r2416_17 +# 2416| m2416_20(unknown) = ^CallSideEffect : ~m2416_13 +# 2416| m2416_21(unknown) = Chi : total:m2416_13, partial:m2416_20 +# 2416| v2416_22(void) = ^IndirectReadSideEffect[-1] : &:r2416_17, m2416_16 +# 2416| m2416_23(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2416_17 +# 2416| m2416_24(ClassWithDestructor) = Chi : total:m2416_16, partial:m2416_23 +# 2416| m2416_25(char) = Store[x] : &:r2416_1, r2416_11 +# 2416| r2416_26(glval &&>) = VariableAddress[(__range)] : +# 2416| r2416_27(glval>) = VariableAddress[#temp2416:58] : +# 2416| m2416_28(vector) = Uninitialized[#temp2416:58] : &:r2416_27 +# 2416| r2416_29(glval) = FunctionAddress[vector] : +# 2416| r2416_30(glval) = VariableAddress[x] : +# 2416| r2416_31(char) = Load[x] : &:r2416_30, m2416_25 +# 2416| v2416_32(void) = Call[vector] : func:r2416_29, this:r2416_27, 0:r2416_31 +# 2416| m2416_33(unknown) = ^CallSideEffect : ~m2416_21 +# 2416| m2416_34(unknown) = Chi : total:m2416_21, partial:m2416_33 +# 2416| m2416_35(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2416_27 +# 2416| m2416_36(vector) = Chi : total:m2416_28, partial:m2416_35 +# 2416| r2416_37(vector &) = CopyValue : r2416_27 +# 2416| m2416_38(vector &&) = Store[(__range)] : &:r2416_26, r2416_37 +# 2416| r2416_39(glval>) = VariableAddress[(__begin)] : +# 2416| r2416_40(glval &&>) = VariableAddress[(__range)] : +# 2416| r2416_41(vector &&) = Load[(__range)] : &:r2416_40, m2416_38 +#-----| r0_1(glval>) = CopyValue : r2416_41 +#-----| r0_2(glval>) = Convert : r0_1 +# 2416| r2416_42(glval) = FunctionAddress[begin] : +# 2416| r2416_43(iterator) = Call[begin] : func:r2416_42, this:r0_2 +#-----| v0_3(void) = ^IndirectReadSideEffect[-1] : &:r0_2, m2416_36 +# 2416| m2416_44(iterator) = Store[(__begin)] : &:r2416_39, r2416_43 +# 2416| r2416_45(glval>) = VariableAddress[(__end)] : +# 2416| r2416_46(glval &&>) = VariableAddress[(__range)] : +# 2416| r2416_47(vector &&) = Load[(__range)] : &:r2416_46, m2416_38 +#-----| r0_4(glval>) = CopyValue : r2416_47 +#-----| r0_5(glval>) = Convert : r0_4 +# 2416| r2416_48(glval) = FunctionAddress[end] : +# 2416| r2416_49(iterator) = Call[end] : func:r2416_48, this:r0_5 +#-----| v0_6(void) = ^IndirectReadSideEffect[-1] : &:r0_5, m2416_36 +# 2416| m2416_50(iterator) = Store[(__end)] : &:r2416_45, r2416_49 #-----| Goto -> Block 10 # 2416| Block 10 -# 2416| m2416_43(iterator) = Phi : from 9:m2416_36, from 11:m2416_73 -# 2416| m2416_44(unknown) = Phi : from 9:~m2416_26, from 11:~m2416_70 -# 2416| r2416_45(glval>) = VariableAddress[(__begin)] : -#-----| r0_7(glval>) = Convert : r2416_45 -# 2416| r2416_46(glval) = FunctionAddress[operator!=] : +# 2416| m2416_51(iterator) = Phi : from 9:m2416_44, from 11:m2416_81 +# 2416| m2416_52(unknown) = Phi : from 9:~m2416_34, from 11:~m2416_78 +# 2416| r2416_53(glval>) = VariableAddress[(__begin)] : +#-----| r0_7(glval>) = Convert : r2416_53 +# 2416| r2416_54(glval) = FunctionAddress[operator!=] : #-----| r0_8(glval>) = VariableAddress[#temp0:0] : #-----| m0_9(iterator) = Uninitialized[#temp0:0] : &:r0_8 -# 2416| r2416_47(glval) = FunctionAddress[iterator] : -# 2416| r2416_48(glval>) = VariableAddress[(__end)] : -#-----| r0_10(glval>) = Convert : r2416_48 +# 2416| r2416_55(glval) = FunctionAddress[iterator] : +# 2416| r2416_56(glval>) = VariableAddress[(__end)] : +#-----| r0_10(glval>) = Convert : r2416_56 #-----| r0_11(iterator &) = CopyValue : r0_10 -# 2416| v2416_49(void) = Call[iterator] : func:r2416_47, this:r0_8, 0:r0_11 -# 2416| m2416_50(unknown) = ^CallSideEffect : ~m2416_44 -# 2416| m2416_51(unknown) = Chi : total:m2416_44, partial:m2416_50 -#-----| v0_12(void) = ^BufferReadSideEffect[0] : &:r0_11, ~m2416_42 -# 2416| m2416_52(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_8 -# 2416| m2416_53(iterator) = Chi : total:m0_9, partial:m2416_52 -#-----| r0_13(iterator) = Load[#temp0:0] : &:r0_8, m2416_53 -# 2416| r2416_54(bool) = Call[operator!=] : func:r2416_46, this:r0_7, 0:r0_13 -# 2416| m2416_55(unknown) = ^CallSideEffect : ~m2416_51 -# 2416| m2416_56(unknown) = Chi : total:m2416_51, partial:m2416_55 -#-----| v0_14(void) = ^IndirectReadSideEffect[-1] : &:r0_7, m2416_43 -# 2416| v2416_57(void) = ConditionalBranch : r2416_54 +# 2416| v2416_57(void) = Call[iterator] : func:r2416_55, this:r0_8, 0:r0_11 +# 2416| m2416_58(unknown) = ^CallSideEffect : ~m2416_52 +# 2416| m2416_59(unknown) = Chi : total:m2416_52, partial:m2416_58 +#-----| v0_12(void) = ^BufferReadSideEffect[0] : &:r0_11, ~m2416_50 +# 2416| m2416_60(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_8 +# 2416| m2416_61(iterator) = Chi : total:m0_9, partial:m2416_60 +#-----| r0_13(iterator) = Load[#temp0:0] : &:r0_8, m2416_61 +# 2416| r2416_62(bool) = Call[operator!=] : func:r2416_54, this:r0_7, 0:r0_13 +# 2416| m2416_63(unknown) = ^CallSideEffect : ~m2416_59 +# 2416| m2416_64(unknown) = Chi : total:m2416_59, partial:m2416_63 +#-----| v0_14(void) = ^IndirectReadSideEffect[-1] : &:r0_7, m2416_51 +# 2416| v2416_65(void) = ConditionalBranch : r2416_62 #-----| False -> Block 12 #-----| True -> Block 11 # 2416| Block 11 -# 2416| r2416_58(glval) = VariableAddress[y] : -# 2416| r2416_59(glval>) = VariableAddress[(__begin)] : -#-----| r0_15(glval>) = Convert : r2416_59 -# 2416| r2416_60(glval) = FunctionAddress[operator*] : -# 2416| r2416_61(char &) = Call[operator*] : func:r2416_60, this:r0_15 -# 2416| m2416_62(unknown) = ^CallSideEffect : ~m2416_56 -# 2416| m2416_63(unknown) = Chi : total:m2416_56, partial:m2416_62 -#-----| v0_16(void) = ^IndirectReadSideEffect[-1] : &:r0_15, m2416_43 -# 2416| r2416_64(char) = Load[?] : &:r2416_61, ~m2416_63 -# 2416| m2416_65(char) = Store[y] : &:r2416_58, r2416_64 +# 2416| r2416_66(glval) = VariableAddress[y] : +# 2416| r2416_67(glval>) = VariableAddress[(__begin)] : +#-----| r0_15(glval>) = Convert : r2416_67 +# 2416| r2416_68(glval) = FunctionAddress[operator*] : +# 2416| r2416_69(char &) = Call[operator*] : func:r2416_68, this:r0_15 +# 2416| m2416_70(unknown) = ^CallSideEffect : ~m2416_64 +# 2416| m2416_71(unknown) = Chi : total:m2416_64, partial:m2416_70 +#-----| v0_16(void) = ^IndirectReadSideEffect[-1] : &:r0_15, m2416_51 +# 2416| r2416_72(char) = Load[?] : &:r2416_69, ~m2416_71 +# 2416| m2416_73(char) = Store[y] : &:r2416_66, r2416_72 # 2417| r2417_1(glval) = VariableAddress[x] : -# 2417| r2417_2(char) = Load[x] : &:r2417_1, m2416_17 +# 2417| r2417_2(char) = Load[x] : &:r2417_1, m2416_25 # 2417| r2417_3(int) = Convert : r2417_2 # 2417| r2417_4(glval) = VariableAddress[y] : -# 2417| r2417_5(char) = Load[y] : &:r2417_4, m2416_65 +# 2417| r2417_5(char) = Load[y] : &:r2417_4, m2416_73 # 2417| r2417_6(int) = Convert : r2417_5 # 2417| r2417_7(int) = Add : r2417_6, r2417_3 # 2417| r2417_8(char) = Convert : r2417_7 # 2417| m2417_9(char) = Store[y] : &:r2417_4, r2417_8 -# 2416| r2416_66(glval>) = VariableAddress[(__begin)] : -# 2416| r2416_67(glval) = FunctionAddress[operator++] : -# 2416| r2416_68(iterator &) = Call[operator++] : func:r2416_67, this:r2416_66 -# 2416| m2416_69(unknown) = ^CallSideEffect : ~m2416_63 -# 2416| m2416_70(unknown) = Chi : total:m2416_63, partial:m2416_69 -# 2416| v2416_71(void) = ^IndirectReadSideEffect[-1] : &:r2416_66, m2416_43 -# 2416| m2416_72(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2416_66 -# 2416| m2416_73(iterator) = Chi : total:m2416_43, partial:m2416_72 -# 2416| r2416_74(glval>) = CopyValue : r2416_68 +# 2416| r2416_74(glval>) = VariableAddress[(__begin)] : +# 2416| r2416_75(glval) = FunctionAddress[operator++] : +# 2416| r2416_76(iterator &) = Call[operator++] : func:r2416_75, this:r2416_74 +# 2416| m2416_77(unknown) = ^CallSideEffect : ~m2416_71 +# 2416| m2416_78(unknown) = Chi : total:m2416_71, partial:m2416_77 +# 2416| v2416_79(void) = ^IndirectReadSideEffect[-1] : &:r2416_74, m2416_51 +# 2416| m2416_80(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2416_74 +# 2416| m2416_81(iterator) = Chi : total:m2416_51, partial:m2416_80 +# 2416| r2416_82(glval>) = CopyValue : r2416_76 #-----| Goto (back edge) -> Block 10 # 2418| Block 12 # 2418| v2418_1(void) = NoOp : # 2396| v2396_5(void) = ReturnVoid : -# 2396| v2396_6(void) = AliasedUse : ~m2416_56 +# 2396| v2396_6(void) = AliasedUse : ~m2416_64 # 2396| v2396_7(void) = ExitFunction : # 2396| Block 13 @@ -15597,234 +15949,269 @@ perf-regression.cpp: smart_ptr.cpp: # 10| void call_unique_ptr_arg(int*) # 10| Block 0 -# 10| v10_1(void) = EnterFunction : -# 10| m10_2(unknown) = AliasedDefinition : -# 10| m10_3(unknown) = InitializeNonLocal : -# 10| m10_4(unknown) = Chi : total:m10_2, partial:m10_3 -# 10| r10_5(glval) = VariableAddress[p] : -# 10| m10_6(int *) = InitializeParameter[p] : &:r10_5 -# 10| r10_7(int *) = Load[p] : &:r10_5, m10_6 -# 10| m10_8(unknown) = InitializeIndirection[p] : &:r10_7 -# 11| r11_1(glval>>) = VariableAddress[up] : -# 11| m11_2(unique_ptr>) = Uninitialized[up] : &:r11_1 -# 11| r11_3(glval) = FunctionAddress[unique_ptr] : -# 11| r11_4(glval) = VariableAddress[p] : -# 11| r11_5(int *) = Load[p] : &:r11_4, m10_6 -# 11| v11_6(void) = Call[unique_ptr] : func:r11_3, this:r11_1, 0:r11_5 -# 11| m11_7(unknown) = ^CallSideEffect : ~m10_4 -# 11| m11_8(unknown) = Chi : total:m10_4, partial:m11_7 -# 11| m11_9(unique_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r11_1 -# 12| r12_1(glval) = FunctionAddress[unique_ptr_arg] : -# 12| r12_2(glval>>) = VariableAddress[#temp12:20] : -# 12| r12_3(glval) = FunctionAddress[move] : -# 12| r12_4(glval>>) = VariableAddress[up] : -# 12| r12_5(unique_ptr> &) = CopyValue : r12_4 -# 12| r12_6(unique_ptr> &&) = Call[move] : func:r12_3, 0:r12_5 -# 12| r12_7(unique_ptr>) = Load[?] : &:r12_6, m11_9 -# 12| m12_8(unique_ptr>) = Store[#temp12:20] : &:r12_2, r12_7 -# 12| r12_9(unique_ptr>) = Load[#temp12:20] : &:r12_2, m12_8 -# 12| v12_10(void) = Call[unique_ptr_arg] : func:r12_1, 0:r12_9 -# 12| m12_11(unknown) = ^CallSideEffect : ~m11_8 -# 12| m12_12(unknown) = Chi : total:m11_8, partial:m12_11 -# 12| v12_13(void) = ^BufferReadSideEffect[0] : &:r12_9, ~m10_8 -# 12| m12_14(unknown) = ^BufferMayWriteSideEffect[0] : &:r12_9 -# 12| m12_15(unknown) = Chi : total:m10_8, partial:m12_14 -# 13| v13_1(void) = NoOp : -# 13| r13_2(glval>>) = VariableAddress[up] : -# 13| r13_3(glval) = FunctionAddress[~unique_ptr] : -# 13| v13_4(void) = Call[~unique_ptr] : func:r13_3, this:r13_2 -# 13| v13_5(void) = ^IndirectReadSideEffect[-1] : &:r13_2, m11_9 -# 13| m13_6(unique_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r13_2 -# 10| v10_9(void) = ReturnIndirection[p] : &:r10_7, m12_15 -# 10| v10_10(void) = ReturnVoid : -# 10| v10_11(void) = AliasedUse : ~m12_12 -# 10| v10_12(void) = ExitFunction : +# 10| v10_1(void) = EnterFunction : +# 10| m10_2(unknown) = AliasedDefinition : +# 10| m10_3(unknown) = InitializeNonLocal : +# 10| m10_4(unknown) = Chi : total:m10_2, partial:m10_3 +# 10| r10_5(glval) = VariableAddress[p] : +# 10| m10_6(int *) = InitializeParameter[p] : &:r10_5 +# 10| r10_7(int *) = Load[p] : &:r10_5, m10_6 +# 10| m10_8(unknown) = InitializeIndirection[p] : &:r10_7 +# 11| r11_1(glval>>) = VariableAddress[up] : +# 11| m11_2(unique_ptr>) = Uninitialized[up] : &:r11_1 +# 11| r11_3(glval) = FunctionAddress[unique_ptr] : +# 11| r11_4(glval) = VariableAddress[p] : +# 11| r11_5(int *) = Load[p] : &:r11_4, m10_6 +# 11| v11_6(void) = Call[unique_ptr] : func:r11_3, this:r11_1, 0:r11_5 +# 11| m11_7(unknown) = ^CallSideEffect : ~m10_4 +# 11| m11_8(unknown) = Chi : total:m10_4, partial:m11_7 +# 11| m11_9(unique_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r11_1 +# 12| r12_1(glval) = FunctionAddress[unique_ptr_arg] : +# 12| r12_2(glval>>) = VariableAddress[#temp12:20] : +# 12| r12_3(glval) = FunctionAddress[move] : +# 12| r12_4(glval>>) = VariableAddress[up] : +# 12| r12_5(unique_ptr> &) = CopyValue : r12_4 +# 12| r12_6(unique_ptr> &&) = Call[move] : func:r12_3, 0:r12_5 +# 12| r12_7(unique_ptr>) = Load[?] : &:r12_6, m11_9 +# 12| m12_8(unique_ptr>) = Store[#temp12:20] : &:r12_2, r12_7 +# 12| r12_9(unique_ptr>) = Load[#temp12:20] : &:r12_2, m12_8 +# 12| v12_10(void) = Call[unique_ptr_arg] : func:r12_1, 0:r12_9 +# 12| m12_11(unknown) = ^CallSideEffect : ~m11_8 +# 12| m12_12(unknown) = Chi : total:m11_8, partial:m12_11 +# 12| v12_13(void) = ^BufferReadSideEffect[0] : &:r12_9, ~m10_8 +# 12| m12_14(unknown) = ^BufferMayWriteSideEffect[0] : &:r12_9 +# 12| m12_15(unknown) = Chi : total:m10_8, partial:m12_14 +# 12| r12_16(glval>>) = CopyValue : r12_2 +# 12| r12_17(glval) = FunctionAddress[~unique_ptr] : +# 12| v12_18(void) = Call[~unique_ptr] : func:r12_17, this:r12_16 +# 12| v12_19(void) = ^IndirectReadSideEffect[-1] : &:r12_16, m12_8 +# 12| m12_20(unique_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r12_16 +# 13| v13_1(void) = NoOp : +# 13| r13_2(glval>>) = VariableAddress[up] : +# 13| r13_3(glval) = FunctionAddress[~unique_ptr] : +# 13| v13_4(void) = Call[~unique_ptr] : func:r13_3, this:r13_2 +# 13| v13_5(void) = ^IndirectReadSideEffect[-1] : &:r13_2, m11_9 +# 13| m13_6(unique_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r13_2 +# 10| v10_9(void) = ReturnIndirection[p] : &:r10_7, m12_15 +# 10| v10_10(void) = ReturnVoid : +# 10| v10_11(void) = AliasedUse : ~m12_12 +# 10| v10_12(void) = ExitFunction : # 17| void call_shared_ptr_arg(float*) # 17| Block 0 -# 17| v17_1(void) = EnterFunction : -# 17| m17_2(unknown) = AliasedDefinition : -# 17| m17_3(unknown) = InitializeNonLocal : -# 17| m17_4(unknown) = Chi : total:m17_2, partial:m17_3 -# 17| r17_5(glval) = VariableAddress[p] : -# 17| m17_6(float *) = InitializeParameter[p] : &:r17_5 -# 17| r17_7(float *) = Load[p] : &:r17_5, m17_6 -# 17| m17_8(unknown) = InitializeIndirection[p] : &:r17_7 -# 18| r18_1(glval>) = VariableAddress[sp] : -# 18| m18_2(shared_ptr) = Uninitialized[sp] : &:r18_1 -# 18| r18_3(glval) = FunctionAddress[shared_ptr] : -# 18| r18_4(glval) = VariableAddress[p] : -# 18| r18_5(float *) = Load[p] : &:r18_4, m17_6 -# 18| v18_6(void) = Call[shared_ptr] : func:r18_3, this:r18_1, 0:r18_5 -# 18| m18_7(unknown) = ^CallSideEffect : ~m17_4 -# 18| m18_8(unknown) = Chi : total:m17_4, partial:m18_7 -# 18| m18_9(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r18_1 -# 19| r19_1(glval) = FunctionAddress[shared_ptr_arg] : -# 19| r19_2(glval>) = VariableAddress[#temp19:20] : -# 19| m19_3(shared_ptr) = Uninitialized[#temp19:20] : &:r19_2 -# 19| r19_4(glval) = FunctionAddress[shared_ptr] : -# 19| r19_5(glval>) = VariableAddress[sp] : -# 19| r19_6(glval>) = Convert : r19_5 -# 19| r19_7(shared_ptr &) = CopyValue : r19_6 -# 19| v19_8(void) = Call[shared_ptr] : func:r19_4, this:r19_2, 0:r19_7 -# 19| m19_9(unknown) = ^CallSideEffect : ~m18_8 -# 19| m19_10(unknown) = Chi : total:m18_8, partial:m19_9 -# 19| v19_11(void) = ^IndirectReadSideEffect[0] : &:r19_7, m18_9 -# 19| m19_12(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r19_2 -# 19| r19_13(shared_ptr) = Load[#temp19:20] : &:r19_2, m19_12 -# 19| v19_14(void) = Call[shared_ptr_arg] : func:r19_1, 0:r19_13 -# 19| m19_15(unknown) = ^CallSideEffect : ~m19_10 -# 19| m19_16(unknown) = Chi : total:m19_10, partial:m19_15 -# 19| v19_17(void) = ^BufferReadSideEffect[0] : &:r19_13, ~m17_8 -# 19| m19_18(unknown) = ^BufferMayWriteSideEffect[0] : &:r19_13 -# 19| m19_19(unknown) = Chi : total:m17_8, partial:m19_18 -# 20| v20_1(void) = NoOp : -# 20| r20_2(glval>) = VariableAddress[sp] : -# 20| r20_3(glval) = FunctionAddress[~shared_ptr] : -# 20| v20_4(void) = Call[~shared_ptr] : func:r20_3, this:r20_2 -# 20| v20_5(void) = ^IndirectReadSideEffect[-1] : &:r20_2, m18_9 -# 20| m20_6(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r20_2 -# 17| v17_9(void) = ReturnIndirection[p] : &:r17_7, m19_19 -# 17| v17_10(void) = ReturnVoid : -# 17| v17_11(void) = AliasedUse : ~m19_16 -# 17| v17_12(void) = ExitFunction : +# 17| v17_1(void) = EnterFunction : +# 17| m17_2(unknown) = AliasedDefinition : +# 17| m17_3(unknown) = InitializeNonLocal : +# 17| m17_4(unknown) = Chi : total:m17_2, partial:m17_3 +# 17| r17_5(glval) = VariableAddress[p] : +# 17| m17_6(float *) = InitializeParameter[p] : &:r17_5 +# 17| r17_7(float *) = Load[p] : &:r17_5, m17_6 +# 17| m17_8(unknown) = InitializeIndirection[p] : &:r17_7 +# 18| r18_1(glval>) = VariableAddress[sp] : +# 18| m18_2(shared_ptr) = Uninitialized[sp] : &:r18_1 +# 18| r18_3(glval) = FunctionAddress[shared_ptr] : +# 18| r18_4(glval) = VariableAddress[p] : +# 18| r18_5(float *) = Load[p] : &:r18_4, m17_6 +# 18| v18_6(void) = Call[shared_ptr] : func:r18_3, this:r18_1, 0:r18_5 +# 18| m18_7(unknown) = ^CallSideEffect : ~m17_4 +# 18| m18_8(unknown) = Chi : total:m17_4, partial:m18_7 +# 18| m18_9(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r18_1 +# 19| r19_1(glval) = FunctionAddress[shared_ptr_arg] : +# 19| r19_2(glval>) = VariableAddress[#temp19:20] : +# 19| m19_3(shared_ptr) = Uninitialized[#temp19:20] : &:r19_2 +# 19| r19_4(glval) = FunctionAddress[shared_ptr] : +# 19| r19_5(glval>) = VariableAddress[sp] : +# 19| r19_6(glval>) = Convert : r19_5 +# 19| r19_7(shared_ptr &) = CopyValue : r19_6 +# 19| v19_8(void) = Call[shared_ptr] : func:r19_4, this:r19_2, 0:r19_7 +# 19| m19_9(unknown) = ^CallSideEffect : ~m18_8 +# 19| m19_10(unknown) = Chi : total:m18_8, partial:m19_9 +# 19| v19_11(void) = ^IndirectReadSideEffect[0] : &:r19_7, m18_9 +# 19| m19_12(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r19_2 +# 19| r19_13(shared_ptr) = Load[#temp19:20] : &:r19_2, m19_12 +# 19| v19_14(void) = Call[shared_ptr_arg] : func:r19_1, 0:r19_13 +# 19| m19_15(unknown) = ^CallSideEffect : ~m19_10 +# 19| m19_16(unknown) = Chi : total:m19_10, partial:m19_15 +# 19| v19_17(void) = ^BufferReadSideEffect[0] : &:r19_13, ~m17_8 +# 19| m19_18(unknown) = ^BufferMayWriteSideEffect[0] : &:r19_13 +# 19| m19_19(unknown) = Chi : total:m17_8, partial:m19_18 +# 19| r19_20(glval>) = CopyValue : r19_2 +# 19| r19_21(glval) = FunctionAddress[~shared_ptr] : +# 19| v19_22(void) = Call[~shared_ptr] : func:r19_21, this:r19_20 +# 19| v19_23(void) = ^IndirectReadSideEffect[-1] : &:r19_20, m19_12 +# 19| m19_24(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r19_20 +# 20| v20_1(void) = NoOp : +# 20| r20_2(glval>) = VariableAddress[sp] : +# 20| r20_3(glval) = FunctionAddress[~shared_ptr] : +# 20| v20_4(void) = Call[~shared_ptr] : func:r20_3, this:r20_2 +# 20| v20_5(void) = ^IndirectReadSideEffect[-1] : &:r20_2, m18_9 +# 20| m20_6(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r20_2 +# 17| v17_9(void) = ReturnIndirection[p] : &:r17_7, m19_19 +# 17| v17_10(void) = ReturnVoid : +# 17| v17_11(void) = AliasedUse : ~m19_16 +# 17| v17_12(void) = ExitFunction : # 28| void call_shared_ptr_consts() # 28| Block 0 -# 28| v28_1(void) = EnterFunction : -# 28| m28_2(unknown) = AliasedDefinition : -# 28| m28_3(unknown) = InitializeNonLocal : -# 28| m28_4(unknown) = Chi : total:m28_2, partial:m28_3 -# 29| r29_1(glval>) = VariableAddress[sp_const_int] : -# 29| m29_2(shared_ptr) = Uninitialized[sp_const_int] : &:r29_1 -# 31| r31_1(glval) = FunctionAddress[shared_ptr_const_int] : -# 31| r31_2(glval>) = VariableAddress[#temp31:26] : -# 31| m31_3(shared_ptr) = Uninitialized[#temp31:26] : &:r31_2 -# 31| r31_4(glval) = FunctionAddress[shared_ptr] : -# 31| r31_5(glval>) = VariableAddress[sp_const_int] : -# 31| r31_6(glval>) = Convert : r31_5 -# 31| r31_7(shared_ptr &) = CopyValue : r31_6 -# 31| v31_8(void) = Call[shared_ptr] : func:r31_4, this:r31_2, 0:r31_7 -# 31| m31_9(unknown) = ^CallSideEffect : ~m28_4 -# 31| m31_10(unknown) = Chi : total:m28_4, partial:m31_9 -# 31| v31_11(void) = ^IndirectReadSideEffect[0] : &:r31_7, m29_2 -# 31| m31_12(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r31_2 -# 31| r31_13(shared_ptr) = Load[#temp31:26] : &:r31_2, m31_12 -# 31| v31_14(void) = Call[shared_ptr_const_int] : func:r31_1, 0:r31_13 -# 31| m31_15(unknown) = ^CallSideEffect : ~m31_10 -# 31| m31_16(unknown) = Chi : total:m31_10, partial:m31_15 -# 31| v31_17(void) = ^BufferReadSideEffect[0] : &:r31_13, ~m31_16 -# 33| r33_1(glval>) = VariableAddress[sp_const_int_pointer] : -# 33| m33_2(shared_ptr) = Uninitialized[sp_const_int_pointer] : &:r33_1 -# 35| r35_1(glval) = FunctionAddress[shared_ptr_const_int_ptr] : -# 35| r35_2(glval>) = VariableAddress[#temp35:30] : -# 35| m35_3(shared_ptr) = Uninitialized[#temp35:30] : &:r35_2 -# 35| r35_4(glval) = FunctionAddress[shared_ptr] : -# 35| r35_5(glval>) = VariableAddress[sp_const_int_pointer] : -# 35| r35_6(glval>) = Convert : r35_5 -# 35| r35_7(shared_ptr &) = CopyValue : r35_6 -# 35| v35_8(void) = Call[shared_ptr] : func:r35_4, this:r35_2, 0:r35_7 -# 35| m35_9(unknown) = ^CallSideEffect : ~m31_16 -# 35| m35_10(unknown) = Chi : total:m31_16, partial:m35_9 -# 35| v35_11(void) = ^IndirectReadSideEffect[0] : &:r35_7, m33_2 -# 35| m35_12(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r35_2 -# 35| r35_13(shared_ptr) = Load[#temp35:30] : &:r35_2, m35_12 -# 35| v35_14(void) = Call[shared_ptr_const_int_ptr] : func:r35_1, 0:r35_13 -# 35| m35_15(unknown) = ^CallSideEffect : ~m35_10 -# 35| m35_16(unknown) = Chi : total:m35_10, partial:m35_15 -# 35| v35_17(void) = ^BufferReadSideEffect[0] : &:r35_13, ~m35_16 -# 35| m35_18(unknown) = ^BufferMayWriteSideEffect[0] : &:r35_13 -# 35| m35_19(unknown) = Chi : total:m35_16, partial:m35_18 -# 37| r37_1(glval>>) = VariableAddress[sp_sp_const_int] : -# 37| m37_2(shared_ptr>) = Uninitialized[sp_sp_const_int] : &:r37_1 -# 39| r39_1(glval) = FunctionAddress[shared_ptr_shared_ptr_const_int] : -# 39| r39_2(glval>>) = VariableAddress[#temp39:37] : -# 39| m39_3(shared_ptr>) = Uninitialized[#temp39:37] : &:r39_2 -# 39| r39_4(glval) = FunctionAddress[shared_ptr] : -# 39| r39_5(glval>>) = VariableAddress[sp_sp_const_int] : -# 39| r39_6(glval>>) = Convert : r39_5 -# 39| r39_7(shared_ptr> &) = CopyValue : r39_6 -# 39| v39_8(void) = Call[shared_ptr] : func:r39_4, this:r39_2, 0:r39_7 -# 39| m39_9(unknown) = ^CallSideEffect : ~m35_19 -# 39| m39_10(unknown) = Chi : total:m35_19, partial:m39_9 -# 39| v39_11(void) = ^IndirectReadSideEffect[0] : &:r39_7, m37_2 -# 39| m39_12(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r39_2 -# 39| r39_13(shared_ptr>) = Load[#temp39:37] : &:r39_2, m39_12 -# 39| v39_14(void) = Call[shared_ptr_shared_ptr_const_int] : func:r39_1, 0:r39_13 -# 39| m39_15(unknown) = ^CallSideEffect : ~m39_10 -# 39| m39_16(unknown) = Chi : total:m39_10, partial:m39_15 -# 39| v39_17(void) = ^BufferReadSideEffect[0] : &:r39_13, ~m39_16 -# 39| m39_18(unknown) = ^BufferMayWriteSideEffect[0] : &:r39_13 -# 39| m39_19(unknown) = Chi : total:m39_16, partial:m39_18 -# 41| r41_1(glval>>) = VariableAddress[sp_const_sp_int] : -# 41| m41_2(shared_ptr>) = Uninitialized[sp_const_sp_int] : &:r41_1 -# 43| r43_1(glval) = FunctionAddress[shared_ptr_const_shared_ptr_int] : -# 43| r43_2(glval>>) = VariableAddress[#temp43:37] : -# 43| m43_3(shared_ptr>) = Uninitialized[#temp43:37] : &:r43_2 -# 43| r43_4(glval) = FunctionAddress[shared_ptr] : -# 43| r43_5(glval>>) = VariableAddress[sp_const_sp_int] : -# 43| r43_6(glval>>) = Convert : r43_5 -# 43| r43_7(shared_ptr> &) = CopyValue : r43_6 -# 43| v43_8(void) = Call[shared_ptr] : func:r43_4, this:r43_2, 0:r43_7 -# 43| m43_9(unknown) = ^CallSideEffect : ~m39_19 -# 43| m43_10(unknown) = Chi : total:m39_19, partial:m43_9 -# 43| v43_11(void) = ^IndirectReadSideEffect[0] : &:r43_7, m41_2 -# 43| m43_12(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r43_2 -# 43| r43_13(shared_ptr>) = Load[#temp43:37] : &:r43_2, m43_12 -# 43| v43_14(void) = Call[shared_ptr_const_shared_ptr_int] : func:r43_1, 0:r43_13 -# 43| m43_15(unknown) = ^CallSideEffect : ~m43_10 -# 43| m43_16(unknown) = Chi : total:m43_10, partial:m43_15 -# 43| v43_17(void) = ^BufferReadSideEffect[0] : &:r43_13, ~m43_16 -# 43| m43_18(unknown) = ^BufferMayWriteSideEffect[0] : &:r43_13 -# 43| m43_19(unknown) = Chi : total:m43_16, partial:m43_18 -# 45| r45_1(glval>>) = VariableAddress[sp_const_sp_const_int] : -# 45| m45_2(shared_ptr>) = Uninitialized[sp_const_sp_const_int] : &:r45_1 -# 47| r47_1(glval) = FunctionAddress[shared_ptr_const_shared_ptr_const_int] : -# 47| r47_2(glval>>) = VariableAddress[#temp47:43] : -# 47| m47_3(shared_ptr>) = Uninitialized[#temp47:43] : &:r47_2 -# 47| r47_4(glval) = FunctionAddress[shared_ptr] : -# 47| r47_5(glval>>) = VariableAddress[sp_const_sp_const_int] : -# 47| r47_6(glval>>) = Convert : r47_5 -# 47| r47_7(shared_ptr> &) = CopyValue : r47_6 -# 47| v47_8(void) = Call[shared_ptr] : func:r47_4, this:r47_2, 0:r47_7 -# 47| m47_9(unknown) = ^CallSideEffect : ~m43_19 -# 47| m47_10(unknown) = Chi : total:m43_19, partial:m47_9 -# 47| v47_11(void) = ^IndirectReadSideEffect[0] : &:r47_7, m45_2 -# 47| m47_12(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r47_2 -# 47| r47_13(shared_ptr>) = Load[#temp47:43] : &:r47_2, m47_12 -# 47| v47_14(void) = Call[shared_ptr_const_shared_ptr_const_int] : func:r47_1, 0:r47_13 -# 47| m47_15(unknown) = ^CallSideEffect : ~m47_10 -# 47| m47_16(unknown) = Chi : total:m47_10, partial:m47_15 -# 47| v47_17(void) = ^BufferReadSideEffect[0] : &:r47_13, ~m47_16 -# 48| v48_1(void) = NoOp : -# 48| r48_2(glval>>) = VariableAddress[sp_const_sp_const_int] : -# 48| r48_3(glval) = FunctionAddress[~shared_ptr] : -# 48| v48_4(void) = Call[~shared_ptr] : func:r48_3, this:r48_2 -# 48| v48_5(void) = ^IndirectReadSideEffect[-1] : &:r48_2, m45_2 -# 48| m48_6(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r48_2 -# 48| r48_7(glval>>) = VariableAddress[sp_const_sp_int] : -# 48| r48_8(glval) = FunctionAddress[~shared_ptr] : -# 48| v48_9(void) = Call[~shared_ptr] : func:r48_8, this:r48_7 -# 48| v48_10(void) = ^IndirectReadSideEffect[-1] : &:r48_7, m41_2 -# 48| m48_11(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r48_7 -# 48| r48_12(glval>>) = VariableAddress[sp_sp_const_int] : -# 48| r48_13(glval) = FunctionAddress[~shared_ptr] : -# 48| v48_14(void) = Call[~shared_ptr] : func:r48_13, this:r48_12 -# 48| v48_15(void) = ^IndirectReadSideEffect[-1] : &:r48_12, m37_2 -# 48| m48_16(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r48_12 -# 48| r48_17(glval>) = VariableAddress[sp_const_int_pointer] : -# 48| r48_18(glval) = FunctionAddress[~shared_ptr] : -# 48| v48_19(void) = Call[~shared_ptr] : func:r48_18, this:r48_17 -# 48| v48_20(void) = ^IndirectReadSideEffect[-1] : &:r48_17, m33_2 -# 48| m48_21(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r48_17 -# 48| r48_22(glval>) = VariableAddress[sp_const_int] : -# 48| r48_23(glval) = FunctionAddress[~shared_ptr] : -# 48| v48_24(void) = Call[~shared_ptr] : func:r48_23, this:r48_22 -# 48| v48_25(void) = ^IndirectReadSideEffect[-1] : &:r48_22, m29_2 -# 48| m48_26(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r48_22 -# 28| v28_5(void) = ReturnVoid : -# 28| v28_6(void) = AliasedUse : ~m47_16 -# 28| v28_7(void) = ExitFunction : +# 28| v28_1(void) = EnterFunction : +# 28| m28_2(unknown) = AliasedDefinition : +# 28| m28_3(unknown) = InitializeNonLocal : +# 28| m28_4(unknown) = Chi : total:m28_2, partial:m28_3 +# 29| r29_1(glval>) = VariableAddress[sp_const_int] : +# 29| m29_2(shared_ptr) = Uninitialized[sp_const_int] : &:r29_1 +# 31| r31_1(glval) = FunctionAddress[shared_ptr_const_int] : +# 31| r31_2(glval>) = VariableAddress[#temp31:26] : +# 31| m31_3(shared_ptr) = Uninitialized[#temp31:26] : &:r31_2 +# 31| r31_4(glval) = FunctionAddress[shared_ptr] : +# 31| r31_5(glval>) = VariableAddress[sp_const_int] : +# 31| r31_6(glval>) = Convert : r31_5 +# 31| r31_7(shared_ptr &) = CopyValue : r31_6 +# 31| v31_8(void) = Call[shared_ptr] : func:r31_4, this:r31_2, 0:r31_7 +# 31| m31_9(unknown) = ^CallSideEffect : ~m28_4 +# 31| m31_10(unknown) = Chi : total:m28_4, partial:m31_9 +# 31| v31_11(void) = ^IndirectReadSideEffect[0] : &:r31_7, m29_2 +# 31| m31_12(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r31_2 +# 31| r31_13(shared_ptr) = Load[#temp31:26] : &:r31_2, m31_12 +# 31| v31_14(void) = Call[shared_ptr_const_int] : func:r31_1, 0:r31_13 +# 31| m31_15(unknown) = ^CallSideEffect : ~m31_10 +# 31| m31_16(unknown) = Chi : total:m31_10, partial:m31_15 +# 31| v31_17(void) = ^BufferReadSideEffect[0] : &:r31_13, ~m31_16 +# 31| r31_18(glval>) = CopyValue : r31_2 +# 31| r31_19(glval) = FunctionAddress[~shared_ptr] : +# 31| v31_20(void) = Call[~shared_ptr] : func:r31_19, this:r31_18 +# 31| v31_21(void) = ^IndirectReadSideEffect[-1] : &:r31_18, m31_12 +# 31| m31_22(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r31_18 +# 33| r33_1(glval>) = VariableAddress[sp_const_int_pointer] : +# 33| m33_2(shared_ptr) = Uninitialized[sp_const_int_pointer] : &:r33_1 +# 35| r35_1(glval) = FunctionAddress[shared_ptr_const_int_ptr] : +# 35| r35_2(glval>) = VariableAddress[#temp35:30] : +# 35| m35_3(shared_ptr) = Uninitialized[#temp35:30] : &:r35_2 +# 35| r35_4(glval) = FunctionAddress[shared_ptr] : +# 35| r35_5(glval>) = VariableAddress[sp_const_int_pointer] : +# 35| r35_6(glval>) = Convert : r35_5 +# 35| r35_7(shared_ptr &) = CopyValue : r35_6 +# 35| v35_8(void) = Call[shared_ptr] : func:r35_4, this:r35_2, 0:r35_7 +# 35| m35_9(unknown) = ^CallSideEffect : ~m31_16 +# 35| m35_10(unknown) = Chi : total:m31_16, partial:m35_9 +# 35| v35_11(void) = ^IndirectReadSideEffect[0] : &:r35_7, m33_2 +# 35| m35_12(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r35_2 +# 35| r35_13(shared_ptr) = Load[#temp35:30] : &:r35_2, m35_12 +# 35| v35_14(void) = Call[shared_ptr_const_int_ptr] : func:r35_1, 0:r35_13 +# 35| m35_15(unknown) = ^CallSideEffect : ~m35_10 +# 35| m35_16(unknown) = Chi : total:m35_10, partial:m35_15 +# 35| v35_17(void) = ^BufferReadSideEffect[0] : &:r35_13, ~m35_16 +# 35| m35_18(unknown) = ^BufferMayWriteSideEffect[0] : &:r35_13 +# 35| m35_19(unknown) = Chi : total:m35_16, partial:m35_18 +# 35| r35_20(glval>) = CopyValue : r35_2 +# 35| r35_21(glval) = FunctionAddress[~shared_ptr] : +# 35| v35_22(void) = Call[~shared_ptr] : func:r35_21, this:r35_20 +# 35| v35_23(void) = ^IndirectReadSideEffect[-1] : &:r35_20, m35_12 +# 35| m35_24(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r35_20 +# 37| r37_1(glval>>) = VariableAddress[sp_sp_const_int] : +# 37| m37_2(shared_ptr>) = Uninitialized[sp_sp_const_int] : &:r37_1 +# 39| r39_1(glval) = FunctionAddress[shared_ptr_shared_ptr_const_int] : +# 39| r39_2(glval>>) = VariableAddress[#temp39:37] : +# 39| m39_3(shared_ptr>) = Uninitialized[#temp39:37] : &:r39_2 +# 39| r39_4(glval) = FunctionAddress[shared_ptr] : +# 39| r39_5(glval>>) = VariableAddress[sp_sp_const_int] : +# 39| r39_6(glval>>) = Convert : r39_5 +# 39| r39_7(shared_ptr> &) = CopyValue : r39_6 +# 39| v39_8(void) = Call[shared_ptr] : func:r39_4, this:r39_2, 0:r39_7 +# 39| m39_9(unknown) = ^CallSideEffect : ~m35_19 +# 39| m39_10(unknown) = Chi : total:m35_19, partial:m39_9 +# 39| v39_11(void) = ^IndirectReadSideEffect[0] : &:r39_7, m37_2 +# 39| m39_12(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r39_2 +# 39| r39_13(shared_ptr>) = Load[#temp39:37] : &:r39_2, m39_12 +# 39| v39_14(void) = Call[shared_ptr_shared_ptr_const_int] : func:r39_1, 0:r39_13 +# 39| m39_15(unknown) = ^CallSideEffect : ~m39_10 +# 39| m39_16(unknown) = Chi : total:m39_10, partial:m39_15 +# 39| v39_17(void) = ^BufferReadSideEffect[0] : &:r39_13, ~m39_16 +# 39| m39_18(unknown) = ^BufferMayWriteSideEffect[0] : &:r39_13 +# 39| m39_19(unknown) = Chi : total:m39_16, partial:m39_18 +# 39| r39_20(glval>>) = CopyValue : r39_2 +# 39| r39_21(glval) = FunctionAddress[~shared_ptr] : +# 39| v39_22(void) = Call[~shared_ptr] : func:r39_21, this:r39_20 +# 39| v39_23(void) = ^IndirectReadSideEffect[-1] : &:r39_20, m39_12 +# 39| m39_24(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r39_20 +# 41| r41_1(glval>>) = VariableAddress[sp_const_sp_int] : +# 41| m41_2(shared_ptr>) = Uninitialized[sp_const_sp_int] : &:r41_1 +# 43| r43_1(glval) = FunctionAddress[shared_ptr_const_shared_ptr_int] : +# 43| r43_2(glval>>) = VariableAddress[#temp43:37] : +# 43| m43_3(shared_ptr>) = Uninitialized[#temp43:37] : &:r43_2 +# 43| r43_4(glval) = FunctionAddress[shared_ptr] : +# 43| r43_5(glval>>) = VariableAddress[sp_const_sp_int] : +# 43| r43_6(glval>>) = Convert : r43_5 +# 43| r43_7(shared_ptr> &) = CopyValue : r43_6 +# 43| v43_8(void) = Call[shared_ptr] : func:r43_4, this:r43_2, 0:r43_7 +# 43| m43_9(unknown) = ^CallSideEffect : ~m39_19 +# 43| m43_10(unknown) = Chi : total:m39_19, partial:m43_9 +# 43| v43_11(void) = ^IndirectReadSideEffect[0] : &:r43_7, m41_2 +# 43| m43_12(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r43_2 +# 43| r43_13(shared_ptr>) = Load[#temp43:37] : &:r43_2, m43_12 +# 43| v43_14(void) = Call[shared_ptr_const_shared_ptr_int] : func:r43_1, 0:r43_13 +# 43| m43_15(unknown) = ^CallSideEffect : ~m43_10 +# 43| m43_16(unknown) = Chi : total:m43_10, partial:m43_15 +# 43| v43_17(void) = ^BufferReadSideEffect[0] : &:r43_13, ~m43_16 +# 43| m43_18(unknown) = ^BufferMayWriteSideEffect[0] : &:r43_13 +# 43| m43_19(unknown) = Chi : total:m43_16, partial:m43_18 +# 43| r43_20(glval>>) = CopyValue : r43_2 +# 43| r43_21(glval) = FunctionAddress[~shared_ptr] : +# 43| v43_22(void) = Call[~shared_ptr] : func:r43_21, this:r43_20 +# 43| v43_23(void) = ^IndirectReadSideEffect[-1] : &:r43_20, m43_12 +# 43| m43_24(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r43_20 +# 45| r45_1(glval>>) = VariableAddress[sp_const_sp_const_int] : +# 45| m45_2(shared_ptr>) = Uninitialized[sp_const_sp_const_int] : &:r45_1 +# 47| r47_1(glval) = FunctionAddress[shared_ptr_const_shared_ptr_const_int] : +# 47| r47_2(glval>>) = VariableAddress[#temp47:43] : +# 47| m47_3(shared_ptr>) = Uninitialized[#temp47:43] : &:r47_2 +# 47| r47_4(glval) = FunctionAddress[shared_ptr] : +# 47| r47_5(glval>>) = VariableAddress[sp_const_sp_const_int] : +# 47| r47_6(glval>>) = Convert : r47_5 +# 47| r47_7(shared_ptr> &) = CopyValue : r47_6 +# 47| v47_8(void) = Call[shared_ptr] : func:r47_4, this:r47_2, 0:r47_7 +# 47| m47_9(unknown) = ^CallSideEffect : ~m43_19 +# 47| m47_10(unknown) = Chi : total:m43_19, partial:m47_9 +# 47| v47_11(void) = ^IndirectReadSideEffect[0] : &:r47_7, m45_2 +# 47| m47_12(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r47_2 +# 47| r47_13(shared_ptr>) = Load[#temp47:43] : &:r47_2, m47_12 +# 47| v47_14(void) = Call[shared_ptr_const_shared_ptr_const_int] : func:r47_1, 0:r47_13 +# 47| m47_15(unknown) = ^CallSideEffect : ~m47_10 +# 47| m47_16(unknown) = Chi : total:m47_10, partial:m47_15 +# 47| v47_17(void) = ^BufferReadSideEffect[0] : &:r47_13, ~m47_16 +# 47| r47_18(glval>>) = CopyValue : r47_2 +# 47| r47_19(glval) = FunctionAddress[~shared_ptr] : +# 47| v47_20(void) = Call[~shared_ptr] : func:r47_19, this:r47_18 +# 47| v47_21(void) = ^IndirectReadSideEffect[-1] : &:r47_18, m47_12 +# 47| m47_22(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r47_18 +# 48| v48_1(void) = NoOp : +# 48| r48_2(glval>>) = VariableAddress[sp_const_sp_const_int] : +# 48| r48_3(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_4(void) = Call[~shared_ptr] : func:r48_3, this:r48_2 +# 48| v48_5(void) = ^IndirectReadSideEffect[-1] : &:r48_2, m45_2 +# 48| m48_6(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r48_2 +# 48| r48_7(glval>>) = VariableAddress[sp_const_sp_int] : +# 48| r48_8(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_9(void) = Call[~shared_ptr] : func:r48_8, this:r48_7 +# 48| v48_10(void) = ^IndirectReadSideEffect[-1] : &:r48_7, m41_2 +# 48| m48_11(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r48_7 +# 48| r48_12(glval>>) = VariableAddress[sp_sp_const_int] : +# 48| r48_13(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_14(void) = Call[~shared_ptr] : func:r48_13, this:r48_12 +# 48| v48_15(void) = ^IndirectReadSideEffect[-1] : &:r48_12, m37_2 +# 48| m48_16(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r48_12 +# 48| r48_17(glval>) = VariableAddress[sp_const_int_pointer] : +# 48| r48_18(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_19(void) = Call[~shared_ptr] : func:r48_18, this:r48_17 +# 48| v48_20(void) = ^IndirectReadSideEffect[-1] : &:r48_17, m33_2 +# 48| m48_21(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r48_17 +# 48| r48_22(glval>) = VariableAddress[sp_const_int] : +# 48| r48_23(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_24(void) = Call[~shared_ptr] : func:r48_23, this:r48_22 +# 48| v48_25(void) = ^IndirectReadSideEffect[-1] : &:r48_22, m29_2 +# 48| m48_26(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r48_22 +# 28| v28_5(void) = ReturnVoid : +# 28| v28_6(void) = AliasedUse : ~m47_16 +# 28| v28_7(void) = ExitFunction : struct_init.cpp: # 9| Info infos_in_file[] 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 b93c7d2649f8..560bb8f4a358 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 @@ -7,7 +7,61 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors +| destructors_for_temps.cpp:51:41:51:62 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:41:55:62 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unexplainedLoop +| destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -18,8 +72,16 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability +| destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Block 'Load: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:5 | Store: ... ? ... : ... | Block 'Store: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Block 'Load: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:5 | Store: ... ? ... : ... | Block 'Store: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | backEdgeCountMismatch useNotDominatedByDefinition +| destructors_for_temps.cpp:51:5:51:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:5:55:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 b93c7d2649f8..d8e6d0b173a1 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 @@ -2,12 +2,79 @@ missingOperand unexpectedOperand duplicateOperand missingPhiOperand +| destructors_for_temps.cpp:51:5:51:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is missing an operand for predecessor block 'VariableAddress: temporary object' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is missing an operand for predecessor block 'VariableAddress: temporary object' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:5:55:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is missing an operand for predecessor block 'VariableAddress: temporary object' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is missing an operand for predecessor block 'VariableAddress: temporary object' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | missingOperandType +| destructors_for_temps.cpp:39:3:39:53 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | destructors_for_temps.cpp:38:6:38:15 | void temp_test5(bool) | void temp_test5(bool) | +| ir.cpp:1425:5:1425:30 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | ir.cpp:1414:6:1414:21 | void temporary_string() | void temporary_string() | +| ir.cpp:1437:5:1437:39 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | ir.cpp:1428:6:1428:30 | void temporary_destructor_only() | void temporary_destructor_only() | duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors +| destructors_for_temps.cpp:51:41:51:62 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:41:55:62 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unexplainedLoop +| destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -18,8 +85,16 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability +| destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Block 'Load: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:5 | Store: ... ? ... : ... | Block 'Store: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Block 'Load: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:5 | Store: ... ? ... : ... | Block 'Store: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | backEdgeCountMismatch useNotDominatedByDefinition +| destructors_for_temps.cpp:51:5:51:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:5:55:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 80ec181a2194..ca4a6d2b2b72 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -664,24 +664,35 @@ | destructors_for_temps.cpp:14:6:14:14 | Address | &:r14_5 | | destructors_for_temps.cpp:14:6:14:14 | ChiPartial | partial:m14_3 | | destructors_for_temps.cpp:14:6:14:14 | ChiTotal | total:m14_2 | -| destructors_for_temps.cpp:14:6:14:14 | Load | m17_17 | -| destructors_for_temps.cpp:14:6:14:14 | SideEffect | ~m17_13 | +| destructors_for_temps.cpp:14:6:14:14 | Load | m17_25 | +| destructors_for_temps.cpp:14:6:14:14 | SideEffect | ~m17_21 | | destructors_for_temps.cpp:15:10:15:10 | Address | &:r15_1 | | destructors_for_temps.cpp:15:14:15:35 | Address | &:r15_2 | | destructors_for_temps.cpp:15:14:15:35 | Address | &:r15_2 | | destructors_for_temps.cpp:15:14:15:35 | Address | &:r15_2 | | destructors_for_temps.cpp:15:14:15:35 | Address | &:r15_2 | +| destructors_for_temps.cpp:15:14:15:35 | Address | &:r15_17 | +| destructors_for_temps.cpp:15:14:15:35 | Address | &:r15_17 | | destructors_for_temps.cpp:15:14:15:35 | Arg(this) | this:r15_2 | | destructors_for_temps.cpp:15:14:15:35 | Arg(this) | this:r15_2 | +| destructors_for_temps.cpp:15:14:15:35 | Arg(this) | this:r15_17 | | destructors_for_temps.cpp:15:14:15:35 | CallTarget | func:r15_4 | +| destructors_for_temps.cpp:15:14:15:35 | CallTarget | func:r15_18 | | destructors_for_temps.cpp:15:14:15:35 | ChiPartial | partial:m15_6 | | destructors_for_temps.cpp:15:14:15:35 | ChiPartial | partial:m15_8 | | destructors_for_temps.cpp:15:14:15:35 | ChiPartial | partial:m15_15 | +| destructors_for_temps.cpp:15:14:15:35 | ChiPartial | partial:m15_20 | +| destructors_for_temps.cpp:15:14:15:35 | ChiPartial | partial:m15_23 | | destructors_for_temps.cpp:15:14:15:35 | ChiTotal | total:m14_4 | | destructors_for_temps.cpp:15:14:15:35 | ChiTotal | total:m15_3 | | destructors_for_temps.cpp:15:14:15:35 | ChiTotal | total:m15_9 | +| destructors_for_temps.cpp:15:14:15:35 | ChiTotal | total:m15_13 | +| destructors_for_temps.cpp:15:14:15:35 | ChiTotal | total:m15_16 | | destructors_for_temps.cpp:15:14:15:35 | SideEffect | m15_9 | +| destructors_for_temps.cpp:15:14:15:35 | SideEffect | m15_16 | | destructors_for_temps.cpp:15:14:15:35 | SideEffect | ~m14_4 | +| destructors_for_temps.cpp:15:14:15:35 | SideEffect | ~m15_13 | +| destructors_for_temps.cpp:15:14:15:35 | Unary | r15_2 | | destructors_for_temps.cpp:15:37:15:41 | CallTarget | func:r15_10 | | destructors_for_temps.cpp:15:37:15:41 | ChiPartial | partial:m15_12 | | destructors_for_temps.cpp:15:37:15:41 | ChiTotal | total:m15_7 | @@ -701,17 +712,28 @@ | destructors_for_temps.cpp:16:33:16:54 | Address | &:r16_5 | | destructors_for_temps.cpp:16:33:16:54 | Address | &:r16_5 | | destructors_for_temps.cpp:16:33:16:54 | Address | &:r16_5 | +| destructors_for_temps.cpp:16:33:16:54 | Address | &:r16_25 | +| destructors_for_temps.cpp:16:33:16:54 | Address | &:r16_25 | | destructors_for_temps.cpp:16:33:16:54 | Arg(this) | this:r16_5 | | destructors_for_temps.cpp:16:33:16:54 | Arg(this) | this:r16_5 | +| destructors_for_temps.cpp:16:33:16:54 | Arg(this) | this:r16_25 | | destructors_for_temps.cpp:16:33:16:54 | CallTarget | func:r16_7 | +| destructors_for_temps.cpp:16:33:16:54 | CallTarget | func:r16_26 | | destructors_for_temps.cpp:16:33:16:54 | ChiPartial | partial:m16_9 | | destructors_for_temps.cpp:16:33:16:54 | ChiPartial | partial:m16_11 | | destructors_for_temps.cpp:16:33:16:54 | ChiPartial | partial:m16_18 | -| destructors_for_temps.cpp:16:33:16:54 | ChiTotal | total:m15_13 | +| destructors_for_temps.cpp:16:33:16:54 | ChiPartial | partial:m16_28 | +| destructors_for_temps.cpp:16:33:16:54 | ChiPartial | partial:m16_31 | +| destructors_for_temps.cpp:16:33:16:54 | ChiTotal | total:m15_21 | | destructors_for_temps.cpp:16:33:16:54 | ChiTotal | total:m16_6 | | destructors_for_temps.cpp:16:33:16:54 | ChiTotal | total:m16_12 | +| destructors_for_temps.cpp:16:33:16:54 | ChiTotal | total:m16_19 | +| destructors_for_temps.cpp:16:33:16:54 | ChiTotal | total:m16_22 | | destructors_for_temps.cpp:16:33:16:54 | SideEffect | m16_12 | -| destructors_for_temps.cpp:16:33:16:54 | SideEffect | ~m15_13 | +| destructors_for_temps.cpp:16:33:16:54 | SideEffect | m16_19 | +| destructors_for_temps.cpp:16:33:16:54 | SideEffect | ~m15_21 | +| destructors_for_temps.cpp:16:33:16:54 | SideEffect | ~m16_22 | +| destructors_for_temps.cpp:16:33:16:54 | Unary | r16_5 | | destructors_for_temps.cpp:16:56:16:60 | Arg(1) | 1:r16_14 | | destructors_for_temps.cpp:16:56:16:60 | CallTarget | func:r16_13 | | destructors_for_temps.cpp:16:56:16:60 | ChiPartial | partial:m16_15 | @@ -722,17 +744,28 @@ | destructors_for_temps.cpp:17:12:17:33 | Address | &:r17_2 | | destructors_for_temps.cpp:17:12:17:33 | Address | &:r17_2 | | destructors_for_temps.cpp:17:12:17:33 | Address | &:r17_2 | +| destructors_for_temps.cpp:17:12:17:33 | Address | &:r17_17 | +| destructors_for_temps.cpp:17:12:17:33 | Address | &:r17_17 | | destructors_for_temps.cpp:17:12:17:33 | Arg(this) | this:r17_2 | | destructors_for_temps.cpp:17:12:17:33 | Arg(this) | this:r17_2 | +| destructors_for_temps.cpp:17:12:17:33 | Arg(this) | this:r17_17 | | destructors_for_temps.cpp:17:12:17:33 | CallTarget | func:r17_4 | +| destructors_for_temps.cpp:17:12:17:33 | CallTarget | func:r17_18 | | destructors_for_temps.cpp:17:12:17:33 | ChiPartial | partial:m17_6 | | destructors_for_temps.cpp:17:12:17:33 | ChiPartial | partial:m17_8 | | destructors_for_temps.cpp:17:12:17:33 | ChiPartial | partial:m17_15 | -| destructors_for_temps.cpp:17:12:17:33 | ChiTotal | total:m16_22 | +| destructors_for_temps.cpp:17:12:17:33 | ChiPartial | partial:m17_20 | +| destructors_for_temps.cpp:17:12:17:33 | ChiPartial | partial:m17_23 | +| destructors_for_temps.cpp:17:12:17:33 | ChiTotal | total:m16_29 | | destructors_for_temps.cpp:17:12:17:33 | ChiTotal | total:m17_3 | | destructors_for_temps.cpp:17:12:17:33 | ChiTotal | total:m17_9 | +| destructors_for_temps.cpp:17:12:17:33 | ChiTotal | total:m17_13 | +| destructors_for_temps.cpp:17:12:17:33 | ChiTotal | total:m17_16 | | destructors_for_temps.cpp:17:12:17:33 | SideEffect | m17_9 | -| destructors_for_temps.cpp:17:12:17:33 | SideEffect | ~m16_22 | +| destructors_for_temps.cpp:17:12:17:33 | SideEffect | m17_16 | +| destructors_for_temps.cpp:17:12:17:33 | SideEffect | ~m16_29 | +| destructors_for_temps.cpp:17:12:17:33 | SideEffect | ~m17_13 | +| destructors_for_temps.cpp:17:12:17:33 | Unary | r17_2 | | destructors_for_temps.cpp:17:35:17:39 | CallTarget | func:r17_10 | | destructors_for_temps.cpp:17:35:17:39 | ChiPartial | partial:m17_12 | | destructors_for_temps.cpp:17:35:17:39 | ChiTotal | total:m17_7 | @@ -741,8 +774,8 @@ | destructors_for_temps.cpp:21:6:21:15 | Address | &:r21_5 | | destructors_for_temps.cpp:21:6:21:15 | ChiPartial | partial:m21_3 | | destructors_for_temps.cpp:21:6:21:15 | ChiTotal | total:m21_2 | -| destructors_for_temps.cpp:21:6:21:15 | Load | m23_36 | -| destructors_for_temps.cpp:21:6:21:15 | SideEffect | ~m23_29 | +| destructors_for_temps.cpp:21:6:21:15 | Load | m23_52 | +| destructors_for_temps.cpp:21:6:21:15 | SideEffect | ~m23_47 | | destructors_for_temps.cpp:22:5:22:30 | Address | &:r22_3 | | destructors_for_temps.cpp:22:5:22:30 | Address | &:r22_7 | | destructors_for_temps.cpp:22:5:22:30 | Arg(0) | 0:r22_2 | @@ -763,19 +796,30 @@ | destructors_for_temps.cpp:23:12:23:33 | Address | &:r23_2 | | destructors_for_temps.cpp:23:12:23:33 | Address | &:r23_2 | | destructors_for_temps.cpp:23:12:23:33 | Address | &:r23_2 | +| destructors_for_temps.cpp:23:12:23:33 | Address | &:r23_43 | +| destructors_for_temps.cpp:23:12:23:33 | Address | &:r23_43 | | destructors_for_temps.cpp:23:12:23:33 | Arg(this) | this:r23_2 | | destructors_for_temps.cpp:23:12:23:33 | Arg(this) | this:r23_2 | +| destructors_for_temps.cpp:23:12:23:33 | Arg(this) | this:r23_43 | | destructors_for_temps.cpp:23:12:23:33 | CallTarget | func:r23_4 | +| destructors_for_temps.cpp:23:12:23:33 | CallTarget | func:r23_44 | | destructors_for_temps.cpp:23:12:23:33 | ChiPartial | partial:m23_6 | | destructors_for_temps.cpp:23:12:23:33 | ChiPartial | partial:m23_8 | | destructors_for_temps.cpp:23:12:23:33 | ChiPartial | partial:m23_15 | +| destructors_for_temps.cpp:23:12:23:33 | ChiPartial | partial:m23_46 | +| destructors_for_temps.cpp:23:12:23:33 | ChiPartial | partial:m23_49 | | destructors_for_temps.cpp:23:12:23:33 | ChiTotal | total:m22_11 | | destructors_for_temps.cpp:23:12:23:33 | ChiTotal | total:m23_3 | | destructors_for_temps.cpp:23:12:23:33 | ChiTotal | total:m23_9 | +| destructors_for_temps.cpp:23:12:23:33 | ChiTotal | total:m23_16 | +| destructors_for_temps.cpp:23:12:23:33 | ChiTotal | total:m23_39 | | destructors_for_temps.cpp:23:12:23:33 | SideEffect | m23_9 | +| destructors_for_temps.cpp:23:12:23:33 | SideEffect | m23_16 | | destructors_for_temps.cpp:23:12:23:33 | SideEffect | ~m22_11 | +| destructors_for_temps.cpp:23:12:23:33 | SideEffect | ~m23_39 | +| destructors_for_temps.cpp:23:12:23:33 | Unary | r23_2 | | destructors_for_temps.cpp:23:12:23:41 | Left | r23_17 | -| destructors_for_temps.cpp:23:12:23:74 | StoreValue | r23_35 | +| destructors_for_temps.cpp:23:12:23:74 | StoreValue | r23_51 | | destructors_for_temps.cpp:23:12:23:74 | Unary | r23_34 | | destructors_for_temps.cpp:23:35:23:39 | CallTarget | func:r23_10 | | destructors_for_temps.cpp:23:35:23:39 | ChiPartial | partial:m23_12 | @@ -786,17 +830,28 @@ | destructors_for_temps.cpp:23:45:23:66 | Address | &:r23_18 | | destructors_for_temps.cpp:23:45:23:66 | Address | &:r23_18 | | destructors_for_temps.cpp:23:45:23:66 | Address | &:r23_18 | +| destructors_for_temps.cpp:23:45:23:66 | Address | &:r23_35 | +| destructors_for_temps.cpp:23:45:23:66 | Address | &:r23_35 | | destructors_for_temps.cpp:23:45:23:66 | Arg(this) | this:r23_18 | | destructors_for_temps.cpp:23:45:23:66 | Arg(this) | this:r23_18 | +| destructors_for_temps.cpp:23:45:23:66 | Arg(this) | this:r23_35 | | destructors_for_temps.cpp:23:45:23:66 | CallTarget | func:r23_20 | +| destructors_for_temps.cpp:23:45:23:66 | CallTarget | func:r23_36 | | destructors_for_temps.cpp:23:45:23:66 | ChiPartial | partial:m23_22 | | destructors_for_temps.cpp:23:45:23:66 | ChiPartial | partial:m23_24 | | destructors_for_temps.cpp:23:45:23:66 | ChiPartial | partial:m23_31 | +| destructors_for_temps.cpp:23:45:23:66 | ChiPartial | partial:m23_38 | +| destructors_for_temps.cpp:23:45:23:66 | ChiPartial | partial:m23_41 | | destructors_for_temps.cpp:23:45:23:66 | ChiTotal | total:m23_13 | | destructors_for_temps.cpp:23:45:23:66 | ChiTotal | total:m23_19 | | destructors_for_temps.cpp:23:45:23:66 | ChiTotal | total:m23_25 | +| destructors_for_temps.cpp:23:45:23:66 | ChiTotal | total:m23_29 | +| destructors_for_temps.cpp:23:45:23:66 | ChiTotal | total:m23_32 | | destructors_for_temps.cpp:23:45:23:66 | SideEffect | m23_25 | +| destructors_for_temps.cpp:23:45:23:66 | SideEffect | m23_32 | | destructors_for_temps.cpp:23:45:23:66 | SideEffect | ~m23_13 | +| destructors_for_temps.cpp:23:45:23:66 | SideEffect | ~m23_29 | +| destructors_for_temps.cpp:23:45:23:66 | Unary | r23_18 | | destructors_for_temps.cpp:23:45:23:74 | Right | r23_33 | | destructors_for_temps.cpp:23:68:23:72 | CallTarget | func:r23_26 | | destructors_for_temps.cpp:23:68:23:72 | ChiPartial | partial:m23_28 | @@ -872,45 +927,56 @@ | destructors_for_temps.cpp:36:1:36:1 | SideEffect | ~m36_6 | | destructors_for_temps.cpp:38:6:38:15 | ChiPartial | partial:m38_3 | | destructors_for_temps.cpp:38:6:38:15 | ChiTotal | total:m38_2 | -| destructors_for_temps.cpp:38:6:38:15 | SideEffect | ~m39_5 | +| destructors_for_temps.cpp:38:6:38:15 | SideEffect | ~m39_13 | | destructors_for_temps.cpp:38:22:38:22 | Address | &:r38_5 | | destructors_for_temps.cpp:39:3:39:3 | Address | &:r39_2 | | destructors_for_temps.cpp:39:3:39:3 | Address | &:r39_7 | -| destructors_for_temps.cpp:39:3:39:3 | Address | &:r39_19 | -| destructors_for_temps.cpp:39:3:39:3 | Address | &:r39_30 | +| destructors_for_temps.cpp:39:3:39:3 | Address | &:r39_27 | +| destructors_for_temps.cpp:39:3:39:3 | Address | &:r39_38 | | destructors_for_temps.cpp:39:3:39:3 | Condition | r39_3 | | destructors_for_temps.cpp:39:3:39:3 | Load | m38_6 | | destructors_for_temps.cpp:39:3:39:3 | Load | m39_6 | -| destructors_for_temps.cpp:39:3:39:3 | Phi | from 2:m39_20 | -| destructors_for_temps.cpp:39:3:39:3 | Phi | from 2:~m39_15 | -| destructors_for_temps.cpp:39:3:39:3 | Phi | from 3:m39_31 | -| destructors_for_temps.cpp:39:3:39:3 | Phi | from 3:~m39_26 | +| destructors_for_temps.cpp:39:3:39:3 | Phi | from 2:m39_28 | +| destructors_for_temps.cpp:39:3:39:3 | Phi | from 2:~m39_23 | +| destructors_for_temps.cpp:39:3:39:3 | Phi | from 3:m39_39 | +| destructors_for_temps.cpp:39:3:39:3 | Phi | from 3:~m39_34 | | destructors_for_temps.cpp:39:3:39:3 | StoreValue | r39_8 | | destructors_for_temps.cpp:39:3:39:53 | Address | &:r39_1 | -| destructors_for_temps.cpp:39:7:39:28 | Address | &:r39_10 | -| destructors_for_temps.cpp:39:7:39:28 | Address | &:r39_10 | -| destructors_for_temps.cpp:39:7:39:28 | Address | &:r39_10 | -| destructors_for_temps.cpp:39:7:39:28 | Arg(this) | this:r39_10 | -| destructors_for_temps.cpp:39:7:39:28 | CallTarget | func:r39_12 | -| destructors_for_temps.cpp:39:7:39:28 | ChiPartial | partial:m39_14 | -| destructors_for_temps.cpp:39:7:39:28 | ChiPartial | partial:m39_16 | +| destructors_for_temps.cpp:39:3:39:53 | Address | &:r39_9 | +| destructors_for_temps.cpp:39:3:39:53 | Address | &:r39_9 | +| destructors_for_temps.cpp:39:3:39:53 | Arg(this) | this:r39_9 | +| destructors_for_temps.cpp:39:3:39:53 | CallTarget | func:r39_10 | +| destructors_for_temps.cpp:39:3:39:53 | ChiPartial | partial:m39_12 | +| destructors_for_temps.cpp:39:3:39:53 | ChiPartial | partial:m39_15 | +| destructors_for_temps.cpp:39:3:39:53 | ChiTotal | total:m39_5 | +| destructors_for_temps.cpp:39:3:39:53 | ChiTotal | total:~m? | +| destructors_for_temps.cpp:39:3:39:53 | SideEffect | ~m39_5 | +| destructors_for_temps.cpp:39:3:39:53 | SideEffect | ~m? | +| destructors_for_temps.cpp:39:3:39:53 | Unary | r39_1 | +| destructors_for_temps.cpp:39:7:39:28 | Address | &:r39_18 | +| destructors_for_temps.cpp:39:7:39:28 | Address | &:r39_18 | +| destructors_for_temps.cpp:39:7:39:28 | Address | &:r39_18 | +| destructors_for_temps.cpp:39:7:39:28 | Arg(this) | this:r39_18 | +| destructors_for_temps.cpp:39:7:39:28 | CallTarget | func:r39_20 | +| destructors_for_temps.cpp:39:7:39:28 | ChiPartial | partial:m39_22 | +| destructors_for_temps.cpp:39:7:39:28 | ChiPartial | partial:m39_24 | | destructors_for_temps.cpp:39:7:39:28 | ChiTotal | total:m38_4 | -| destructors_for_temps.cpp:39:7:39:28 | ChiTotal | total:m39_11 | -| destructors_for_temps.cpp:39:7:39:28 | Load | m39_17 | +| destructors_for_temps.cpp:39:7:39:28 | ChiTotal | total:m39_19 | +| destructors_for_temps.cpp:39:7:39:28 | Load | m39_25 | | destructors_for_temps.cpp:39:7:39:28 | SideEffect | ~m38_4 | -| destructors_for_temps.cpp:39:7:39:28 | StoreValue | r39_18 | -| destructors_for_temps.cpp:39:32:39:53 | Address | &:r39_21 | -| destructors_for_temps.cpp:39:32:39:53 | Address | &:r39_21 | -| destructors_for_temps.cpp:39:32:39:53 | Address | &:r39_21 | -| destructors_for_temps.cpp:39:32:39:53 | Arg(this) | this:r39_21 | -| destructors_for_temps.cpp:39:32:39:53 | CallTarget | func:r39_23 | -| destructors_for_temps.cpp:39:32:39:53 | ChiPartial | partial:m39_25 | -| destructors_for_temps.cpp:39:32:39:53 | ChiPartial | partial:m39_27 | +| destructors_for_temps.cpp:39:7:39:28 | StoreValue | r39_26 | +| destructors_for_temps.cpp:39:32:39:53 | Address | &:r39_29 | +| destructors_for_temps.cpp:39:32:39:53 | Address | &:r39_29 | +| destructors_for_temps.cpp:39:32:39:53 | Address | &:r39_29 | +| destructors_for_temps.cpp:39:32:39:53 | Arg(this) | this:r39_29 | +| destructors_for_temps.cpp:39:32:39:53 | CallTarget | func:r39_31 | +| destructors_for_temps.cpp:39:32:39:53 | ChiPartial | partial:m39_33 | +| destructors_for_temps.cpp:39:32:39:53 | ChiPartial | partial:m39_35 | | destructors_for_temps.cpp:39:32:39:53 | ChiTotal | total:m38_4 | -| destructors_for_temps.cpp:39:32:39:53 | ChiTotal | total:m39_22 | -| destructors_for_temps.cpp:39:32:39:53 | Load | m39_28 | +| destructors_for_temps.cpp:39:32:39:53 | ChiTotal | total:m39_30 | +| destructors_for_temps.cpp:39:32:39:53 | Load | m39_36 | | destructors_for_temps.cpp:39:32:39:53 | SideEffect | ~m38_4 | -| destructors_for_temps.cpp:39:32:39:53 | StoreValue | r39_29 | +| destructors_for_temps.cpp:39:32:39:53 | StoreValue | r39_37 | | destructors_for_temps.cpp:42:6:42:15 | ChiPartial | partial:m42_3 | | destructors_for_temps.cpp:42:6:42:15 | ChiTotal | total:m42_2 | | destructors_for_temps.cpp:42:6:42:15 | Phi | from 2:~m45_22 | @@ -973,8 +1039,8 @@ | destructors_for_temps.cpp:47:1:47:1 | SideEffect | ~m43_6 | | destructors_for_temps.cpp:49:6:49:15 | ChiPartial | partial:m49_3 | | destructors_for_temps.cpp:49:6:49:15 | ChiTotal | total:m49_2 | -| destructors_for_temps.cpp:49:6:49:15 | Phi | from 2:~m51_26 | -| destructors_for_temps.cpp:49:6:49:15 | Phi | from 4:~m52_6 | +| destructors_for_temps.cpp:49:6:49:15 | Phi | from 2:~m51_28 | +| destructors_for_temps.cpp:49:6:49:15 | Phi | from 3:~m52_6 | | destructors_for_temps.cpp:49:6:49:15 | SideEffect | ~m49_7 | | destructors_for_temps.cpp:49:22:49:22 | Address | &:r49_5 | | destructors_for_temps.cpp:50:26:50:26 | Address | &:r50_1 | @@ -987,57 +1053,146 @@ | destructors_for_temps.cpp:50:26:50:26 | ChiTotal | total:m50_2 | | destructors_for_temps.cpp:50:26:50:26 | SideEffect | ~m49_4 | | destructors_for_temps.cpp:51:5:51:5 | Address | &:r51_2 | -| destructors_for_temps.cpp:51:5:51:5 | Address | &:r51_39 | | destructors_for_temps.cpp:51:5:51:5 | Address | &:r51_41 | +| destructors_for_temps.cpp:51:5:51:5 | Address | &:r51_43 | | destructors_for_temps.cpp:51:5:51:5 | Condition | r51_3 | | destructors_for_temps.cpp:51:5:51:5 | Load | m49_6 | -| destructors_for_temps.cpp:51:5:51:5 | Load | m51_40 | -| destructors_for_temps.cpp:51:5:51:5 | StoreValue | r51_42 | +| destructors_for_temps.cpp:51:5:51:5 | Load | m51_42 | +| destructors_for_temps.cpp:51:5:51:5 | StoreValue | r51_6 | | destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_1 | -| destructors_for_temps.cpp:51:9:51:71 | Address | &:r51_5 | -| destructors_for_temps.cpp:51:9:51:71 | Address | &:r51_5 | -| destructors_for_temps.cpp:51:9:51:71 | Address | &:r51_5 | -| destructors_for_temps.cpp:51:9:51:71 | Arg(this) | this:r51_5 | -| destructors_for_temps.cpp:51:9:51:71 | CallTarget | func:r51_7 | -| destructors_for_temps.cpp:51:9:51:71 | ChiPartial | partial:m51_25 | +| destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_52 | +| destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_52 | +| destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_84 | +| destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_84 | +| destructors_for_temps.cpp:51:5:51:96 | Arg(this) | this:r51_52 | +| destructors_for_temps.cpp:51:5:51:96 | Arg(this) | this:r51_84 | +| destructors_for_temps.cpp:51:5:51:96 | CallTarget | func:r51_53 | +| destructors_for_temps.cpp:51:5:51:96 | CallTarget | func:r51_85 | +| destructors_for_temps.cpp:51:5:51:96 | ChiPartial | partial:m51_55 | +| destructors_for_temps.cpp:51:5:51:96 | ChiPartial | partial:m51_58 | +| destructors_for_temps.cpp:51:5:51:96 | ChiPartial | partial:m51_87 | +| destructors_for_temps.cpp:51:5:51:96 | ChiPartial | partial:m51_90 | +| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_46 | +| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_47 | +| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_50 | +| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_51 | +| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_78 | +| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_79 | +| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_82 | +| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_83 | +| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:m51_59 | +| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:m51_67 | +| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:m51_75 | +| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:m51_91 | +| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:m51_99 | +| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:m51_107 | +| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:~m51_72 | +| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:~m51_104 | +| destructors_for_temps.cpp:51:5:51:96 | Phi | from 6:m51_39 | +| destructors_for_temps.cpp:51:5:51:96 | Phi | from 6:~m51_37 | +| destructors_for_temps.cpp:51:5:51:96 | SideEffect | m51_46 | +| destructors_for_temps.cpp:51:5:51:96 | SideEffect | m51_50 | +| destructors_for_temps.cpp:51:5:51:96 | SideEffect | m51_78 | +| destructors_for_temps.cpp:51:5:51:96 | SideEffect | m51_82 | +| destructors_for_temps.cpp:51:5:51:96 | SideEffect | ~m51_47 | +| destructors_for_temps.cpp:51:5:51:96 | SideEffect | ~m51_51 | +| destructors_for_temps.cpp:51:5:51:96 | SideEffect | ~m51_79 | +| destructors_for_temps.cpp:51:5:51:96 | SideEffect | ~m51_83 | +| destructors_for_temps.cpp:51:5:51:96 | Unary | r51_1 | +| destructors_for_temps.cpp:51:9:51:71 | Address | &:r51_7 | +| destructors_for_temps.cpp:51:9:51:71 | Address | &:r51_7 | +| destructors_for_temps.cpp:51:9:51:71 | Address | &:r51_7 | +| destructors_for_temps.cpp:51:9:51:71 | Arg(this) | this:r51_7 | +| destructors_for_temps.cpp:51:9:51:71 | CallTarget | func:r51_9 | | destructors_for_temps.cpp:51:9:51:71 | ChiPartial | partial:m51_27 | -| destructors_for_temps.cpp:51:9:51:71 | ChiTotal | total:m51_6 | -| destructors_for_temps.cpp:51:9:51:71 | ChiTotal | total:m51_20 | -| destructors_for_temps.cpp:51:9:51:71 | Load | m51_28 | -| destructors_for_temps.cpp:51:9:51:71 | SideEffect | ~m51_20 | -| destructors_for_temps.cpp:51:36:51:38 | Arg(0) | 0:r51_8 | -| destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_9 | -| destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_9 | -| destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_9 | -| destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_9 | -| destructors_for_temps.cpp:51:41:51:62 | Arg(this) | this:r51_9 | -| destructors_for_temps.cpp:51:41:51:62 | Arg(this) | this:r51_9 | -| destructors_for_temps.cpp:51:41:51:62 | CallTarget | func:r51_11 | -| destructors_for_temps.cpp:51:41:51:62 | ChiPartial | partial:m51_13 | +| destructors_for_temps.cpp:51:9:51:71 | ChiPartial | partial:m51_29 | +| destructors_for_temps.cpp:51:9:51:71 | ChiTotal | total:m51_8 | +| destructors_for_temps.cpp:51:9:51:71 | ChiTotal | total:m51_22 | +| destructors_for_temps.cpp:51:9:51:71 | Load | m51_30 | +| destructors_for_temps.cpp:51:9:51:71 | SideEffect | ~m51_22 | +| destructors_for_temps.cpp:51:36:51:38 | Arg(0) | 0:r51_10 | +| destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_11 | +| destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_11 | +| destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_11 | +| destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_11 | +| destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_68 | +| destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_68 | +| destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_100 | +| destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_100 | +| destructors_for_temps.cpp:51:41:51:62 | Arg(this) | this:r51_11 | +| destructors_for_temps.cpp:51:41:51:62 | Arg(this) | this:r51_11 | +| destructors_for_temps.cpp:51:41:51:62 | Arg(this) | this:r51_68 | +| destructors_for_temps.cpp:51:41:51:62 | Arg(this) | this:r51_100 | +| destructors_for_temps.cpp:51:41:51:62 | CallTarget | func:r51_13 | +| destructors_for_temps.cpp:51:41:51:62 | CallTarget | func:r51_69 | +| destructors_for_temps.cpp:51:41:51:62 | CallTarget | func:r51_101 | | destructors_for_temps.cpp:51:41:51:62 | ChiPartial | partial:m51_15 | -| destructors_for_temps.cpp:51:41:51:62 | ChiPartial | partial:m51_22 | +| destructors_for_temps.cpp:51:41:51:62 | ChiPartial | partial:m51_17 | +| destructors_for_temps.cpp:51:41:51:62 | ChiPartial | partial:m51_24 | +| destructors_for_temps.cpp:51:41:51:62 | ChiPartial | partial:m51_71 | +| destructors_for_temps.cpp:51:41:51:62 | ChiPartial | partial:m51_74 | +| destructors_for_temps.cpp:51:41:51:62 | ChiPartial | partial:m51_103 | +| destructors_for_temps.cpp:51:41:51:62 | ChiPartial | partial:m51_106 | | destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m50_6 | -| destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m51_10 | -| destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m51_16 | -| destructors_for_temps.cpp:51:41:51:62 | SideEffect | m51_16 | +| destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m51_12 | +| destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m51_18 | +| destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m51_45 | +| destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m51_49 | +| destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m51_64 | +| destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m51_77 | +| destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m51_81 | +| destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m51_96 | +| destructors_for_temps.cpp:51:41:51:62 | SideEffect | m51_18 | +| destructors_for_temps.cpp:51:41:51:62 | SideEffect | m51_45 | +| destructors_for_temps.cpp:51:41:51:62 | SideEffect | m51_49 | +| destructors_for_temps.cpp:51:41:51:62 | SideEffect | m51_77 | +| destructors_for_temps.cpp:51:41:51:62 | SideEffect | m51_81 | | destructors_for_temps.cpp:51:41:51:62 | SideEffect | ~m50_6 | -| destructors_for_temps.cpp:51:64:51:68 | Arg(1) | 1:r51_18 | -| destructors_for_temps.cpp:51:64:51:68 | CallTarget | func:r51_17 | -| destructors_for_temps.cpp:51:64:51:68 | ChiPartial | partial:m51_19 | -| destructors_for_temps.cpp:51:64:51:68 | ChiTotal | total:m51_14 | -| destructors_for_temps.cpp:51:64:51:68 | SideEffect | ~m51_14 | -| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_30 | -| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_30 | -| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_30 | -| destructors_for_temps.cpp:51:75:51:96 | Arg(this) | this:r51_30 | -| destructors_for_temps.cpp:51:75:51:96 | CallTarget | func:r51_32 | -| destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_34 | +| destructors_for_temps.cpp:51:41:51:62 | SideEffect | ~m51_64 | +| destructors_for_temps.cpp:51:41:51:62 | SideEffect | ~m51_96 | +| destructors_for_temps.cpp:51:41:51:62 | Unary | r51_11 | +| destructors_for_temps.cpp:51:64:51:68 | Arg(1) | 1:r51_20 | +| destructors_for_temps.cpp:51:64:51:68 | CallTarget | func:r51_19 | +| destructors_for_temps.cpp:51:64:51:68 | ChiPartial | partial:m51_21 | +| destructors_for_temps.cpp:51:64:51:68 | ChiTotal | total:m51_16 | +| destructors_for_temps.cpp:51:64:51:68 | SideEffect | ~m51_16 | +| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_32 | +| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_32 | +| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_32 | +| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_60 | +| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_60 | +| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_92 | +| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_92 | +| destructors_for_temps.cpp:51:75:51:96 | Arg(this) | this:r51_32 | +| destructors_for_temps.cpp:51:75:51:96 | Arg(this) | this:r51_60 | +| destructors_for_temps.cpp:51:75:51:96 | Arg(this) | this:r51_92 | +| destructors_for_temps.cpp:51:75:51:96 | CallTarget | func:r51_34 | +| destructors_for_temps.cpp:51:75:51:96 | CallTarget | func:r51_61 | +| destructors_for_temps.cpp:51:75:51:96 | CallTarget | func:r51_93 | | destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_36 | +| destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_38 | +| destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_63 | +| destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_66 | +| destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_95 | +| destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_98 | | destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m50_6 | -| destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_31 | -| destructors_for_temps.cpp:51:75:51:96 | Load | m51_37 | +| destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_33 | +| destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_44 | +| destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_48 | +| destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_56 | +| destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_76 | +| destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_80 | +| destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_88 | +| destructors_for_temps.cpp:51:75:51:96 | Load | m51_39 | +| destructors_for_temps.cpp:51:75:51:96 | SideEffect | m51_44 | +| destructors_for_temps.cpp:51:75:51:96 | SideEffect | m51_48 | +| destructors_for_temps.cpp:51:75:51:96 | SideEffect | m51_76 | +| destructors_for_temps.cpp:51:75:51:96 | SideEffect | m51_80 | | destructors_for_temps.cpp:51:75:51:96 | SideEffect | ~m50_6 | -| destructors_for_temps.cpp:51:75:51:96 | StoreValue | r51_38 | +| destructors_for_temps.cpp:51:75:51:96 | SideEffect | ~m51_56 | +| destructors_for_temps.cpp:51:75:51:96 | SideEffect | ~m51_88 | +| destructors_for_temps.cpp:51:75:51:96 | StoreValue | r51_40 | +| destructors_for_temps.cpp:51:75:51:96 | Unary | r51_32 | | destructors_for_temps.cpp:52:1:52:1 | Address | &:r52_2 | | destructors_for_temps.cpp:52:1:52:1 | Address | &:r52_2 | | destructors_for_temps.cpp:52:1:52:1 | Arg(this) | this:r52_2 | @@ -1045,67 +1200,159 @@ | destructors_for_temps.cpp:52:1:52:1 | ChiPartial | partial:m52_5 | | destructors_for_temps.cpp:52:1:52:1 | ChiPartial | partial:m52_8 | | destructors_for_temps.cpp:52:1:52:1 | ChiTotal | total:m50_8 | -| destructors_for_temps.cpp:52:1:52:1 | ChiTotal | total:m51_35 | +| destructors_for_temps.cpp:52:1:52:1 | ChiTotal | total:m51_72 | +| destructors_for_temps.cpp:52:1:52:1 | ChiTotal | total:m51_104 | | destructors_for_temps.cpp:52:1:52:1 | SideEffect | m50_8 | -| destructors_for_temps.cpp:52:1:52:1 | SideEffect | ~m51_35 | +| destructors_for_temps.cpp:52:1:52:1 | SideEffect | ~m51_72 | +| destructors_for_temps.cpp:52:1:52:1 | SideEffect | ~m51_104 | | destructors_for_temps.cpp:54:6:54:15 | ChiPartial | partial:m54_3 | | destructors_for_temps.cpp:54:6:54:15 | ChiTotal | total:m54_2 | -| destructors_for_temps.cpp:54:6:54:15 | Phi | from 2:~m55_26 | -| destructors_for_temps.cpp:54:6:54:15 | Phi | from 4:~m55_35 | +| destructors_for_temps.cpp:54:6:54:15 | Phi | from 2:~m55_28 | +| destructors_for_temps.cpp:54:6:54:15 | Phi | from 3:~m55_72 | +| destructors_for_temps.cpp:54:6:54:15 | Phi | from 3:~m55_104 | | destructors_for_temps.cpp:54:6:54:15 | SideEffect | ~m54_7 | | destructors_for_temps.cpp:54:22:54:22 | Address | &:r54_5 | | destructors_for_temps.cpp:55:5:55:5 | Address | &:r55_2 | -| destructors_for_temps.cpp:55:5:55:5 | Address | &:r55_39 | | destructors_for_temps.cpp:55:5:55:5 | Address | &:r55_41 | +| destructors_for_temps.cpp:55:5:55:5 | Address | &:r55_43 | | destructors_for_temps.cpp:55:5:55:5 | Condition | r55_3 | | destructors_for_temps.cpp:55:5:55:5 | Load | m54_6 | -| destructors_for_temps.cpp:55:5:55:5 | Load | m55_40 | -| destructors_for_temps.cpp:55:5:55:5 | StoreValue | r55_42 | +| destructors_for_temps.cpp:55:5:55:5 | Load | m55_42 | +| destructors_for_temps.cpp:55:5:55:5 | StoreValue | r55_6 | | destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_1 | -| destructors_for_temps.cpp:55:9:55:71 | Address | &:r55_5 | -| destructors_for_temps.cpp:55:9:55:71 | Address | &:r55_5 | -| destructors_for_temps.cpp:55:9:55:71 | Address | &:r55_5 | -| destructors_for_temps.cpp:55:9:55:71 | Arg(this) | this:r55_5 | -| destructors_for_temps.cpp:55:9:55:71 | CallTarget | func:r55_7 | -| destructors_for_temps.cpp:55:9:55:71 | ChiPartial | partial:m55_25 | +| destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_52 | +| destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_52 | +| destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_84 | +| destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_84 | +| destructors_for_temps.cpp:55:5:55:96 | Arg(this) | this:r55_52 | +| destructors_for_temps.cpp:55:5:55:96 | Arg(this) | this:r55_84 | +| destructors_for_temps.cpp:55:5:55:96 | CallTarget | func:r55_53 | +| destructors_for_temps.cpp:55:5:55:96 | CallTarget | func:r55_85 | +| destructors_for_temps.cpp:55:5:55:96 | ChiPartial | partial:m55_55 | +| destructors_for_temps.cpp:55:5:55:96 | ChiPartial | partial:m55_58 | +| destructors_for_temps.cpp:55:5:55:96 | ChiPartial | partial:m55_87 | +| destructors_for_temps.cpp:55:5:55:96 | ChiPartial | partial:m55_90 | +| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_44 | +| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_47 | +| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_48 | +| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_51 | +| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_76 | +| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_79 | +| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_80 | +| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_83 | +| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:m55_59 | +| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:m55_67 | +| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:m55_75 | +| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:m55_91 | +| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:m55_99 | +| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:m55_107 | +| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:~m55_72 | +| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:~m55_104 | +| destructors_for_temps.cpp:55:5:55:96 | Phi | from 6:m55_39 | +| destructors_for_temps.cpp:55:5:55:96 | Phi | from 6:~m55_37 | +| destructors_for_temps.cpp:55:5:55:96 | SideEffect | m55_44 | +| destructors_for_temps.cpp:55:5:55:96 | SideEffect | m55_48 | +| destructors_for_temps.cpp:55:5:55:96 | SideEffect | m55_76 | +| destructors_for_temps.cpp:55:5:55:96 | SideEffect | m55_80 | +| destructors_for_temps.cpp:55:5:55:96 | SideEffect | ~m55_47 | +| destructors_for_temps.cpp:55:5:55:96 | SideEffect | ~m55_51 | +| destructors_for_temps.cpp:55:5:55:96 | SideEffect | ~m55_79 | +| destructors_for_temps.cpp:55:5:55:96 | SideEffect | ~m55_83 | +| destructors_for_temps.cpp:55:5:55:96 | Unary | r55_1 | +| destructors_for_temps.cpp:55:9:55:71 | Address | &:r55_7 | +| destructors_for_temps.cpp:55:9:55:71 | Address | &:r55_7 | +| destructors_for_temps.cpp:55:9:55:71 | Address | &:r55_7 | +| destructors_for_temps.cpp:55:9:55:71 | Arg(this) | this:r55_7 | +| destructors_for_temps.cpp:55:9:55:71 | CallTarget | func:r55_9 | | destructors_for_temps.cpp:55:9:55:71 | ChiPartial | partial:m55_27 | -| destructors_for_temps.cpp:55:9:55:71 | ChiTotal | total:m55_6 | -| destructors_for_temps.cpp:55:9:55:71 | ChiTotal | total:m55_20 | -| destructors_for_temps.cpp:55:9:55:71 | Load | m55_28 | -| destructors_for_temps.cpp:55:9:55:71 | SideEffect | ~m55_20 | -| destructors_for_temps.cpp:55:36:55:38 | Arg(0) | 0:r55_8 | -| destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_9 | -| destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_9 | -| destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_9 | -| destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_9 | -| destructors_for_temps.cpp:55:41:55:62 | Arg(this) | this:r55_9 | -| destructors_for_temps.cpp:55:41:55:62 | Arg(this) | this:r55_9 | -| destructors_for_temps.cpp:55:41:55:62 | CallTarget | func:r55_11 | -| destructors_for_temps.cpp:55:41:55:62 | ChiPartial | partial:m55_13 | +| destructors_for_temps.cpp:55:9:55:71 | ChiPartial | partial:m55_29 | +| destructors_for_temps.cpp:55:9:55:71 | ChiTotal | total:m55_8 | +| destructors_for_temps.cpp:55:9:55:71 | ChiTotal | total:m55_22 | +| destructors_for_temps.cpp:55:9:55:71 | Load | m55_30 | +| destructors_for_temps.cpp:55:9:55:71 | SideEffect | ~m55_22 | +| destructors_for_temps.cpp:55:36:55:38 | Arg(0) | 0:r55_10 | +| destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_11 | +| destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_11 | +| destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_11 | +| destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_11 | +| destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_68 | +| destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_68 | +| destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_100 | +| destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_100 | +| destructors_for_temps.cpp:55:41:55:62 | Arg(this) | this:r55_11 | +| destructors_for_temps.cpp:55:41:55:62 | Arg(this) | this:r55_11 | +| destructors_for_temps.cpp:55:41:55:62 | Arg(this) | this:r55_68 | +| destructors_for_temps.cpp:55:41:55:62 | Arg(this) | this:r55_100 | +| destructors_for_temps.cpp:55:41:55:62 | CallTarget | func:r55_13 | +| destructors_for_temps.cpp:55:41:55:62 | CallTarget | func:r55_69 | +| destructors_for_temps.cpp:55:41:55:62 | CallTarget | func:r55_101 | | destructors_for_temps.cpp:55:41:55:62 | ChiPartial | partial:m55_15 | -| destructors_for_temps.cpp:55:41:55:62 | ChiPartial | partial:m55_22 | +| destructors_for_temps.cpp:55:41:55:62 | ChiPartial | partial:m55_17 | +| destructors_for_temps.cpp:55:41:55:62 | ChiPartial | partial:m55_24 | +| destructors_for_temps.cpp:55:41:55:62 | ChiPartial | partial:m55_71 | +| destructors_for_temps.cpp:55:41:55:62 | ChiPartial | partial:m55_74 | +| destructors_for_temps.cpp:55:41:55:62 | ChiPartial | partial:m55_103 | +| destructors_for_temps.cpp:55:41:55:62 | ChiPartial | partial:m55_106 | | destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m54_4 | -| destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m55_10 | -| destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m55_16 | -| destructors_for_temps.cpp:55:41:55:62 | SideEffect | m55_16 | +| destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m55_12 | +| destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m55_18 | +| destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m55_46 | +| destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m55_50 | +| destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m55_64 | +| destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m55_78 | +| destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m55_82 | +| destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m55_96 | +| destructors_for_temps.cpp:55:41:55:62 | SideEffect | m55_18 | +| destructors_for_temps.cpp:55:41:55:62 | SideEffect | m55_46 | +| destructors_for_temps.cpp:55:41:55:62 | SideEffect | m55_50 | +| destructors_for_temps.cpp:55:41:55:62 | SideEffect | m55_78 | +| destructors_for_temps.cpp:55:41:55:62 | SideEffect | m55_82 | | destructors_for_temps.cpp:55:41:55:62 | SideEffect | ~m54_4 | -| destructors_for_temps.cpp:55:64:55:68 | Arg(1) | 1:r55_18 | -| destructors_for_temps.cpp:55:64:55:68 | CallTarget | func:r55_17 | -| destructors_for_temps.cpp:55:64:55:68 | ChiPartial | partial:m55_19 | -| destructors_for_temps.cpp:55:64:55:68 | ChiTotal | total:m55_14 | -| destructors_for_temps.cpp:55:64:55:68 | SideEffect | ~m55_14 | -| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_30 | -| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_30 | -| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_30 | -| destructors_for_temps.cpp:55:75:55:96 | Arg(this) | this:r55_30 | -| destructors_for_temps.cpp:55:75:55:96 | CallTarget | func:r55_32 | -| destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_34 | +| destructors_for_temps.cpp:55:41:55:62 | SideEffect | ~m55_64 | +| destructors_for_temps.cpp:55:41:55:62 | SideEffect | ~m55_96 | +| destructors_for_temps.cpp:55:41:55:62 | Unary | r55_11 | +| destructors_for_temps.cpp:55:64:55:68 | Arg(1) | 1:r55_20 | +| destructors_for_temps.cpp:55:64:55:68 | CallTarget | func:r55_19 | +| destructors_for_temps.cpp:55:64:55:68 | ChiPartial | partial:m55_21 | +| destructors_for_temps.cpp:55:64:55:68 | ChiTotal | total:m55_16 | +| destructors_for_temps.cpp:55:64:55:68 | SideEffect | ~m55_16 | +| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_32 | +| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_32 | +| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_32 | +| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_60 | +| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_60 | +| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_92 | +| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_92 | +| destructors_for_temps.cpp:55:75:55:96 | Arg(this) | this:r55_32 | +| destructors_for_temps.cpp:55:75:55:96 | Arg(this) | this:r55_60 | +| destructors_for_temps.cpp:55:75:55:96 | Arg(this) | this:r55_92 | +| destructors_for_temps.cpp:55:75:55:96 | CallTarget | func:r55_34 | +| destructors_for_temps.cpp:55:75:55:96 | CallTarget | func:r55_61 | +| destructors_for_temps.cpp:55:75:55:96 | CallTarget | func:r55_93 | | destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_36 | +| destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_38 | +| destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_63 | +| destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_66 | +| destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_95 | +| destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_98 | | destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m54_4 | -| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_31 | -| destructors_for_temps.cpp:55:75:55:96 | Load | m55_37 | +| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_33 | +| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_45 | +| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_49 | +| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_56 | +| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_77 | +| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_81 | +| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_88 | +| destructors_for_temps.cpp:55:75:55:96 | Load | m55_39 | +| destructors_for_temps.cpp:55:75:55:96 | SideEffect | m55_45 | +| destructors_for_temps.cpp:55:75:55:96 | SideEffect | m55_49 | +| destructors_for_temps.cpp:55:75:55:96 | SideEffect | m55_77 | +| destructors_for_temps.cpp:55:75:55:96 | SideEffect | m55_81 | | destructors_for_temps.cpp:55:75:55:96 | SideEffect | ~m54_4 | -| destructors_for_temps.cpp:55:75:55:96 | StoreValue | r55_38 | +| destructors_for_temps.cpp:55:75:55:96 | SideEffect | ~m55_56 | +| destructors_for_temps.cpp:55:75:55:96 | SideEffect | ~m55_88 | +| destructors_for_temps.cpp:55:75:55:96 | StoreValue | r55_40 | +| destructors_for_temps.cpp:55:75:55:96 | Unary | r55_32 | | file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_1 | @@ -1390,12 +1637,12 @@ | file://:0:0:0:0 | Load | m1883_6 | | file://:0:0:0:0 | Load | m1888_6 | | file://:0:0:0:0 | Load | m2062_6 | -| file://:0:0:0:0 | Load | m2201_40 | -| file://:0:0:0:0 | Load | m2204_40 | +| file://:0:0:0:0 | Load | m2201_48 | +| file://:0:0:0:0 | Load | m2204_48 | | file://:0:0:0:0 | Load | m2210_36 | -| file://:0:0:0:0 | Load | m2215_40 | -| file://:0:0:0:0 | Load | m2293_46 | -| file://:0:0:0:0 | Load | m2416_53 | +| file://:0:0:0:0 | Load | m2215_48 | +| file://:0:0:0:0 | Load | m2293_54 | +| file://:0:0:0:0 | Load | m2416_61 | | file://:0:0:0:0 | Load | ~m0_4 | | file://:0:0:0:0 | Load | ~m1493_6 | | file://:0:0:0:0 | Load | ~m1761_10 | @@ -1427,28 +1674,28 @@ | file://:0:0:0:0 | SideEffect | m1133_19 | | file://:0:0:0:0 | SideEffect | m2201_13 | | file://:0:0:0:0 | SideEffect | m2201_13 | -| file://:0:0:0:0 | SideEffect | m2201_30 | -| file://:0:0:0:0 | SideEffect | m2201_30 | +| file://:0:0:0:0 | SideEffect | m2201_38 | +| file://:0:0:0:0 | SideEffect | m2201_38 | | file://:0:0:0:0 | SideEffect | m2204_13 | | file://:0:0:0:0 | SideEffect | m2204_13 | -| file://:0:0:0:0 | SideEffect | m2204_30 | -| file://:0:0:0:0 | SideEffect | m2204_30 | +| file://:0:0:0:0 | SideEffect | m2204_38 | +| file://:0:0:0:0 | SideEffect | m2204_38 | | file://:0:0:0:0 | SideEffect | m2210_9 | | file://:0:0:0:0 | SideEffect | m2210_9 | | file://:0:0:0:0 | SideEffect | m2210_26 | | file://:0:0:0:0 | SideEffect | m2210_26 | | file://:0:0:0:0 | SideEffect | m2215_13 | | file://:0:0:0:0 | SideEffect | m2215_13 | -| file://:0:0:0:0 | SideEffect | m2215_30 | -| file://:0:0:0:0 | SideEffect | m2215_30 | +| file://:0:0:0:0 | SideEffect | m2215_38 | +| file://:0:0:0:0 | SideEffect | m2215_38 | | file://:0:0:0:0 | SideEffect | m2293_21 | | file://:0:0:0:0 | SideEffect | m2293_21 | -| file://:0:0:0:0 | SideEffect | m2293_36 | -| file://:0:0:0:0 | SideEffect | m2293_36 | -| file://:0:0:0:0 | SideEffect | m2416_28 | -| file://:0:0:0:0 | SideEffect | m2416_28 | -| file://:0:0:0:0 | SideEffect | m2416_43 | -| file://:0:0:0:0 | SideEffect | m2416_43 | +| file://:0:0:0:0 | SideEffect | m2293_44 | +| file://:0:0:0:0 | SideEffect | m2293_44 | +| file://:0:0:0:0 | SideEffect | m2416_36 | +| file://:0:0:0:0 | SideEffect | m2416_36 | +| file://:0:0:0:0 | SideEffect | m2416_51 | +| file://:0:0:0:0 | SideEffect | m2416_51 | | file://:0:0:0:0 | SideEffect | ~m0_4 | | file://:0:0:0:0 | SideEffect | ~m0_4 | | file://:0:0:0:0 | SideEffect | ~m0_4 | @@ -1467,15 +1714,15 @@ | file://:0:0:0:0 | SideEffect | ~m1289_4 | | file://:0:0:0:0 | SideEffect | ~m1496_6 | | file://:0:0:0:0 | SideEffect | ~m1888_8 | -| file://:0:0:0:0 | SideEffect | ~m2201_29 | -| file://:0:0:0:0 | SideEffect | ~m2204_29 | +| file://:0:0:0:0 | SideEffect | ~m2201_37 | +| file://:0:0:0:0 | SideEffect | ~m2204_37 | | file://:0:0:0:0 | SideEffect | ~m2210_25 | -| file://:0:0:0:0 | SideEffect | ~m2215_29 | +| file://:0:0:0:0 | SideEffect | ~m2215_37 | | file://:0:0:0:0 | SideEffect | ~m2222_6 | | file://:0:0:0:0 | SideEffect | ~m2226_4 | | file://:0:0:0:0 | SideEffect | ~m2233_6 | -| file://:0:0:0:0 | SideEffect | ~m2293_35 | -| file://:0:0:0:0 | SideEffect | ~m2416_42 | +| file://:0:0:0:0 | SideEffect | ~m2293_43 | +| file://:0:0:0:0 | SideEffect | ~m2416_50 | | file://:0:0:0:0 | StoreValue | r0_1 | | file://:0:0:0:0 | StoreValue | r0_1 | | file://:0:0:0:0 | StoreValue | r0_1 | @@ -4639,15 +4886,26 @@ | ir.cpp:809:7:809:13 | Address | &:r809_3 | | ir.cpp:809:7:809:13 | Address | &:r809_3 | | ir.cpp:809:7:809:13 | Address | &:r809_16 | +| ir.cpp:809:7:809:13 | Address | &:r809_24 | +| ir.cpp:809:7:809:13 | Address | &:r809_24 | | ir.cpp:809:7:809:13 | Arg(0) | 0:r809_16 | | ir.cpp:809:7:809:13 | Arg(this) | this:r809_3 | +| ir.cpp:809:7:809:13 | Arg(this) | this:r809_24 | | ir.cpp:809:7:809:13 | CallTarget | func:r809_5 | +| ir.cpp:809:7:809:13 | CallTarget | func:r809_25 | | ir.cpp:809:7:809:13 | ChiPartial | partial:m809_10 | | ir.cpp:809:7:809:13 | ChiPartial | partial:m809_13 | +| ir.cpp:809:7:809:13 | ChiPartial | partial:m809_27 | +| ir.cpp:809:7:809:13 | ChiPartial | partial:m809_30 | | ir.cpp:809:7:809:13 | ChiTotal | total:m808_8 | | ir.cpp:809:7:809:13 | ChiTotal | total:m809_4 | +| ir.cpp:809:7:809:13 | ChiTotal | total:m809_14 | +| ir.cpp:809:7:809:13 | ChiTotal | total:m809_19 | +| ir.cpp:809:7:809:13 | SideEffect | m809_14 | | ir.cpp:809:7:809:13 | SideEffect | ~m808_8 | | ir.cpp:809:7:809:13 | SideEffect | ~m809_14 | +| ir.cpp:809:7:809:13 | SideEffect | ~m809_19 | +| ir.cpp:809:7:809:13 | Unary | r809_3 | | ir.cpp:809:7:809:13 | Unary | r809_3 | | ir.cpp:809:7:809:13 | Unary | r809_15 | | ir.cpp:809:13:809:13 | Address | &:r809_8 | @@ -4669,15 +4927,26 @@ | ir.cpp:810:7:810:26 | Address | &:r810_3 | | ir.cpp:810:7:810:26 | Address | &:r810_3 | | ir.cpp:810:7:810:26 | Address | &:r810_16 | +| ir.cpp:810:7:810:26 | Address | &:r810_24 | +| ir.cpp:810:7:810:26 | Address | &:r810_24 | | ir.cpp:810:7:810:26 | Arg(0) | 0:r810_16 | | ir.cpp:810:7:810:26 | Arg(this) | this:r810_3 | +| ir.cpp:810:7:810:26 | Arg(this) | this:r810_24 | | ir.cpp:810:7:810:26 | CallTarget | func:r810_5 | +| ir.cpp:810:7:810:26 | CallTarget | func:r810_25 | | ir.cpp:810:7:810:26 | ChiPartial | partial:m810_10 | | ir.cpp:810:7:810:26 | ChiPartial | partial:m810_13 | -| ir.cpp:810:7:810:26 | ChiTotal | total:m809_19 | +| ir.cpp:810:7:810:26 | ChiPartial | partial:m810_27 | +| ir.cpp:810:7:810:26 | ChiPartial | partial:m810_30 | +| ir.cpp:810:7:810:26 | ChiTotal | total:m809_28 | | ir.cpp:810:7:810:26 | ChiTotal | total:m810_4 | -| ir.cpp:810:7:810:26 | SideEffect | ~m809_19 | +| ir.cpp:810:7:810:26 | ChiTotal | total:m810_14 | +| ir.cpp:810:7:810:26 | ChiTotal | total:m810_19 | +| ir.cpp:810:7:810:26 | SideEffect | m810_14 | +| ir.cpp:810:7:810:26 | SideEffect | ~m809_28 | | ir.cpp:810:7:810:26 | SideEffect | ~m810_14 | +| ir.cpp:810:7:810:26 | SideEffect | ~m810_19 | +| ir.cpp:810:7:810:26 | Unary | r810_3 | | ir.cpp:810:7:810:26 | Unary | r810_3 | | ir.cpp:810:7:810:26 | Unary | r810_15 | | ir.cpp:810:25:810:25 | Address | &:r810_8 | @@ -4713,8 +4982,8 @@ | ir.cpp:816:3:816:3 | SideEffect | m801_8 | | ir.cpp:816:5:816:5 | CallTarget | func:r816_2 | | ir.cpp:816:5:816:5 | ChiPartial | partial:m816_8 | -| ir.cpp:816:5:816:5 | ChiTotal | total:m810_19 | -| ir.cpp:816:5:816:5 | SideEffect | ~m810_19 | +| ir.cpp:816:5:816:5 | ChiTotal | total:m810_28 | +| ir.cpp:816:5:816:5 | SideEffect | ~m810_28 | | ir.cpp:816:5:816:5 | Unary | r816_7 | | ir.cpp:816:7:816:16 | Address | &:r816_6 | | ir.cpp:816:7:816:16 | Arg(0) | 0:r816_6 | @@ -4785,15 +5054,26 @@ | ir.cpp:823:7:823:13 | Address | &:r823_3 | | ir.cpp:823:7:823:13 | Address | &:r823_3 | | ir.cpp:823:7:823:13 | Address | &:r823_17 | +| ir.cpp:823:7:823:13 | Address | &:r823_25 | +| ir.cpp:823:7:823:13 | Address | &:r823_25 | | ir.cpp:823:7:823:13 | Arg(0) | 0:r823_17 | | ir.cpp:823:7:823:13 | Arg(this) | this:r823_3 | +| ir.cpp:823:7:823:13 | Arg(this) | this:r823_25 | | ir.cpp:823:7:823:13 | CallTarget | func:r823_5 | +| ir.cpp:823:7:823:13 | CallTarget | func:r823_26 | | ir.cpp:823:7:823:13 | ChiPartial | partial:m823_11 | | ir.cpp:823:7:823:13 | ChiPartial | partial:m823_14 | +| ir.cpp:823:7:823:13 | ChiPartial | partial:m823_28 | +| ir.cpp:823:7:823:13 | ChiPartial | partial:m823_31 | | ir.cpp:823:7:823:13 | ChiTotal | total:m822_9 | | ir.cpp:823:7:823:13 | ChiTotal | total:m823_4 | +| ir.cpp:823:7:823:13 | ChiTotal | total:m823_15 | +| ir.cpp:823:7:823:13 | ChiTotal | total:m823_20 | +| ir.cpp:823:7:823:13 | SideEffect | m823_15 | | ir.cpp:823:7:823:13 | SideEffect | ~m822_9 | | ir.cpp:823:7:823:13 | SideEffect | ~m823_15 | +| ir.cpp:823:7:823:13 | SideEffect | ~m823_20 | +| ir.cpp:823:7:823:13 | Unary | r823_3 | | ir.cpp:823:7:823:13 | Unary | r823_3 | | ir.cpp:823:7:823:13 | Unary | r823_16 | | ir.cpp:823:13:823:13 | Address | &:r823_9 | @@ -4816,15 +5096,26 @@ | ir.cpp:824:7:824:26 | Address | &:r824_3 | | ir.cpp:824:7:824:26 | Address | &:r824_3 | | ir.cpp:824:7:824:26 | Address | &:r824_17 | +| ir.cpp:824:7:824:26 | Address | &:r824_25 | +| ir.cpp:824:7:824:26 | Address | &:r824_25 | | ir.cpp:824:7:824:26 | Arg(0) | 0:r824_17 | | ir.cpp:824:7:824:26 | Arg(this) | this:r824_3 | +| ir.cpp:824:7:824:26 | Arg(this) | this:r824_25 | | ir.cpp:824:7:824:26 | CallTarget | func:r824_5 | +| ir.cpp:824:7:824:26 | CallTarget | func:r824_26 | | ir.cpp:824:7:824:26 | ChiPartial | partial:m824_11 | | ir.cpp:824:7:824:26 | ChiPartial | partial:m824_14 | -| ir.cpp:824:7:824:26 | ChiTotal | total:m823_20 | +| ir.cpp:824:7:824:26 | ChiPartial | partial:m824_28 | +| ir.cpp:824:7:824:26 | ChiPartial | partial:m824_31 | +| ir.cpp:824:7:824:26 | ChiTotal | total:m823_29 | | ir.cpp:824:7:824:26 | ChiTotal | total:m824_4 | -| ir.cpp:824:7:824:26 | SideEffect | ~m823_20 | +| ir.cpp:824:7:824:26 | ChiTotal | total:m824_15 | +| ir.cpp:824:7:824:26 | ChiTotal | total:m824_20 | +| ir.cpp:824:7:824:26 | SideEffect | m824_15 | +| ir.cpp:824:7:824:26 | SideEffect | ~m823_29 | | ir.cpp:824:7:824:26 | SideEffect | ~m824_15 | +| ir.cpp:824:7:824:26 | SideEffect | ~m824_20 | +| ir.cpp:824:7:824:26 | Unary | r824_3 | | ir.cpp:824:7:824:26 | Unary | r824_3 | | ir.cpp:824:7:824:26 | Unary | r824_16 | | ir.cpp:824:25:824:25 | Address | &:r824_9 | @@ -4864,8 +5155,8 @@ | ir.cpp:830:3:830:3 | SideEffect | m802_8 | | ir.cpp:830:5:830:5 | CallTarget | func:r830_2 | | ir.cpp:830:5:830:5 | ChiPartial | partial:m830_9 | -| ir.cpp:830:5:830:5 | ChiTotal | total:m824_20 | -| ir.cpp:830:5:830:5 | SideEffect | ~m824_20 | +| ir.cpp:830:5:830:5 | ChiTotal | total:m824_29 | +| ir.cpp:830:5:830:5 | SideEffect | ~m824_29 | | ir.cpp:830:5:830:5 | Unary | r830_8 | | ir.cpp:830:7:830:17 | Address | &:r830_7 | | ir.cpp:830:7:830:17 | Arg(0) | 0:r830_7 | @@ -7373,17 +7664,28 @@ | ir.cpp:1419:23:1419:27 | Address | &:r1419_2 | | ir.cpp:1419:23:1419:27 | Address | &:r1419_6 | | ir.cpp:1419:23:1419:27 | Address | &:r1419_13 | +| ir.cpp:1419:23:1419:27 | Address | &:r1419_18 | +| ir.cpp:1419:23:1419:27 | Address | &:r1419_18 | | ir.cpp:1419:23:1419:27 | Arg(0) | 0:r1419_6 | | ir.cpp:1419:23:1419:27 | Arg(0) | 0:r1419_13 | | ir.cpp:1419:23:1419:27 | Arg(this) | this:r1419_2 | +| ir.cpp:1419:23:1419:27 | Arg(this) | this:r1419_18 | | ir.cpp:1419:23:1419:27 | CallTarget | func:r1419_4 | +| ir.cpp:1419:23:1419:27 | CallTarget | func:r1419_19 | | ir.cpp:1419:23:1419:27 | ChiPartial | partial:m1419_8 | | ir.cpp:1419:23:1419:27 | ChiPartial | partial:m1419_11 | +| ir.cpp:1419:23:1419:27 | ChiPartial | partial:m1419_21 | +| ir.cpp:1419:23:1419:27 | ChiPartial | partial:m1419_24 | | ir.cpp:1419:23:1419:27 | ChiTotal | total:m1418_7 | | ir.cpp:1419:23:1419:27 | ChiTotal | total:m1419_3 | +| ir.cpp:1419:23:1419:27 | ChiTotal | total:m1419_12 | +| ir.cpp:1419:23:1419:27 | ChiTotal | total:m1419_16 | +| ir.cpp:1419:23:1419:27 | SideEffect | m1419_12 | | ir.cpp:1419:23:1419:27 | SideEffect | ~m1414_3 | | ir.cpp:1419:23:1419:27 | SideEffect | ~m1418_7 | | ir.cpp:1419:23:1419:27 | SideEffect | ~m1419_12 | +| ir.cpp:1419:23:1419:27 | SideEffect | ~m1419_16 | +| ir.cpp:1419:23:1419:27 | Unary | r1419_2 | | ir.cpp:1419:23:1419:27 | Unary | r1419_2 | | ir.cpp:1419:23:1419:27 | Unary | r1419_5 | | ir.cpp:1420:5:1420:15 | CallTarget | func:r1420_1 | @@ -7394,17 +7696,28 @@ | ir.cpp:1420:17:1420:17 | Address | &:r1420_2 | | ir.cpp:1420:17:1420:17 | Address | &:r1420_2 | | ir.cpp:1420:17:1420:17 | Address | &:r1420_7 | +| ir.cpp:1420:17:1420:17 | Address | &:r1420_18 | +| ir.cpp:1420:17:1420:17 | Address | &:r1420_18 | | ir.cpp:1420:17:1420:17 | Arg(0) | 0:r1420_7 | | ir.cpp:1420:17:1420:17 | Arg(0) | 0:r1420_14 | | ir.cpp:1420:17:1420:17 | Arg(this) | this:r1420_2 | +| ir.cpp:1420:17:1420:17 | Arg(this) | this:r1420_18 | | ir.cpp:1420:17:1420:17 | CallTarget | func:r1420_4 | +| ir.cpp:1420:17:1420:17 | CallTarget | func:r1420_19 | | ir.cpp:1420:17:1420:17 | ChiPartial | partial:m1420_9 | | ir.cpp:1420:17:1420:17 | ChiPartial | partial:m1420_12 | -| ir.cpp:1420:17:1420:17 | ChiTotal | total:m1419_16 | +| ir.cpp:1420:17:1420:17 | ChiPartial | partial:m1420_21 | +| ir.cpp:1420:17:1420:17 | ChiPartial | partial:m1420_24 | +| ir.cpp:1420:17:1420:17 | ChiTotal | total:m1419_22 | | ir.cpp:1420:17:1420:17 | ChiTotal | total:m1420_3 | +| ir.cpp:1420:17:1420:17 | ChiTotal | total:m1420_13 | +| ir.cpp:1420:17:1420:17 | ChiTotal | total:m1420_17 | | ir.cpp:1420:17:1420:17 | Load | m1420_13 | +| ir.cpp:1420:17:1420:17 | SideEffect | m1420_13 | | ir.cpp:1420:17:1420:17 | SideEffect | ~m1415_6 | -| ir.cpp:1420:17:1420:17 | SideEffect | ~m1419_16 | +| ir.cpp:1420:17:1420:17 | SideEffect | ~m1419_22 | +| ir.cpp:1420:17:1420:17 | SideEffect | ~m1420_17 | +| ir.cpp:1420:17:1420:17 | Unary | r1420_2 | | ir.cpp:1420:17:1420:17 | Unary | r1420_5 | | ir.cpp:1420:17:1420:17 | Unary | r1420_6 | | ir.cpp:1421:5:1421:23 | CallTarget | func:r1421_1 | @@ -7415,30 +7728,52 @@ | ir.cpp:1421:25:1421:29 | Address | &:r1421_2 | | ir.cpp:1421:25:1421:29 | Address | &:r1421_2 | | ir.cpp:1421:25:1421:29 | Address | &:r1421_6 | +| ir.cpp:1421:25:1421:29 | Address | &:r1421_17 | +| ir.cpp:1421:25:1421:29 | Address | &:r1421_17 | | ir.cpp:1421:25:1421:29 | Arg(0) | 0:r1421_6 | | ir.cpp:1421:25:1421:29 | Arg(0) | 0:r1421_13 | | ir.cpp:1421:25:1421:29 | Arg(this) | this:r1421_2 | +| ir.cpp:1421:25:1421:29 | Arg(this) | this:r1421_17 | | ir.cpp:1421:25:1421:29 | CallTarget | func:r1421_4 | +| ir.cpp:1421:25:1421:29 | CallTarget | func:r1421_18 | | ir.cpp:1421:25:1421:29 | ChiPartial | partial:m1421_8 | | ir.cpp:1421:25:1421:29 | ChiPartial | partial:m1421_11 | -| ir.cpp:1421:25:1421:29 | ChiTotal | total:m1420_17 | +| ir.cpp:1421:25:1421:29 | ChiPartial | partial:m1421_20 | +| ir.cpp:1421:25:1421:29 | ChiPartial | partial:m1421_23 | +| ir.cpp:1421:25:1421:29 | ChiTotal | total:m1420_22 | | ir.cpp:1421:25:1421:29 | ChiTotal | total:m1421_3 | +| ir.cpp:1421:25:1421:29 | ChiTotal | total:m1421_12 | +| ir.cpp:1421:25:1421:29 | ChiTotal | total:m1421_16 | | ir.cpp:1421:25:1421:29 | Load | m1421_12 | +| ir.cpp:1421:25:1421:29 | SideEffect | m1421_12 | | ir.cpp:1421:25:1421:29 | SideEffect | ~m1414_3 | -| ir.cpp:1421:25:1421:29 | SideEffect | ~m1420_17 | +| ir.cpp:1421:25:1421:29 | SideEffect | ~m1420_22 | +| ir.cpp:1421:25:1421:29 | SideEffect | ~m1421_16 | +| ir.cpp:1421:25:1421:29 | Unary | r1421_2 | | ir.cpp:1421:25:1421:29 | Unary | r1421_5 | | ir.cpp:1422:5:1422:12 | Address | &:r1422_1 | | ir.cpp:1422:5:1422:12 | Address | &:r1422_1 | | ir.cpp:1422:5:1422:12 | Address | &:r1422_9 | +| ir.cpp:1422:5:1422:12 | Address | &:r1422_15 | +| ir.cpp:1422:5:1422:12 | Address | &:r1422_15 | | ir.cpp:1422:5:1422:12 | Arg(this) | this:r1422_1 | | ir.cpp:1422:5:1422:12 | Arg(this) | this:r1422_9 | +| ir.cpp:1422:5:1422:12 | Arg(this) | this:r1422_15 | | ir.cpp:1422:5:1422:12 | CallTarget | func:r1422_3 | +| ir.cpp:1422:5:1422:12 | CallTarget | func:r1422_16 | | ir.cpp:1422:5:1422:12 | ChiPartial | partial:m1422_5 | | ir.cpp:1422:5:1422:12 | ChiPartial | partial:m1422_7 | -| ir.cpp:1422:5:1422:12 | ChiTotal | total:m1421_16 | +| ir.cpp:1422:5:1422:12 | ChiPartial | partial:m1422_18 | +| ir.cpp:1422:5:1422:12 | ChiPartial | partial:m1422_21 | +| ir.cpp:1422:5:1422:12 | ChiTotal | total:m1421_21 | | ir.cpp:1422:5:1422:12 | ChiTotal | total:m1422_2 | +| ir.cpp:1422:5:1422:12 | ChiTotal | total:m1422_8 | +| ir.cpp:1422:5:1422:12 | ChiTotal | total:m1422_13 | +| ir.cpp:1422:5:1422:12 | SideEffect | m1422_8 | | ir.cpp:1422:5:1422:12 | SideEffect | m1422_8 | -| ir.cpp:1422:5:1422:12 | SideEffect | ~m1421_16 | +| ir.cpp:1422:5:1422:12 | SideEffect | ~m1421_21 | +| ir.cpp:1422:5:1422:12 | SideEffect | ~m1422_13 | +| ir.cpp:1422:5:1422:12 | Unary | r1422_1 | | ir.cpp:1422:5:1422:12 | Unary | r1422_1 | | ir.cpp:1422:14:1422:18 | CallTarget | func:r1422_10 | | ir.cpp:1422:14:1422:18 | ChiPartial | partial:m1422_12 | @@ -7446,13 +7781,24 @@ | ir.cpp:1422:14:1422:18 | SideEffect | ~m1422_6 | | ir.cpp:1423:5:1423:23 | CallTarget | func:r1423_2 | | ir.cpp:1423:5:1423:23 | ChiPartial | partial:m1423_4 | -| ir.cpp:1423:5:1423:23 | ChiTotal | total:m1422_13 | -| ir.cpp:1423:5:1423:23 | SideEffect | ~m1422_13 | +| ir.cpp:1423:5:1423:23 | ChiTotal | total:m1422_19 | +| ir.cpp:1423:5:1423:23 | SideEffect | ~m1422_19 | | ir.cpp:1423:5:1423:23 | StoreValue | r1423_3 | | ir.cpp:1423:5:1423:25 | Address | &:r1423_1 | | ir.cpp:1423:5:1423:25 | Address | &:r1423_7 | +| ir.cpp:1423:5:1423:25 | Address | &:r1423_13 | +| ir.cpp:1423:5:1423:25 | Address | &:r1423_13 | | ir.cpp:1423:5:1423:25 | Arg(this) | this:r1423_7 | +| ir.cpp:1423:5:1423:25 | Arg(this) | this:r1423_13 | +| ir.cpp:1423:5:1423:25 | CallTarget | func:r1423_14 | +| ir.cpp:1423:5:1423:25 | ChiPartial | partial:m1423_16 | +| ir.cpp:1423:5:1423:25 | ChiPartial | partial:m1423_19 | +| ir.cpp:1423:5:1423:25 | ChiTotal | total:m1423_6 | +| ir.cpp:1423:5:1423:25 | ChiTotal | total:m1423_11 | +| ir.cpp:1423:5:1423:25 | SideEffect | m1423_6 | | ir.cpp:1423:5:1423:25 | SideEffect | m1423_6 | +| ir.cpp:1423:5:1423:25 | SideEffect | ~m1423_11 | +| ir.cpp:1423:5:1423:25 | Unary | r1423_1 | | ir.cpp:1423:5:1423:25 | Unary | r1423_1 | | ir.cpp:1423:27:1423:31 | CallTarget | func:r1423_8 | | ir.cpp:1423:27:1423:31 | ChiPartial | partial:m1423_10 | @@ -7460,10 +7806,21 @@ | ir.cpp:1423:27:1423:31 | SideEffect | ~m1423_5 | | ir.cpp:1425:5:1425:28 | CallTarget | func:r1425_2 | | ir.cpp:1425:5:1425:28 | ChiPartial | partial:m1425_4 | -| ir.cpp:1425:5:1425:28 | ChiTotal | total:m1423_11 | -| ir.cpp:1425:5:1425:28 | SideEffect | ~m1423_11 | +| ir.cpp:1425:5:1425:28 | ChiTotal | total:m1423_17 | +| ir.cpp:1425:5:1425:28 | SideEffect | ~m1423_17 | | ir.cpp:1425:5:1425:28 | StoreValue | r1425_3 | | ir.cpp:1425:5:1425:30 | Address | &:r1425_1 | +| ir.cpp:1425:5:1425:30 | Address | &:r1425_6 | +| ir.cpp:1425:5:1425:30 | Address | &:r1425_6 | +| ir.cpp:1425:5:1425:30 | Arg(this) | this:r1425_6 | +| ir.cpp:1425:5:1425:30 | CallTarget | func:r1425_7 | +| ir.cpp:1425:5:1425:30 | ChiPartial | partial:m1425_9 | +| ir.cpp:1425:5:1425:30 | ChiPartial | partial:m1425_12 | +| ir.cpp:1425:5:1425:30 | ChiTotal | total:m1425_5 | +| ir.cpp:1425:5:1425:30 | ChiTotal | total:~m? | +| ir.cpp:1425:5:1425:30 | SideEffect | ~m1425_5 | +| ir.cpp:1425:5:1425:30 | SideEffect | ~m? | +| ir.cpp:1425:5:1425:30 | Unary | r1425_1 | | ir.cpp:1426:1:1426:1 | Address | &:r1426_2 | | ir.cpp:1426:1:1426:1 | Address | &:r1426_2 | | ir.cpp:1426:1:1426:1 | Address | &:r1426_10 | @@ -7478,11 +7835,11 @@ | ir.cpp:1426:1:1426:1 | ChiPartial | partial:m1426_16 | | ir.cpp:1426:1:1426:1 | ChiTotal | total:m1415_6 | | ir.cpp:1426:1:1426:1 | ChiTotal | total:m1416_7 | -| ir.cpp:1426:1:1426:1 | ChiTotal | total:m1425_5 | +| ir.cpp:1426:1:1426:1 | ChiTotal | total:m1425_10 | | ir.cpp:1426:1:1426:1 | ChiTotal | total:m1426_6 | | ir.cpp:1426:1:1426:1 | SideEffect | m1415_6 | | ir.cpp:1426:1:1426:1 | SideEffect | m1416_7 | -| ir.cpp:1426:1:1426:1 | SideEffect | ~m1425_5 | +| ir.cpp:1426:1:1426:1 | SideEffect | ~m1425_10 | | ir.cpp:1426:1:1426:1 | SideEffect | ~m1426_6 | | ir.cpp:1428:6:1428:30 | ChiPartial | partial:m1428_3 | | ir.cpp:1428:6:1428:30 | ChiTotal | total:m1428_2 | @@ -7521,44 +7878,88 @@ | ir.cpp:1433:17:1433:17 | Address | &:r1433_2 | | ir.cpp:1433:17:1433:17 | Address | &:r1433_2 | | ir.cpp:1433:17:1433:17 | Address | &:r1433_3 | +| ir.cpp:1433:17:1433:17 | Address | &:r1433_10 | +| ir.cpp:1433:17:1433:17 | Address | &:r1433_10 | | ir.cpp:1433:17:1433:17 | Arg(0) | 0:r1433_6 | +| ir.cpp:1433:17:1433:17 | Arg(this) | this:r1433_10 | +| ir.cpp:1433:17:1433:17 | CallTarget | func:r1433_11 | +| ir.cpp:1433:17:1433:17 | ChiPartial | partial:m1433_13 | +| ir.cpp:1433:17:1433:17 | ChiPartial | partial:m1433_16 | +| ir.cpp:1433:17:1433:17 | ChiTotal | total:m1433_5 | +| ir.cpp:1433:17:1433:17 | ChiTotal | total:m1433_9 | | ir.cpp:1433:17:1433:17 | Load | m1429_6 | | ir.cpp:1433:17:1433:17 | Load | m1433_5 | +| ir.cpp:1433:17:1433:17 | SideEffect | m1433_5 | +| ir.cpp:1433:17:1433:17 | SideEffect | ~m1433_9 | | ir.cpp:1433:17:1433:17 | StoreValue | r1433_4 | +| ir.cpp:1433:17:1433:17 | Unary | r1433_2 | | ir.cpp:1434:5:1434:21 | Address | &:r1434_1 | | ir.cpp:1434:5:1434:21 | Address | &:r1434_1 | | ir.cpp:1434:5:1434:21 | Address | &:r1434_1 | +| ir.cpp:1434:5:1434:21 | Address | &:r1434_11 | +| ir.cpp:1434:5:1434:21 | Address | &:r1434_11 | | ir.cpp:1434:5:1434:21 | Arg(this) | this:r1434_1 | +| ir.cpp:1434:5:1434:21 | Arg(this) | this:r1434_11 | +| ir.cpp:1434:5:1434:21 | CallTarget | func:r1434_12 | | ir.cpp:1434:5:1434:21 | ChiPartial | partial:m1434_9 | +| ir.cpp:1434:5:1434:21 | ChiPartial | partial:m1434_14 | +| ir.cpp:1434:5:1434:21 | ChiPartial | partial:m1434_17 | | ir.cpp:1434:5:1434:21 | ChiTotal | total:m1434_3 | +| ir.cpp:1434:5:1434:21 | ChiTotal | total:m1434_7 | +| ir.cpp:1434:5:1434:21 | ChiTotal | total:m1434_10 | | ir.cpp:1434:5:1434:21 | SideEffect | m1434_3 | +| ir.cpp:1434:5:1434:21 | SideEffect | m1434_10 | +| ir.cpp:1434:5:1434:21 | SideEffect | ~m1434_7 | | ir.cpp:1434:5:1434:21 | StoreValue | r1434_2 | +| ir.cpp:1434:5:1434:21 | Unary | r1434_1 | | ir.cpp:1434:23:1434:28 | CallTarget | func:r1434_4 | | ir.cpp:1434:23:1434:28 | ChiPartial | partial:m1434_6 | -| ir.cpp:1434:23:1434:28 | ChiTotal | total:m1433_9 | -| ir.cpp:1434:23:1434:28 | SideEffect | ~m1433_9 | +| ir.cpp:1434:23:1434:28 | ChiTotal | total:m1433_14 | +| ir.cpp:1434:23:1434:28 | SideEffect | ~m1433_14 | | ir.cpp:1435:5:1435:32 | CallTarget | func:r1435_2 | | ir.cpp:1435:5:1435:32 | ChiPartial | partial:m1435_4 | -| ir.cpp:1435:5:1435:32 | ChiTotal | total:m1434_7 | -| ir.cpp:1435:5:1435:32 | SideEffect | ~m1434_7 | +| ir.cpp:1435:5:1435:32 | ChiTotal | total:m1434_15 | +| ir.cpp:1435:5:1435:32 | SideEffect | ~m1434_15 | | ir.cpp:1435:5:1435:32 | StoreValue | r1435_3 | | ir.cpp:1435:5:1435:34 | Address | &:r1435_1 | | ir.cpp:1435:5:1435:34 | Address | &:r1435_1 | | ir.cpp:1435:5:1435:34 | Address | &:r1435_1 | +| ir.cpp:1435:5:1435:34 | Address | &:r1435_14 | +| ir.cpp:1435:5:1435:34 | Address | &:r1435_14 | | ir.cpp:1435:5:1435:34 | Arg(this) | this:r1435_1 | +| ir.cpp:1435:5:1435:34 | Arg(this) | this:r1435_14 | +| ir.cpp:1435:5:1435:34 | CallTarget | func:r1435_15 | | ir.cpp:1435:5:1435:34 | ChiPartial | partial:m1435_12 | +| ir.cpp:1435:5:1435:34 | ChiPartial | partial:m1435_17 | +| ir.cpp:1435:5:1435:34 | ChiPartial | partial:m1435_20 | | ir.cpp:1435:5:1435:34 | ChiTotal | total:m1435_6 | +| ir.cpp:1435:5:1435:34 | ChiTotal | total:m1435_10 | +| ir.cpp:1435:5:1435:34 | ChiTotal | total:m1435_13 | | ir.cpp:1435:5:1435:34 | SideEffect | m1435_6 | +| ir.cpp:1435:5:1435:34 | SideEffect | m1435_13 | +| ir.cpp:1435:5:1435:34 | SideEffect | ~m1435_10 | +| ir.cpp:1435:5:1435:34 | Unary | r1435_1 | | ir.cpp:1435:36:1435:41 | CallTarget | func:r1435_7 | | ir.cpp:1435:36:1435:41 | ChiPartial | partial:m1435_9 | | ir.cpp:1435:36:1435:41 | ChiTotal | total:m1435_5 | | ir.cpp:1435:36:1435:41 | SideEffect | ~m1435_5 | | ir.cpp:1437:5:1437:37 | CallTarget | func:r1437_2 | | ir.cpp:1437:5:1437:37 | ChiPartial | partial:m1437_4 | -| ir.cpp:1437:5:1437:37 | ChiTotal | total:m1435_10 | -| ir.cpp:1437:5:1437:37 | SideEffect | ~m1435_10 | +| ir.cpp:1437:5:1437:37 | ChiTotal | total:m1435_18 | +| ir.cpp:1437:5:1437:37 | SideEffect | ~m1435_18 | | ir.cpp:1437:5:1437:37 | StoreValue | r1437_3 | | ir.cpp:1437:5:1437:39 | Address | &:r1437_1 | +| ir.cpp:1437:5:1437:39 | Address | &:r1437_6 | +| ir.cpp:1437:5:1437:39 | Address | &:r1437_6 | +| ir.cpp:1437:5:1437:39 | Arg(this) | this:r1437_6 | +| ir.cpp:1437:5:1437:39 | CallTarget | func:r1437_7 | +| ir.cpp:1437:5:1437:39 | ChiPartial | partial:m1437_9 | +| ir.cpp:1437:5:1437:39 | ChiPartial | partial:m1437_12 | +| ir.cpp:1437:5:1437:39 | ChiTotal | total:m1437_5 | +| ir.cpp:1437:5:1437:39 | ChiTotal | total:~m? | +| ir.cpp:1437:5:1437:39 | SideEffect | ~m1437_5 | +| ir.cpp:1437:5:1437:39 | SideEffect | ~m? | +| ir.cpp:1437:5:1437:39 | Unary | r1437_1 | | ir.cpp:1438:1:1438:1 | Address | &:r1438_2 | | ir.cpp:1438:1:1438:1 | Address | &:r1438_2 | | ir.cpp:1438:1:1438:1 | Address | &:r1438_10 | @@ -7580,13 +7981,13 @@ | ir.cpp:1438:1:1438:1 | ChiTotal | total:m1429_6 | | ir.cpp:1438:1:1438:1 | ChiTotal | total:m1430_7 | | ir.cpp:1438:1:1438:1 | ChiTotal | total:m1431_2 | -| ir.cpp:1438:1:1438:1 | ChiTotal | total:m1437_5 | +| ir.cpp:1438:1:1438:1 | ChiTotal | total:m1437_10 | | ir.cpp:1438:1:1438:1 | ChiTotal | total:m1438_6 | | ir.cpp:1438:1:1438:1 | ChiTotal | total:m1438_14 | | ir.cpp:1438:1:1438:1 | SideEffect | m1429_6 | | ir.cpp:1438:1:1438:1 | SideEffect | m1430_7 | | ir.cpp:1438:1:1438:1 | SideEffect | m1431_2 | -| ir.cpp:1438:1:1438:1 | SideEffect | ~m1437_5 | +| ir.cpp:1438:1:1438:1 | SideEffect | ~m1437_10 | | ir.cpp:1438:1:1438:1 | SideEffect | ~m1438_6 | | ir.cpp:1438:1:1438:1 | SideEffect | ~m1438_14 | | ir.cpp:1440:6:1440:31 | ChiPartial | partial:m1440_3 | @@ -10322,7 +10723,7 @@ | ir.cpp:2063:13:2063:29 | SideEffect | m2063_8 | | ir.cpp:2066:6:2066:25 | ChiPartial | partial:m2066_3 | | ir.cpp:2066:6:2066:25 | ChiTotal | total:m2066_2 | -| ir.cpp:2066:6:2066:25 | SideEffect | ~m2070_32 | +| ir.cpp:2066:6:2066:25 | SideEffect | ~m2070_41 | | ir.cpp:2066:32:2066:32 | Address | &:r2066_5 | | ir.cpp:2066:52:2066:52 | Address | &:r2066_7 | | ir.cpp:2066:72:2066:72 | Address | &:r2066_9 | @@ -10367,51 +10768,62 @@ | ir.cpp:2068:7:2068:7 | Unary | r2068_14 | | ir.cpp:2068:9:2068:9 | Address | &:r2068_4 | | ir.cpp:2068:9:2068:9 | Address | &:r2068_9 | -| ir.cpp:2068:9:2068:9 | Address | &:r2068_35 | -| ir.cpp:2068:9:2068:9 | Address | &:r2068_46 | +| ir.cpp:2068:9:2068:9 | Address | &:r2068_43 | +| ir.cpp:2068:9:2068:9 | Address | &:r2068_54 | | ir.cpp:2068:9:2068:9 | Condition | r2068_5 | | ir.cpp:2068:9:2068:9 | Load | m2066_6 | | ir.cpp:2068:9:2068:9 | Load | m2068_8 | -| ir.cpp:2068:9:2068:9 | Phi | from 5:m2068_36 | -| ir.cpp:2068:9:2068:9 | Phi | from 5:~m2068_30 | -| ir.cpp:2068:9:2068:9 | Phi | from 6:m2068_47 | -| ir.cpp:2068:9:2068:9 | Phi | from 6:~m2068_42 | +| ir.cpp:2068:9:2068:9 | Phi | from 5:m2068_44 | +| ir.cpp:2068:9:2068:9 | Phi | from 5:~m2068_38 | +| ir.cpp:2068:9:2068:9 | Phi | from 6:m2068_55 | +| ir.cpp:2068:9:2068:9 | Phi | from 6:~m2068_50 | | ir.cpp:2068:9:2068:9 | StoreValue | r2068_10 | | ir.cpp:2068:9:2068:34 | Address | &:r2068_3 | | ir.cpp:2068:9:2068:34 | Address | &:r2068_13 | +| ir.cpp:2068:9:2068:34 | Address | &:r2068_21 | +| ir.cpp:2068:9:2068:34 | Address | &:r2068_21 | | ir.cpp:2068:9:2068:34 | Arg(0) | 0:r2068_13 | +| ir.cpp:2068:9:2068:34 | Arg(this) | this:r2068_21 | +| ir.cpp:2068:9:2068:34 | CallTarget | func:r2068_22 | +| ir.cpp:2068:9:2068:34 | ChiPartial | partial:m2068_24 | +| ir.cpp:2068:9:2068:34 | ChiPartial | partial:m2068_27 | +| ir.cpp:2068:9:2068:34 | ChiTotal | total:m2068_11 | +| ir.cpp:2068:9:2068:34 | ChiTotal | total:m2068_16 | +| ir.cpp:2068:9:2068:34 | SideEffect | m2068_11 | | ir.cpp:2068:9:2068:34 | SideEffect | ~m2068_11 | +| ir.cpp:2068:9:2068:34 | SideEffect | ~m2068_16 | +| ir.cpp:2068:9:2068:34 | Unary | r2068_3 | | ir.cpp:2068:9:2068:34 | Unary | r2068_3 | | ir.cpp:2068:9:2068:34 | Unary | r2068_12 | -| ir.cpp:2068:13:2068:13 | Address | &:r2068_22 | -| ir.cpp:2068:13:2068:13 | Address | &:r2068_22 | -| ir.cpp:2068:13:2068:13 | Address | &:r2068_22 | -| ir.cpp:2068:13:2068:13 | Address | &:r2068_27 | -| ir.cpp:2068:13:2068:13 | Arg(0) | 0:r2068_27 | -| ir.cpp:2068:13:2068:13 | Arg(this) | this:r2068_22 | -| ir.cpp:2068:13:2068:13 | CallTarget | func:r2068_24 | -| ir.cpp:2068:13:2068:13 | ChiPartial | partial:m2068_29 | -| ir.cpp:2068:13:2068:13 | ChiPartial | partial:m2068_32 | +| ir.cpp:2068:13:2068:13 | Address | &:r2068_30 | +| ir.cpp:2068:13:2068:13 | Address | &:r2068_30 | +| ir.cpp:2068:13:2068:13 | Address | &:r2068_30 | +| ir.cpp:2068:13:2068:13 | Address | &:r2068_35 | +| ir.cpp:2068:13:2068:13 | Arg(0) | 0:r2068_35 | +| ir.cpp:2068:13:2068:13 | Arg(this) | this:r2068_30 | +| ir.cpp:2068:13:2068:13 | CallTarget | func:r2068_32 | +| ir.cpp:2068:13:2068:13 | ChiPartial | partial:m2068_37 | +| ir.cpp:2068:13:2068:13 | ChiPartial | partial:m2068_40 | | ir.cpp:2068:13:2068:13 | ChiTotal | total:m2067_13 | -| ir.cpp:2068:13:2068:13 | ChiTotal | total:m2068_23 | -| ir.cpp:2068:13:2068:13 | Load | m2068_33 | +| ir.cpp:2068:13:2068:13 | ChiTotal | total:m2068_31 | +| ir.cpp:2068:13:2068:13 | Load | m2068_41 | | ir.cpp:2068:13:2068:13 | SideEffect | ~m2066_8 | | ir.cpp:2068:13:2068:13 | SideEffect | ~m2067_13 | -| ir.cpp:2068:13:2068:13 | StoreValue | r2068_34 | -| ir.cpp:2068:13:2068:13 | Unary | r2068_25 | -| ir.cpp:2068:13:2068:13 | Unary | r2068_26 | -| ir.cpp:2068:17:2068:34 | Address | &:r2068_37 | -| ir.cpp:2068:17:2068:34 | Address | &:r2068_37 | -| ir.cpp:2068:17:2068:34 | Address | &:r2068_37 | -| ir.cpp:2068:17:2068:34 | Arg(this) | this:r2068_37 | -| ir.cpp:2068:17:2068:34 | CallTarget | func:r2068_39 | -| ir.cpp:2068:17:2068:34 | ChiPartial | partial:m2068_41 | -| ir.cpp:2068:17:2068:34 | ChiPartial | partial:m2068_43 | +| ir.cpp:2068:13:2068:13 | StoreValue | r2068_42 | +| ir.cpp:2068:13:2068:13 | Unary | r2068_33 | +| ir.cpp:2068:13:2068:13 | Unary | r2068_34 | +| ir.cpp:2068:17:2068:34 | Address | &:r2068_45 | +| ir.cpp:2068:17:2068:34 | Address | &:r2068_45 | +| ir.cpp:2068:17:2068:34 | Address | &:r2068_45 | +| ir.cpp:2068:17:2068:34 | Arg(this) | this:r2068_45 | +| ir.cpp:2068:17:2068:34 | CallTarget | func:r2068_47 | +| ir.cpp:2068:17:2068:34 | ChiPartial | partial:m2068_49 | +| ir.cpp:2068:17:2068:34 | ChiPartial | partial:m2068_51 | | ir.cpp:2068:17:2068:34 | ChiTotal | total:m2067_13 | -| ir.cpp:2068:17:2068:34 | ChiTotal | total:m2068_38 | -| ir.cpp:2068:17:2068:34 | Load | m2068_44 | +| ir.cpp:2068:17:2068:34 | ChiTotal | total:m2068_46 | +| ir.cpp:2068:17:2068:34 | Load | m2068_52 | | ir.cpp:2068:17:2068:34 | SideEffect | ~m2067_13 | -| ir.cpp:2068:17:2068:34 | StoreValue | r2068_45 | +| ir.cpp:2068:17:2068:34 | StoreValue | r2068_53 | | ir.cpp:2069:5:2069:5 | Address | &:r2069_1 | | ir.cpp:2069:5:2069:5 | Address | &:r2069_1 | | ir.cpp:2069:5:2069:5 | Arg(this) | this:r2069_1 | @@ -10425,46 +10837,57 @@ | ir.cpp:2069:7:2069:7 | Unary | r2069_14 | | ir.cpp:2069:9:2069:9 | Address | &:r2069_4 | | ir.cpp:2069:9:2069:9 | Address | &:r2069_9 | -| ir.cpp:2069:9:2069:9 | Address | &:r2069_31 | -| ir.cpp:2069:9:2069:9 | Address | &:r2069_42 | +| ir.cpp:2069:9:2069:9 | Address | &:r2069_39 | +| ir.cpp:2069:9:2069:9 | Address | &:r2069_50 | | ir.cpp:2069:9:2069:9 | Condition | r2069_5 | | ir.cpp:2069:9:2069:9 | Load | m2066_6 | | ir.cpp:2069:9:2069:9 | Load | m2069_8 | -| ir.cpp:2069:9:2069:9 | Phi | from 8:m2069_32 | -| ir.cpp:2069:9:2069:9 | Phi | from 8:~m2069_27 | -| ir.cpp:2069:9:2069:9 | Phi | from 9:m2069_43 | -| ir.cpp:2069:9:2069:9 | Phi | from 9:~m2069_38 | +| ir.cpp:2069:9:2069:9 | Phi | from 8:m2069_40 | +| ir.cpp:2069:9:2069:9 | Phi | from 8:~m2069_35 | +| ir.cpp:2069:9:2069:9 | Phi | from 9:m2069_51 | +| ir.cpp:2069:9:2069:9 | Phi | from 9:~m2069_46 | | ir.cpp:2069:9:2069:9 | StoreValue | r2069_10 | | ir.cpp:2069:9:2069:51 | Address | &:r2069_3 | | ir.cpp:2069:9:2069:51 | Address | &:r2069_13 | +| ir.cpp:2069:9:2069:51 | Address | &:r2069_21 | +| ir.cpp:2069:9:2069:51 | Address | &:r2069_21 | | ir.cpp:2069:9:2069:51 | Arg(0) | 0:r2069_13 | +| ir.cpp:2069:9:2069:51 | Arg(this) | this:r2069_21 | +| ir.cpp:2069:9:2069:51 | CallTarget | func:r2069_22 | +| ir.cpp:2069:9:2069:51 | ChiPartial | partial:m2069_24 | +| ir.cpp:2069:9:2069:51 | ChiPartial | partial:m2069_27 | +| ir.cpp:2069:9:2069:51 | ChiTotal | total:m2069_11 | +| ir.cpp:2069:9:2069:51 | ChiTotal | total:m2069_16 | +| ir.cpp:2069:9:2069:51 | SideEffect | m2069_11 | | ir.cpp:2069:9:2069:51 | SideEffect | ~m2069_11 | +| ir.cpp:2069:9:2069:51 | SideEffect | ~m2069_16 | +| ir.cpp:2069:9:2069:51 | Unary | r2069_3 | | ir.cpp:2069:9:2069:51 | Unary | r2069_3 | | ir.cpp:2069:9:2069:51 | Unary | r2069_12 | -| ir.cpp:2069:13:2069:30 | Address | &:r2069_22 | -| ir.cpp:2069:13:2069:30 | Address | &:r2069_22 | -| ir.cpp:2069:13:2069:30 | Address | &:r2069_22 | -| ir.cpp:2069:13:2069:30 | Arg(this) | this:r2069_22 | -| ir.cpp:2069:13:2069:30 | CallTarget | func:r2069_24 | -| ir.cpp:2069:13:2069:30 | ChiPartial | partial:m2069_26 | -| ir.cpp:2069:13:2069:30 | ChiPartial | partial:m2069_28 | -| ir.cpp:2069:13:2069:30 | ChiTotal | total:m2068_16 | -| ir.cpp:2069:13:2069:30 | ChiTotal | total:m2069_23 | -| ir.cpp:2069:13:2069:30 | Load | m2069_29 | -| ir.cpp:2069:13:2069:30 | SideEffect | ~m2068_16 | -| ir.cpp:2069:13:2069:30 | StoreValue | r2069_30 | -| ir.cpp:2069:34:2069:51 | Address | &:r2069_33 | -| ir.cpp:2069:34:2069:51 | Address | &:r2069_33 | -| ir.cpp:2069:34:2069:51 | Address | &:r2069_33 | -| ir.cpp:2069:34:2069:51 | Arg(this) | this:r2069_33 | -| ir.cpp:2069:34:2069:51 | CallTarget | func:r2069_35 | -| ir.cpp:2069:34:2069:51 | ChiPartial | partial:m2069_37 | -| ir.cpp:2069:34:2069:51 | ChiPartial | partial:m2069_39 | -| ir.cpp:2069:34:2069:51 | ChiTotal | total:m2068_16 | -| ir.cpp:2069:34:2069:51 | ChiTotal | total:m2069_34 | -| ir.cpp:2069:34:2069:51 | Load | m2069_40 | -| ir.cpp:2069:34:2069:51 | SideEffect | ~m2068_16 | -| ir.cpp:2069:34:2069:51 | StoreValue | r2069_41 | +| ir.cpp:2069:13:2069:30 | Address | &:r2069_30 | +| ir.cpp:2069:13:2069:30 | Address | &:r2069_30 | +| ir.cpp:2069:13:2069:30 | Address | &:r2069_30 | +| ir.cpp:2069:13:2069:30 | Arg(this) | this:r2069_30 | +| ir.cpp:2069:13:2069:30 | CallTarget | func:r2069_32 | +| ir.cpp:2069:13:2069:30 | ChiPartial | partial:m2069_34 | +| ir.cpp:2069:13:2069:30 | ChiPartial | partial:m2069_36 | +| ir.cpp:2069:13:2069:30 | ChiTotal | total:m2068_25 | +| ir.cpp:2069:13:2069:30 | ChiTotal | total:m2069_31 | +| ir.cpp:2069:13:2069:30 | Load | m2069_37 | +| ir.cpp:2069:13:2069:30 | SideEffect | ~m2068_25 | +| ir.cpp:2069:13:2069:30 | StoreValue | r2069_38 | +| ir.cpp:2069:34:2069:51 | Address | &:r2069_41 | +| ir.cpp:2069:34:2069:51 | Address | &:r2069_41 | +| ir.cpp:2069:34:2069:51 | Address | &:r2069_41 | +| ir.cpp:2069:34:2069:51 | Arg(this) | this:r2069_41 | +| ir.cpp:2069:34:2069:51 | CallTarget | func:r2069_43 | +| ir.cpp:2069:34:2069:51 | ChiPartial | partial:m2069_45 | +| ir.cpp:2069:34:2069:51 | ChiPartial | partial:m2069_47 | +| ir.cpp:2069:34:2069:51 | ChiTotal | total:m2068_25 | +| ir.cpp:2069:34:2069:51 | ChiTotal | total:m2069_42 | +| ir.cpp:2069:34:2069:51 | Load | m2069_48 | +| ir.cpp:2069:34:2069:51 | SideEffect | ~m2068_25 | +| ir.cpp:2069:34:2069:51 | StoreValue | r2069_49 | | ir.cpp:2070:5:2070:19 | ChiPartial | partial:m2070_35 | | ir.cpp:2070:5:2070:19 | ChiTotal | total:m2070_17 | | ir.cpp:2070:5:2070:19 | SideEffect | m2070_17 | @@ -10476,8 +10899,8 @@ | ir.cpp:2070:6:2070:6 | SideEffect | m2069_20 | | ir.cpp:2070:8:2070:8 | CallTarget | func:r2070_2 | | ir.cpp:2070:8:2070:8 | ChiPartial | partial:m2070_12 | -| ir.cpp:2070:8:2070:8 | ChiTotal | total:m2069_16 | -| ir.cpp:2070:8:2070:8 | SideEffect | ~m2069_16 | +| ir.cpp:2070:8:2070:8 | ChiTotal | total:m2069_25 | +| ir.cpp:2070:8:2070:8 | SideEffect | ~m2069_25 | | ir.cpp:2070:8:2070:8 | Unary | r2070_11 | | ir.cpp:2070:8:2070:19 | Address | &:r2070_18 | | ir.cpp:2070:8:2070:19 | Address | &:r2070_18 | @@ -10487,17 +10910,17 @@ | ir.cpp:2070:10:2070:10 | Load | m2066_6 | | ir.cpp:2070:10:2070:18 | Address | &:r2070_7 | | ir.cpp:2070:10:2070:18 | Address | &:r2070_10 | -| ir.cpp:2070:10:2070:18 | Address | &:r2070_39 | -| ir.cpp:2070:10:2070:18 | Address | &:r2070_42 | +| ir.cpp:2070:10:2070:18 | Address | &:r2070_47 | +| ir.cpp:2070:10:2070:18 | Address | &:r2070_50 | | ir.cpp:2070:10:2070:18 | Arg(0) | 0:r2070_10 | | ir.cpp:2070:10:2070:18 | Load | m2070_6 | -| ir.cpp:2070:10:2070:18 | Phi | from 11:m2070_40 | -| ir.cpp:2070:10:2070:18 | Phi | from 12:m2070_43 | +| ir.cpp:2070:10:2070:18 | Phi | from 11:m2070_48 | +| ir.cpp:2070:10:2070:18 | Phi | from 12:m2070_51 | | ir.cpp:2070:10:2070:18 | SideEffect | ~m2070_13 | | ir.cpp:2070:10:2070:18 | Unary | r2070_8 | | ir.cpp:2070:10:2070:18 | Unary | r2070_9 | -| ir.cpp:2070:14:2070:14 | StoreValue | r2070_38 | -| ir.cpp:2070:18:2070:18 | StoreValue | r2070_41 | +| ir.cpp:2070:14:2070:14 | StoreValue | r2070_46 | +| ir.cpp:2070:18:2070:18 | StoreValue | r2070_49 | | ir.cpp:2070:21:2070:21 | CallTarget | func:r2070_19 | | ir.cpp:2070:21:2070:21 | ChiPartial | partial:m2070_31 | | ir.cpp:2070:21:2070:21 | ChiTotal | total:m2070_25 | @@ -10506,15 +10929,26 @@ | ir.cpp:2070:23:2070:40 | Address | &:r2070_20 | | ir.cpp:2070:23:2070:40 | Address | &:r2070_20 | | ir.cpp:2070:23:2070:40 | Address | &:r2070_29 | +| ir.cpp:2070:23:2070:40 | Address | &:r2070_37 | +| ir.cpp:2070:23:2070:40 | Address | &:r2070_37 | | ir.cpp:2070:23:2070:40 | Arg(0) | 0:r2070_29 | | ir.cpp:2070:23:2070:40 | Arg(this) | this:r2070_20 | +| ir.cpp:2070:23:2070:40 | Arg(this) | this:r2070_37 | | ir.cpp:2070:23:2070:40 | CallTarget | func:r2070_22 | +| ir.cpp:2070:23:2070:40 | CallTarget | func:r2070_38 | | ir.cpp:2070:23:2070:40 | ChiPartial | partial:m2070_24 | | ir.cpp:2070:23:2070:40 | ChiPartial | partial:m2070_26 | +| ir.cpp:2070:23:2070:40 | ChiPartial | partial:m2070_40 | +| ir.cpp:2070:23:2070:40 | ChiPartial | partial:m2070_43 | | ir.cpp:2070:23:2070:40 | ChiTotal | total:m2070_13 | | ir.cpp:2070:23:2070:40 | ChiTotal | total:m2070_21 | +| ir.cpp:2070:23:2070:40 | ChiTotal | total:m2070_27 | +| ir.cpp:2070:23:2070:40 | ChiTotal | total:m2070_32 | +| ir.cpp:2070:23:2070:40 | SideEffect | m2070_27 | | ir.cpp:2070:23:2070:40 | SideEffect | ~m2070_13 | | ir.cpp:2070:23:2070:40 | SideEffect | ~m2070_27 | +| ir.cpp:2070:23:2070:40 | SideEffect | ~m2070_32 | +| ir.cpp:2070:23:2070:40 | Unary | r2070_20 | | ir.cpp:2070:23:2070:40 | Unary | r2070_20 | | ir.cpp:2070:23:2070:40 | Unary | r2070_28 | | ir.cpp:2075:14:2075:22 | Address | &:r2075_7 | @@ -11182,142 +11616,164 @@ | ir.cpp:2200:25:2200:25 | ChiTotal | total:m2198_1 | | ir.cpp:2200:25:2200:25 | ChiTotal | total:m2200_2 | | ir.cpp:2200:25:2200:25 | SideEffect | ~m2198_1 | -| ir.cpp:2201:5:2201:5 | Address | &:r2201_14 | -| ir.cpp:2201:5:2201:5 | Address | &:r2201_18 | -| ir.cpp:2201:5:2201:5 | Address | &:r2201_24 | +| ir.cpp:2201:5:2201:5 | Address | &:r2201_22 | +| ir.cpp:2201:5:2201:5 | Address | &:r2201_26 | +| ir.cpp:2201:5:2201:5 | Address | &:r2201_32 | | ir.cpp:2201:42:2201:43 | Address | &:r2201_1 | | ir.cpp:2201:42:2201:43 | Address | &:r2201_1 | | ir.cpp:2201:42:2201:43 | Arg(this) | this:r2201_1 | | ir.cpp:2201:45:2201:45 | Address | &:r2201_4 | | ir.cpp:2201:45:2201:45 | Address | &:r2201_4 | | ir.cpp:2201:45:2201:45 | Address | &:r2201_5 | +| ir.cpp:2201:45:2201:45 | Address | &:r2201_14 | +| ir.cpp:2201:45:2201:45 | Address | &:r2201_14 | | ir.cpp:2201:45:2201:45 | Arg(0) | 0:r2201_8 | +| ir.cpp:2201:45:2201:45 | Arg(this) | this:r2201_14 | +| ir.cpp:2201:45:2201:45 | CallTarget | func:r2201_15 | +| ir.cpp:2201:45:2201:45 | ChiPartial | partial:m2201_17 | +| ir.cpp:2201:45:2201:45 | ChiPartial | partial:m2201_20 | +| ir.cpp:2201:45:2201:45 | ChiTotal | total:m2201_7 | +| ir.cpp:2201:45:2201:45 | ChiTotal | total:m2201_11 | | ir.cpp:2201:45:2201:45 | Load | m2200_8 | | ir.cpp:2201:45:2201:45 | Load | m2201_7 | +| ir.cpp:2201:45:2201:45 | SideEffect | m2201_7 | +| ir.cpp:2201:45:2201:45 | SideEffect | ~m2201_11 | | ir.cpp:2201:45:2201:45 | StoreValue | r2201_6 | +| ir.cpp:2201:45:2201:45 | Unary | r2201_4 | | ir.cpp:2201:45:2201:46 | CallTarget | func:r2201_3 | | ir.cpp:2201:45:2201:46 | ChiPartial | partial:m2201_10 | | ir.cpp:2201:45:2201:46 | ChiPartial | partial:m2201_12 | | ir.cpp:2201:45:2201:46 | ChiTotal | total:m2200_6 | | ir.cpp:2201:45:2201:46 | ChiTotal | total:m2201_2 | | ir.cpp:2201:45:2201:46 | SideEffect | ~m2200_6 | -| ir.cpp:2201:69:2201:69 | Address | &:r2201_45 | | ir.cpp:2201:69:2201:69 | Address | &:r2201_53 | -| ir.cpp:2201:69:2201:69 | Address | &:r2201_53 | -| ir.cpp:2201:69:2201:69 | Arg(this) | this:r2201_53 | -| ir.cpp:2201:69:2201:69 | CallTarget | func:r2201_54 | -| ir.cpp:2201:69:2201:69 | ChiPartial | partial:m2201_56 | -| ir.cpp:2201:69:2201:69 | ChiPartial | partial:m2201_59 | +| ir.cpp:2201:69:2201:69 | Address | &:r2201_61 | +| ir.cpp:2201:69:2201:69 | Address | &:r2201_61 | +| ir.cpp:2201:69:2201:69 | Arg(this) | this:r2201_61 | +| ir.cpp:2201:69:2201:69 | CallTarget | func:r2201_62 | +| ir.cpp:2201:69:2201:69 | ChiPartial | partial:m2201_64 | +| ir.cpp:2201:69:2201:69 | ChiPartial | partial:m2201_67 | | ir.cpp:2201:69:2201:69 | ChiTotal | total:m2202_6 | | ir.cpp:2201:69:2201:69 | ChiTotal | total:m2202_9 | | ir.cpp:2201:69:2201:69 | SideEffect | m2202_9 | | ir.cpp:2201:69:2201:69 | SideEffect | ~m2202_6 | -| ir.cpp:2201:73:2201:73 | Address | &:r2201_19 | -| ir.cpp:2201:73:2201:73 | Address | &:r2201_25 | -| ir.cpp:2201:73:2201:73 | Address | &:r2201_48 | -| ir.cpp:2201:73:2201:73 | Address | &:r2201_61 | -| ir.cpp:2201:73:2201:73 | Address | &:r2201_61 | +| ir.cpp:2201:73:2201:73 | Address | &:r2201_27 | +| ir.cpp:2201:73:2201:73 | Address | &:r2201_33 | +| ir.cpp:2201:73:2201:73 | Address | &:r2201_56 | +| ir.cpp:2201:73:2201:73 | Address | &:r2201_69 | +| ir.cpp:2201:73:2201:73 | Address | &:r2201_69 | | ir.cpp:2201:73:2201:73 | Arg(this) | this:r0_2 | | ir.cpp:2201:73:2201:73 | Arg(this) | this:r0_5 | | ir.cpp:2201:73:2201:73 | Arg(this) | this:r0_7 | | ir.cpp:2201:73:2201:73 | Arg(this) | this:r0_8 | | ir.cpp:2201:73:2201:73 | Arg(this) | this:r0_15 | -| ir.cpp:2201:73:2201:73 | Arg(this) | this:r2201_61 | -| ir.cpp:2201:73:2201:73 | CallTarget | func:r2201_21 | -| ir.cpp:2201:73:2201:73 | CallTarget | func:r2201_27 | -| ir.cpp:2201:73:2201:73 | CallTarget | func:r2201_33 | -| ir.cpp:2201:73:2201:73 | CallTarget | func:r2201_34 | -| ir.cpp:2201:73:2201:73 | CallTarget | func:r2201_47 | -| ir.cpp:2201:73:2201:73 | CallTarget | func:r2201_62 | -| ir.cpp:2201:73:2201:73 | ChiPartial | partial:m2201_37 | -| ir.cpp:2201:73:2201:73 | ChiPartial | partial:m2201_39 | -| ir.cpp:2201:73:2201:73 | ChiPartial | partial:m2201_42 | -| ir.cpp:2201:73:2201:73 | ChiPartial | partial:m2201_49 | -| ir.cpp:2201:73:2201:73 | ChiPartial | partial:m2201_64 | -| ir.cpp:2201:73:2201:73 | ChiPartial | partial:m2201_67 | +| ir.cpp:2201:73:2201:73 | Arg(this) | this:r2201_69 | +| ir.cpp:2201:73:2201:73 | CallTarget | func:r2201_29 | +| ir.cpp:2201:73:2201:73 | CallTarget | func:r2201_35 | +| ir.cpp:2201:73:2201:73 | CallTarget | func:r2201_41 | +| ir.cpp:2201:73:2201:73 | CallTarget | func:r2201_42 | +| ir.cpp:2201:73:2201:73 | CallTarget | func:r2201_55 | +| ir.cpp:2201:73:2201:73 | CallTarget | func:r2201_70 | +| ir.cpp:2201:73:2201:73 | ChiPartial | partial:m2201_45 | +| ir.cpp:2201:73:2201:73 | ChiPartial | partial:m2201_47 | +| ir.cpp:2201:73:2201:73 | ChiPartial | partial:m2201_50 | +| ir.cpp:2201:73:2201:73 | ChiPartial | partial:m2201_57 | +| ir.cpp:2201:73:2201:73 | ChiPartial | partial:m2201_72 | +| ir.cpp:2201:73:2201:73 | ChiPartial | partial:m2201_75 | | ir.cpp:2201:73:2201:73 | ChiTotal | total:m0_9 | -| ir.cpp:2201:73:2201:73 | ChiTotal | total:m2201_30 | -| ir.cpp:2201:73:2201:73 | ChiTotal | total:m2201_31 | | ir.cpp:2201:73:2201:73 | ChiTotal | total:m2201_38 | -| ir.cpp:2201:73:2201:73 | ChiTotal | total:m2201_43 | -| ir.cpp:2201:73:2201:73 | ChiTotal | total:m2201_57 | -| ir.cpp:2201:73:2201:73 | Condition | r2201_41 | -| ir.cpp:2201:73:2201:73 | Load | m2201_17 | -| ir.cpp:2201:73:2201:73 | Load | m2201_17 | -| ir.cpp:2201:73:2201:73 | Phi | from 7:m2201_23 | -| ir.cpp:2201:73:2201:73 | Phi | from 7:~m2201_11 | -| ir.cpp:2201:73:2201:73 | Phi | from 9:m2201_68 | -| ir.cpp:2201:73:2201:73 | Phi | from 9:~m2201_65 | -| ir.cpp:2201:73:2201:73 | SideEffect | m2201_30 | -| ir.cpp:2201:73:2201:73 | SideEffect | ~m2201_31 | -| ir.cpp:2201:73:2201:73 | SideEffect | ~m2201_38 | -| ir.cpp:2201:73:2201:73 | SideEffect | ~m2201_43 | -| ir.cpp:2201:73:2201:73 | SideEffect | ~m2201_57 | -| ir.cpp:2201:73:2201:73 | StoreValue | r2201_22 | -| ir.cpp:2201:73:2201:73 | StoreValue | r2201_28 | -| ir.cpp:2201:73:2201:73 | Unary | r2201_20 | -| ir.cpp:2201:73:2201:73 | Unary | r2201_26 | -| ir.cpp:2201:73:2201:73 | Unary | r2201_32 | -| ir.cpp:2201:73:2201:73 | Unary | r2201_35 | -| ir.cpp:2201:73:2201:73 | Unary | r2201_46 | -| ir.cpp:2201:73:2201:73 | Unary | r2201_63 | -| ir.cpp:2201:73:2201:74 | StoreValue | r2201_16 | -| ir.cpp:2201:73:2201:74 | Unary | r2201_15 | -| ir.cpp:2201:73:2201:75 | Load | ~m2201_50 | -| ir.cpp:2201:73:2201:75 | StoreValue | r2201_51 | +| ir.cpp:2201:73:2201:73 | ChiTotal | total:m2201_39 | +| ir.cpp:2201:73:2201:73 | ChiTotal | total:m2201_46 | +| ir.cpp:2201:73:2201:73 | ChiTotal | total:m2201_51 | +| ir.cpp:2201:73:2201:73 | ChiTotal | total:m2201_65 | +| ir.cpp:2201:73:2201:73 | Condition | r2201_49 | +| ir.cpp:2201:73:2201:73 | Load | m2201_25 | +| ir.cpp:2201:73:2201:73 | Load | m2201_25 | +| ir.cpp:2201:73:2201:73 | Phi | from 7:m2201_31 | +| ir.cpp:2201:73:2201:73 | Phi | from 7:~m2201_18 | +| ir.cpp:2201:73:2201:73 | Phi | from 9:m2201_76 | +| ir.cpp:2201:73:2201:73 | Phi | from 9:~m2201_73 | +| ir.cpp:2201:73:2201:73 | SideEffect | m2201_38 | +| ir.cpp:2201:73:2201:73 | SideEffect | ~m2201_39 | +| ir.cpp:2201:73:2201:73 | SideEffect | ~m2201_46 | +| ir.cpp:2201:73:2201:73 | SideEffect | ~m2201_51 | +| ir.cpp:2201:73:2201:73 | SideEffect | ~m2201_65 | +| ir.cpp:2201:73:2201:73 | StoreValue | r2201_30 | +| ir.cpp:2201:73:2201:73 | StoreValue | r2201_36 | +| ir.cpp:2201:73:2201:73 | Unary | r2201_28 | +| ir.cpp:2201:73:2201:73 | Unary | r2201_34 | +| ir.cpp:2201:73:2201:73 | Unary | r2201_40 | +| ir.cpp:2201:73:2201:73 | Unary | r2201_43 | +| ir.cpp:2201:73:2201:73 | Unary | r2201_54 | +| ir.cpp:2201:73:2201:73 | Unary | r2201_71 | +| ir.cpp:2201:73:2201:74 | StoreValue | r2201_24 | +| ir.cpp:2201:73:2201:74 | Unary | r2201_23 | +| ir.cpp:2201:73:2201:75 | Load | ~m2201_58 | +| ir.cpp:2201:73:2201:75 | StoreValue | r2201_59 | | ir.cpp:2202:7:2202:7 | Address | &:r2202_1 | | ir.cpp:2202:7:2202:7 | Address | &:r2202_1 | | ir.cpp:2202:7:2202:7 | Arg(this) | this:r2202_1 | | ir.cpp:2202:7:2202:7 | ChiPartial | partial:m2202_8 | -| ir.cpp:2202:7:2202:7 | ChiTotal | total:m2201_52 | -| ir.cpp:2202:7:2202:7 | SideEffect | m2201_52 | +| ir.cpp:2202:7:2202:7 | ChiTotal | total:m2201_60 | +| ir.cpp:2202:7:2202:7 | SideEffect | m2201_60 | | ir.cpp:2202:9:2202:13 | CallTarget | func:r2202_2 | | ir.cpp:2202:9:2202:13 | ChiPartial | partial:m2202_5 | -| ir.cpp:2202:9:2202:13 | ChiTotal | total:m2201_50 | -| ir.cpp:2202:9:2202:13 | SideEffect | ~m2201_50 | +| ir.cpp:2202:9:2202:13 | ChiTotal | total:m2201_58 | +| ir.cpp:2202:9:2202:13 | SideEffect | ~m2201_58 | | ir.cpp:2202:15:2202:17 | Arg(0) | 0:r2202_3 | -| ir.cpp:2204:5:2204:5 | Address | &:r2204_14 | -| ir.cpp:2204:5:2204:5 | Address | &:r2204_18 | -| ir.cpp:2204:5:2204:5 | Address | &:r2204_24 | +| ir.cpp:2204:5:2204:5 | Address | &:r2204_22 | +| ir.cpp:2204:5:2204:5 | Address | &:r2204_26 | +| ir.cpp:2204:5:2204:5 | Address | &:r2204_32 | | ir.cpp:2204:42:2204:43 | Address | &:r2204_1 | | ir.cpp:2204:42:2204:43 | Address | &:r2204_1 | -| ir.cpp:2204:42:2204:43 | Address | &:r2204_61 | -| ir.cpp:2204:42:2204:43 | Address | &:r2204_61 | +| ir.cpp:2204:42:2204:43 | Address | &:r2204_69 | +| ir.cpp:2204:42:2204:43 | Address | &:r2204_69 | | ir.cpp:2204:42:2204:43 | Arg(this) | this:r2204_1 | -| ir.cpp:2204:42:2204:43 | Arg(this) | this:r2204_61 | -| ir.cpp:2204:42:2204:43 | CallTarget | func:r2204_62 | -| ir.cpp:2204:42:2204:43 | ChiPartial | partial:m2204_64 | -| ir.cpp:2204:42:2204:43 | ChiPartial | partial:m2204_67 | +| ir.cpp:2204:42:2204:43 | Arg(this) | this:r2204_69 | +| ir.cpp:2204:42:2204:43 | CallTarget | func:r2204_70 | +| ir.cpp:2204:42:2204:43 | ChiPartial | partial:m2204_72 | +| ir.cpp:2204:42:2204:43 | ChiPartial | partial:m2204_75 | | ir.cpp:2204:42:2204:43 | ChiTotal | total:m2204_13 | -| ir.cpp:2204:42:2204:43 | ChiTotal | total:m2204_57 | +| ir.cpp:2204:42:2204:43 | ChiTotal | total:m2204_65 | | ir.cpp:2204:42:2204:43 | SideEffect | m2204_13 | -| ir.cpp:2204:42:2204:43 | SideEffect | ~m2204_57 | +| ir.cpp:2204:42:2204:43 | SideEffect | ~m2204_65 | | ir.cpp:2204:45:2204:45 | Address | &:r2204_4 | | ir.cpp:2204:45:2204:45 | Address | &:r2204_4 | | ir.cpp:2204:45:2204:45 | Address | &:r2204_5 | +| ir.cpp:2204:45:2204:45 | Address | &:r2204_14 | +| ir.cpp:2204:45:2204:45 | Address | &:r2204_14 | | ir.cpp:2204:45:2204:45 | Arg(0) | 0:r2204_8 | +| ir.cpp:2204:45:2204:45 | Arg(this) | this:r2204_14 | +| ir.cpp:2204:45:2204:45 | CallTarget | func:r2204_15 | +| ir.cpp:2204:45:2204:45 | ChiPartial | partial:m2204_17 | +| ir.cpp:2204:45:2204:45 | ChiPartial | partial:m2204_20 | +| ir.cpp:2204:45:2204:45 | ChiTotal | total:m2204_7 | +| ir.cpp:2204:45:2204:45 | ChiTotal | total:m2204_11 | | ir.cpp:2204:45:2204:45 | Load | m2200_8 | | ir.cpp:2204:45:2204:45 | Load | m2204_7 | +| ir.cpp:2204:45:2204:45 | SideEffect | m2204_7 | +| ir.cpp:2204:45:2204:45 | SideEffect | ~m2204_11 | | ir.cpp:2204:45:2204:45 | StoreValue | r2204_6 | +| ir.cpp:2204:45:2204:45 | Unary | r2204_4 | | ir.cpp:2204:45:2204:46 | CallTarget | func:r2204_3 | | ir.cpp:2204:45:2204:46 | ChiPartial | partial:m2204_10 | | ir.cpp:2204:45:2204:46 | ChiPartial | partial:m2204_12 | -| ir.cpp:2204:45:2204:46 | ChiTotal | total:m2201_43 | +| ir.cpp:2204:45:2204:46 | ChiTotal | total:m2201_51 | | ir.cpp:2204:45:2204:46 | ChiTotal | total:m2204_2 | -| ir.cpp:2204:45:2204:46 | SideEffect | ~m2201_43 | -| ir.cpp:2204:69:2204:69 | Address | &:r2204_45 | -| ir.cpp:2204:69:2204:69 | Address | &:r2204_53 | +| ir.cpp:2204:45:2204:46 | SideEffect | ~m2201_51 | | ir.cpp:2204:69:2204:69 | Address | &:r2204_53 | -| ir.cpp:2204:69:2204:69 | Address | &:r2204_69 | -| ir.cpp:2204:69:2204:69 | Address | &:r2204_69 | -| ir.cpp:2204:69:2204:69 | Arg(this) | this:r2204_53 | -| ir.cpp:2204:69:2204:69 | Arg(this) | this:r2204_69 | -| ir.cpp:2204:69:2204:69 | CallTarget | func:r2204_54 | -| ir.cpp:2204:69:2204:69 | CallTarget | func:r2204_70 | -| ir.cpp:2204:69:2204:69 | ChiPartial | partial:m2204_56 | -| ir.cpp:2204:69:2204:69 | ChiPartial | partial:m2204_59 | -| ir.cpp:2204:69:2204:69 | ChiPartial | partial:m2204_72 | -| ir.cpp:2204:69:2204:69 | ChiPartial | partial:m2204_75 | +| ir.cpp:2204:69:2204:69 | Address | &:r2204_61 | +| ir.cpp:2204:69:2204:69 | Address | &:r2204_61 | +| ir.cpp:2204:69:2204:69 | Address | &:r2204_77 | +| ir.cpp:2204:69:2204:69 | Address | &:r2204_77 | +| ir.cpp:2204:69:2204:69 | Arg(this) | this:r2204_61 | +| ir.cpp:2204:69:2204:69 | Arg(this) | this:r2204_77 | +| ir.cpp:2204:69:2204:69 | CallTarget | func:r2204_62 | +| ir.cpp:2204:69:2204:69 | CallTarget | func:r2204_78 | +| ir.cpp:2204:69:2204:69 | ChiPartial | partial:m2204_64 | +| ir.cpp:2204:69:2204:69 | ChiPartial | partial:m2204_67 | +| ir.cpp:2204:69:2204:69 | ChiPartial | partial:m2204_80 | +| ir.cpp:2204:69:2204:69 | ChiPartial | partial:m2204_83 | | ir.cpp:2204:69:2204:69 | ChiTotal | total:m2206_5 | | ir.cpp:2204:69:2204:69 | ChiTotal | total:m2206_5 | | ir.cpp:2204:69:2204:69 | ChiTotal | total:m2206_8 | @@ -11326,69 +11782,69 @@ | ir.cpp:2204:69:2204:69 | SideEffect | m2206_8 | | ir.cpp:2204:69:2204:69 | SideEffect | ~m2206_5 | | ir.cpp:2204:69:2204:69 | SideEffect | ~m2206_5 | -| ir.cpp:2204:73:2204:73 | Address | &:r2204_19 | -| ir.cpp:2204:73:2204:73 | Address | &:r2204_25 | -| ir.cpp:2204:73:2204:73 | Address | &:r2204_48 | -| ir.cpp:2204:73:2204:73 | Address | &:r2204_77 | -| ir.cpp:2204:73:2204:73 | Address | &:r2204_77 | +| ir.cpp:2204:73:2204:73 | Address | &:r2204_27 | +| ir.cpp:2204:73:2204:73 | Address | &:r2204_33 | +| ir.cpp:2204:73:2204:73 | Address | &:r2204_56 | +| ir.cpp:2204:73:2204:73 | Address | &:r2204_85 | +| ir.cpp:2204:73:2204:73 | Address | &:r2204_85 | | ir.cpp:2204:73:2204:73 | Arg(this) | this:r0_18 | | ir.cpp:2204:73:2204:73 | Arg(this) | this:r0_21 | | ir.cpp:2204:73:2204:73 | Arg(this) | this:r0_23 | | ir.cpp:2204:73:2204:73 | Arg(this) | this:r0_24 | | ir.cpp:2204:73:2204:73 | Arg(this) | this:r0_31 | -| ir.cpp:2204:73:2204:73 | Arg(this) | this:r2204_77 | -| ir.cpp:2204:73:2204:73 | CallTarget | func:r2204_21 | -| ir.cpp:2204:73:2204:73 | CallTarget | func:r2204_27 | -| ir.cpp:2204:73:2204:73 | CallTarget | func:r2204_33 | -| ir.cpp:2204:73:2204:73 | CallTarget | func:r2204_34 | -| ir.cpp:2204:73:2204:73 | CallTarget | func:r2204_47 | -| ir.cpp:2204:73:2204:73 | CallTarget | func:r2204_78 | -| ir.cpp:2204:73:2204:73 | ChiPartial | partial:m2204_37 | -| ir.cpp:2204:73:2204:73 | ChiPartial | partial:m2204_39 | -| ir.cpp:2204:73:2204:73 | ChiPartial | partial:m2204_42 | -| ir.cpp:2204:73:2204:73 | ChiPartial | partial:m2204_49 | -| ir.cpp:2204:73:2204:73 | ChiPartial | partial:m2204_80 | -| ir.cpp:2204:73:2204:73 | ChiPartial | partial:m2204_83 | +| ir.cpp:2204:73:2204:73 | Arg(this) | this:r2204_85 | +| ir.cpp:2204:73:2204:73 | CallTarget | func:r2204_29 | +| ir.cpp:2204:73:2204:73 | CallTarget | func:r2204_35 | +| ir.cpp:2204:73:2204:73 | CallTarget | func:r2204_41 | +| ir.cpp:2204:73:2204:73 | CallTarget | func:r2204_42 | +| ir.cpp:2204:73:2204:73 | CallTarget | func:r2204_55 | +| ir.cpp:2204:73:2204:73 | CallTarget | func:r2204_86 | +| ir.cpp:2204:73:2204:73 | ChiPartial | partial:m2204_45 | +| ir.cpp:2204:73:2204:73 | ChiPartial | partial:m2204_47 | +| ir.cpp:2204:73:2204:73 | ChiPartial | partial:m2204_50 | +| ir.cpp:2204:73:2204:73 | ChiPartial | partial:m2204_57 | +| ir.cpp:2204:73:2204:73 | ChiPartial | partial:m2204_88 | +| ir.cpp:2204:73:2204:73 | ChiPartial | partial:m2204_91 | | ir.cpp:2204:73:2204:73 | ChiTotal | total:m0_25 | -| ir.cpp:2204:73:2204:73 | ChiTotal | total:m2204_30 | -| ir.cpp:2204:73:2204:73 | ChiTotal | total:m2204_31 | | ir.cpp:2204:73:2204:73 | ChiTotal | total:m2204_38 | -| ir.cpp:2204:73:2204:73 | ChiTotal | total:m2204_43 | -| ir.cpp:2204:73:2204:73 | ChiTotal | total:m2204_73 | -| ir.cpp:2204:73:2204:73 | Condition | r2204_41 | -| ir.cpp:2204:73:2204:73 | Load | m2204_17 | -| ir.cpp:2204:73:2204:73 | Load | m2204_17 | -| ir.cpp:2204:73:2204:73 | Phi | from 10:m2204_23 | -| ir.cpp:2204:73:2204:73 | Phi | from 10:~m2204_11 | -| ir.cpp:2204:73:2204:73 | Phi | from 14:m2204_84 | -| ir.cpp:2204:73:2204:73 | Phi | from 14:~m2204_81 | -| ir.cpp:2204:73:2204:73 | SideEffect | m2204_30 | -| ir.cpp:2204:73:2204:73 | SideEffect | ~m2204_31 | -| ir.cpp:2204:73:2204:73 | SideEffect | ~m2204_38 | -| ir.cpp:2204:73:2204:73 | SideEffect | ~m2204_43 | -| ir.cpp:2204:73:2204:73 | SideEffect | ~m2204_73 | -| ir.cpp:2204:73:2204:73 | StoreValue | r2204_22 | -| ir.cpp:2204:73:2204:73 | StoreValue | r2204_28 | -| ir.cpp:2204:73:2204:73 | Unary | r2204_20 | -| ir.cpp:2204:73:2204:73 | Unary | r2204_26 | -| ir.cpp:2204:73:2204:73 | Unary | r2204_32 | -| ir.cpp:2204:73:2204:73 | Unary | r2204_35 | -| ir.cpp:2204:73:2204:73 | Unary | r2204_46 | -| ir.cpp:2204:73:2204:73 | Unary | r2204_79 | -| ir.cpp:2204:73:2204:74 | StoreValue | r2204_16 | -| ir.cpp:2204:73:2204:74 | Unary | r2204_15 | -| ir.cpp:2204:73:2204:75 | Load | ~m2204_50 | -| ir.cpp:2204:73:2204:75 | StoreValue | r2204_51 | +| ir.cpp:2204:73:2204:73 | ChiTotal | total:m2204_39 | +| ir.cpp:2204:73:2204:73 | ChiTotal | total:m2204_46 | +| ir.cpp:2204:73:2204:73 | ChiTotal | total:m2204_51 | +| ir.cpp:2204:73:2204:73 | ChiTotal | total:m2204_81 | +| ir.cpp:2204:73:2204:73 | Condition | r2204_49 | +| ir.cpp:2204:73:2204:73 | Load | m2204_25 | +| ir.cpp:2204:73:2204:73 | Load | m2204_25 | +| ir.cpp:2204:73:2204:73 | Phi | from 10:m2204_31 | +| ir.cpp:2204:73:2204:73 | Phi | from 10:~m2204_18 | +| ir.cpp:2204:73:2204:73 | Phi | from 14:m2204_92 | +| ir.cpp:2204:73:2204:73 | Phi | from 14:~m2204_89 | +| ir.cpp:2204:73:2204:73 | SideEffect | m2204_38 | +| ir.cpp:2204:73:2204:73 | SideEffect | ~m2204_39 | +| ir.cpp:2204:73:2204:73 | SideEffect | ~m2204_46 | +| ir.cpp:2204:73:2204:73 | SideEffect | ~m2204_51 | +| ir.cpp:2204:73:2204:73 | SideEffect | ~m2204_81 | +| ir.cpp:2204:73:2204:73 | StoreValue | r2204_30 | +| ir.cpp:2204:73:2204:73 | StoreValue | r2204_36 | +| ir.cpp:2204:73:2204:73 | Unary | r2204_28 | +| ir.cpp:2204:73:2204:73 | Unary | r2204_34 | +| ir.cpp:2204:73:2204:73 | Unary | r2204_40 | +| ir.cpp:2204:73:2204:73 | Unary | r2204_43 | +| ir.cpp:2204:73:2204:73 | Unary | r2204_54 | +| ir.cpp:2204:73:2204:73 | Unary | r2204_87 | +| ir.cpp:2204:73:2204:74 | StoreValue | r2204_24 | +| ir.cpp:2204:73:2204:74 | Unary | r2204_23 | +| ir.cpp:2204:73:2204:75 | Load | ~m2204_58 | +| ir.cpp:2204:73:2204:75 | StoreValue | r2204_59 | | ir.cpp:2205:7:2205:7 | Address | &:r2205_1 | | ir.cpp:2205:7:2205:7 | Address | &:r2205_1 | | ir.cpp:2205:7:2205:7 | Arg(this) | this:r2205_1 | | ir.cpp:2205:7:2205:7 | ChiPartial | partial:m2205_8 | -| ir.cpp:2205:7:2205:7 | ChiTotal | total:m2204_52 | -| ir.cpp:2205:7:2205:7 | SideEffect | m2204_52 | +| ir.cpp:2205:7:2205:7 | ChiTotal | total:m2204_60 | +| ir.cpp:2205:7:2205:7 | SideEffect | m2204_60 | | ir.cpp:2205:9:2205:13 | CallTarget | func:r2205_2 | | ir.cpp:2205:9:2205:13 | ChiPartial | partial:m2205_5 | -| ir.cpp:2205:9:2205:13 | ChiTotal | total:m2204_50 | -| ir.cpp:2205:9:2205:13 | SideEffect | ~m2204_50 | +| ir.cpp:2205:9:2205:13 | ChiTotal | total:m2204_58 | +| ir.cpp:2205:9:2205:13 | SideEffect | ~m2204_58 | | ir.cpp:2205:15:2205:17 | Arg(0) | 0:r2205_3 | | ir.cpp:2206:11:2206:11 | Address | &:r2206_1 | | ir.cpp:2206:11:2206:11 | Address | &:r2206_1 | @@ -11424,9 +11880,9 @@ | ir.cpp:2210:29:2210:30 | CallTarget | func:r2210_3 | | ir.cpp:2210:29:2210:30 | ChiPartial | partial:m2210_6 | | ir.cpp:2210:29:2210:30 | ChiPartial | partial:m2210_8 | -| ir.cpp:2210:29:2210:30 | ChiTotal | total:m2204_43 | +| ir.cpp:2210:29:2210:30 | ChiTotal | total:m2204_51 | | ir.cpp:2210:29:2210:30 | ChiTotal | total:m2210_2 | -| ir.cpp:2210:29:2210:30 | SideEffect | ~m2204_43 | +| ir.cpp:2210:29:2210:30 | SideEffect | ~m2204_51 | | ir.cpp:2210:37:2210:37 | Address | &:r2210_50 | | ir.cpp:2210:41:2210:41 | Address | &:r2210_15 | | ir.cpp:2210:41:2210:41 | Address | &:r2210_21 | @@ -11486,98 +11942,109 @@ | ir.cpp:2211:11:2211:11 | Load | m2210_57 | | ir.cpp:2211:11:2211:16 | Condition | r2211_4 | | ir.cpp:2211:16:2211:16 | Right | r2211_3 | -| ir.cpp:2215:5:2215:5 | Address | &:r2215_14 | -| ir.cpp:2215:5:2215:5 | Address | &:r2215_18 | -| ir.cpp:2215:5:2215:5 | Address | &:r2215_24 | +| ir.cpp:2215:5:2215:5 | Address | &:r2215_22 | +| ir.cpp:2215:5:2215:5 | Address | &:r2215_26 | +| ir.cpp:2215:5:2215:5 | Address | &:r2215_32 | | ir.cpp:2215:42:2215:43 | Address | &:r2215_1 | | ir.cpp:2215:42:2215:43 | Address | &:r2215_1 | | ir.cpp:2215:42:2215:43 | Arg(this) | this:r2215_1 | | ir.cpp:2215:45:2215:45 | Address | &:r2215_4 | | ir.cpp:2215:45:2215:45 | Address | &:r2215_4 | | ir.cpp:2215:45:2215:45 | Address | &:r2215_5 | +| ir.cpp:2215:45:2215:45 | Address | &:r2215_14 | +| ir.cpp:2215:45:2215:45 | Address | &:r2215_14 | | ir.cpp:2215:45:2215:45 | Arg(0) | 0:r2215_8 | +| ir.cpp:2215:45:2215:45 | Arg(this) | this:r2215_14 | +| ir.cpp:2215:45:2215:45 | CallTarget | func:r2215_15 | +| ir.cpp:2215:45:2215:45 | ChiPartial | partial:m2215_17 | +| ir.cpp:2215:45:2215:45 | ChiPartial | partial:m2215_20 | +| ir.cpp:2215:45:2215:45 | ChiTotal | total:m2215_7 | +| ir.cpp:2215:45:2215:45 | ChiTotal | total:m2215_11 | | ir.cpp:2215:45:2215:45 | Load | m2200_8 | | ir.cpp:2215:45:2215:45 | Load | m2215_7 | +| ir.cpp:2215:45:2215:45 | SideEffect | m2215_7 | +| ir.cpp:2215:45:2215:45 | SideEffect | ~m2215_11 | | ir.cpp:2215:45:2215:45 | StoreValue | r2215_6 | +| ir.cpp:2215:45:2215:45 | Unary | r2215_4 | | ir.cpp:2215:45:2215:46 | CallTarget | func:r2215_3 | | ir.cpp:2215:45:2215:46 | ChiPartial | partial:m2215_10 | | ir.cpp:2215:45:2215:46 | ChiPartial | partial:m2215_12 | | ir.cpp:2215:45:2215:46 | ChiTotal | total:m2210_39 | | ir.cpp:2215:45:2215:46 | ChiTotal | total:m2215_2 | | ir.cpp:2215:45:2215:46 | SideEffect | ~m2210_39 | -| ir.cpp:2215:69:2215:69 | Address | &:r2215_45 | -| ir.cpp:2215:69:2215:69 | Address | &:r2215_53 | | ir.cpp:2215:69:2215:69 | Address | &:r2215_53 | -| ir.cpp:2215:69:2215:69 | Arg(this) | this:r2215_53 | -| ir.cpp:2215:69:2215:69 | CallTarget | func:r2215_54 | -| ir.cpp:2215:69:2215:69 | ChiPartial | partial:m2215_56 | -| ir.cpp:2215:69:2215:69 | ChiPartial | partial:m2215_59 | -| ir.cpp:2215:69:2215:69 | ChiTotal | total:m2215_52 | +| ir.cpp:2215:69:2215:69 | Address | &:r2215_61 | +| ir.cpp:2215:69:2215:69 | Address | &:r2215_61 | +| ir.cpp:2215:69:2215:69 | Arg(this) | this:r2215_61 | +| ir.cpp:2215:69:2215:69 | CallTarget | func:r2215_62 | +| ir.cpp:2215:69:2215:69 | ChiPartial | partial:m2215_64 | +| ir.cpp:2215:69:2215:69 | ChiPartial | partial:m2215_67 | +| ir.cpp:2215:69:2215:69 | ChiTotal | total:m2215_60 | | ir.cpp:2215:69:2215:69 | ChiTotal | total:m2218_13 | -| ir.cpp:2215:69:2215:69 | SideEffect | m2215_52 | +| ir.cpp:2215:69:2215:69 | SideEffect | m2215_60 | | ir.cpp:2215:69:2215:69 | SideEffect | ~m2218_13 | -| ir.cpp:2215:73:2215:73 | Address | &:r2215_19 | -| ir.cpp:2215:73:2215:73 | Address | &:r2215_25 | -| ir.cpp:2215:73:2215:73 | Address | &:r2215_48 | -| ir.cpp:2215:73:2215:73 | Address | &:r2215_61 | -| ir.cpp:2215:73:2215:73 | Address | &:r2215_61 | +| ir.cpp:2215:73:2215:73 | Address | &:r2215_27 | +| ir.cpp:2215:73:2215:73 | Address | &:r2215_33 | +| ir.cpp:2215:73:2215:73 | Address | &:r2215_56 | +| ir.cpp:2215:73:2215:73 | Address | &:r2215_69 | +| ir.cpp:2215:73:2215:73 | Address | &:r2215_69 | | ir.cpp:2215:73:2215:73 | Arg(this) | this:r0_50 | | ir.cpp:2215:73:2215:73 | Arg(this) | this:r0_53 | | ir.cpp:2215:73:2215:73 | Arg(this) | this:r0_55 | | ir.cpp:2215:73:2215:73 | Arg(this) | this:r0_56 | | ir.cpp:2215:73:2215:73 | Arg(this) | this:r0_63 | -| ir.cpp:2215:73:2215:73 | Arg(this) | this:r2215_61 | -| ir.cpp:2215:73:2215:73 | CallTarget | func:r2215_21 | -| ir.cpp:2215:73:2215:73 | CallTarget | func:r2215_27 | -| ir.cpp:2215:73:2215:73 | CallTarget | func:r2215_33 | -| ir.cpp:2215:73:2215:73 | CallTarget | func:r2215_34 | -| ir.cpp:2215:73:2215:73 | CallTarget | func:r2215_47 | -| ir.cpp:2215:73:2215:73 | CallTarget | func:r2215_62 | -| ir.cpp:2215:73:2215:73 | ChiPartial | partial:m2215_37 | -| ir.cpp:2215:73:2215:73 | ChiPartial | partial:m2215_39 | -| ir.cpp:2215:73:2215:73 | ChiPartial | partial:m2215_42 | -| ir.cpp:2215:73:2215:73 | ChiPartial | partial:m2215_49 | -| ir.cpp:2215:73:2215:73 | ChiPartial | partial:m2215_64 | -| ir.cpp:2215:73:2215:73 | ChiPartial | partial:m2215_67 | +| ir.cpp:2215:73:2215:73 | Arg(this) | this:r2215_69 | +| ir.cpp:2215:73:2215:73 | CallTarget | func:r2215_29 | +| ir.cpp:2215:73:2215:73 | CallTarget | func:r2215_35 | +| ir.cpp:2215:73:2215:73 | CallTarget | func:r2215_41 | +| ir.cpp:2215:73:2215:73 | CallTarget | func:r2215_42 | +| ir.cpp:2215:73:2215:73 | CallTarget | func:r2215_55 | +| ir.cpp:2215:73:2215:73 | CallTarget | func:r2215_70 | +| ir.cpp:2215:73:2215:73 | ChiPartial | partial:m2215_45 | +| ir.cpp:2215:73:2215:73 | ChiPartial | partial:m2215_47 | +| ir.cpp:2215:73:2215:73 | ChiPartial | partial:m2215_50 | +| ir.cpp:2215:73:2215:73 | ChiPartial | partial:m2215_57 | +| ir.cpp:2215:73:2215:73 | ChiPartial | partial:m2215_72 | +| ir.cpp:2215:73:2215:73 | ChiPartial | partial:m2215_75 | | ir.cpp:2215:73:2215:73 | ChiTotal | total:m0_57 | -| ir.cpp:2215:73:2215:73 | ChiTotal | total:m2215_30 | -| ir.cpp:2215:73:2215:73 | ChiTotal | total:m2215_31 | | ir.cpp:2215:73:2215:73 | ChiTotal | total:m2215_38 | -| ir.cpp:2215:73:2215:73 | ChiTotal | total:m2215_43 | -| ir.cpp:2215:73:2215:73 | ChiTotal | total:m2215_57 | -| ir.cpp:2215:73:2215:73 | Condition | r2215_41 | -| ir.cpp:2215:73:2215:73 | Load | m2215_17 | -| ir.cpp:2215:73:2215:73 | Load | m2215_17 | -| ir.cpp:2215:73:2215:73 | Phi | from 20:m2215_23 | -| ir.cpp:2215:73:2215:73 | Phi | from 20:~m2215_11 | -| ir.cpp:2215:73:2215:73 | Phi | from 22:m2215_68 | -| ir.cpp:2215:73:2215:73 | Phi | from 22:~m2215_65 | -| ir.cpp:2215:73:2215:73 | SideEffect | m2215_30 | -| ir.cpp:2215:73:2215:73 | SideEffect | ~m2215_31 | -| ir.cpp:2215:73:2215:73 | SideEffect | ~m2215_38 | -| ir.cpp:2215:73:2215:73 | SideEffect | ~m2215_43 | -| ir.cpp:2215:73:2215:73 | SideEffect | ~m2215_57 | -| ir.cpp:2215:73:2215:73 | StoreValue | r2215_22 | -| ir.cpp:2215:73:2215:73 | StoreValue | r2215_28 | -| ir.cpp:2215:73:2215:73 | Unary | r2215_20 | -| ir.cpp:2215:73:2215:73 | Unary | r2215_26 | -| ir.cpp:2215:73:2215:73 | Unary | r2215_32 | -| ir.cpp:2215:73:2215:73 | Unary | r2215_35 | -| ir.cpp:2215:73:2215:73 | Unary | r2215_46 | -| ir.cpp:2215:73:2215:73 | Unary | r2215_63 | -| ir.cpp:2215:73:2215:74 | StoreValue | r2215_16 | -| ir.cpp:2215:73:2215:74 | Unary | r2215_15 | -| ir.cpp:2215:73:2215:75 | Load | ~m2215_50 | -| ir.cpp:2215:73:2215:75 | StoreValue | r2215_51 | +| ir.cpp:2215:73:2215:73 | ChiTotal | total:m2215_39 | +| ir.cpp:2215:73:2215:73 | ChiTotal | total:m2215_46 | +| ir.cpp:2215:73:2215:73 | ChiTotal | total:m2215_51 | +| ir.cpp:2215:73:2215:73 | ChiTotal | total:m2215_65 | +| ir.cpp:2215:73:2215:73 | Condition | r2215_49 | +| ir.cpp:2215:73:2215:73 | Load | m2215_25 | +| ir.cpp:2215:73:2215:73 | Load | m2215_25 | +| ir.cpp:2215:73:2215:73 | Phi | from 20:m2215_31 | +| ir.cpp:2215:73:2215:73 | Phi | from 20:~m2215_18 | +| ir.cpp:2215:73:2215:73 | Phi | from 22:m2215_76 | +| ir.cpp:2215:73:2215:73 | Phi | from 22:~m2215_73 | +| ir.cpp:2215:73:2215:73 | SideEffect | m2215_38 | +| ir.cpp:2215:73:2215:73 | SideEffect | ~m2215_39 | +| ir.cpp:2215:73:2215:73 | SideEffect | ~m2215_46 | +| ir.cpp:2215:73:2215:73 | SideEffect | ~m2215_51 | +| ir.cpp:2215:73:2215:73 | SideEffect | ~m2215_65 | +| ir.cpp:2215:73:2215:73 | StoreValue | r2215_30 | +| ir.cpp:2215:73:2215:73 | StoreValue | r2215_36 | +| ir.cpp:2215:73:2215:73 | Unary | r2215_28 | +| ir.cpp:2215:73:2215:73 | Unary | r2215_34 | +| ir.cpp:2215:73:2215:73 | Unary | r2215_40 | +| ir.cpp:2215:73:2215:73 | Unary | r2215_43 | +| ir.cpp:2215:73:2215:73 | Unary | r2215_54 | +| ir.cpp:2215:73:2215:73 | Unary | r2215_71 | +| ir.cpp:2215:73:2215:74 | StoreValue | r2215_24 | +| ir.cpp:2215:73:2215:74 | Unary | r2215_23 | +| ir.cpp:2215:73:2215:75 | Load | ~m2215_58 | +| ir.cpp:2215:73:2215:75 | StoreValue | r2215_59 | | ir.cpp:2216:27:2216:28 | Address | &:r2216_1 | | ir.cpp:2216:27:2216:28 | Address | &:r2216_1 | | ir.cpp:2216:27:2216:28 | Arg(this) | this:r2216_1 | | ir.cpp:2216:27:2216:28 | CallTarget | func:r2216_3 | | ir.cpp:2216:27:2216:28 | ChiPartial | partial:m2216_5 | | ir.cpp:2216:27:2216:28 | ChiPartial | partial:m2216_7 | -| ir.cpp:2216:27:2216:28 | ChiTotal | total:m2215_50 | +| ir.cpp:2216:27:2216:28 | ChiTotal | total:m2215_58 | | ir.cpp:2216:27:2216:28 | ChiTotal | total:m2216_2 | -| ir.cpp:2216:27:2216:28 | SideEffect | ~m2215_50 | +| ir.cpp:2216:27:2216:28 | SideEffect | ~m2215_58 | | ir.cpp:2217:27:2217:28 | Address | &:r2217_1 | | ir.cpp:2217:27:2217:28 | Address | &:r2217_1 | | ir.cpp:2217:27:2217:28 | Arg(this) | this:r2217_1 | @@ -11628,15 +12095,15 @@ | ir.cpp:2219:1:2219:1 | ChiTotal | total:m2200_8 | | ir.cpp:2219:1:2219:1 | ChiTotal | total:m2200_8 | | ir.cpp:2219:1:2219:1 | ChiTotal | total:m2200_8 | -| ir.cpp:2219:1:2219:1 | ChiTotal | total:m2204_65 | +| ir.cpp:2219:1:2219:1 | ChiTotal | total:m2204_73 | | ir.cpp:2219:1:2219:1 | ChiTotal | total:m2210_62 | -| ir.cpp:2219:1:2219:1 | ChiTotal | total:m2215_43 | +| ir.cpp:2219:1:2219:1 | ChiTotal | total:m2215_51 | | ir.cpp:2219:1:2219:1 | SideEffect | m2200_8 | | ir.cpp:2219:1:2219:1 | SideEffect | m2200_8 | | ir.cpp:2219:1:2219:1 | SideEffect | m2200_8 | -| ir.cpp:2219:1:2219:1 | SideEffect | ~m2204_65 | +| ir.cpp:2219:1:2219:1 | SideEffect | ~m2204_73 | | ir.cpp:2219:1:2219:1 | SideEffect | ~m2210_62 | -| ir.cpp:2219:1:2219:1 | SideEffect | ~m2215_43 | +| ir.cpp:2219:1:2219:1 | SideEffect | ~m2215_51 | | ir.cpp:2221:6:2221:38 | ChiPartial | partial:m2221_3 | | ir.cpp:2221:6:2221:38 | ChiTotal | total:m2221_2 | | ir.cpp:2221:6:2221:38 | SideEffect | ~m2224_7 | @@ -12140,76 +12607,76 @@ | ir.cpp:2291:5:2291:5 | SideEffect | m2290_8 | | ir.cpp:2291:5:2291:5 | SideEffect | ~m2290_6 | | ir.cpp:2293:5:2293:5 | Address | &:r2293_1 | -| ir.cpp:2293:5:2293:5 | Address | &:r2293_24 | -| ir.cpp:2293:5:2293:5 | Address | &:r2293_30 | -| ir.cpp:2293:16:2293:16 | Address | &:r2293_51 | -| ir.cpp:2293:16:2293:16 | Address | &:r2293_51 | -| ir.cpp:2293:16:2293:16 | Address | &:r2293_68 | -| ir.cpp:2293:16:2293:16 | Address | &:r2293_68 | -| ir.cpp:2293:16:2293:16 | Arg(this) | this:r2293_51 | -| ir.cpp:2293:16:2293:16 | Arg(this) | this:r2293_68 | -| ir.cpp:2293:16:2293:16 | CallTarget | func:r2293_53 | -| ir.cpp:2293:16:2293:16 | CallTarget | func:r2293_69 | -| ir.cpp:2293:16:2293:16 | ChiPartial | partial:m2293_63 | -| ir.cpp:2293:16:2293:16 | ChiPartial | partial:m2293_66 | +| ir.cpp:2293:5:2293:5 | Address | &:r2293_32 | +| ir.cpp:2293:5:2293:5 | Address | &:r2293_38 | +| ir.cpp:2293:16:2293:16 | Address | &:r2293_59 | +| ir.cpp:2293:16:2293:16 | Address | &:r2293_59 | +| ir.cpp:2293:16:2293:16 | Address | &:r2293_76 | +| ir.cpp:2293:16:2293:16 | Address | &:r2293_76 | +| ir.cpp:2293:16:2293:16 | Arg(this) | this:r2293_59 | +| ir.cpp:2293:16:2293:16 | Arg(this) | this:r2293_76 | +| ir.cpp:2293:16:2293:16 | CallTarget | func:r2293_61 | +| ir.cpp:2293:16:2293:16 | CallTarget | func:r2293_77 | | ir.cpp:2293:16:2293:16 | ChiPartial | partial:m2293_71 | | ir.cpp:2293:16:2293:16 | ChiPartial | partial:m2293_74 | -| ir.cpp:2293:16:2293:16 | ChiTotal | total:m2293_52 | -| ir.cpp:2293:16:2293:16 | ChiTotal | total:m2293_58 | -| ir.cpp:2293:16:2293:16 | ChiTotal | total:m2293_67 | +| ir.cpp:2293:16:2293:16 | ChiPartial | partial:m2293_79 | +| ir.cpp:2293:16:2293:16 | ChiPartial | partial:m2293_82 | +| ir.cpp:2293:16:2293:16 | ChiTotal | total:m2293_60 | +| ir.cpp:2293:16:2293:16 | ChiTotal | total:m2293_66 | +| ir.cpp:2293:16:2293:16 | ChiTotal | total:m2293_75 | | ir.cpp:2293:16:2293:16 | ChiTotal | total:m2295_5 | -| ir.cpp:2293:16:2293:16 | SideEffect | m2293_67 | -| ir.cpp:2293:16:2293:16 | SideEffect | ~m2293_58 | +| ir.cpp:2293:16:2293:16 | SideEffect | m2293_75 | +| ir.cpp:2293:16:2293:16 | SideEffect | ~m2293_66 | | ir.cpp:2293:16:2293:16 | SideEffect | ~m2295_5 | -| ir.cpp:2293:20:2293:20 | Address | &:r2293_25 | -| ir.cpp:2293:20:2293:20 | Address | &:r2293_31 | -| ir.cpp:2293:20:2293:20 | Address | &:r2293_76 | -| ir.cpp:2293:20:2293:20 | Address | &:r2293_76 | +| ir.cpp:2293:20:2293:20 | Address | &:r2293_33 | +| ir.cpp:2293:20:2293:20 | Address | &:r2293_39 | +| ir.cpp:2293:20:2293:20 | Address | &:r2293_84 | +| ir.cpp:2293:20:2293:20 | Address | &:r2293_84 | | ir.cpp:2293:20:2293:20 | Arg(this) | this:r0_2 | | ir.cpp:2293:20:2293:20 | Arg(this) | this:r0_5 | | ir.cpp:2293:20:2293:20 | Arg(this) | this:r0_7 | | ir.cpp:2293:20:2293:20 | Arg(this) | this:r0_8 | | ir.cpp:2293:20:2293:20 | Arg(this) | this:r0_15 | -| ir.cpp:2293:20:2293:20 | Arg(this) | this:r2293_76 | -| ir.cpp:2293:20:2293:20 | CallTarget | func:r2293_27 | -| ir.cpp:2293:20:2293:20 | CallTarget | func:r2293_33 | -| ir.cpp:2293:20:2293:20 | CallTarget | func:r2293_39 | -| ir.cpp:2293:20:2293:20 | CallTarget | func:r2293_40 | -| ir.cpp:2293:20:2293:20 | CallTarget | func:r2293_55 | -| ir.cpp:2293:20:2293:20 | CallTarget | func:r2293_77 | -| ir.cpp:2293:20:2293:20 | ChiPartial | partial:m2293_43 | -| ir.cpp:2293:20:2293:20 | ChiPartial | partial:m2293_45 | -| ir.cpp:2293:20:2293:20 | ChiPartial | partial:m2293_48 | -| ir.cpp:2293:20:2293:20 | ChiPartial | partial:m2293_57 | -| ir.cpp:2293:20:2293:20 | ChiPartial | partial:m2293_79 | -| ir.cpp:2293:20:2293:20 | ChiPartial | partial:m2293_82 | +| ir.cpp:2293:20:2293:20 | Arg(this) | this:r2293_84 | +| ir.cpp:2293:20:2293:20 | CallTarget | func:r2293_35 | +| ir.cpp:2293:20:2293:20 | CallTarget | func:r2293_41 | +| ir.cpp:2293:20:2293:20 | CallTarget | func:r2293_47 | +| ir.cpp:2293:20:2293:20 | CallTarget | func:r2293_48 | +| ir.cpp:2293:20:2293:20 | CallTarget | func:r2293_63 | +| ir.cpp:2293:20:2293:20 | CallTarget | func:r2293_85 | +| ir.cpp:2293:20:2293:20 | ChiPartial | partial:m2293_51 | +| ir.cpp:2293:20:2293:20 | ChiPartial | partial:m2293_53 | +| ir.cpp:2293:20:2293:20 | ChiPartial | partial:m2293_56 | +| ir.cpp:2293:20:2293:20 | ChiPartial | partial:m2293_65 | +| ir.cpp:2293:20:2293:20 | ChiPartial | partial:m2293_87 | +| ir.cpp:2293:20:2293:20 | ChiPartial | partial:m2293_90 | | ir.cpp:2293:20:2293:20 | ChiTotal | total:m0_9 | -| ir.cpp:2293:20:2293:20 | ChiTotal | total:m2293_36 | -| ir.cpp:2293:20:2293:20 | ChiTotal | total:m2293_37 | | ir.cpp:2293:20:2293:20 | ChiTotal | total:m2293_44 | -| ir.cpp:2293:20:2293:20 | ChiTotal | total:m2293_49 | -| ir.cpp:2293:20:2293:20 | ChiTotal | total:m2293_72 | -| ir.cpp:2293:20:2293:20 | Condition | r2293_47 | -| ir.cpp:2293:20:2293:20 | Load | m2293_23 | -| ir.cpp:2293:20:2293:20 | Load | m2293_23 | -| ir.cpp:2293:20:2293:20 | Phi | from 3:m2293_29 | -| ir.cpp:2293:20:2293:20 | Phi | from 3:~m2293_19 | -| ir.cpp:2293:20:2293:20 | Phi | from 5:m2293_83 | -| ir.cpp:2293:20:2293:20 | Phi | from 5:~m2293_80 | -| ir.cpp:2293:20:2293:20 | SideEffect | m2293_36 | -| ir.cpp:2293:20:2293:20 | SideEffect | ~m2293_37 | -| ir.cpp:2293:20:2293:20 | SideEffect | ~m2293_44 | -| ir.cpp:2293:20:2293:20 | SideEffect | ~m2293_49 | -| ir.cpp:2293:20:2293:20 | SideEffect | ~m2293_72 | -| ir.cpp:2293:20:2293:20 | StoreValue | r2293_28 | -| ir.cpp:2293:20:2293:20 | StoreValue | r2293_34 | -| ir.cpp:2293:20:2293:20 | Unary | r2293_26 | -| ir.cpp:2293:20:2293:20 | Unary | r2293_32 | -| ir.cpp:2293:20:2293:20 | Unary | r2293_38 | -| ir.cpp:2293:20:2293:20 | Unary | r2293_41 | -| ir.cpp:2293:20:2293:20 | Unary | r2293_54 | -| ir.cpp:2293:20:2293:20 | Unary | r2293_56 | -| ir.cpp:2293:20:2293:20 | Unary | r2293_78 | +| ir.cpp:2293:20:2293:20 | ChiTotal | total:m2293_45 | +| ir.cpp:2293:20:2293:20 | ChiTotal | total:m2293_52 | +| ir.cpp:2293:20:2293:20 | ChiTotal | total:m2293_57 | +| ir.cpp:2293:20:2293:20 | ChiTotal | total:m2293_80 | +| ir.cpp:2293:20:2293:20 | Condition | r2293_55 | +| ir.cpp:2293:20:2293:20 | Load | m2293_31 | +| ir.cpp:2293:20:2293:20 | Load | m2293_31 | +| ir.cpp:2293:20:2293:20 | Phi | from 3:m2293_37 | +| ir.cpp:2293:20:2293:20 | Phi | from 3:~m2293_26 | +| ir.cpp:2293:20:2293:20 | Phi | from 5:m2293_91 | +| ir.cpp:2293:20:2293:20 | Phi | from 5:~m2293_88 | +| ir.cpp:2293:20:2293:20 | SideEffect | m2293_44 | +| ir.cpp:2293:20:2293:20 | SideEffect | ~m2293_45 | +| ir.cpp:2293:20:2293:20 | SideEffect | ~m2293_52 | +| ir.cpp:2293:20:2293:20 | SideEffect | ~m2293_57 | +| ir.cpp:2293:20:2293:20 | SideEffect | ~m2293_80 | +| ir.cpp:2293:20:2293:20 | StoreValue | r2293_36 | +| ir.cpp:2293:20:2293:20 | StoreValue | r2293_42 | +| ir.cpp:2293:20:2293:20 | Unary | r2293_34 | +| ir.cpp:2293:20:2293:20 | Unary | r2293_40 | +| ir.cpp:2293:20:2293:20 | Unary | r2293_46 | +| ir.cpp:2293:20:2293:20 | Unary | r2293_49 | +| ir.cpp:2293:20:2293:20 | Unary | r2293_62 | +| ir.cpp:2293:20:2293:20 | Unary | r2293_64 | +| ir.cpp:2293:20:2293:20 | Unary | r2293_86 | | ir.cpp:2293:20:2293:55 | Address | &:r2293_2 | | ir.cpp:2293:20:2293:55 | Address | &:r2293_2 | | ir.cpp:2293:20:2293:55 | Arg(this) | this:r2293_2 | @@ -12219,25 +12686,36 @@ | ir.cpp:2293:20:2293:55 | ChiTotal | total:m2293_3 | | ir.cpp:2293:20:2293:55 | ChiTotal | total:m2293_12 | | ir.cpp:2293:20:2293:55 | SideEffect | ~m2293_12 | -| ir.cpp:2293:20:2293:55 | StoreValue | r2293_22 | +| ir.cpp:2293:20:2293:55 | StoreValue | r2293_30 | | ir.cpp:2293:20:2293:55 | Unary | r2293_2 | -| ir.cpp:2293:20:2293:56 | Address | &:r2293_61 | -| ir.cpp:2293:20:2293:56 | Arg(0) | 0:r2293_61 | -| ir.cpp:2293:20:2293:56 | SideEffect | ~m2293_64 | -| ir.cpp:2293:20:2293:56 | Unary | r2293_59 | -| ir.cpp:2293:20:2293:56 | Unary | r2293_60 | +| ir.cpp:2293:20:2293:56 | Address | &:r2293_69 | +| ir.cpp:2293:20:2293:56 | Arg(0) | 0:r2293_69 | +| ir.cpp:2293:20:2293:56 | SideEffect | ~m2293_72 | +| ir.cpp:2293:20:2293:56 | Unary | r2293_67 | +| ir.cpp:2293:20:2293:56 | Unary | r2293_68 | | ir.cpp:2293:40:2293:54 | Address | &:r2293_5 | | ir.cpp:2293:40:2293:54 | Address | &:r2293_5 | | ir.cpp:2293:40:2293:54 | Address | &:r2293_5 | +| ir.cpp:2293:40:2293:54 | Address | &:r2293_22 | +| ir.cpp:2293:40:2293:54 | Address | &:r2293_22 | | ir.cpp:2293:40:2293:54 | Arg(0) | 0:r2293_16 | | ir.cpp:2293:40:2293:54 | Arg(this) | this:r2293_5 | +| ir.cpp:2293:40:2293:54 | Arg(this) | this:r2293_22 | | ir.cpp:2293:40:2293:54 | CallTarget | func:r2293_7 | +| ir.cpp:2293:40:2293:54 | CallTarget | func:r2293_23 | | ir.cpp:2293:40:2293:54 | ChiPartial | partial:m2293_11 | | ir.cpp:2293:40:2293:54 | ChiPartial | partial:m2293_14 | +| ir.cpp:2293:40:2293:54 | ChiPartial | partial:m2293_25 | +| ir.cpp:2293:40:2293:54 | ChiPartial | partial:m2293_28 | | ir.cpp:2293:40:2293:54 | ChiTotal | total:m2289_35 | | ir.cpp:2293:40:2293:54 | ChiTotal | total:m2293_6 | +| ir.cpp:2293:40:2293:54 | ChiTotal | total:m2293_15 | +| ir.cpp:2293:40:2293:54 | ChiTotal | total:m2293_19 | | ir.cpp:2293:40:2293:54 | Load | m2293_15 | +| ir.cpp:2293:40:2293:54 | SideEffect | m2293_15 | | ir.cpp:2293:40:2293:54 | SideEffect | ~m2289_35 | +| ir.cpp:2293:40:2293:54 | SideEffect | ~m2293_19 | +| ir.cpp:2293:40:2293:54 | Unary | r2293_5 | | ir.cpp:2293:47:2293:53 | Address | &:r2293_9 | | ir.cpp:2293:47:2293:53 | Arg(0) | 0:r2293_9 | | ir.cpp:2293:47:2293:53 | SideEffect | ~m2287_3 | @@ -12248,9 +12726,9 @@ | ir.cpp:2294:16:2294:17 | CallTarget | func:r2294_3 | | ir.cpp:2294:16:2294:17 | ChiPartial | partial:m2294_5 | | ir.cpp:2294:16:2294:17 | ChiPartial | partial:m2294_7 | -| ir.cpp:2294:16:2294:17 | ChiTotal | total:m2293_64 | +| ir.cpp:2294:16:2294:17 | ChiTotal | total:m2293_72 | | ir.cpp:2294:16:2294:17 | ChiTotal | total:m2294_2 | -| ir.cpp:2294:16:2294:17 | SideEffect | ~m2293_64 | +| ir.cpp:2294:16:2294:17 | SideEffect | ~m2293_72 | | ir.cpp:2295:5:2295:5 | Address | &:r2295_1 | | ir.cpp:2295:5:2295:5 | Address | &:r2295_1 | | ir.cpp:2295:5:2295:5 | Arg(this) | this:r2295_1 | @@ -12281,9 +12759,9 @@ | ir.cpp:2297:18:2297:25 | CallTarget | func:r2297_3 | | ir.cpp:2297:18:2297:25 | ChiPartial | partial:m2297_7 | | ir.cpp:2297:18:2297:25 | ChiPartial | partial:m2297_10 | -| ir.cpp:2297:18:2297:25 | ChiTotal | total:m2293_49 | +| ir.cpp:2297:18:2297:25 | ChiTotal | total:m2293_57 | | ir.cpp:2297:18:2297:25 | ChiTotal | total:m2297_2 | -| ir.cpp:2297:18:2297:25 | SideEffect | ~m2293_49 | +| ir.cpp:2297:18:2297:25 | SideEffect | ~m2293_57 | | ir.cpp:2297:28:2297:29 | Address | &:r2297_12 | | ir.cpp:2297:28:2297:29 | Address | &:r2297_12 | | ir.cpp:2297:28:2297:29 | Address | &:r2297_42 | @@ -12681,29 +13159,40 @@ | ir.cpp:2393:12:2393:21 | StoreValue | r2393_2 | | ir.cpp:2396:6:2396:40 | ChiPartial | partial:m2396_3 | | ir.cpp:2396:6:2396:40 | ChiTotal | total:m2396_2 | -| ir.cpp:2396:6:2396:40 | SideEffect | ~m2416_56 | +| ir.cpp:2396:6:2396:40 | SideEffect | ~m2416_64 | | ir.cpp:2397:9:2397:46 | Address | &:r2397_1 | -| ir.cpp:2397:9:2397:46 | Condition | r2397_22 | -| ir.cpp:2397:14:2397:14 | Address | &:r2397_18 | -| ir.cpp:2397:14:2397:14 | Left | r2397_19 | -| ir.cpp:2397:14:2397:14 | Load | m2397_17 | -| ir.cpp:2397:14:2397:14 | Right | r2397_20 | -| ir.cpp:2397:14:2397:14 | Unary | r2397_21 | +| ir.cpp:2397:9:2397:46 | Condition | r2397_30 | +| ir.cpp:2397:14:2397:14 | Address | &:r2397_26 | +| ir.cpp:2397:14:2397:14 | Left | r2397_27 | +| ir.cpp:2397:14:2397:14 | Load | m2397_25 | +| ir.cpp:2397:14:2397:14 | Right | r2397_28 | +| ir.cpp:2397:14:2397:14 | Unary | r2397_29 | | ir.cpp:2397:18:2397:38 | Address | &:r2397_2 | | ir.cpp:2397:18:2397:38 | Address | &:r2397_2 | | ir.cpp:2397:18:2397:38 | Address | &:r2397_2 | | ir.cpp:2397:18:2397:38 | Address | &:r2397_2 | +| ir.cpp:2397:18:2397:38 | Address | &:r2397_17 | +| ir.cpp:2397:18:2397:38 | Address | &:r2397_17 | | ir.cpp:2397:18:2397:38 | Arg(this) | this:r2397_2 | | ir.cpp:2397:18:2397:38 | Arg(this) | this:r2397_2 | +| ir.cpp:2397:18:2397:38 | Arg(this) | this:r2397_17 | | ir.cpp:2397:18:2397:38 | CallTarget | func:r2397_4 | +| ir.cpp:2397:18:2397:38 | CallTarget | func:r2397_18 | | ir.cpp:2397:18:2397:38 | ChiPartial | partial:m2397_6 | | ir.cpp:2397:18:2397:38 | ChiPartial | partial:m2397_8 | | ir.cpp:2397:18:2397:38 | ChiPartial | partial:m2397_15 | +| ir.cpp:2397:18:2397:38 | ChiPartial | partial:m2397_20 | +| ir.cpp:2397:18:2397:38 | ChiPartial | partial:m2397_23 | | ir.cpp:2397:18:2397:38 | ChiTotal | total:m2396_4 | | ir.cpp:2397:18:2397:38 | ChiTotal | total:m2397_3 | | ir.cpp:2397:18:2397:38 | ChiTotal | total:m2397_9 | +| ir.cpp:2397:18:2397:38 | ChiTotal | total:m2397_13 | +| ir.cpp:2397:18:2397:38 | ChiTotal | total:m2397_16 | | ir.cpp:2397:18:2397:38 | SideEffect | m2397_9 | +| ir.cpp:2397:18:2397:38 | SideEffect | m2397_16 | | ir.cpp:2397:18:2397:38 | SideEffect | ~m2396_4 | +| ir.cpp:2397:18:2397:38 | SideEffect | ~m2397_13 | +| ir.cpp:2397:18:2397:38 | Unary | r2397_2 | | ir.cpp:2397:40:2397:44 | CallTarget | func:r2397_10 | | ir.cpp:2397:40:2397:44 | ChiPartial | partial:m2397_12 | | ir.cpp:2397:40:2397:44 | ChiTotal | total:m2397_7 | @@ -12712,7 +13201,7 @@ | ir.cpp:2398:9:2398:9 | Address | &:r2398_1 | | ir.cpp:2398:9:2398:9 | Address | &:r2398_1 | | ir.cpp:2398:9:2398:9 | Left | r2398_2 | -| ir.cpp:2398:9:2398:9 | Load | m2397_17 | +| ir.cpp:2398:9:2398:9 | Load | m2397_25 | | ir.cpp:2398:9:2398:11 | Right | r2398_3 | | ir.cpp:2398:9:2398:11 | StoreValue | r2398_4 | | ir.cpp:2400:14:2400:14 | Address | &:r2400_1 | @@ -12720,31 +13209,42 @@ | ir.cpp:2400:18:2400:38 | Address | &:r2400_2 | | ir.cpp:2400:18:2400:38 | Address | &:r2400_2 | | ir.cpp:2400:18:2400:38 | Address | &:r2400_2 | +| ir.cpp:2400:18:2400:38 | Address | &:r2400_17 | +| ir.cpp:2400:18:2400:38 | Address | &:r2400_17 | | ir.cpp:2400:18:2400:38 | Arg(this) | this:r2400_2 | | ir.cpp:2400:18:2400:38 | Arg(this) | this:r2400_2 | +| ir.cpp:2400:18:2400:38 | Arg(this) | this:r2400_17 | | ir.cpp:2400:18:2400:38 | CallTarget | func:r2400_4 | +| ir.cpp:2400:18:2400:38 | CallTarget | func:r2400_18 | | ir.cpp:2400:18:2400:38 | ChiPartial | partial:m2400_6 | | ir.cpp:2400:18:2400:38 | ChiPartial | partial:m2400_8 | | ir.cpp:2400:18:2400:38 | ChiPartial | partial:m2400_15 | -| ir.cpp:2400:18:2400:38 | ChiTotal | total:m2397_13 | +| ir.cpp:2400:18:2400:38 | ChiPartial | partial:m2400_20 | +| ir.cpp:2400:18:2400:38 | ChiPartial | partial:m2400_23 | +| ir.cpp:2400:18:2400:38 | ChiTotal | total:m2397_21 | | ir.cpp:2400:18:2400:38 | ChiTotal | total:m2400_3 | | ir.cpp:2400:18:2400:38 | ChiTotal | total:m2400_9 | +| ir.cpp:2400:18:2400:38 | ChiTotal | total:m2400_13 | +| ir.cpp:2400:18:2400:38 | ChiTotal | total:m2400_16 | | ir.cpp:2400:18:2400:38 | SideEffect | m2400_9 | -| ir.cpp:2400:18:2400:38 | SideEffect | ~m2397_13 | +| ir.cpp:2400:18:2400:38 | SideEffect | m2400_16 | +| ir.cpp:2400:18:2400:38 | SideEffect | ~m2397_21 | +| ir.cpp:2400:18:2400:38 | SideEffect | ~m2400_13 | +| ir.cpp:2400:18:2400:38 | Unary | r2400_2 | | ir.cpp:2400:40:2400:44 | CallTarget | func:r2400_10 | | ir.cpp:2400:40:2400:44 | ChiPartial | partial:m2400_12 | | ir.cpp:2400:40:2400:44 | ChiTotal | total:m2400_7 | | ir.cpp:2400:40:2400:44 | SideEffect | ~m2400_7 | | ir.cpp:2400:40:2400:44 | StoreValue | r2400_11 | -| ir.cpp:2400:49:2400:49 | Address | &:r2400_18 | -| ir.cpp:2400:49:2400:49 | Condition | r2400_21 | -| ir.cpp:2400:49:2400:49 | Left | r2400_19 | -| ir.cpp:2400:49:2400:49 | Load | m2400_17 | -| ir.cpp:2400:49:2400:49 | Right | r2400_20 | +| ir.cpp:2400:49:2400:49 | Address | &:r2400_26 | +| ir.cpp:2400:49:2400:49 | Condition | r2400_29 | +| ir.cpp:2400:49:2400:49 | Left | r2400_27 | +| ir.cpp:2400:49:2400:49 | Load | m2400_25 | +| ir.cpp:2400:49:2400:49 | Right | r2400_28 | | ir.cpp:2401:9:2401:9 | Address | &:r2401_1 | | ir.cpp:2401:9:2401:9 | Address | &:r2401_1 | | ir.cpp:2401:9:2401:9 | Left | r2401_2 | -| ir.cpp:2401:9:2401:9 | Load | m2400_17 | +| ir.cpp:2401:9:2401:9 | Load | m2400_25 | | ir.cpp:2401:9:2401:11 | Right | r2401_3 | | ir.cpp:2401:9:2401:11 | StoreValue | r2401_4 | | ir.cpp:2403:24:2403:24 | Address | &:r2403_1 | @@ -12752,50 +13252,72 @@ | ir.cpp:2403:28:2403:48 | Address | &:r2403_2 | | ir.cpp:2403:28:2403:48 | Address | &:r2403_2 | | ir.cpp:2403:28:2403:48 | Address | &:r2403_2 | +| ir.cpp:2403:28:2403:48 | Address | &:r2403_17 | +| ir.cpp:2403:28:2403:48 | Address | &:r2403_17 | | ir.cpp:2403:28:2403:48 | Arg(this) | this:r2403_2 | | ir.cpp:2403:28:2403:48 | Arg(this) | this:r2403_2 | +| ir.cpp:2403:28:2403:48 | Arg(this) | this:r2403_17 | | ir.cpp:2403:28:2403:48 | CallTarget | func:r2403_4 | +| ir.cpp:2403:28:2403:48 | CallTarget | func:r2403_18 | | ir.cpp:2403:28:2403:48 | ChiPartial | partial:m2403_6 | | ir.cpp:2403:28:2403:48 | ChiPartial | partial:m2403_8 | | ir.cpp:2403:28:2403:48 | ChiPartial | partial:m2403_15 | -| ir.cpp:2403:28:2403:48 | ChiTotal | total:m2400_13 | +| ir.cpp:2403:28:2403:48 | ChiPartial | partial:m2403_20 | +| ir.cpp:2403:28:2403:48 | ChiPartial | partial:m2403_23 | +| ir.cpp:2403:28:2403:48 | ChiTotal | total:m2400_21 | | ir.cpp:2403:28:2403:48 | ChiTotal | total:m2403_3 | | ir.cpp:2403:28:2403:48 | ChiTotal | total:m2403_9 | +| ir.cpp:2403:28:2403:48 | ChiTotal | total:m2403_13 | +| ir.cpp:2403:28:2403:48 | ChiTotal | total:m2403_16 | | ir.cpp:2403:28:2403:48 | SideEffect | m2403_9 | -| ir.cpp:2403:28:2403:48 | SideEffect | ~m2400_13 | +| ir.cpp:2403:28:2403:48 | SideEffect | m2403_16 | +| ir.cpp:2403:28:2403:48 | SideEffect | ~m2400_21 | +| ir.cpp:2403:28:2403:48 | SideEffect | ~m2403_13 | +| ir.cpp:2403:28:2403:48 | Unary | r2403_2 | | ir.cpp:2403:50:2403:54 | CallTarget | func:r2403_10 | | ir.cpp:2403:50:2403:54 | ChiPartial | partial:m2403_12 | | ir.cpp:2403:50:2403:54 | ChiTotal | total:m2403_7 | | ir.cpp:2403:50:2403:54 | SideEffect | ~m2403_7 | | ir.cpp:2403:50:2403:54 | StoreValue | r2403_11 | -| ir.cpp:2403:59:2403:93 | Condition | r2403_18 | +| ir.cpp:2403:59:2403:93 | Condition | r2403_26 | | ir.cpp:2404:9:2404:9 | Address | &:r2404_1 | | ir.cpp:2404:9:2404:9 | Address | &:r2404_1 | | ir.cpp:2404:9:2404:9 | Left | r2404_2 | -| ir.cpp:2404:9:2404:9 | Load | m2403_17 | +| ir.cpp:2404:9:2404:9 | Load | m2403_25 | | ir.cpp:2404:9:2404:11 | Right | r2404_3 | | ir.cpp:2404:9:2404:11 | StoreValue | r2404_4 | | ir.cpp:2406:12:2406:49 | Address | &:r2406_1 | -| ir.cpp:2406:12:2406:49 | Condition | r2406_21 | -| ir.cpp:2406:17:2406:17 | Address | &:r2406_18 | -| ir.cpp:2406:17:2406:17 | Load | m2406_17 | -| ir.cpp:2406:17:2406:17 | Unary | r2406_19 | -| ir.cpp:2406:17:2406:17 | Unary | r2406_20 | +| ir.cpp:2406:12:2406:49 | Condition | r2406_29 | +| ir.cpp:2406:17:2406:17 | Address | &:r2406_26 | +| ir.cpp:2406:17:2406:17 | Load | m2406_25 | +| ir.cpp:2406:17:2406:17 | Unary | r2406_27 | +| ir.cpp:2406:17:2406:17 | Unary | r2406_28 | | ir.cpp:2406:21:2406:41 | Address | &:r2406_2 | | ir.cpp:2406:21:2406:41 | Address | &:r2406_2 | | ir.cpp:2406:21:2406:41 | Address | &:r2406_2 | | ir.cpp:2406:21:2406:41 | Address | &:r2406_2 | +| ir.cpp:2406:21:2406:41 | Address | &:r2406_17 | +| ir.cpp:2406:21:2406:41 | Address | &:r2406_17 | | ir.cpp:2406:21:2406:41 | Arg(this) | this:r2406_2 | | ir.cpp:2406:21:2406:41 | Arg(this) | this:r2406_2 | +| ir.cpp:2406:21:2406:41 | Arg(this) | this:r2406_17 | | ir.cpp:2406:21:2406:41 | CallTarget | func:r2406_4 | +| ir.cpp:2406:21:2406:41 | CallTarget | func:r2406_18 | | ir.cpp:2406:21:2406:41 | ChiPartial | partial:m2406_6 | | ir.cpp:2406:21:2406:41 | ChiPartial | partial:m2406_8 | | ir.cpp:2406:21:2406:41 | ChiPartial | partial:m2406_15 | -| ir.cpp:2406:21:2406:41 | ChiTotal | total:m2403_13 | +| ir.cpp:2406:21:2406:41 | ChiPartial | partial:m2406_20 | +| ir.cpp:2406:21:2406:41 | ChiPartial | partial:m2406_23 | +| ir.cpp:2406:21:2406:41 | ChiTotal | total:m2403_21 | | ir.cpp:2406:21:2406:41 | ChiTotal | total:m2406_3 | | ir.cpp:2406:21:2406:41 | ChiTotal | total:m2406_9 | +| ir.cpp:2406:21:2406:41 | ChiTotal | total:m2406_13 | +| ir.cpp:2406:21:2406:41 | ChiTotal | total:m2406_16 | | ir.cpp:2406:21:2406:41 | SideEffect | m2406_9 | -| ir.cpp:2406:21:2406:41 | SideEffect | ~m2403_13 | +| ir.cpp:2406:21:2406:41 | SideEffect | m2406_16 | +| ir.cpp:2406:21:2406:41 | SideEffect | ~m2403_21 | +| ir.cpp:2406:21:2406:41 | SideEffect | ~m2406_13 | +| ir.cpp:2406:21:2406:41 | Unary | r2406_2 | | ir.cpp:2406:43:2406:47 | CallTarget | func:r2406_10 | | ir.cpp:2406:43:2406:47 | ChiPartial | partial:m2406_12 | | ir.cpp:2406:43:2406:47 | ChiTotal | total:m2406_7 | @@ -12804,7 +13326,7 @@ | ir.cpp:2408:11:2408:11 | Address | &:r2408_1 | | ir.cpp:2408:11:2408:11 | Address | &:r2408_1 | | ir.cpp:2408:11:2408:11 | Left | r2408_2 | -| ir.cpp:2408:11:2408:11 | Load | m2406_17 | +| ir.cpp:2408:11:2408:11 | Load | m2406_25 | | ir.cpp:2408:11:2408:13 | Right | r2408_3 | | ir.cpp:2408:11:2408:13 | StoreValue | r2408_4 | | ir.cpp:2411:17:2411:17 | Address | &:r2411_1 | @@ -12812,131 +13334,153 @@ | ir.cpp:2411:21:2411:41 | Address | &:r2411_2 | | ir.cpp:2411:21:2411:41 | Address | &:r2411_2 | | ir.cpp:2411:21:2411:41 | Address | &:r2411_2 | +| ir.cpp:2411:21:2411:41 | Address | &:r2411_17 | +| ir.cpp:2411:21:2411:41 | Address | &:r2411_17 | | ir.cpp:2411:21:2411:41 | Arg(this) | this:r2411_2 | | ir.cpp:2411:21:2411:41 | Arg(this) | this:r2411_2 | +| ir.cpp:2411:21:2411:41 | Arg(this) | this:r2411_17 | | ir.cpp:2411:21:2411:41 | CallTarget | func:r2411_4 | +| ir.cpp:2411:21:2411:41 | CallTarget | func:r2411_18 | | ir.cpp:2411:21:2411:41 | ChiPartial | partial:m2411_6 | | ir.cpp:2411:21:2411:41 | ChiPartial | partial:m2411_8 | | ir.cpp:2411:21:2411:41 | ChiPartial | partial:m2411_15 | -| ir.cpp:2411:21:2411:41 | ChiTotal | total:m2406_13 | +| ir.cpp:2411:21:2411:41 | ChiPartial | partial:m2411_20 | +| ir.cpp:2411:21:2411:41 | ChiPartial | partial:m2411_23 | +| ir.cpp:2411:21:2411:41 | ChiTotal | total:m2406_21 | | ir.cpp:2411:21:2411:41 | ChiTotal | total:m2411_3 | | ir.cpp:2411:21:2411:41 | ChiTotal | total:m2411_9 | +| ir.cpp:2411:21:2411:41 | ChiTotal | total:m2411_13 | +| ir.cpp:2411:21:2411:41 | ChiTotal | total:m2411_16 | | ir.cpp:2411:21:2411:41 | SideEffect | m2411_9 | -| ir.cpp:2411:21:2411:41 | SideEffect | ~m2406_13 | +| ir.cpp:2411:21:2411:41 | SideEffect | m2411_16 | +| ir.cpp:2411:21:2411:41 | SideEffect | ~m2406_21 | +| ir.cpp:2411:21:2411:41 | SideEffect | ~m2411_13 | +| ir.cpp:2411:21:2411:41 | Unary | r2411_2 | | ir.cpp:2411:43:2411:47 | CallTarget | func:r2411_10 | | ir.cpp:2411:43:2411:47 | ChiPartial | partial:m2411_12 | | ir.cpp:2411:43:2411:47 | ChiTotal | total:m2411_7 | | ir.cpp:2411:43:2411:47 | SideEffect | ~m2411_7 | | ir.cpp:2411:43:2411:47 | StoreValue | r2411_11 | -| ir.cpp:2411:52:2411:52 | Address | &:r2411_18 | -| ir.cpp:2411:52:2411:52 | Condition | r2411_20 | -| ir.cpp:2411:52:2411:52 | Load | m2411_17 | -| ir.cpp:2411:52:2411:52 | Unary | r2411_19 | +| ir.cpp:2411:52:2411:52 | Address | &:r2411_26 | +| ir.cpp:2411:52:2411:52 | Condition | r2411_28 | +| ir.cpp:2411:52:2411:52 | Load | m2411_25 | +| ir.cpp:2411:52:2411:52 | Unary | r2411_27 | | ir.cpp:2413:11:2413:11 | Address | &:r2413_1 | | ir.cpp:2413:11:2413:11 | Address | &:r2413_1 | | ir.cpp:2413:11:2413:11 | Left | r2413_2 | -| ir.cpp:2413:11:2413:11 | Load | m2411_17 | +| ir.cpp:2413:11:2413:11 | Load | m2411_25 | | ir.cpp:2413:11:2413:13 | Right | r2413_3 | | ir.cpp:2413:11:2413:13 | StoreValue | r2413_4 | -| ir.cpp:2416:5:2416:5 | Address | &:r2416_18 | -| ir.cpp:2416:5:2416:5 | Address | &:r2416_31 | -| ir.cpp:2416:5:2416:5 | Address | &:r2416_37 | +| ir.cpp:2416:5:2416:5 | Address | &:r2416_26 | +| ir.cpp:2416:5:2416:5 | Address | &:r2416_39 | +| ir.cpp:2416:5:2416:5 | Address | &:r2416_45 | | ir.cpp:2416:14:2416:14 | Address | &:r2416_1 | | ir.cpp:2416:18:2416:38 | Address | &:r2416_2 | | ir.cpp:2416:18:2416:38 | Address | &:r2416_2 | | ir.cpp:2416:18:2416:38 | Address | &:r2416_2 | | ir.cpp:2416:18:2416:38 | Address | &:r2416_2 | +| ir.cpp:2416:18:2416:38 | Address | &:r2416_17 | +| ir.cpp:2416:18:2416:38 | Address | &:r2416_17 | | ir.cpp:2416:18:2416:38 | Arg(this) | this:r2416_2 | | ir.cpp:2416:18:2416:38 | Arg(this) | this:r2416_2 | +| ir.cpp:2416:18:2416:38 | Arg(this) | this:r2416_17 | | ir.cpp:2416:18:2416:38 | CallTarget | func:r2416_4 | +| ir.cpp:2416:18:2416:38 | CallTarget | func:r2416_18 | | ir.cpp:2416:18:2416:38 | ChiPartial | partial:m2416_6 | | ir.cpp:2416:18:2416:38 | ChiPartial | partial:m2416_8 | | ir.cpp:2416:18:2416:38 | ChiPartial | partial:m2416_15 | -| ir.cpp:2416:18:2416:38 | ChiTotal | total:m2411_13 | +| ir.cpp:2416:18:2416:38 | ChiPartial | partial:m2416_20 | +| ir.cpp:2416:18:2416:38 | ChiPartial | partial:m2416_23 | +| ir.cpp:2416:18:2416:38 | ChiTotal | total:m2411_21 | | ir.cpp:2416:18:2416:38 | ChiTotal | total:m2416_3 | | ir.cpp:2416:18:2416:38 | ChiTotal | total:m2416_9 | +| ir.cpp:2416:18:2416:38 | ChiTotal | total:m2416_13 | +| ir.cpp:2416:18:2416:38 | ChiTotal | total:m2416_16 | | ir.cpp:2416:18:2416:38 | SideEffect | m2416_9 | -| ir.cpp:2416:18:2416:38 | SideEffect | ~m2411_13 | +| ir.cpp:2416:18:2416:38 | SideEffect | m2416_16 | +| ir.cpp:2416:18:2416:38 | SideEffect | ~m2411_21 | +| ir.cpp:2416:18:2416:38 | SideEffect | ~m2416_13 | +| ir.cpp:2416:18:2416:38 | Unary | r2416_2 | | ir.cpp:2416:40:2416:44 | CallTarget | func:r2416_10 | | ir.cpp:2416:40:2416:44 | ChiPartial | partial:m2416_12 | | ir.cpp:2416:40:2416:44 | ChiTotal | total:m2416_7 | | ir.cpp:2416:40:2416:44 | SideEffect | ~m2416_7 | | ir.cpp:2416:40:2416:44 | StoreValue | r2416_11 | -| ir.cpp:2416:54:2416:54 | Address | &:r2416_58 | -| ir.cpp:2416:58:2416:58 | Address | &:r2416_32 | -| ir.cpp:2416:58:2416:58 | Address | &:r2416_38 | -| ir.cpp:2416:58:2416:58 | Address | &:r2416_61 | -| ir.cpp:2416:58:2416:58 | Address | &:r2416_66 | -| ir.cpp:2416:58:2416:58 | Address | &:r2416_66 | +| ir.cpp:2416:54:2416:54 | Address | &:r2416_66 | +| ir.cpp:2416:58:2416:58 | Address | &:r2416_40 | +| ir.cpp:2416:58:2416:58 | Address | &:r2416_46 | +| ir.cpp:2416:58:2416:58 | Address | &:r2416_69 | +| ir.cpp:2416:58:2416:58 | Address | &:r2416_74 | +| ir.cpp:2416:58:2416:58 | Address | &:r2416_74 | | ir.cpp:2416:58:2416:58 | Arg(this) | this:r0_2 | | ir.cpp:2416:58:2416:58 | Arg(this) | this:r0_5 | | ir.cpp:2416:58:2416:58 | Arg(this) | this:r0_7 | | ir.cpp:2416:58:2416:58 | Arg(this) | this:r0_8 | | ir.cpp:2416:58:2416:58 | Arg(this) | this:r0_15 | -| ir.cpp:2416:58:2416:58 | Arg(this) | this:r2416_66 | -| ir.cpp:2416:58:2416:58 | CallTarget | func:r2416_34 | -| ir.cpp:2416:58:2416:58 | CallTarget | func:r2416_40 | -| ir.cpp:2416:58:2416:58 | CallTarget | func:r2416_46 | -| ir.cpp:2416:58:2416:58 | CallTarget | func:r2416_47 | -| ir.cpp:2416:58:2416:58 | CallTarget | func:r2416_60 | -| ir.cpp:2416:58:2416:58 | CallTarget | func:r2416_67 | -| ir.cpp:2416:58:2416:58 | ChiPartial | partial:m2416_50 | -| ir.cpp:2416:58:2416:58 | ChiPartial | partial:m2416_52 | -| ir.cpp:2416:58:2416:58 | ChiPartial | partial:m2416_55 | -| ir.cpp:2416:58:2416:58 | ChiPartial | partial:m2416_62 | -| ir.cpp:2416:58:2416:58 | ChiPartial | partial:m2416_69 | -| ir.cpp:2416:58:2416:58 | ChiPartial | partial:m2416_72 | +| ir.cpp:2416:58:2416:58 | Arg(this) | this:r2416_74 | +| ir.cpp:2416:58:2416:58 | CallTarget | func:r2416_42 | +| ir.cpp:2416:58:2416:58 | CallTarget | func:r2416_48 | +| ir.cpp:2416:58:2416:58 | CallTarget | func:r2416_54 | +| ir.cpp:2416:58:2416:58 | CallTarget | func:r2416_55 | +| ir.cpp:2416:58:2416:58 | CallTarget | func:r2416_68 | +| ir.cpp:2416:58:2416:58 | CallTarget | func:r2416_75 | +| ir.cpp:2416:58:2416:58 | ChiPartial | partial:m2416_58 | +| ir.cpp:2416:58:2416:58 | ChiPartial | partial:m2416_60 | +| ir.cpp:2416:58:2416:58 | ChiPartial | partial:m2416_63 | +| ir.cpp:2416:58:2416:58 | ChiPartial | partial:m2416_70 | +| ir.cpp:2416:58:2416:58 | ChiPartial | partial:m2416_77 | +| ir.cpp:2416:58:2416:58 | ChiPartial | partial:m2416_80 | | ir.cpp:2416:58:2416:58 | ChiTotal | total:m0_9 | -| ir.cpp:2416:58:2416:58 | ChiTotal | total:m2416_43 | -| ir.cpp:2416:58:2416:58 | ChiTotal | total:m2416_44 | | ir.cpp:2416:58:2416:58 | ChiTotal | total:m2416_51 | -| ir.cpp:2416:58:2416:58 | ChiTotal | total:m2416_56 | -| ir.cpp:2416:58:2416:58 | ChiTotal | total:m2416_63 | -| ir.cpp:2416:58:2416:58 | Condition | r2416_54 | -| ir.cpp:2416:58:2416:58 | Load | m2416_30 | -| ir.cpp:2416:58:2416:58 | Load | m2416_30 | -| ir.cpp:2416:58:2416:58 | Phi | from 9:m2416_36 | -| ir.cpp:2416:58:2416:58 | Phi | from 9:~m2416_26 | -| ir.cpp:2416:58:2416:58 | Phi | from 11:m2416_73 | -| ir.cpp:2416:58:2416:58 | Phi | from 11:~m2416_70 | -| ir.cpp:2416:58:2416:58 | SideEffect | m2416_43 | -| ir.cpp:2416:58:2416:58 | SideEffect | ~m2416_44 | -| ir.cpp:2416:58:2416:58 | SideEffect | ~m2416_51 | -| ir.cpp:2416:58:2416:58 | SideEffect | ~m2416_56 | -| ir.cpp:2416:58:2416:58 | SideEffect | ~m2416_63 | -| ir.cpp:2416:58:2416:58 | StoreValue | r2416_35 | -| ir.cpp:2416:58:2416:58 | StoreValue | r2416_41 | -| ir.cpp:2416:58:2416:58 | Unary | r2416_33 | -| ir.cpp:2416:58:2416:58 | Unary | r2416_39 | -| ir.cpp:2416:58:2416:58 | Unary | r2416_45 | -| ir.cpp:2416:58:2416:58 | Unary | r2416_48 | -| ir.cpp:2416:58:2416:58 | Unary | r2416_59 | -| ir.cpp:2416:58:2416:58 | Unary | r2416_68 | -| ir.cpp:2416:58:2416:77 | Address | &:r2416_19 | -| ir.cpp:2416:58:2416:77 | Address | &:r2416_19 | -| ir.cpp:2416:58:2416:77 | Arg(this) | this:r2416_19 | -| ir.cpp:2416:58:2416:77 | CallTarget | func:r2416_21 | -| ir.cpp:2416:58:2416:77 | ChiPartial | partial:m2416_25 | -| ir.cpp:2416:58:2416:77 | ChiPartial | partial:m2416_27 | -| ir.cpp:2416:58:2416:77 | ChiTotal | total:m2416_13 | -| ir.cpp:2416:58:2416:77 | ChiTotal | total:m2416_20 | -| ir.cpp:2416:58:2416:77 | SideEffect | ~m2416_13 | -| ir.cpp:2416:58:2416:77 | StoreValue | r2416_29 | -| ir.cpp:2416:58:2416:77 | Unary | r2416_19 | -| ir.cpp:2416:58:2416:78 | Load | ~m2416_63 | -| ir.cpp:2416:58:2416:78 | StoreValue | r2416_64 | -| ir.cpp:2416:76:2416:76 | Address | &:r2416_22 | -| ir.cpp:2416:76:2416:76 | Arg(0) | 0:r2416_23 | -| ir.cpp:2416:76:2416:76 | Load | m2416_17 | +| ir.cpp:2416:58:2416:58 | ChiTotal | total:m2416_52 | +| ir.cpp:2416:58:2416:58 | ChiTotal | total:m2416_59 | +| ir.cpp:2416:58:2416:58 | ChiTotal | total:m2416_64 | +| ir.cpp:2416:58:2416:58 | ChiTotal | total:m2416_71 | +| ir.cpp:2416:58:2416:58 | Condition | r2416_62 | +| ir.cpp:2416:58:2416:58 | Load | m2416_38 | +| ir.cpp:2416:58:2416:58 | Load | m2416_38 | +| ir.cpp:2416:58:2416:58 | Phi | from 9:m2416_44 | +| ir.cpp:2416:58:2416:58 | Phi | from 9:~m2416_34 | +| ir.cpp:2416:58:2416:58 | Phi | from 11:m2416_81 | +| ir.cpp:2416:58:2416:58 | Phi | from 11:~m2416_78 | +| ir.cpp:2416:58:2416:58 | SideEffect | m2416_51 | +| ir.cpp:2416:58:2416:58 | SideEffect | ~m2416_52 | +| ir.cpp:2416:58:2416:58 | SideEffect | ~m2416_59 | +| ir.cpp:2416:58:2416:58 | SideEffect | ~m2416_64 | +| ir.cpp:2416:58:2416:58 | SideEffect | ~m2416_71 | +| ir.cpp:2416:58:2416:58 | StoreValue | r2416_43 | +| ir.cpp:2416:58:2416:58 | StoreValue | r2416_49 | +| ir.cpp:2416:58:2416:58 | Unary | r2416_41 | +| ir.cpp:2416:58:2416:58 | Unary | r2416_47 | +| ir.cpp:2416:58:2416:58 | Unary | r2416_53 | +| ir.cpp:2416:58:2416:58 | Unary | r2416_56 | +| ir.cpp:2416:58:2416:58 | Unary | r2416_67 | +| ir.cpp:2416:58:2416:58 | Unary | r2416_76 | +| ir.cpp:2416:58:2416:77 | Address | &:r2416_27 | +| ir.cpp:2416:58:2416:77 | Address | &:r2416_27 | +| ir.cpp:2416:58:2416:77 | Arg(this) | this:r2416_27 | +| ir.cpp:2416:58:2416:77 | CallTarget | func:r2416_29 | +| ir.cpp:2416:58:2416:77 | ChiPartial | partial:m2416_33 | +| ir.cpp:2416:58:2416:77 | ChiPartial | partial:m2416_35 | +| ir.cpp:2416:58:2416:77 | ChiTotal | total:m2416_21 | +| ir.cpp:2416:58:2416:77 | ChiTotal | total:m2416_28 | +| ir.cpp:2416:58:2416:77 | SideEffect | ~m2416_21 | +| ir.cpp:2416:58:2416:77 | StoreValue | r2416_37 | +| ir.cpp:2416:58:2416:77 | Unary | r2416_27 | +| ir.cpp:2416:58:2416:78 | Load | ~m2416_71 | +| ir.cpp:2416:58:2416:78 | StoreValue | r2416_72 | +| ir.cpp:2416:76:2416:76 | Address | &:r2416_30 | +| ir.cpp:2416:76:2416:76 | Arg(0) | 0:r2416_31 | +| ir.cpp:2416:76:2416:76 | Load | m2416_25 | | ir.cpp:2417:9:2417:9 | Address | &:r2417_4 | | ir.cpp:2417:9:2417:9 | Address | &:r2417_4 | -| ir.cpp:2417:9:2417:9 | Load | m2416_65 | +| ir.cpp:2417:9:2417:9 | Load | m2416_73 | | ir.cpp:2417:9:2417:9 | Unary | r2417_5 | | ir.cpp:2417:9:2417:14 | Left | r2417_6 | | ir.cpp:2417:9:2417:14 | StoreValue | r2417_8 | | ir.cpp:2417:9:2417:14 | Unary | r2417_7 | | ir.cpp:2417:14:2417:14 | Address | &:r2417_1 | -| ir.cpp:2417:14:2417:14 | Load | m2416_17 | +| ir.cpp:2417:14:2417:14 | Load | m2416_25 | | ir.cpp:2417:14:2417:14 | Right | r2417_3 | | ir.cpp:2417:14:2417:14 | Unary | r2417_2 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | @@ -13008,11 +13552,17 @@ | smart_ptr.cpp:12:20:12:27 | Address | &:r12_2 | | smart_ptr.cpp:12:20:12:27 | Address | &:r12_9 | | smart_ptr.cpp:12:20:12:27 | Address | &:r12_9 | +| smart_ptr.cpp:12:20:12:27 | Address | &:r12_16 | +| smart_ptr.cpp:12:20:12:27 | Address | &:r12_16 | | smart_ptr.cpp:12:20:12:27 | Arg(0) | 0:r12_9 | +| smart_ptr.cpp:12:20:12:27 | Arg(this) | this:r12_16 | +| smart_ptr.cpp:12:20:12:27 | CallTarget | func:r12_17 | | smart_ptr.cpp:12:20:12:27 | ChiPartial | partial:m12_14 | | smart_ptr.cpp:12:20:12:27 | ChiTotal | total:m10_8 | | smart_ptr.cpp:12:20:12:27 | Load | m12_8 | +| smart_ptr.cpp:12:20:12:27 | SideEffect | m12_8 | | smart_ptr.cpp:12:20:12:27 | SideEffect | ~m10_8 | +| smart_ptr.cpp:12:20:12:27 | Unary | r12_2 | | smart_ptr.cpp:12:24:12:28 | Load | m11_9 | | smart_ptr.cpp:12:24:12:28 | StoreValue | r12_7 | | smart_ptr.cpp:12:25:12:26 | Arg(0) | 0:r12_5 | @@ -13051,18 +13601,24 @@ | smart_ptr.cpp:19:20:19:21 | Address | &:r19_7 | | smart_ptr.cpp:19:20:19:21 | Address | &:r19_13 | | smart_ptr.cpp:19:20:19:21 | Address | &:r19_13 | +| smart_ptr.cpp:19:20:19:21 | Address | &:r19_20 | +| smart_ptr.cpp:19:20:19:21 | Address | &:r19_20 | | smart_ptr.cpp:19:20:19:21 | Arg(0) | 0:r19_7 | | smart_ptr.cpp:19:20:19:21 | Arg(0) | 0:r19_13 | | smart_ptr.cpp:19:20:19:21 | Arg(this) | this:r19_2 | +| smart_ptr.cpp:19:20:19:21 | Arg(this) | this:r19_20 | | smart_ptr.cpp:19:20:19:21 | CallTarget | func:r19_4 | +| smart_ptr.cpp:19:20:19:21 | CallTarget | func:r19_21 | | smart_ptr.cpp:19:20:19:21 | ChiPartial | partial:m19_9 | | smart_ptr.cpp:19:20:19:21 | ChiPartial | partial:m19_18 | | smart_ptr.cpp:19:20:19:21 | ChiTotal | total:m17_8 | | smart_ptr.cpp:19:20:19:21 | ChiTotal | total:m18_8 | | smart_ptr.cpp:19:20:19:21 | Load | m19_12 | | smart_ptr.cpp:19:20:19:21 | SideEffect | m18_9 | +| smart_ptr.cpp:19:20:19:21 | SideEffect | m19_12 | | smart_ptr.cpp:19:20:19:21 | SideEffect | ~m17_8 | | smart_ptr.cpp:19:20:19:21 | SideEffect | ~m18_8 | +| smart_ptr.cpp:19:20:19:21 | Unary | r19_2 | | smart_ptr.cpp:19:20:19:21 | Unary | r19_5 | | smart_ptr.cpp:19:20:19:21 | Unary | r19_6 | | smart_ptr.cpp:20:1:20:1 | Address | &:r20_2 | @@ -13083,16 +13639,22 @@ | smart_ptr.cpp:31:26:31:37 | Address | &:r31_2 | | smart_ptr.cpp:31:26:31:37 | Address | &:r31_7 | | smart_ptr.cpp:31:26:31:37 | Address | &:r31_13 | +| smart_ptr.cpp:31:26:31:37 | Address | &:r31_18 | +| smart_ptr.cpp:31:26:31:37 | Address | &:r31_18 | | smart_ptr.cpp:31:26:31:37 | Arg(0) | 0:r31_7 | | smart_ptr.cpp:31:26:31:37 | Arg(0) | 0:r31_13 | | smart_ptr.cpp:31:26:31:37 | Arg(this) | this:r31_2 | +| smart_ptr.cpp:31:26:31:37 | Arg(this) | this:r31_18 | | smart_ptr.cpp:31:26:31:37 | CallTarget | func:r31_4 | +| smart_ptr.cpp:31:26:31:37 | CallTarget | func:r31_19 | | smart_ptr.cpp:31:26:31:37 | ChiPartial | partial:m31_9 | | smart_ptr.cpp:31:26:31:37 | ChiTotal | total:m28_4 | | smart_ptr.cpp:31:26:31:37 | Load | m31_12 | | smart_ptr.cpp:31:26:31:37 | SideEffect | m29_2 | +| smart_ptr.cpp:31:26:31:37 | SideEffect | m31_12 | | smart_ptr.cpp:31:26:31:37 | SideEffect | ~m28_4 | | smart_ptr.cpp:31:26:31:37 | SideEffect | ~m31_16 | +| smart_ptr.cpp:31:26:31:37 | Unary | r31_2 | | smart_ptr.cpp:31:26:31:37 | Unary | r31_5 | | smart_ptr.cpp:31:26:31:37 | Unary | r31_6 | | smart_ptr.cpp:33:28:33:47 | Address | &:r33_1 | @@ -13106,18 +13668,24 @@ | smart_ptr.cpp:35:30:35:49 | Address | &:r35_7 | | smart_ptr.cpp:35:30:35:49 | Address | &:r35_13 | | smart_ptr.cpp:35:30:35:49 | Address | &:r35_13 | +| smart_ptr.cpp:35:30:35:49 | Address | &:r35_20 | +| smart_ptr.cpp:35:30:35:49 | Address | &:r35_20 | | smart_ptr.cpp:35:30:35:49 | Arg(0) | 0:r35_7 | | smart_ptr.cpp:35:30:35:49 | Arg(0) | 0:r35_13 | | smart_ptr.cpp:35:30:35:49 | Arg(this) | this:r35_2 | +| smart_ptr.cpp:35:30:35:49 | Arg(this) | this:r35_20 | | smart_ptr.cpp:35:30:35:49 | CallTarget | func:r35_4 | +| smart_ptr.cpp:35:30:35:49 | CallTarget | func:r35_21 | | smart_ptr.cpp:35:30:35:49 | ChiPartial | partial:m35_9 | | smart_ptr.cpp:35:30:35:49 | ChiPartial | partial:m35_18 | | smart_ptr.cpp:35:30:35:49 | ChiTotal | total:m31_16 | | smart_ptr.cpp:35:30:35:49 | ChiTotal | total:m35_16 | | smart_ptr.cpp:35:30:35:49 | Load | m35_12 | | smart_ptr.cpp:35:30:35:49 | SideEffect | m33_2 | +| smart_ptr.cpp:35:30:35:49 | SideEffect | m35_12 | | smart_ptr.cpp:35:30:35:49 | SideEffect | ~m31_16 | | smart_ptr.cpp:35:30:35:49 | SideEffect | ~m35_16 | +| smart_ptr.cpp:35:30:35:49 | Unary | r35_2 | | smart_ptr.cpp:35:30:35:49 | Unary | r35_5 | | smart_ptr.cpp:35:30:35:49 | Unary | r35_6 | | smart_ptr.cpp:37:39:37:53 | Address | &:r37_1 | @@ -13131,18 +13699,24 @@ | smart_ptr.cpp:39:37:39:51 | Address | &:r39_7 | | smart_ptr.cpp:39:37:39:51 | Address | &:r39_13 | | smart_ptr.cpp:39:37:39:51 | Address | &:r39_13 | +| smart_ptr.cpp:39:37:39:51 | Address | &:r39_20 | +| smart_ptr.cpp:39:37:39:51 | Address | &:r39_20 | | smart_ptr.cpp:39:37:39:51 | Arg(0) | 0:r39_7 | | smart_ptr.cpp:39:37:39:51 | Arg(0) | 0:r39_13 | | smart_ptr.cpp:39:37:39:51 | Arg(this) | this:r39_2 | +| smart_ptr.cpp:39:37:39:51 | Arg(this) | this:r39_20 | | smart_ptr.cpp:39:37:39:51 | CallTarget | func:r39_4 | +| smart_ptr.cpp:39:37:39:51 | CallTarget | func:r39_21 | | smart_ptr.cpp:39:37:39:51 | ChiPartial | partial:m39_9 | | smart_ptr.cpp:39:37:39:51 | ChiPartial | partial:m39_18 | | smart_ptr.cpp:39:37:39:51 | ChiTotal | total:m35_19 | | smart_ptr.cpp:39:37:39:51 | ChiTotal | total:m39_16 | | smart_ptr.cpp:39:37:39:51 | Load | m39_12 | | smart_ptr.cpp:39:37:39:51 | SideEffect | m37_2 | +| smart_ptr.cpp:39:37:39:51 | SideEffect | m39_12 | | smart_ptr.cpp:39:37:39:51 | SideEffect | ~m35_19 | | smart_ptr.cpp:39:37:39:51 | SideEffect | ~m39_16 | +| smart_ptr.cpp:39:37:39:51 | Unary | r39_2 | | smart_ptr.cpp:39:37:39:51 | Unary | r39_5 | | smart_ptr.cpp:39:37:39:51 | Unary | r39_6 | | smart_ptr.cpp:41:39:41:53 | Address | &:r41_1 | @@ -13156,18 +13730,24 @@ | smart_ptr.cpp:43:37:43:51 | Address | &:r43_7 | | smart_ptr.cpp:43:37:43:51 | Address | &:r43_13 | | smart_ptr.cpp:43:37:43:51 | Address | &:r43_13 | +| smart_ptr.cpp:43:37:43:51 | Address | &:r43_20 | +| smart_ptr.cpp:43:37:43:51 | Address | &:r43_20 | | smart_ptr.cpp:43:37:43:51 | Arg(0) | 0:r43_7 | | smart_ptr.cpp:43:37:43:51 | Arg(0) | 0:r43_13 | | smart_ptr.cpp:43:37:43:51 | Arg(this) | this:r43_2 | +| smart_ptr.cpp:43:37:43:51 | Arg(this) | this:r43_20 | | smart_ptr.cpp:43:37:43:51 | CallTarget | func:r43_4 | +| smart_ptr.cpp:43:37:43:51 | CallTarget | func:r43_21 | | smart_ptr.cpp:43:37:43:51 | ChiPartial | partial:m43_9 | | smart_ptr.cpp:43:37:43:51 | ChiPartial | partial:m43_18 | | smart_ptr.cpp:43:37:43:51 | ChiTotal | total:m39_19 | | smart_ptr.cpp:43:37:43:51 | ChiTotal | total:m43_16 | | smart_ptr.cpp:43:37:43:51 | Load | m43_12 | | smart_ptr.cpp:43:37:43:51 | SideEffect | m41_2 | +| smart_ptr.cpp:43:37:43:51 | SideEffect | m43_12 | | smart_ptr.cpp:43:37:43:51 | SideEffect | ~m39_19 | | smart_ptr.cpp:43:37:43:51 | SideEffect | ~m43_16 | +| smart_ptr.cpp:43:37:43:51 | Unary | r43_2 | | smart_ptr.cpp:43:37:43:51 | Unary | r43_5 | | smart_ptr.cpp:43:37:43:51 | Unary | r43_6 | | smart_ptr.cpp:45:45:45:65 | Address | &:r45_1 | @@ -13180,16 +13760,22 @@ | smart_ptr.cpp:47:43:47:63 | Address | &:r47_2 | | smart_ptr.cpp:47:43:47:63 | Address | &:r47_7 | | smart_ptr.cpp:47:43:47:63 | Address | &:r47_13 | +| smart_ptr.cpp:47:43:47:63 | Address | &:r47_18 | +| smart_ptr.cpp:47:43:47:63 | Address | &:r47_18 | | smart_ptr.cpp:47:43:47:63 | Arg(0) | 0:r47_7 | | smart_ptr.cpp:47:43:47:63 | Arg(0) | 0:r47_13 | | smart_ptr.cpp:47:43:47:63 | Arg(this) | this:r47_2 | +| smart_ptr.cpp:47:43:47:63 | Arg(this) | this:r47_18 | | smart_ptr.cpp:47:43:47:63 | CallTarget | func:r47_4 | +| smart_ptr.cpp:47:43:47:63 | CallTarget | func:r47_19 | | smart_ptr.cpp:47:43:47:63 | ChiPartial | partial:m47_9 | | smart_ptr.cpp:47:43:47:63 | ChiTotal | total:m43_19 | | smart_ptr.cpp:47:43:47:63 | Load | m47_12 | | smart_ptr.cpp:47:43:47:63 | SideEffect | m45_2 | +| smart_ptr.cpp:47:43:47:63 | SideEffect | m47_12 | | smart_ptr.cpp:47:43:47:63 | SideEffect | ~m43_19 | | smart_ptr.cpp:47:43:47:63 | SideEffect | ~m47_16 | +| smart_ptr.cpp:47:43:47:63 | Unary | r47_2 | | smart_ptr.cpp:47:43:47:63 | Unary | r47_5 | | smart_ptr.cpp:47:43:47:63 | Unary | r47_6 | | smart_ptr.cpp:48:1:48:1 | Address | &:r48_2 | 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 356390f9b4ff..2df766d81285 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -7,7 +7,47 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors +| destructors_for_temps.cpp:51:41:51:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:41:55:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unexplainedLoop +| destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -18,8 +58,17 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability +| destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Block 'Load: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:5 | Store: ... ? ... : ... | Block 'Store: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Block 'Load: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:5 | Store: ... ? ... : ... | Block 'Store: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | backEdgeCountMismatch useNotDominatedByDefinition +| destructors_for_temps.cpp:45:39:45:60 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:42:6:42:15 | void temp_test6(bool) | void temp_test6(bool) | +| destructors_for_temps.cpp:51:5:51:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:5:55:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | ir.cpp:1535:8:1535:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1535:8:1535:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | 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 25d6225d77eb..9d6c43a008e0 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -747,105 +747,135 @@ destructors_for_temps.cpp: # 14| char temp_test() # 14| Block 0 -# 14| v14_1(void) = EnterFunction : -# 14| mu14_2(unknown) = AliasedDefinition : -# 14| mu14_3(unknown) = InitializeNonLocal : -# 15| r15_1(glval) = VariableAddress[x] : -# 15| r15_2(glval) = VariableAddress[#temp15:14] : -# 15| mu15_3(ClassWithDestructor2) = Uninitialized[#temp15:14] : &:r15_2 -# 15| r15_4(glval) = FunctionAddress[ClassWithDestructor2] : -# 15| v15_5(void) = Call[ClassWithDestructor2] : func:r15_4, this:r15_2 -# 15| mu15_6(unknown) = ^CallSideEffect : ~m? -# 15| mu15_7(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r15_2 -# 15| r15_8(glval) = FunctionAddress[get_x] : -# 15| r15_9(char) = Call[get_x] : func:r15_8, this:r15_2 -# 15| mu15_10(unknown) = ^CallSideEffect : ~m? -# 15| v15_11(void) = ^IndirectReadSideEffect[-1] : &:r15_2, ~m? -# 15| mu15_12(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r15_2 -# 15| mu15_13(char) = Store[x] : &:r15_1, r15_9 -# 16| r16_1(glval) = VariableAddress[y] : -# 16| mu16_2(ClassWithConstructor) = Uninitialized[y] : &:r16_1 -# 16| r16_3(glval) = FunctionAddress[ClassWithConstructor] : -# 16| r16_4(char) = Constant[97] : -# 16| r16_5(glval) = VariableAddress[#temp16:33] : -# 16| mu16_6(ClassWithDestructor2) = Uninitialized[#temp16:33] : &:r16_5 -# 16| r16_7(glval) = FunctionAddress[ClassWithDestructor2] : -# 16| v16_8(void) = Call[ClassWithDestructor2] : func:r16_7, this:r16_5 -# 16| mu16_9(unknown) = ^CallSideEffect : ~m? -# 16| mu16_10(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r16_5 -# 16| r16_11(glval) = FunctionAddress[get_x] : -# 16| r16_12(char) = Call[get_x] : func:r16_11, this:r16_5 -# 16| mu16_13(unknown) = ^CallSideEffect : ~m? -# 16| v16_14(void) = ^IndirectReadSideEffect[-1] : &:r16_5, ~m? -# 16| mu16_15(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r16_5 -# 16| v16_16(void) = Call[ClassWithConstructor] : func:r16_3, this:r16_1, 0:r16_4, 1:r16_12 -# 16| mu16_17(unknown) = ^CallSideEffect : ~m? -# 16| mu16_18(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r16_1 -# 17| r17_1(glval) = VariableAddress[#return] : -# 17| r17_2(glval) = VariableAddress[#temp17:12] : -# 17| mu17_3(ClassWithDestructor2) = Uninitialized[#temp17:12] : &:r17_2 -# 17| r17_4(glval) = FunctionAddress[ClassWithDestructor2] : -# 17| v17_5(void) = Call[ClassWithDestructor2] : func:r17_4, this:r17_2 -# 17| mu17_6(unknown) = ^CallSideEffect : ~m? -# 17| mu17_7(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r17_2 -# 17| r17_8(glval) = FunctionAddress[get_x] : -# 17| r17_9(char) = Call[get_x] : func:r17_8, this:r17_2 -# 17| mu17_10(unknown) = ^CallSideEffect : ~m? -# 17| v17_11(void) = ^IndirectReadSideEffect[-1] : &:r17_2, ~m? -# 17| mu17_12(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r17_2 -# 17| mu17_13(char) = Store[#return] : &:r17_1, r17_9 -# 14| r14_4(glval) = VariableAddress[#return] : -# 14| v14_5(void) = ReturnValue : &:r14_4, ~m? -# 14| v14_6(void) = AliasedUse : ~m? -# 14| v14_7(void) = ExitFunction : +# 14| v14_1(void) = EnterFunction : +# 14| mu14_2(unknown) = AliasedDefinition : +# 14| mu14_3(unknown) = InitializeNonLocal : +# 15| r15_1(glval) = VariableAddress[x] : +# 15| r15_2(glval) = VariableAddress[#temp15:14] : +# 15| mu15_3(ClassWithDestructor2) = Uninitialized[#temp15:14] : &:r15_2 +# 15| r15_4(glval) = FunctionAddress[ClassWithDestructor2] : +# 15| v15_5(void) = Call[ClassWithDestructor2] : func:r15_4, this:r15_2 +# 15| mu15_6(unknown) = ^CallSideEffect : ~m? +# 15| mu15_7(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r15_2 +# 15| r15_8(glval) = FunctionAddress[get_x] : +# 15| r15_9(char) = Call[get_x] : func:r15_8, this:r15_2 +# 15| mu15_10(unknown) = ^CallSideEffect : ~m? +# 15| v15_11(void) = ^IndirectReadSideEffect[-1] : &:r15_2, ~m? +# 15| mu15_12(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r15_2 +# 15| r15_13(glval) = CopyValue : r15_2 +# 15| r15_14(glval) = FunctionAddress[~ClassWithDestructor2] : +# 15| v15_15(void) = Call[~ClassWithDestructor2] : func:r15_14, this:r15_13 +# 15| mu15_16(unknown) = ^CallSideEffect : ~m? +# 15| v15_17(void) = ^IndirectReadSideEffect[-1] : &:r15_13, ~m? +# 15| mu15_18(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r15_13 +# 15| mu15_19(char) = Store[x] : &:r15_1, r15_9 +# 16| r16_1(glval) = VariableAddress[y] : +# 16| mu16_2(ClassWithConstructor) = Uninitialized[y] : &:r16_1 +# 16| r16_3(glval) = FunctionAddress[ClassWithConstructor] : +# 16| r16_4(char) = Constant[97] : +# 16| r16_5(glval) = VariableAddress[#temp16:33] : +# 16| mu16_6(ClassWithDestructor2) = Uninitialized[#temp16:33] : &:r16_5 +# 16| r16_7(glval) = FunctionAddress[ClassWithDestructor2] : +# 16| v16_8(void) = Call[ClassWithDestructor2] : func:r16_7, this:r16_5 +# 16| mu16_9(unknown) = ^CallSideEffect : ~m? +# 16| mu16_10(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r16_5 +# 16| r16_11(glval) = FunctionAddress[get_x] : +# 16| r16_12(char) = Call[get_x] : func:r16_11, this:r16_5 +# 16| mu16_13(unknown) = ^CallSideEffect : ~m? +# 16| v16_14(void) = ^IndirectReadSideEffect[-1] : &:r16_5, ~m? +# 16| mu16_15(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r16_5 +# 16| v16_16(void) = Call[ClassWithConstructor] : func:r16_3, this:r16_1, 0:r16_4, 1:r16_12 +# 16| mu16_17(unknown) = ^CallSideEffect : ~m? +# 16| mu16_18(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r16_1 +# 16| r16_19(glval) = CopyValue : r16_5 +# 16| r16_20(glval) = FunctionAddress[~ClassWithDestructor2] : +# 16| v16_21(void) = Call[~ClassWithDestructor2] : func:r16_20, this:r16_19 +# 16| mu16_22(unknown) = ^CallSideEffect : ~m? +# 16| v16_23(void) = ^IndirectReadSideEffect[-1] : &:r16_19, ~m? +# 16| mu16_24(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r16_19 +# 17| r17_1(glval) = VariableAddress[#return] : +# 17| r17_2(glval) = VariableAddress[#temp17:12] : +# 17| mu17_3(ClassWithDestructor2) = Uninitialized[#temp17:12] : &:r17_2 +# 17| r17_4(glval) = FunctionAddress[ClassWithDestructor2] : +# 17| v17_5(void) = Call[ClassWithDestructor2] : func:r17_4, this:r17_2 +# 17| mu17_6(unknown) = ^CallSideEffect : ~m? +# 17| mu17_7(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r17_2 +# 17| r17_8(glval) = FunctionAddress[get_x] : +# 17| r17_9(char) = Call[get_x] : func:r17_8, this:r17_2 +# 17| mu17_10(unknown) = ^CallSideEffect : ~m? +# 17| v17_11(void) = ^IndirectReadSideEffect[-1] : &:r17_2, ~m? +# 17| mu17_12(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r17_2 +# 17| r17_13(glval) = CopyValue : r17_2 +# 17| r17_14(glval) = FunctionAddress[~ClassWithDestructor2] : +# 17| v17_15(void) = Call[~ClassWithDestructor2] : func:r17_14, this:r17_13 +# 17| mu17_16(unknown) = ^CallSideEffect : ~m? +# 17| v17_17(void) = ^IndirectReadSideEffect[-1] : &:r17_13, ~m? +# 17| mu17_18(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r17_13 +# 17| mu17_19(char) = Store[#return] : &:r17_1, r17_9 +# 14| r14_4(glval) = VariableAddress[#return] : +# 14| v14_5(void) = ReturnValue : &:r14_4, ~m? +# 14| v14_6(void) = AliasedUse : ~m? +# 14| v14_7(void) = ExitFunction : # 21| char temp_test2() # 21| Block 0 -# 21| v21_1(void) = EnterFunction : -# 21| mu21_2(unknown) = AliasedDefinition : -# 21| mu21_3(unknown) = InitializeNonLocal : -# 22| r22_1(glval) = FunctionAddress[operator new] : -# 22| r22_2(unsigned long) = Constant[1] : -# 22| r22_3(void *) = Call[operator new] : func:r22_1, 0:r22_2 -# 22| mu22_4(unknown) = ^CallSideEffect : ~m? -# 22| mu22_5(unknown) = ^InitializeDynamicAllocation : &:r22_3 -# 22| r22_6(ClassWithDestructor2 *) = Convert : r22_3 -# 22| r22_7(glval) = FunctionAddress[ClassWithDestructor2] : -# 22| v22_8(void) = Call[ClassWithDestructor2] : func:r22_7, this:r22_6 -# 22| mu22_9(unknown) = ^CallSideEffect : ~m? -# 22| mu22_10(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r22_6 -# 23| r23_1(glval) = VariableAddress[#return] : -# 23| r23_2(glval) = VariableAddress[#temp23:12] : -# 23| mu23_3(ClassWithDestructor2) = Uninitialized[#temp23:12] : &:r23_2 -# 23| r23_4(glval) = FunctionAddress[ClassWithDestructor2] : -# 23| v23_5(void) = Call[ClassWithDestructor2] : func:r23_4, this:r23_2 -# 23| mu23_6(unknown) = ^CallSideEffect : ~m? -# 23| mu23_7(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r23_2 -# 23| r23_8(glval) = FunctionAddress[get_x] : -# 23| r23_9(char) = Call[get_x] : func:r23_8, this:r23_2 -# 23| mu23_10(unknown) = ^CallSideEffect : ~m? -# 23| v23_11(void) = ^IndirectReadSideEffect[-1] : &:r23_2, ~m? -# 23| mu23_12(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r23_2 -# 23| r23_13(int) = Convert : r23_9 -# 23| r23_14(glval) = VariableAddress[#temp23:45] : -# 23| mu23_15(ClassWithDestructor2) = Uninitialized[#temp23:45] : &:r23_14 -# 23| r23_16(glval) = FunctionAddress[ClassWithDestructor2] : -# 23| v23_17(void) = Call[ClassWithDestructor2] : func:r23_16, this:r23_14 -# 23| mu23_18(unknown) = ^CallSideEffect : ~m? -# 23| mu23_19(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r23_14 -# 23| r23_20(glval) = FunctionAddress[get_x] : -# 23| r23_21(char) = Call[get_x] : func:r23_20, this:r23_14 -# 23| mu23_22(unknown) = ^CallSideEffect : ~m? -# 23| v23_23(void) = ^IndirectReadSideEffect[-1] : &:r23_14, ~m? -# 23| mu23_24(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r23_14 -# 23| r23_25(int) = Convert : r23_21 -# 23| r23_26(int) = Add : r23_13, r23_25 -# 23| r23_27(char) = Convert : r23_26 -# 23| mu23_28(char) = Store[#return] : &:r23_1, r23_27 -# 21| r21_4(glval) = VariableAddress[#return] : -# 21| v21_5(void) = ReturnValue : &:r21_4, ~m? -# 21| v21_6(void) = AliasedUse : ~m? -# 21| v21_7(void) = ExitFunction : +# 21| v21_1(void) = EnterFunction : +# 21| mu21_2(unknown) = AliasedDefinition : +# 21| mu21_3(unknown) = InitializeNonLocal : +# 22| r22_1(glval) = FunctionAddress[operator new] : +# 22| r22_2(unsigned long) = Constant[1] : +# 22| r22_3(void *) = Call[operator new] : func:r22_1, 0:r22_2 +# 22| mu22_4(unknown) = ^CallSideEffect : ~m? +# 22| mu22_5(unknown) = ^InitializeDynamicAllocation : &:r22_3 +# 22| r22_6(ClassWithDestructor2 *) = Convert : r22_3 +# 22| r22_7(glval) = FunctionAddress[ClassWithDestructor2] : +# 22| v22_8(void) = Call[ClassWithDestructor2] : func:r22_7, this:r22_6 +# 22| mu22_9(unknown) = ^CallSideEffect : ~m? +# 22| mu22_10(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r22_6 +# 23| r23_1(glval) = VariableAddress[#return] : +# 23| r23_2(glval) = VariableAddress[#temp23:12] : +# 23| mu23_3(ClassWithDestructor2) = Uninitialized[#temp23:12] : &:r23_2 +# 23| r23_4(glval) = FunctionAddress[ClassWithDestructor2] : +# 23| v23_5(void) = Call[ClassWithDestructor2] : func:r23_4, this:r23_2 +# 23| mu23_6(unknown) = ^CallSideEffect : ~m? +# 23| mu23_7(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r23_2 +# 23| r23_8(glval) = FunctionAddress[get_x] : +# 23| r23_9(char) = Call[get_x] : func:r23_8, this:r23_2 +# 23| mu23_10(unknown) = ^CallSideEffect : ~m? +# 23| v23_11(void) = ^IndirectReadSideEffect[-1] : &:r23_2, ~m? +# 23| mu23_12(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r23_2 +# 23| r23_13(int) = Convert : r23_9 +# 23| r23_14(glval) = VariableAddress[#temp23:45] : +# 23| mu23_15(ClassWithDestructor2) = Uninitialized[#temp23:45] : &:r23_14 +# 23| r23_16(glval) = FunctionAddress[ClassWithDestructor2] : +# 23| v23_17(void) = Call[ClassWithDestructor2] : func:r23_16, this:r23_14 +# 23| mu23_18(unknown) = ^CallSideEffect : ~m? +# 23| mu23_19(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r23_14 +# 23| r23_20(glval) = FunctionAddress[get_x] : +# 23| r23_21(char) = Call[get_x] : func:r23_20, this:r23_14 +# 23| mu23_22(unknown) = ^CallSideEffect : ~m? +# 23| v23_23(void) = ^IndirectReadSideEffect[-1] : &:r23_14, ~m? +# 23| mu23_24(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r23_14 +# 23| r23_25(int) = Convert : r23_21 +# 23| r23_26(int) = Add : r23_13, r23_25 +# 23| r23_27(glval) = CopyValue : r23_14 +# 23| r23_28(glval) = FunctionAddress[~ClassWithDestructor2] : +# 23| v23_29(void) = Call[~ClassWithDestructor2] : func:r23_28, this:r23_27 +# 23| mu23_30(unknown) = ^CallSideEffect : ~m? +# 23| v23_31(void) = ^IndirectReadSideEffect[-1] : &:r23_27, ~m? +# 23| mu23_32(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r23_27 +# 23| r23_33(glval) = CopyValue : r23_2 +# 23| r23_34(glval) = FunctionAddress[~ClassWithDestructor2] : +# 23| v23_35(void) = Call[~ClassWithDestructor2] : func:r23_34, this:r23_33 +# 23| mu23_36(unknown) = ^CallSideEffect : ~m? +# 23| v23_37(void) = ^IndirectReadSideEffect[-1] : &:r23_33, ~m? +# 23| mu23_38(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r23_33 +# 23| r23_39(char) = Convert : r23_26 +# 23| mu23_40(char) = Store[#return] : &:r23_1, r23_39 +# 21| r21_4(glval) = VariableAddress[#return] : +# 21| v21_5(void) = ReturnValue : &:r21_4, ~m? +# 21| v21_6(void) = AliasedUse : ~m? +# 21| v21_7(void) = ExitFunction : # 29| void temp_test3() # 29| Block 0 @@ -924,36 +954,42 @@ destructors_for_temps.cpp: #-----| True -> Block 2 # 39| Block 1 -# 39| r39_5(glval) = VariableAddress[#temp39:3] : -# 39| r39_6(ClassWithDestructor2) = Load[#temp39:3] : &:r39_5, ~m? -# 39| mu39_7(ClassWithDestructor2) = Store[#temp39:3] : &:r39_1, r39_6 -# 40| v40_1(void) = NoOp : -# 38| v38_6(void) = ReturnVoid : -# 38| v38_7(void) = AliasedUse : ~m? -# 38| v38_8(void) = ExitFunction : +# 39| r39_5(glval) = VariableAddress[#temp39:3] : +# 39| r39_6(ClassWithDestructor2) = Load[#temp39:3] : &:r39_5, ~m? +# 39| r39_7(glval) = CopyValue : r39_1 +# 39| r39_8(glval) = FunctionAddress[~ClassWithDestructor2] : +# 39| v39_9(void) = Call[~ClassWithDestructor2] : func:r39_8, this:r39_7 +# 39| mu39_10(unknown) = ^CallSideEffect : ~m? +# 39| v39_11(void) = ^IndirectReadSideEffect[-1] : &:r39_7, ~m? +# 39| mu39_12(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r39_7 +# 39| mu39_13(ClassWithDestructor2) = Store[#temp39:3] : &:r39_1, r39_6 +# 40| v40_1(void) = NoOp : +# 38| v38_6(void) = ReturnVoid : +# 38| v38_7(void) = AliasedUse : ~m? +# 38| v38_8(void) = ExitFunction : # 39| Block 2 -# 39| r39_8(glval) = VariableAddress[#temp39:7] : -# 39| mu39_9(ClassWithDestructor2) = Uninitialized[#temp39:7] : &:r39_8 -# 39| r39_10(glval) = FunctionAddress[ClassWithDestructor2] : -# 39| v39_11(void) = Call[ClassWithDestructor2] : func:r39_10, this:r39_8 -# 39| mu39_12(unknown) = ^CallSideEffect : ~m? -# 39| mu39_13(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r39_8 -# 39| r39_14(ClassWithDestructor2) = Load[#temp39:7] : &:r39_8, ~m? -# 39| r39_15(glval) = VariableAddress[#temp39:3] : -# 39| mu39_16(ClassWithDestructor2) = Store[#temp39:3] : &:r39_15, r39_14 +# 39| r39_14(glval) = VariableAddress[#temp39:7] : +# 39| mu39_15(ClassWithDestructor2) = Uninitialized[#temp39:7] : &:r39_14 +# 39| r39_16(glval) = FunctionAddress[ClassWithDestructor2] : +# 39| v39_17(void) = Call[ClassWithDestructor2] : func:r39_16, this:r39_14 +# 39| mu39_18(unknown) = ^CallSideEffect : ~m? +# 39| mu39_19(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r39_14 +# 39| r39_20(ClassWithDestructor2) = Load[#temp39:7] : &:r39_14, ~m? +# 39| r39_21(glval) = VariableAddress[#temp39:3] : +# 39| mu39_22(ClassWithDestructor2) = Store[#temp39:3] : &:r39_21, r39_20 #-----| Goto -> Block 1 # 39| Block 3 -# 39| r39_17(glval) = VariableAddress[#temp39:32] : -# 39| mu39_18(ClassWithDestructor2) = Uninitialized[#temp39:32] : &:r39_17 -# 39| r39_19(glval) = FunctionAddress[ClassWithDestructor2] : -# 39| v39_20(void) = Call[ClassWithDestructor2] : func:r39_19, this:r39_17 -# 39| mu39_21(unknown) = ^CallSideEffect : ~m? -# 39| mu39_22(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r39_17 -# 39| r39_23(ClassWithDestructor2) = Load[#temp39:32] : &:r39_17, ~m? -# 39| r39_24(glval) = VariableAddress[#temp39:3] : -# 39| mu39_25(ClassWithDestructor2) = Store[#temp39:3] : &:r39_24, r39_23 +# 39| r39_23(glval) = VariableAddress[#temp39:32] : +# 39| mu39_24(ClassWithDestructor2) = Uninitialized[#temp39:32] : &:r39_23 +# 39| r39_25(glval) = FunctionAddress[ClassWithDestructor2] : +# 39| v39_26(void) = Call[ClassWithDestructor2] : func:r39_25, this:r39_23 +# 39| mu39_27(unknown) = ^CallSideEffect : ~m? +# 39| mu39_28(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r39_23 +# 39| r39_29(ClassWithDestructor2) = Load[#temp39:32] : &:r39_23, ~m? +# 39| r39_30(glval) = VariableAddress[#temp39:3] : +# 39| mu39_31(ClassWithDestructor2) = Store[#temp39:3] : &:r39_30, r39_29 #-----| Goto -> Block 1 # 42| void temp_test6(bool) @@ -972,7 +1008,7 @@ destructors_for_temps.cpp: # 44| r44_1(glval) = VariableAddress[b] : # 44| r44_2(bool) = Load[b] : &:r44_1, ~m? # 44| v44_3(void) = ConditionalBranch : r44_2 -#-----| False -> Block 4 +#-----| False -> Block 5 #-----| True -> Block 3 # 42| Block 1 @@ -1005,14 +1041,29 @@ destructors_for_temps.cpp: # 45| v45_19(void) = ThrowValue : &:r45_1, ~m? #-----| Exception -> Block 2 -# 47| Block 4 -# 47| v47_1(void) = NoOp : -# 47| r47_2(glval) = VariableAddress[c] : -# 47| r47_3(glval) = FunctionAddress[~ClassWithDestructor2] : -# 47| v47_4(void) = Call[~ClassWithDestructor2] : func:r47_3, this:r47_2 -# 47| mu47_5(unknown) = ^CallSideEffect : ~m? -# 47| v47_6(void) = ^IndirectReadSideEffect[-1] : &:r47_2, ~m? -# 47| mu47_7(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r47_2 +# 45| Block 4 +# 45| r45_20(glval) = CopyValue : r45_5 +# 45| r45_21(glval) = FunctionAddress[~ClassWithDestructor2] : +# 45| v45_22(void) = Call[~ClassWithDestructor2] : func:r45_21, this:r45_20 +# 45| mu45_23(unknown) = ^CallSideEffect : ~m? +# 45| v45_24(void) = ^IndirectReadSideEffect[-1] : &:r45_20, ~m? +# 45| mu45_25(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r45_20 +# 47| r47_1(glval) = VariableAddress[c] : +# 47| r47_2(glval) = FunctionAddress[~ClassWithDestructor2] : +# 47| v47_3(void) = Call[~ClassWithDestructor2] : func:r47_2, this:r47_1 +# 47| mu47_4(unknown) = ^CallSideEffect : ~m? +# 47| v47_5(void) = ^IndirectReadSideEffect[-1] : &:r47_1, ~m? +# 47| mu47_6(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r47_1 +#-----| Goto -> Block 5 + +# 47| Block 5 +# 47| v47_7(void) = NoOp : +# 47| r47_8(glval) = VariableAddress[c] : +# 47| r47_9(glval) = FunctionAddress[~ClassWithDestructor2] : +# 47| v47_10(void) = Call[~ClassWithDestructor2] : func:r47_9, this:r47_8 +# 47| mu47_11(unknown) = ^CallSideEffect : ~m? +# 47| v47_12(void) = ^IndirectReadSideEffect[-1] : &:r47_8, ~m? +# 47| mu47_13(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r47_8 # 42| v42_9(void) = ReturnVoid : #-----| Goto -> Block 1 @@ -1033,8 +1084,8 @@ destructors_for_temps.cpp: # 51| r51_2(glval) = VariableAddress[b] : # 51| r51_3(bool) = Load[b] : &:r51_2, ~m? # 51| v51_4(void) = ConditionalBranch : r51_3 -#-----| False -> Block 4 -#-----| True -> Block 3 +#-----| False -> Block 7 +#-----| True -> Block 5 # 49| Block 1 # 49| v49_6(void) = AliasedUse : ~m? @@ -1045,49 +1096,92 @@ destructors_for_temps.cpp: #-----| Goto -> Block 1 # 51| Block 3 -# 51| r51_5(glval) = VariableAddress[#throw51:9] : -# 51| mu51_6(ClassWithConstructor) = Uninitialized[#throw51:9] : &:r51_5 -# 51| r51_7(glval) = FunctionAddress[ClassWithConstructor] : -# 51| r51_8(char) = Constant[120] : -# 51| r51_9(glval) = VariableAddress[#temp51:41] : -# 51| mu51_10(ClassWithDestructor2) = Uninitialized[#temp51:41] : &:r51_9 -# 51| r51_11(glval) = FunctionAddress[ClassWithDestructor2] : -# 51| v51_12(void) = Call[ClassWithDestructor2] : func:r51_11, this:r51_9 -# 51| mu51_13(unknown) = ^CallSideEffect : ~m? -# 51| mu51_14(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_9 -# 51| r51_15(glval) = FunctionAddress[get_x] : -# 51| r51_16(char) = Call[get_x] : func:r51_15, this:r51_9 -# 51| mu51_17(unknown) = ^CallSideEffect : ~m? -# 51| v51_18(void) = ^IndirectReadSideEffect[-1] : &:r51_9, ~m? -# 51| mu51_19(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_9 -# 51| v51_20(void) = Call[ClassWithConstructor] : func:r51_7, this:r51_5, 0:r51_8, 1:r51_16 -# 51| mu51_21(unknown) = ^CallSideEffect : ~m? -# 51| mu51_22(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r51_5 -# 51| v51_23(void) = ThrowValue : &:r51_5, ~m? -#-----| Exception -> Block 2 +# 51| mu51_5(ClassWithDestructor2) = Store[#temp51:5] : &:r51_1, r51_6 +# 52| v52_1(void) = NoOp : +# 52| r52_2(glval) = VariableAddress[c] : +# 52| r52_3(glval) = FunctionAddress[~ClassWithDestructor2] : +# 52| v52_4(void) = Call[~ClassWithDestructor2] : func:r52_3, this:r52_2 +# 52| mu52_5(unknown) = ^CallSideEffect : ~m? +# 52| v52_6(void) = ^IndirectReadSideEffect[-1] : &:r52_2, ~m? +# 52| mu52_7(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r52_2 +# 49| v49_9(void) = ReturnVoid : +#-----| Goto -> Block 1 # 51| Block 4 -# 51| r51_24(glval) = VariableAddress[#temp51:75] : -# 51| mu51_25(ClassWithDestructor2) = Uninitialized[#temp51:75] : &:r51_24 -# 51| r51_26(glval) = FunctionAddress[ClassWithDestructor2] : -# 51| v51_27(void) = Call[ClassWithDestructor2] : func:r51_26, this:r51_24 -# 51| mu51_28(unknown) = ^CallSideEffect : ~m? -# 51| mu51_29(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_24 -# 51| r51_30(ClassWithDestructor2) = Load[#temp51:75] : &:r51_24, ~m? -# 51| r51_31(glval) = VariableAddress[#temp51:5] : -# 51| mu51_32(ClassWithDestructor2) = Store[#temp51:5] : &:r51_31, r51_30 -# 51| r51_33(glval) = VariableAddress[#temp51:5] : -# 51| r51_34(ClassWithDestructor2) = Load[#temp51:5] : &:r51_33, ~m? -# 51| mu51_35(ClassWithDestructor2) = Store[#temp51:5] : &:r51_1, r51_34 -# 52| v52_1(void) = NoOp : -# 52| r52_2(glval) = VariableAddress[c] : -# 52| r52_3(glval) = FunctionAddress[~ClassWithDestructor2] : -# 52| v52_4(void) = Call[~ClassWithDestructor2] : func:r52_3, this:r52_2 -# 52| mu52_5(unknown) = ^CallSideEffect : ~m? -# 52| v52_6(void) = ^IndirectReadSideEffect[-1] : &:r52_2, ~m? -# 52| mu52_7(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r52_2 -# 49| v49_9(void) = ReturnVoid : -#-----| Goto -> Block 1 +# 51| r51_6(ClassWithDestructor2) = Load[#temp51:5] : &:r51_35, ~m? +#-----| Goto (back edge) -> Block 8 +#-----| Goto (back edge) -> Block 8 + +# 51| Block 5 +# 51| r51_7(glval) = VariableAddress[#throw51:9] : +# 51| mu51_8(ClassWithConstructor) = Uninitialized[#throw51:9] : &:r51_7 +# 51| r51_9(glval) = FunctionAddress[ClassWithConstructor] : +# 51| r51_10(char) = Constant[120] : +# 51| r51_11(glval) = VariableAddress[#temp51:41] : +# 51| mu51_12(ClassWithDestructor2) = Uninitialized[#temp51:41] : &:r51_11 +# 51| r51_13(glval) = FunctionAddress[ClassWithDestructor2] : +# 51| v51_14(void) = Call[ClassWithDestructor2] : func:r51_13, this:r51_11 +# 51| mu51_15(unknown) = ^CallSideEffect : ~m? +# 51| mu51_16(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_11 +# 51| r51_17(glval) = FunctionAddress[get_x] : +# 51| r51_18(char) = Call[get_x] : func:r51_17, this:r51_11 +# 51| mu51_19(unknown) = ^CallSideEffect : ~m? +# 51| v51_20(void) = ^IndirectReadSideEffect[-1] : &:r51_11, ~m? +# 51| mu51_21(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_11 +# 51| v51_22(void) = Call[ClassWithConstructor] : func:r51_9, this:r51_7, 0:r51_10, 1:r51_18 +# 51| mu51_23(unknown) = ^CallSideEffect : ~m? +# 51| mu51_24(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r51_7 +# 51| v51_25(void) = ThrowValue : &:r51_7, ~m? +#-----| Exception -> Block 2 + +# 52| Block 6 +# 52| r52_8(glval) = VariableAddress[c] : +# 52| r52_9(glval) = FunctionAddress[~ClassWithDestructor2] : +# 52| v52_10(void) = Call[~ClassWithDestructor2] : func:r52_9, this:r52_8 +# 52| mu52_11(unknown) = ^CallSideEffect : ~m? +# 52| v52_12(void) = ^IndirectReadSideEffect[-1] : &:r52_8, ~m? +# 52| mu52_13(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r52_8 +#-----| Goto -> Block 4 + +# 51| Block 7 +# 51| r51_26(glval) = VariableAddress[#temp51:75] : +# 51| mu51_27(ClassWithDestructor2) = Uninitialized[#temp51:75] : &:r51_26 +# 51| r51_28(glval) = FunctionAddress[ClassWithDestructor2] : +# 51| v51_29(void) = Call[ClassWithDestructor2] : func:r51_28, this:r51_26 +# 51| mu51_30(unknown) = ^CallSideEffect : ~m? +# 51| mu51_31(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_26 +# 51| r51_32(ClassWithDestructor2) = Load[#temp51:75] : &:r51_26, ~m? +# 51| r51_33(glval) = VariableAddress[#temp51:5] : +# 51| mu51_34(ClassWithDestructor2) = Store[#temp51:5] : &:r51_33, r51_32 +# 51| r51_35(glval) = VariableAddress[#temp51:5] : +#-----| Goto -> Block 8 +#-----| Goto -> Block 8 + +# 51| Block 8 +# 51| r51_54(glval) = CopyValue : r51_1 +# 51| r51_55(glval) = FunctionAddress[~ClassWithDestructor2] : +# 51| v51_56(void) = Call[~ClassWithDestructor2] : func:r51_37, func:r51_55, this:r51_36, this:r51_54 +# 51| mu51_57(unknown) = ^CallSideEffect : ~m? +# 51| v51_58(void) = ^IndirectReadSideEffect[-1] : &:r51_36, &:r51_54, ~m? +# 51| mu51_59(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_36, &:r51_54 +# 51| r51_60(glval) = CopyValue : r51_26 +# 51| r51_61(glval) = FunctionAddress[~ClassWithDestructor2] : +# 51| v51_62(void) = Call[~ClassWithDestructor2] : func:r51_43, func:r51_61, this:r51_42, this:r51_60 +# 51| mu51_63(unknown) = ^CallSideEffect : ~m? +# 51| v51_64(void) = ^IndirectReadSideEffect[-1] : &:r51_42, &:r51_60, ~m? +# 51| mu51_65(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_42, &:r51_60 +# 51| r51_66(glval) = CopyValue : r51_11 +# 51| r51_67(glval) = FunctionAddress[~ClassWithDestructor2] : +# 51| v51_68(void) = Call[~ClassWithDestructor2] : func:r51_49, func:r51_67, this:r51_48, this:r51_66 +# 51| mu51_69(unknown) = ^CallSideEffect : ~m? +# 51| v51_70(void) = ^IndirectReadSideEffect[-1] : &:r51_48, &:r51_66, ~m? +# 51| mu51_71(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_48, &:r51_66 +#-----| Goto (back edge) -> Block 4 +#-----| Goto (back edge) -> Block 3 + +# 51| Block 8 +#-----| Goto (back edge) -> Block 4 +#-----| Goto (back edge) -> Block 3 # 54| void temp_test8(bool) # 54| Block 0 @@ -1100,8 +1194,8 @@ destructors_for_temps.cpp: # 55| r55_2(glval) = VariableAddress[b] : # 55| r55_3(bool) = Load[b] : &:r55_2, ~m? # 55| v55_4(void) = ConditionalBranch : r55_3 -#-----| False -> Block 4 -#-----| True -> Block 3 +#-----| False -> Block 6 +#-----| True -> Block 5 # 54| Block 1 # 54| v54_6(void) = AliasedUse : ~m? @@ -1112,43 +1206,77 @@ destructors_for_temps.cpp: #-----| Goto -> Block 1 # 55| Block 3 -# 55| r55_5(glval) = VariableAddress[#throw55:9] : -# 55| mu55_6(ClassWithConstructor) = Uninitialized[#throw55:9] : &:r55_5 -# 55| r55_7(glval) = FunctionAddress[ClassWithConstructor] : -# 55| r55_8(char) = Constant[120] : -# 55| r55_9(glval) = VariableAddress[#temp55:41] : -# 55| mu55_10(ClassWithDestructor2) = Uninitialized[#temp55:41] : &:r55_9 -# 55| r55_11(glval) = FunctionAddress[ClassWithDestructor2] : -# 55| v55_12(void) = Call[ClassWithDestructor2] : func:r55_11, this:r55_9 -# 55| mu55_13(unknown) = ^CallSideEffect : ~m? -# 55| mu55_14(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_9 -# 55| r55_15(glval) = FunctionAddress[get_x] : -# 55| r55_16(char) = Call[get_x] : func:r55_15, this:r55_9 -# 55| mu55_17(unknown) = ^CallSideEffect : ~m? -# 55| v55_18(void) = ^IndirectReadSideEffect[-1] : &:r55_9, ~m? -# 55| mu55_19(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_9 -# 55| v55_20(void) = Call[ClassWithConstructor] : func:r55_7, this:r55_5, 0:r55_8, 1:r55_16 -# 55| mu55_21(unknown) = ^CallSideEffect : ~m? -# 55| mu55_22(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r55_5 -# 55| v55_23(void) = ThrowValue : &:r55_5, ~m? -#-----| Exception -> Block 2 +# 55| mu55_5(ClassWithDestructor2) = Store[#temp55:5] : &:r55_1, r55_6 +# 56| v56_1(void) = NoOp : +# 54| v54_9(void) = ReturnVoid : +#-----| Goto -> Block 1 # 55| Block 4 -# 55| r55_24(glval) = VariableAddress[#temp55:75] : -# 55| mu55_25(ClassWithDestructor2) = Uninitialized[#temp55:75] : &:r55_24 -# 55| r55_26(glval) = FunctionAddress[ClassWithDestructor2] : -# 55| v55_27(void) = Call[ClassWithDestructor2] : func:r55_26, this:r55_24 -# 55| mu55_28(unknown) = ^CallSideEffect : ~m? -# 55| mu55_29(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_24 -# 55| r55_30(ClassWithDestructor2) = Load[#temp55:75] : &:r55_24, ~m? -# 55| r55_31(glval) = VariableAddress[#temp55:5] : -# 55| mu55_32(ClassWithDestructor2) = Store[#temp55:5] : &:r55_31, r55_30 +# 55| r55_6(ClassWithDestructor2) = Load[#temp55:5] : &:r55_35, ~m? +#-----| Goto (back edge) -> Block 8 +#-----| Goto (back edge) -> Block 8 + +# 55| Block 5 +# 55| r55_7(glval) = VariableAddress[#throw55:9] : +# 55| mu55_8(ClassWithConstructor) = Uninitialized[#throw55:9] : &:r55_7 +# 55| r55_9(glval) = FunctionAddress[ClassWithConstructor] : +# 55| r55_10(char) = Constant[120] : +# 55| r55_11(glval) = VariableAddress[#temp55:41] : +# 55| mu55_12(ClassWithDestructor2) = Uninitialized[#temp55:41] : &:r55_11 +# 55| r55_13(glval) = FunctionAddress[ClassWithDestructor2] : +# 55| v55_14(void) = Call[ClassWithDestructor2] : func:r55_13, this:r55_11 +# 55| mu55_15(unknown) = ^CallSideEffect : ~m? +# 55| mu55_16(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_11 +# 55| r55_17(glval) = FunctionAddress[get_x] : +# 55| r55_18(char) = Call[get_x] : func:r55_17, this:r55_11 +# 55| mu55_19(unknown) = ^CallSideEffect : ~m? +# 55| v55_20(void) = ^IndirectReadSideEffect[-1] : &:r55_11, ~m? +# 55| mu55_21(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_11 +# 55| v55_22(void) = Call[ClassWithConstructor] : func:r55_9, this:r55_7, 0:r55_10, 1:r55_18 +# 55| mu55_23(unknown) = ^CallSideEffect : ~m? +# 55| mu55_24(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r55_7 +# 55| v55_25(void) = ThrowValue : &:r55_7, ~m? +#-----| Exception -> Block 2 + +# 55| Block 6 +# 55| r55_26(glval) = VariableAddress[#temp55:75] : +# 55| mu55_27(ClassWithDestructor2) = Uninitialized[#temp55:75] : &:r55_26 +# 55| r55_28(glval) = FunctionAddress[ClassWithDestructor2] : +# 55| v55_29(void) = Call[ClassWithDestructor2] : func:r55_28, this:r55_26 +# 55| mu55_30(unknown) = ^CallSideEffect : ~m? +# 55| mu55_31(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_26 +# 55| r55_32(ClassWithDestructor2) = Load[#temp55:75] : &:r55_26, ~m? # 55| r55_33(glval) = VariableAddress[#temp55:5] : -# 55| r55_34(ClassWithDestructor2) = Load[#temp55:5] : &:r55_33, ~m? -# 55| mu55_35(ClassWithDestructor2) = Store[#temp55:5] : &:r55_1, r55_34 -# 56| v56_1(void) = NoOp : -# 54| v54_9(void) = ReturnVoid : -#-----| Goto -> Block 1 +# 55| mu55_34(ClassWithDestructor2) = Store[#temp55:5] : &:r55_33, r55_32 +# 55| r55_35(glval) = VariableAddress[#temp55:5] : +#-----| Goto -> Block 8 +#-----| Goto -> Block 8 + +# 55| Block 8 +# 55| r55_54(glval) = CopyValue : r55_1 +# 55| r55_55(glval) = FunctionAddress[~ClassWithDestructor2] : +# 55| v55_56(void) = Call[~ClassWithDestructor2] : func:r55_37, func:r55_55, this:r55_36, this:r55_54 +# 55| mu55_57(unknown) = ^CallSideEffect : ~m? +# 55| v55_58(void) = ^IndirectReadSideEffect[-1] : &:r55_36, &:r55_54, ~m? +# 55| mu55_59(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_36, &:r55_54 +# 55| r55_60(glval) = CopyValue : r55_26 +# 55| r55_61(glval) = FunctionAddress[~ClassWithDestructor2] : +# 55| v55_62(void) = Call[~ClassWithDestructor2] : func:r55_43, func:r55_61, this:r55_42, this:r55_60 +# 55| mu55_63(unknown) = ^CallSideEffect : ~m? +# 55| v55_64(void) = ^IndirectReadSideEffect[-1] : &:r55_42, &:r55_60, ~m? +# 55| mu55_65(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_42, &:r55_60 +# 55| r55_66(glval) = CopyValue : r55_11 +# 55| r55_67(glval) = FunctionAddress[~ClassWithDestructor2] : +# 55| v55_68(void) = Call[~ClassWithDestructor2] : func:r55_49, func:r55_67, this:r55_48, this:r55_66 +# 55| mu55_69(unknown) = ^CallSideEffect : ~m? +# 55| v55_70(void) = ^IndirectReadSideEffect[-1] : &:r55_48, &:r55_66, ~m? +# 55| mu55_71(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_48, &:r55_66 +#-----| Goto (back edge) -> Block 4 +#-----| Goto (back edge) -> Block 3 + +# 55| Block 8 +#-----| Goto (back edge) -> Block 4 +#-----| Goto (back edge) -> Block 3 ir.c: # 7| void MyCoordsTest(int) @@ -5157,7 +5285,13 @@ ir.cpp: # 809| v809_17(void) = ^IndirectReadSideEffect[-1] : &:r809_1, ~m? # 809| v809_18(void) = ^BufferReadSideEffect[0] : &:r809_14, ~m? # 809| mu809_19(Base) = ^IndirectMayWriteSideEffect[-1] : &:r809_1 -# 809| r809_20(glval) = CopyValue : r809_15 +# 809| r809_20(glval) = CopyValue : r809_3 +# 809| r809_21(glval) = FunctionAddress[~Base] : +# 809| v809_22(void) = Call[~Base] : func:r809_21, this:r809_20 +# 809| mu809_23(unknown) = ^CallSideEffect : ~m? +# 809| v809_24(void) = ^IndirectReadSideEffect[-1] : &:r809_20, ~m? +# 809| mu809_25(Base) = ^IndirectMayWriteSideEffect[-1] : &:r809_20 +# 809| r809_26(glval) = CopyValue : r809_15 # 810| r810_1(glval) = VariableAddress[b] : # 810| r810_2(glval) = FunctionAddress[operator=] : # 810| r810_3(glval) = VariableAddress[#temp810:7] : @@ -5177,7 +5311,13 @@ ir.cpp: # 810| v810_17(void) = ^IndirectReadSideEffect[-1] : &:r810_1, ~m? # 810| v810_18(void) = ^BufferReadSideEffect[0] : &:r810_14, ~m? # 810| mu810_19(Base) = ^IndirectMayWriteSideEffect[-1] : &:r810_1 -# 810| r810_20(glval) = CopyValue : r810_15 +# 810| r810_20(glval) = CopyValue : r810_3 +# 810| r810_21(glval) = FunctionAddress[~Base] : +# 810| v810_22(void) = Call[~Base] : func:r810_21, this:r810_20 +# 810| mu810_23(unknown) = ^CallSideEffect : ~m? +# 810| v810_24(void) = ^IndirectReadSideEffect[-1] : &:r810_20, ~m? +# 810| mu810_25(Base) = ^IndirectMayWriteSideEffect[-1] : &:r810_20 +# 810| r810_26(glval) = CopyValue : r810_15 # 811| r811_1(glval) = VariableAddress[pm] : # 811| r811_2(Middle *) = Load[pm] : &:r811_1, ~m? # 811| r811_3(Base *) = ConvertToNonVirtualBase[Middle : Base] : r811_2 @@ -5269,7 +5409,13 @@ ir.cpp: # 823| v823_18(void) = ^IndirectReadSideEffect[-1] : &:r823_1, ~m? # 823| v823_19(void) = ^BufferReadSideEffect[0] : &:r823_15, ~m? # 823| mu823_20(Base) = ^IndirectMayWriteSideEffect[-1] : &:r823_1 -# 823| r823_21(glval) = CopyValue : r823_16 +# 823| r823_21(glval) = CopyValue : r823_3 +# 823| r823_22(glval) = FunctionAddress[~Base] : +# 823| v823_23(void) = Call[~Base] : func:r823_22, this:r823_21 +# 823| mu823_24(unknown) = ^CallSideEffect : ~m? +# 823| v823_25(void) = ^IndirectReadSideEffect[-1] : &:r823_21, ~m? +# 823| mu823_26(Base) = ^IndirectMayWriteSideEffect[-1] : &:r823_21 +# 823| r823_27(glval) = CopyValue : r823_16 # 824| r824_1(glval) = VariableAddress[b] : # 824| r824_2(glval) = FunctionAddress[operator=] : # 824| r824_3(glval) = VariableAddress[#temp824:7] : @@ -5290,7 +5436,13 @@ ir.cpp: # 824| v824_18(void) = ^IndirectReadSideEffect[-1] : &:r824_1, ~m? # 824| v824_19(void) = ^BufferReadSideEffect[0] : &:r824_15, ~m? # 824| mu824_20(Base) = ^IndirectMayWriteSideEffect[-1] : &:r824_1 -# 824| r824_21(glval) = CopyValue : r824_16 +# 824| r824_21(glval) = CopyValue : r824_3 +# 824| r824_22(glval) = FunctionAddress[~Base] : +# 824| v824_23(void) = Call[~Base] : func:r824_22, this:r824_21 +# 824| mu824_24(unknown) = ^CallSideEffect : ~m? +# 824| v824_25(void) = ^IndirectReadSideEffect[-1] : &:r824_21, ~m? +# 824| mu824_26(Base) = ^IndirectMayWriteSideEffect[-1] : &:r824_21 +# 824| r824_27(glval) = CopyValue : r824_16 # 825| r825_1(glval) = VariableAddress[pd] : # 825| r825_2(Derived *) = Load[pd] : &:r825_1, ~m? # 825| r825_3(Middle *) = ConvertToNonVirtualBase[Derived : Middle] : r825_2 @@ -8303,6 +8455,12 @@ ir.cpp: # 1419| v1419_12(void) = Call[acceptRef] : func:r1419_1, 0:r1419_11 # 1419| mu1419_13(unknown) = ^CallSideEffect : ~m? # 1419| v1419_14(void) = ^BufferReadSideEffect[0] : &:r1419_11, ~m? +# 1419| r1419_15(glval) = CopyValue : r1419_2 +# 1419| r1419_16(glval) = FunctionAddress[~String] : +# 1419| v1419_17(void) = Call[~String] : func:r1419_16, this:r1419_15 +# 1419| mu1419_18(unknown) = ^CallSideEffect : ~m? +# 1419| v1419_19(void) = ^IndirectReadSideEffect[-1] : &:r1419_15, ~m? +# 1419| mu1419_20(String) = ^IndirectMayWriteSideEffect[-1] : &:r1419_15 # 1420| r1420_1(glval) = FunctionAddress[acceptValue] : # 1420| r1420_2(glval) = VariableAddress[#temp1420:17] : # 1420| mu1420_3(String) = Uninitialized[#temp1420:17] : &:r1420_2 @@ -8317,6 +8475,12 @@ ir.cpp: # 1420| r1420_12(String) = Load[#temp1420:17] : &:r1420_2, ~m? # 1420| v1420_13(void) = Call[acceptValue] : func:r1420_1, 0:r1420_12 # 1420| mu1420_14(unknown) = ^CallSideEffect : ~m? +# 1420| r1420_15(glval) = CopyValue : r1420_2 +# 1420| r1420_16(glval) = FunctionAddress[~String] : +# 1420| v1420_17(void) = Call[~String] : func:r1420_16, this:r1420_15 +# 1420| mu1420_18(unknown) = ^CallSideEffect : ~m? +# 1420| v1420_19(void) = ^IndirectReadSideEffect[-1] : &:r1420_15, ~m? +# 1420| mu1420_20(String) = ^IndirectMayWriteSideEffect[-1] : &:r1420_15 # 1421| r1421_1(glval) = FunctionAddress[acceptValue] : # 1421| r1421_2(glval) = VariableAddress[#temp1421:25] : # 1421| mu1421_3(String) = Uninitialized[#temp1421:25] : &:r1421_2 @@ -8330,6 +8494,12 @@ ir.cpp: # 1421| r1421_11(String) = Load[#temp1421:25] : &:r1421_2, ~m? # 1421| v1421_12(void) = Call[acceptValue] : func:r1421_1, 0:r1421_11 # 1421| mu1421_13(unknown) = ^CallSideEffect : ~m? +# 1421| r1421_14(glval) = CopyValue : r1421_2 +# 1421| r1421_15(glval) = FunctionAddress[~String] : +# 1421| v1421_16(void) = Call[~String] : func:r1421_15, this:r1421_14 +# 1421| mu1421_17(unknown) = ^CallSideEffect : ~m? +# 1421| v1421_18(void) = ^IndirectReadSideEffect[-1] : &:r1421_14, ~m? +# 1421| mu1421_19(String) = ^IndirectMayWriteSideEffect[-1] : &:r1421_14 # 1422| r1422_1(glval) = VariableAddress[#temp1422:5] : # 1422| mu1422_2(String) = Uninitialized[#temp1422:5] : &:r1422_1 # 1422| r1422_3(glval) = FunctionAddress[String] : @@ -8341,6 +8511,12 @@ ir.cpp: # 1422| r1422_9(char *) = Call[c_str] : func:r1422_8, this:r1422_7 # 1422| mu1422_10(unknown) = ^CallSideEffect : ~m? # 1422| v1422_11(void) = ^IndirectReadSideEffect[-1] : &:r1422_7, ~m? +# 1422| r1422_12(glval) = CopyValue : r1422_1 +# 1422| r1422_13(glval) = FunctionAddress[~String] : +# 1422| v1422_14(void) = Call[~String] : func:r1422_13, this:r1422_12 +# 1422| mu1422_15(unknown) = ^CallSideEffect : ~m? +# 1422| v1422_16(void) = ^IndirectReadSideEffect[-1] : &:r1422_12, ~m? +# 1422| mu1422_17(String) = ^IndirectMayWriteSideEffect[-1] : &:r1422_12 # 1423| r1423_1(glval) = VariableAddress[#temp1423:5] : # 1423| r1423_2(glval) = FunctionAddress[returnValue] : # 1423| r1423_3(String) = Call[returnValue] : func:r1423_2 @@ -8351,11 +8527,23 @@ ir.cpp: # 1423| r1423_8(char *) = Call[c_str] : func:r1423_7, this:r1423_6 # 1423| mu1423_9(unknown) = ^CallSideEffect : ~m? # 1423| v1423_10(void) = ^IndirectReadSideEffect[-1] : &:r1423_6, ~m? +# 1423| r1423_11(glval) = CopyValue : r1423_1 +# 1423| r1423_12(glval) = FunctionAddress[~String] : +# 1423| v1423_13(void) = Call[~String] : func:r1423_12, this:r1423_11 +# 1423| mu1423_14(unknown) = ^CallSideEffect : ~m? +# 1423| v1423_15(void) = ^IndirectReadSideEffect[-1] : &:r1423_11, ~m? +# 1423| mu1423_16(String) = ^IndirectMayWriteSideEffect[-1] : &:r1423_11 # 1425| r1425_1(glval) = VariableAddress[#temp1425:5] : # 1425| r1425_2(glval) = FunctionAddress[defaultConstruct] : # 1425| r1425_3(String) = Call[defaultConstruct] : func:r1425_2 # 1425| mu1425_4(unknown) = ^CallSideEffect : ~m? -# 1425| mu1425_5(String) = Store[#temp1425:5] : &:r1425_1, r1425_3 +# 1425| r1425_5(glval) = CopyValue : r1425_1 +# 1425| r1425_6(glval) = FunctionAddress[~String] : +# 1425| v1425_7(void) = Call[~String] : func:r1425_6, this:r1425_5 +# 1425| mu1425_8(unknown) = ^CallSideEffect : ~m? +# 1425| v1425_9(void) = ^IndirectReadSideEffect[-1] : &:r1425_5, ~m? +# 1425| mu1425_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r1425_5 +# 1425| mu1425_11(String) = Store[#temp1425:5] : &:r1425_1, r1425_3 # 1426| v1426_1(void) = NoOp : # 1426| r1426_2(glval) = CopyValue : r1416_2 # 1426| r1426_3(glval) = FunctionAddress[~String] : @@ -8409,6 +8597,12 @@ ir.cpp: # 1433| r1433_6(destructor_only) = Load[#temp1433:17] : &:r1433_2, ~m? # 1433| v1433_7(void) = Call[acceptValue] : func:r1433_1, 0:r1433_6 # 1433| mu1433_8(unknown) = ^CallSideEffect : ~m? +# 1433| r1433_9(glval) = CopyValue : r1433_2 +# 1433| r1433_10(glval) = FunctionAddress[~destructor_only] : +# 1433| v1433_11(void) = Call[~destructor_only] : func:r1433_10, this:r1433_9 +# 1433| mu1433_12(unknown) = ^CallSideEffect : ~m? +# 1433| v1433_13(void) = ^IndirectReadSideEffect[-1] : &:r1433_9, ~m? +# 1433| mu1433_14(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1433_9 # 1434| r1434_1(glval) = VariableAddress[#temp1434:5] : # 1434| r1434_2(destructor_only) = Constant[0] : # 1434| mu1434_3(destructor_only) = Store[#temp1434:5] : &:r1434_1, r1434_2 @@ -8417,6 +8611,12 @@ ir.cpp: # 1434| mu1434_6(unknown) = ^CallSideEffect : ~m? # 1434| v1434_7(void) = ^IndirectReadSideEffect[-1] : &:r1434_1, ~m? # 1434| mu1434_8(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1434_1 +# 1434| r1434_9(glval) = CopyValue : r1434_1 +# 1434| r1434_10(glval) = FunctionAddress[~destructor_only] : +# 1434| v1434_11(void) = Call[~destructor_only] : func:r1434_10, this:r1434_9 +# 1434| mu1434_12(unknown) = ^CallSideEffect : ~m? +# 1434| v1434_13(void) = ^IndirectReadSideEffect[-1] : &:r1434_9, ~m? +# 1434| mu1434_14(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1434_9 # 1435| r1435_1(glval) = VariableAddress[#temp1435:5] : # 1435| r1435_2(glval) = FunctionAddress[returnValue] : # 1435| r1435_3(destructor_only) = Call[returnValue] : func:r1435_2 @@ -8427,11 +8627,23 @@ ir.cpp: # 1435| mu1435_8(unknown) = ^CallSideEffect : ~m? # 1435| v1435_9(void) = ^IndirectReadSideEffect[-1] : &:r1435_1, ~m? # 1435| mu1435_10(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1435_1 +# 1435| r1435_11(glval) = CopyValue : r1435_1 +# 1435| r1435_12(glval) = FunctionAddress[~destructor_only] : +# 1435| v1435_13(void) = Call[~destructor_only] : func:r1435_12, this:r1435_11 +# 1435| mu1435_14(unknown) = ^CallSideEffect : ~m? +# 1435| v1435_15(void) = ^IndirectReadSideEffect[-1] : &:r1435_11, ~m? +# 1435| mu1435_16(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1435_11 # 1437| r1437_1(glval) = VariableAddress[#temp1437:5] : # 1437| r1437_2(glval) = FunctionAddress[defaultConstruct] : # 1437| r1437_3(destructor_only) = Call[defaultConstruct] : func:r1437_2 # 1437| mu1437_4(unknown) = ^CallSideEffect : ~m? -# 1437| mu1437_5(destructor_only) = Store[#temp1437:5] : &:r1437_1, r1437_3 +# 1437| r1437_5(glval) = CopyValue : r1437_1 +# 1437| r1437_6(glval) = FunctionAddress[~destructor_only] : +# 1437| v1437_7(void) = Call[~destructor_only] : func:r1437_6, this:r1437_5 +# 1437| mu1437_8(unknown) = ^CallSideEffect : ~m? +# 1437| v1437_9(void) = ^IndirectReadSideEffect[-1] : &:r1437_5, ~m? +# 1437| mu1437_10(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1437_5 +# 1437| mu1437_11(destructor_only) = Store[#temp1437:5] : &:r1437_1, r1437_3 # 1438| v1438_1(void) = NoOp : # 1438| r1438_2(glval) = VariableAddress[d2] : # 1438| r1438_3(glval) = FunctionAddress[~destructor_only] : @@ -11628,139 +11840,157 @@ ir.cpp: #-----| Goto -> Block 1 # 2068| Block 4 -# 2068| r2068_7(glval) = VariableAddress[#temp2068:9] : -# 2068| r2068_8(TernaryNonPodObj) = Load[#temp2068:9] : &:r2068_7, ~m? -# 2068| mu2068_9(TernaryNonPodObj) = Store[#temp2068:9] : &:r2068_3, r2068_8 -# 2068| r2068_10(glval) = Convert : r2068_3 -# 2068| r2068_11(TernaryNonPodObj &) = CopyValue : r2068_10 -# 2068| r2068_12(TernaryNonPodObj &) = Call[operator=] : func:r2068_2, this:r2068_1, 0:r2068_11 -# 2068| mu2068_13(unknown) = ^CallSideEffect : ~m? -# 2068| v2068_14(void) = ^IndirectReadSideEffect[-1] : &:r2068_1, ~m? -# 2068| v2068_15(void) = ^BufferReadSideEffect[0] : &:r2068_11, ~m? -# 2068| mu2068_16(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2068_1 -# 2068| r2068_17(glval) = CopyValue : r2068_12 -# 2069| r2069_1(glval) = VariableAddress[z] : -# 2069| r2069_2(glval) = FunctionAddress[operator=] : -# 2069| r2069_3(glval) = VariableAddress[#temp2069:9] : -# 2069| r2069_4(glval) = VariableAddress[a] : -# 2069| r2069_5(bool) = Load[a] : &:r2069_4, ~m? -# 2069| v2069_6(void) = ConditionalBranch : r2069_5 +# 2068| r2068_7(glval) = VariableAddress[#temp2068:9] : +# 2068| r2068_8(TernaryNonPodObj) = Load[#temp2068:9] : &:r2068_7, ~m? +# 2068| mu2068_9(TernaryNonPodObj) = Store[#temp2068:9] : &:r2068_3, r2068_8 +# 2068| r2068_10(glval) = Convert : r2068_3 +# 2068| r2068_11(TernaryNonPodObj &) = CopyValue : r2068_10 +# 2068| r2068_12(TernaryNonPodObj &) = Call[operator=] : func:r2068_2, this:r2068_1, 0:r2068_11 +# 2068| mu2068_13(unknown) = ^CallSideEffect : ~m? +# 2068| v2068_14(void) = ^IndirectReadSideEffect[-1] : &:r2068_1, ~m? +# 2068| v2068_15(void) = ^BufferReadSideEffect[0] : &:r2068_11, ~m? +# 2068| mu2068_16(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2068_1 +# 2068| r2068_17(glval) = CopyValue : r2068_3 +# 2068| r2068_18(glval) = FunctionAddress[~TernaryNonPodObj] : +# 2068| v2068_19(void) = Call[~TernaryNonPodObj] : func:r2068_18, this:r2068_17 +# 2068| mu2068_20(unknown) = ^CallSideEffect : ~m? +# 2068| v2068_21(void) = ^IndirectReadSideEffect[-1] : &:r2068_17, ~m? +# 2068| mu2068_22(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2068_17 +# 2068| r2068_23(glval) = CopyValue : r2068_12 +# 2069| r2069_1(glval) = VariableAddress[z] : +# 2069| r2069_2(glval) = FunctionAddress[operator=] : +# 2069| r2069_3(glval) = VariableAddress[#temp2069:9] : +# 2069| r2069_4(glval) = VariableAddress[a] : +# 2069| r2069_5(bool) = Load[a] : &:r2069_4, ~m? +# 2069| v2069_6(void) = ConditionalBranch : r2069_5 #-----| False -> Block 9 #-----| True -> Block 8 # 2068| Block 5 -# 2068| r2068_18(glval) = VariableAddress[#temp2068:13] : -# 2068| mu2068_19(TernaryNonPodObj) = Uninitialized[#temp2068:13] : &:r2068_18 -# 2068| r2068_20(glval) = FunctionAddress[TernaryNonPodObj] : -# 2068| r2068_21(glval) = VariableAddress[x] : -# 2068| r2068_22(glval) = Convert : r2068_21 -# 2068| r2068_23(TernaryNonPodObj &) = CopyValue : r2068_22 -# 2068| v2068_24(void) = Call[TernaryNonPodObj] : func:r2068_20, this:r2068_18, 0:r2068_23 -# 2068| mu2068_25(unknown) = ^CallSideEffect : ~m? -# 2068| v2068_26(void) = ^BufferReadSideEffect[0] : &:r2068_23, ~m? -# 2068| mu2068_27(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2068_18 -# 2068| r2068_28(TernaryNonPodObj) = Load[#temp2068:13] : &:r2068_18, ~m? -# 2068| r2068_29(glval) = VariableAddress[#temp2068:9] : -# 2068| mu2068_30(TernaryNonPodObj) = Store[#temp2068:9] : &:r2068_29, r2068_28 +# 2068| r2068_24(glval) = VariableAddress[#temp2068:13] : +# 2068| mu2068_25(TernaryNonPodObj) = Uninitialized[#temp2068:13] : &:r2068_24 +# 2068| r2068_26(glval) = FunctionAddress[TernaryNonPodObj] : +# 2068| r2068_27(glval) = VariableAddress[x] : +# 2068| r2068_28(glval) = Convert : r2068_27 +# 2068| r2068_29(TernaryNonPodObj &) = CopyValue : r2068_28 +# 2068| v2068_30(void) = Call[TernaryNonPodObj] : func:r2068_26, this:r2068_24, 0:r2068_29 +# 2068| mu2068_31(unknown) = ^CallSideEffect : ~m? +# 2068| v2068_32(void) = ^BufferReadSideEffect[0] : &:r2068_29, ~m? +# 2068| mu2068_33(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2068_24 +# 2068| r2068_34(TernaryNonPodObj) = Load[#temp2068:13] : &:r2068_24, ~m? +# 2068| r2068_35(glval) = VariableAddress[#temp2068:9] : +# 2068| mu2068_36(TernaryNonPodObj) = Store[#temp2068:9] : &:r2068_35, r2068_34 #-----| Goto -> Block 4 # 2068| Block 6 -# 2068| r2068_31(glval) = VariableAddress[#temp2068:17] : -# 2068| mu2068_32(TernaryNonPodObj) = Uninitialized[#temp2068:17] : &:r2068_31 -# 2068| r2068_33(glval) = FunctionAddress[TernaryNonPodObj] : -# 2068| v2068_34(void) = Call[TernaryNonPodObj] : func:r2068_33, this:r2068_31 -# 2068| mu2068_35(unknown) = ^CallSideEffect : ~m? -# 2068| mu2068_36(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2068_31 -# 2068| r2068_37(TernaryNonPodObj) = Load[#temp2068:17] : &:r2068_31, ~m? -# 2068| r2068_38(glval) = VariableAddress[#temp2068:9] : -# 2068| mu2068_39(TernaryNonPodObj) = Store[#temp2068:9] : &:r2068_38, r2068_37 +# 2068| r2068_37(glval) = VariableAddress[#temp2068:17] : +# 2068| mu2068_38(TernaryNonPodObj) = Uninitialized[#temp2068:17] : &:r2068_37 +# 2068| r2068_39(glval) = FunctionAddress[TernaryNonPodObj] : +# 2068| v2068_40(void) = Call[TernaryNonPodObj] : func:r2068_39, this:r2068_37 +# 2068| mu2068_41(unknown) = ^CallSideEffect : ~m? +# 2068| mu2068_42(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2068_37 +# 2068| r2068_43(TernaryNonPodObj) = Load[#temp2068:17] : &:r2068_37, ~m? +# 2068| r2068_44(glval) = VariableAddress[#temp2068:9] : +# 2068| mu2068_45(TernaryNonPodObj) = Store[#temp2068:9] : &:r2068_44, r2068_43 #-----| Goto -> Block 4 # 2069| Block 7 -# 2069| r2069_7(glval) = VariableAddress[#temp2069:9] : -# 2069| r2069_8(TernaryNonPodObj) = Load[#temp2069:9] : &:r2069_7, ~m? -# 2069| mu2069_9(TernaryNonPodObj) = Store[#temp2069:9] : &:r2069_3, r2069_8 -# 2069| r2069_10(glval) = Convert : r2069_3 -# 2069| r2069_11(TernaryNonPodObj &) = CopyValue : r2069_10 -# 2069| r2069_12(TernaryNonPodObj &) = Call[operator=] : func:r2069_2, this:r2069_1, 0:r2069_11 -# 2069| mu2069_13(unknown) = ^CallSideEffect : ~m? -# 2069| v2069_14(void) = ^IndirectReadSideEffect[-1] : &:r2069_1, ~m? -# 2069| v2069_15(void) = ^BufferReadSideEffect[0] : &:r2069_11, ~m? -# 2069| mu2069_16(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2069_1 -# 2069| r2069_17(glval) = CopyValue : r2069_12 -# 2070| r2070_1(glval) = VariableAddress[z] : -# 2070| r2070_2(glval) = FunctionAddress[operator=] : -# 2070| r2070_3(glval) = VariableAddress[a] : -# 2070| r2070_4(bool) = Load[a] : &:r2070_3, ~m? -# 2070| v2070_5(void) = ConditionalBranch : r2070_4 +# 2069| r2069_7(glval) = VariableAddress[#temp2069:9] : +# 2069| r2069_8(TernaryNonPodObj) = Load[#temp2069:9] : &:r2069_7, ~m? +# 2069| mu2069_9(TernaryNonPodObj) = Store[#temp2069:9] : &:r2069_3, r2069_8 +# 2069| r2069_10(glval) = Convert : r2069_3 +# 2069| r2069_11(TernaryNonPodObj &) = CopyValue : r2069_10 +# 2069| r2069_12(TernaryNonPodObj &) = Call[operator=] : func:r2069_2, this:r2069_1, 0:r2069_11 +# 2069| mu2069_13(unknown) = ^CallSideEffect : ~m? +# 2069| v2069_14(void) = ^IndirectReadSideEffect[-1] : &:r2069_1, ~m? +# 2069| v2069_15(void) = ^BufferReadSideEffect[0] : &:r2069_11, ~m? +# 2069| mu2069_16(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2069_1 +# 2069| r2069_17(glval) = CopyValue : r2069_3 +# 2069| r2069_18(glval) = FunctionAddress[~TernaryNonPodObj] : +# 2069| v2069_19(void) = Call[~TernaryNonPodObj] : func:r2069_18, this:r2069_17 +# 2069| mu2069_20(unknown) = ^CallSideEffect : ~m? +# 2069| v2069_21(void) = ^IndirectReadSideEffect[-1] : &:r2069_17, ~m? +# 2069| mu2069_22(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2069_17 +# 2069| r2069_23(glval) = CopyValue : r2069_12 +# 2070| r2070_1(glval) = VariableAddress[z] : +# 2070| r2070_2(glval) = FunctionAddress[operator=] : +# 2070| r2070_3(glval) = VariableAddress[a] : +# 2070| r2070_4(bool) = Load[a] : &:r2070_3, ~m? +# 2070| v2070_5(void) = ConditionalBranch : r2070_4 #-----| False -> Block 12 #-----| True -> Block 11 # 2069| Block 8 -# 2069| r2069_18(glval) = VariableAddress[#temp2069:13] : -# 2069| mu2069_19(TernaryNonPodObj) = Uninitialized[#temp2069:13] : &:r2069_18 -# 2069| r2069_20(glval) = FunctionAddress[TernaryNonPodObj] : -# 2069| v2069_21(void) = Call[TernaryNonPodObj] : func:r2069_20, this:r2069_18 -# 2069| mu2069_22(unknown) = ^CallSideEffect : ~m? -# 2069| mu2069_23(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2069_18 -# 2069| r2069_24(TernaryNonPodObj) = Load[#temp2069:13] : &:r2069_18, ~m? -# 2069| r2069_25(glval) = VariableAddress[#temp2069:9] : -# 2069| mu2069_26(TernaryNonPodObj) = Store[#temp2069:9] : &:r2069_25, r2069_24 +# 2069| r2069_24(glval) = VariableAddress[#temp2069:13] : +# 2069| mu2069_25(TernaryNonPodObj) = Uninitialized[#temp2069:13] : &:r2069_24 +# 2069| r2069_26(glval) = FunctionAddress[TernaryNonPodObj] : +# 2069| v2069_27(void) = Call[TernaryNonPodObj] : func:r2069_26, this:r2069_24 +# 2069| mu2069_28(unknown) = ^CallSideEffect : ~m? +# 2069| mu2069_29(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2069_24 +# 2069| r2069_30(TernaryNonPodObj) = Load[#temp2069:13] : &:r2069_24, ~m? +# 2069| r2069_31(glval) = VariableAddress[#temp2069:9] : +# 2069| mu2069_32(TernaryNonPodObj) = Store[#temp2069:9] : &:r2069_31, r2069_30 #-----| Goto -> Block 7 # 2069| Block 9 -# 2069| r2069_27(glval) = VariableAddress[#temp2069:34] : -# 2069| mu2069_28(TernaryNonPodObj) = Uninitialized[#temp2069:34] : &:r2069_27 -# 2069| r2069_29(glval) = FunctionAddress[TernaryNonPodObj] : -# 2069| v2069_30(void) = Call[TernaryNonPodObj] : func:r2069_29, this:r2069_27 -# 2069| mu2069_31(unknown) = ^CallSideEffect : ~m? -# 2069| mu2069_32(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2069_27 -# 2069| r2069_33(TernaryNonPodObj) = Load[#temp2069:34] : &:r2069_27, ~m? -# 2069| r2069_34(glval) = VariableAddress[#temp2069:9] : -# 2069| mu2069_35(TernaryNonPodObj) = Store[#temp2069:9] : &:r2069_34, r2069_33 +# 2069| r2069_33(glval) = VariableAddress[#temp2069:34] : +# 2069| mu2069_34(TernaryNonPodObj) = Uninitialized[#temp2069:34] : &:r2069_33 +# 2069| r2069_35(glval) = FunctionAddress[TernaryNonPodObj] : +# 2069| v2069_36(void) = Call[TernaryNonPodObj] : func:r2069_35, this:r2069_33 +# 2069| mu2069_37(unknown) = ^CallSideEffect : ~m? +# 2069| mu2069_38(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2069_33 +# 2069| r2069_39(TernaryNonPodObj) = Load[#temp2069:34] : &:r2069_33, ~m? +# 2069| r2069_40(glval) = VariableAddress[#temp2069:9] : +# 2069| mu2069_41(TernaryNonPodObj) = Store[#temp2069:9] : &:r2069_40, r2069_39 #-----| Goto -> Block 7 # 2070| Block 10 -# 2070| r2070_6(glval) = VariableAddress[#temp2070:10] : -# 2070| r2070_7(glval) = Load[#temp2070:10] : &:r2070_6, ~m? -# 2070| r2070_8(glval) = Convert : r2070_7 -# 2070| r2070_9(TernaryNonPodObj &) = CopyValue : r2070_8 -# 2070| r2070_10(TernaryNonPodObj &) = Call[operator=] : func:r2070_2, this:r2070_1, 0:r2070_9 -# 2070| mu2070_11(unknown) = ^CallSideEffect : ~m? -# 2070| v2070_12(void) = ^IndirectReadSideEffect[-1] : &:r2070_1, ~m? -# 2070| v2070_13(void) = ^BufferReadSideEffect[0] : &:r2070_9, ~m? -# 2070| mu2070_14(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2070_1 -# 2070| r2070_15(glval) = CopyValue : r2070_10 -# 2070| r2070_16(glval) = FunctionAddress[operator=] : -# 2070| r2070_17(glval) = VariableAddress[#temp2070:23] : -# 2070| mu2070_18(TernaryNonPodObj) = Uninitialized[#temp2070:23] : &:r2070_17 -# 2070| r2070_19(glval) = FunctionAddress[TernaryNonPodObj] : -# 2070| v2070_20(void) = Call[TernaryNonPodObj] : func:r2070_19, this:r2070_17 -# 2070| mu2070_21(unknown) = ^CallSideEffect : ~m? -# 2070| mu2070_22(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2070_17 -# 2070| r2070_23(glval) = Convert : r2070_17 -# 2070| r2070_24(TernaryNonPodObj &) = CopyValue : r2070_23 -# 2070| r2070_25(TernaryNonPodObj &) = Call[operator=] : func:r2070_16, this:r2070_15, 0:r2070_24 -# 2070| mu2070_26(unknown) = ^CallSideEffect : ~m? -# 2070| v2070_27(void) = ^IndirectReadSideEffect[-1] : &:r2070_15, ~m? -# 2070| v2070_28(void) = ^BufferReadSideEffect[0] : &:r2070_24, ~m? -# 2070| mu2070_29(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2070_15 -# 2070| r2070_30(glval) = CopyValue : r2070_25 -# 2071| v2071_1(void) = NoOp : -# 2066| v2066_12(void) = ReturnVoid : -# 2066| v2066_13(void) = AliasedUse : ~m? -# 2066| v2066_14(void) = ExitFunction : +# 2070| r2070_6(glval) = VariableAddress[#temp2070:10] : +# 2070| r2070_7(glval) = Load[#temp2070:10] : &:r2070_6, ~m? +# 2070| r2070_8(glval) = Convert : r2070_7 +# 2070| r2070_9(TernaryNonPodObj &) = CopyValue : r2070_8 +# 2070| r2070_10(TernaryNonPodObj &) = Call[operator=] : func:r2070_2, this:r2070_1, 0:r2070_9 +# 2070| mu2070_11(unknown) = ^CallSideEffect : ~m? +# 2070| v2070_12(void) = ^IndirectReadSideEffect[-1] : &:r2070_1, ~m? +# 2070| v2070_13(void) = ^BufferReadSideEffect[0] : &:r2070_9, ~m? +# 2070| mu2070_14(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2070_1 +# 2070| r2070_15(glval) = CopyValue : r2070_10 +# 2070| r2070_16(glval) = FunctionAddress[operator=] : +# 2070| r2070_17(glval) = VariableAddress[#temp2070:23] : +# 2070| mu2070_18(TernaryNonPodObj) = Uninitialized[#temp2070:23] : &:r2070_17 +# 2070| r2070_19(glval) = FunctionAddress[TernaryNonPodObj] : +# 2070| v2070_20(void) = Call[TernaryNonPodObj] : func:r2070_19, this:r2070_17 +# 2070| mu2070_21(unknown) = ^CallSideEffect : ~m? +# 2070| mu2070_22(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2070_17 +# 2070| r2070_23(glval) = Convert : r2070_17 +# 2070| r2070_24(TernaryNonPodObj &) = CopyValue : r2070_23 +# 2070| r2070_25(TernaryNonPodObj &) = Call[operator=] : func:r2070_16, this:r2070_15, 0:r2070_24 +# 2070| mu2070_26(unknown) = ^CallSideEffect : ~m? +# 2070| v2070_27(void) = ^IndirectReadSideEffect[-1] : &:r2070_15, ~m? +# 2070| v2070_28(void) = ^BufferReadSideEffect[0] : &:r2070_24, ~m? +# 2070| mu2070_29(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2070_15 +# 2070| r2070_30(glval) = CopyValue : r2070_17 +# 2070| r2070_31(glval) = FunctionAddress[~TernaryNonPodObj] : +# 2070| v2070_32(void) = Call[~TernaryNonPodObj] : func:r2070_31, this:r2070_30 +# 2070| mu2070_33(unknown) = ^CallSideEffect : ~m? +# 2070| v2070_34(void) = ^IndirectReadSideEffect[-1] : &:r2070_30, ~m? +# 2070| mu2070_35(TernaryNonPodObj) = ^IndirectMayWriteSideEffect[-1] : &:r2070_30 +# 2070| r2070_36(glval) = CopyValue : r2070_25 +# 2071| v2071_1(void) = NoOp : +# 2066| v2066_12(void) = ReturnVoid : +# 2066| v2066_13(void) = AliasedUse : ~m? +# 2066| v2066_14(void) = ExitFunction : # 2070| Block 11 -# 2070| r2070_31(glval) = VariableAddress[x] : -# 2070| r2070_32(glval) = VariableAddress[#temp2070:10] : -# 2070| mu2070_33(glval) = Store[#temp2070:10] : &:r2070_32, r2070_31 +# 2070| r2070_37(glval) = VariableAddress[x] : +# 2070| r2070_38(glval) = VariableAddress[#temp2070:10] : +# 2070| mu2070_39(glval) = Store[#temp2070:10] : &:r2070_38, r2070_37 #-----| Goto -> Block 10 # 2070| Block 12 -# 2070| r2070_34(glval) = VariableAddress[y] : -# 2070| r2070_35(glval) = VariableAddress[#temp2070:10] : -# 2070| mu2070_36(glval) = Store[#temp2070:10] : &:r2070_35, r2070_34 +# 2070| r2070_40(glval) = VariableAddress[y] : +# 2070| r2070_41(glval) = VariableAddress[#temp2070:10] : +# 2070| mu2070_42(glval) = Store[#temp2070:10] : &:r2070_41, r2070_40 #-----| Goto -> Block 10 # 2075| unsigned int CommaTest(unsigned int) @@ -12525,80 +12755,86 @@ ir.cpp: #-----| Goto -> Block 10 # 2198| Block 10 -# 2198| v2198_7(void) = NoOp : -# 2200| r2200_1(glval) = VariableAddress[x] : -# 2200| mu2200_2(ClassWithDestructor) = Uninitialized[x] : &:r2200_1 -# 2200| r2200_3(glval) = FunctionAddress[ClassWithDestructor] : -# 2200| v2200_4(void) = Call[ClassWithDestructor] : func:r2200_3, this:r2200_1 -# 2200| mu2200_5(unknown) = ^CallSideEffect : ~m? -# 2200| mu2200_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2200_1 -# 2201| r2201_1(glval>) = VariableAddress[ys] : -# 2201| mu2201_2(vector) = Uninitialized[ys] : &:r2201_1 -# 2201| r2201_3(glval) = FunctionAddress[vector] : -# 2201| r2201_4(glval) = VariableAddress[#temp2201:45] : -# 2201| r2201_5(glval) = VariableAddress[x] : -# 2201| r2201_6(ClassWithDestructor) = Load[x] : &:r2201_5, ~m? -# 2201| mu2201_7(ClassWithDestructor) = Store[#temp2201:45] : &:r2201_4, r2201_6 -# 2201| r2201_8(ClassWithDestructor) = Load[#temp2201:45] : &:r2201_4, ~m? -# 2201| v2201_9(void) = Call[vector] : func:r2201_3, this:r2201_1, 0:r2201_8 -# 2201| mu2201_10(unknown) = ^CallSideEffect : ~m? -# 2201| mu2201_11(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2201_1 -# 2201| r2201_12(glval &>) = VariableAddress[(__range)] : -# 2201| r2201_13(glval>) = VariableAddress[ys] : -# 2201| r2201_14(vector &) = CopyValue : r2201_13 -# 2201| mu2201_15(vector &) = Store[(__range)] : &:r2201_12, r2201_14 -# 2201| r2201_16(glval>) = VariableAddress[(__begin)] : -# 2201| r2201_17(glval &>) = VariableAddress[(__range)] : -# 2201| r2201_18(vector &) = Load[(__range)] : &:r2201_17, ~m? -#-----| r0_1(glval>) = CopyValue : r2201_18 -#-----| r0_2(glval>) = Convert : r0_1 -# 2201| r2201_19(glval) = FunctionAddress[begin] : -# 2201| r2201_20(iterator) = Call[begin] : func:r2201_19, this:r0_2 -#-----| v0_3(void) = ^IndirectReadSideEffect[-1] : &:r0_2, ~m? -# 2201| mu2201_21(iterator) = Store[(__begin)] : &:r2201_16, r2201_20 -# 2201| r2201_22(glval>) = VariableAddress[(__end)] : -# 2201| r2201_23(glval &>) = VariableAddress[(__range)] : -# 2201| r2201_24(vector &) = Load[(__range)] : &:r2201_23, ~m? -#-----| r0_4(glval>) = CopyValue : r2201_24 -#-----| r0_5(glval>) = Convert : r0_4 -# 2201| r2201_25(glval) = FunctionAddress[end] : -# 2201| r2201_26(iterator) = Call[end] : func:r2201_25, this:r0_5 -#-----| v0_6(void) = ^IndirectReadSideEffect[-1] : &:r0_5, ~m? -# 2201| mu2201_27(iterator) = Store[(__end)] : &:r2201_22, r2201_26 +# 2198| v2198_7(void) = NoOp : +# 2200| r2200_1(glval) = VariableAddress[x] : +# 2200| mu2200_2(ClassWithDestructor) = Uninitialized[x] : &:r2200_1 +# 2200| r2200_3(glval) = FunctionAddress[ClassWithDestructor] : +# 2200| v2200_4(void) = Call[ClassWithDestructor] : func:r2200_3, this:r2200_1 +# 2200| mu2200_5(unknown) = ^CallSideEffect : ~m? +# 2200| mu2200_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2200_1 +# 2201| r2201_1(glval>) = VariableAddress[ys] : +# 2201| mu2201_2(vector) = Uninitialized[ys] : &:r2201_1 +# 2201| r2201_3(glval) = FunctionAddress[vector] : +# 2201| r2201_4(glval) = VariableAddress[#temp2201:45] : +# 2201| r2201_5(glval) = VariableAddress[x] : +# 2201| r2201_6(ClassWithDestructor) = Load[x] : &:r2201_5, ~m? +# 2201| mu2201_7(ClassWithDestructor) = Store[#temp2201:45] : &:r2201_4, r2201_6 +# 2201| r2201_8(ClassWithDestructor) = Load[#temp2201:45] : &:r2201_4, ~m? +# 2201| v2201_9(void) = Call[vector] : func:r2201_3, this:r2201_1, 0:r2201_8 +# 2201| mu2201_10(unknown) = ^CallSideEffect : ~m? +# 2201| mu2201_11(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2201_1 +# 2201| r2201_12(glval) = CopyValue : r2201_4 +# 2201| r2201_13(glval) = FunctionAddress[~ClassWithDestructor] : +# 2201| v2201_14(void) = Call[~ClassWithDestructor] : func:r2201_13, this:r2201_12 +# 2201| mu2201_15(unknown) = ^CallSideEffect : ~m? +# 2201| v2201_16(void) = ^IndirectReadSideEffect[-1] : &:r2201_12, ~m? +# 2201| mu2201_17(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2201_12 +# 2201| r2201_18(glval &>) = VariableAddress[(__range)] : +# 2201| r2201_19(glval>) = VariableAddress[ys] : +# 2201| r2201_20(vector &) = CopyValue : r2201_19 +# 2201| mu2201_21(vector &) = Store[(__range)] : &:r2201_18, r2201_20 +# 2201| r2201_22(glval>) = VariableAddress[(__begin)] : +# 2201| r2201_23(glval &>) = VariableAddress[(__range)] : +# 2201| r2201_24(vector &) = Load[(__range)] : &:r2201_23, ~m? +#-----| r0_1(glval>) = CopyValue : r2201_24 +#-----| r0_2(glval>) = Convert : r0_1 +# 2201| r2201_25(glval) = FunctionAddress[begin] : +# 2201| r2201_26(iterator) = Call[begin] : func:r2201_25, this:r0_2 +#-----| v0_3(void) = ^IndirectReadSideEffect[-1] : &:r0_2, ~m? +# 2201| mu2201_27(iterator) = Store[(__begin)] : &:r2201_22, r2201_26 +# 2201| r2201_28(glval>) = VariableAddress[(__end)] : +# 2201| r2201_29(glval &>) = VariableAddress[(__range)] : +# 2201| r2201_30(vector &) = Load[(__range)] : &:r2201_29, ~m? +#-----| r0_4(glval>) = CopyValue : r2201_30 +#-----| r0_5(glval>) = Convert : r0_4 +# 2201| r2201_31(glval) = FunctionAddress[end] : +# 2201| r2201_32(iterator) = Call[end] : func:r2201_31, this:r0_5 +#-----| v0_6(void) = ^IndirectReadSideEffect[-1] : &:r0_5, ~m? +# 2201| mu2201_33(iterator) = Store[(__end)] : &:r2201_28, r2201_32 #-----| Goto -> Block 11 # 2201| Block 11 -# 2201| r2201_28(glval>) = VariableAddress[(__begin)] : -#-----| r0_7(glval>) = Convert : r2201_28 -# 2201| r2201_29(glval) = FunctionAddress[operator!=] : +# 2201| r2201_34(glval>) = VariableAddress[(__begin)] : +#-----| r0_7(glval>) = Convert : r2201_34 +# 2201| r2201_35(glval) = FunctionAddress[operator!=] : #-----| r0_8(glval>) = VariableAddress[#temp0:0] : #-----| mu0_9(iterator) = Uninitialized[#temp0:0] : &:r0_8 -# 2201| r2201_30(glval) = FunctionAddress[iterator] : -# 2201| r2201_31(glval>) = VariableAddress[(__end)] : -#-----| r0_10(glval>) = Convert : r2201_31 +# 2201| r2201_36(glval) = FunctionAddress[iterator] : +# 2201| r2201_37(glval>) = VariableAddress[(__end)] : +#-----| r0_10(glval>) = Convert : r2201_37 #-----| r0_11(iterator &) = CopyValue : r0_10 -# 2201| v2201_32(void) = Call[iterator] : func:r2201_30, this:r0_8, 0:r0_11 -# 2201| mu2201_33(unknown) = ^CallSideEffect : ~m? +# 2201| v2201_38(void) = Call[iterator] : func:r2201_36, this:r0_8, 0:r0_11 +# 2201| mu2201_39(unknown) = ^CallSideEffect : ~m? #-----| v0_12(void) = ^BufferReadSideEffect[0] : &:r0_11, ~m? -# 2201| mu2201_34(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_8 +# 2201| mu2201_40(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_8 #-----| r0_13(iterator) = Load[#temp0:0] : &:r0_8, ~m? -# 2201| r2201_35(bool) = Call[operator!=] : func:r2201_29, this:r0_7, 0:r0_13 -# 2201| mu2201_36(unknown) = ^CallSideEffect : ~m? +# 2201| r2201_41(bool) = Call[operator!=] : func:r2201_35, this:r0_7, 0:r0_13 +# 2201| mu2201_42(unknown) = ^CallSideEffect : ~m? #-----| v0_14(void) = ^IndirectReadSideEffect[-1] : &:r0_7, ~m? -# 2201| v2201_37(void) = ConditionalBranch : r2201_35 +# 2201| v2201_43(void) = ConditionalBranch : r2201_41 #-----| False -> Block 14 #-----| True -> Block 12 # 2201| Block 12 -# 2201| r2201_38(glval) = VariableAddress[y] : -# 2201| r2201_39(glval>) = VariableAddress[(__begin)] : -#-----| r0_15(glval>) = Convert : r2201_39 -# 2201| r2201_40(glval) = FunctionAddress[operator*] : -# 2201| r2201_41(ClassWithDestructor &) = Call[operator*] : func:r2201_40, this:r0_15 -# 2201| mu2201_42(unknown) = ^CallSideEffect : ~m? +# 2201| r2201_44(glval) = VariableAddress[y] : +# 2201| r2201_45(glval>) = VariableAddress[(__begin)] : +#-----| r0_15(glval>) = Convert : r2201_45 +# 2201| r2201_46(glval) = FunctionAddress[operator*] : +# 2201| r2201_47(ClassWithDestructor &) = Call[operator*] : func:r2201_46, this:r0_15 +# 2201| mu2201_48(unknown) = ^CallSideEffect : ~m? #-----| v0_16(void) = ^IndirectReadSideEffect[-1] : &:r0_15, ~m? -# 2201| r2201_43(ClassWithDestructor) = Load[?] : &:r2201_41, ~m? -# 2201| mu2201_44(ClassWithDestructor) = Store[y] : &:r2201_38, r2201_43 +# 2201| r2201_49(ClassWithDestructor) = Load[?] : &:r2201_47, ~m? +# 2201| mu2201_50(ClassWithDestructor) = Store[y] : &:r2201_44, r2201_49 # 2202| r2202_1(glval) = VariableAddress[y] : # 2202| r2202_2(glval) = FunctionAddress[set_x] : # 2202| r2202_3(char) = Constant[97] : @@ -12606,98 +12842,104 @@ ir.cpp: # 2202| mu2202_5(unknown) = ^CallSideEffect : ~m? # 2202| v2202_6(void) = ^IndirectReadSideEffect[-1] : &:r2202_1, ~m? # 2202| mu2202_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2202_1 -# 2201| r2201_45(glval) = VariableAddress[y] : -# 2201| r2201_46(glval) = FunctionAddress[~ClassWithDestructor] : -# 2201| v2201_47(void) = Call[~ClassWithDestructor] : func:r2201_46, this:r2201_45 -# 2201| mu2201_48(unknown) = ^CallSideEffect : ~m? -# 2201| v2201_49(void) = ^IndirectReadSideEffect[-1] : &:r2201_45, ~m? -# 2201| mu2201_50(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2201_45 -# 2201| r2201_51(glval>) = VariableAddress[(__begin)] : -# 2201| r2201_52(glval) = FunctionAddress[operator++] : -# 2201| r2201_53(iterator &) = Call[operator++] : func:r2201_52, this:r2201_51 +# 2201| r2201_51(glval) = VariableAddress[y] : +# 2201| r2201_52(glval) = FunctionAddress[~ClassWithDestructor] : +# 2201| v2201_53(void) = Call[~ClassWithDestructor] : func:r2201_52, this:r2201_51 # 2201| mu2201_54(unknown) = ^CallSideEffect : ~m? # 2201| v2201_55(void) = ^IndirectReadSideEffect[-1] : &:r2201_51, ~m? -# 2201| mu2201_56(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2201_51 -# 2201| r2201_57(glval>) = CopyValue : r2201_53 +# 2201| mu2201_56(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2201_51 +# 2201| r2201_57(glval>) = VariableAddress[(__begin)] : +# 2201| r2201_58(glval) = FunctionAddress[operator++] : +# 2201| r2201_59(iterator &) = Call[operator++] : func:r2201_58, this:r2201_57 +# 2201| mu2201_60(unknown) = ^CallSideEffect : ~m? +# 2201| v2201_61(void) = ^IndirectReadSideEffect[-1] : &:r2201_57, ~m? +# 2201| mu2201_62(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2201_57 +# 2201| r2201_63(glval>) = CopyValue : r2201_59 #-----| Goto (back edge) -> Block 11 # 2201| Block 13 -# 2201| r2201_58(glval>) = VariableAddress[ys] : -# 2201| r2201_59(glval) = FunctionAddress[~vector] : -# 2201| v2201_60(void) = Call[~vector] : func:r2201_59, this:r2201_58 -# 2201| mu2201_61(unknown) = ^CallSideEffect : ~m? -# 2201| v2201_62(void) = ^IndirectReadSideEffect[-1] : &:r2201_58, ~m? -# 2201| mu2201_63(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2201_58 +# 2201| r2201_64(glval>) = VariableAddress[ys] : +# 2201| r2201_65(glval) = FunctionAddress[~vector] : +# 2201| v2201_66(void) = Call[~vector] : func:r2201_65, this:r2201_64 +# 2201| mu2201_67(unknown) = ^CallSideEffect : ~m? +# 2201| v2201_68(void) = ^IndirectReadSideEffect[-1] : &:r2201_64, ~m? +# 2201| mu2201_69(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2201_64 #-----| Goto -> Block 14 # 2204| Block 14 -# 2204| r2204_1(glval>) = VariableAddress[ys] : -# 2204| mu2204_2(vector) = Uninitialized[ys] : &:r2204_1 -# 2204| r2204_3(glval) = FunctionAddress[vector] : -# 2204| r2204_4(glval) = VariableAddress[#temp2204:45] : -# 2204| r2204_5(glval) = VariableAddress[x] : -# 2204| r2204_6(ClassWithDestructor) = Load[x] : &:r2204_5, ~m? -# 2204| mu2204_7(ClassWithDestructor) = Store[#temp2204:45] : &:r2204_4, r2204_6 -# 2204| r2204_8(ClassWithDestructor) = Load[#temp2204:45] : &:r2204_4, ~m? -# 2204| v2204_9(void) = Call[vector] : func:r2204_3, this:r2204_1, 0:r2204_8 -# 2204| mu2204_10(unknown) = ^CallSideEffect : ~m? -# 2204| mu2204_11(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2204_1 -# 2204| r2204_12(glval &>) = VariableAddress[(__range)] : -# 2204| r2204_13(glval>) = VariableAddress[ys] : -# 2204| r2204_14(vector &) = CopyValue : r2204_13 -# 2204| mu2204_15(vector &) = Store[(__range)] : &:r2204_12, r2204_14 -# 2204| r2204_16(glval>) = VariableAddress[(__begin)] : -# 2204| r2204_17(glval &>) = VariableAddress[(__range)] : -# 2204| r2204_18(vector &) = Load[(__range)] : &:r2204_17, ~m? -#-----| r0_17(glval>) = CopyValue : r2204_18 -#-----| r0_18(glval>) = Convert : r0_17 -# 2204| r2204_19(glval) = FunctionAddress[begin] : -# 2204| r2204_20(iterator) = Call[begin] : func:r2204_19, this:r0_18 -#-----| v0_19(void) = ^IndirectReadSideEffect[-1] : &:r0_18, ~m? -# 2204| mu2204_21(iterator) = Store[(__begin)] : &:r2204_16, r2204_20 -# 2204| r2204_22(glval>) = VariableAddress[(__end)] : -# 2204| r2204_23(glval &>) = VariableAddress[(__range)] : -# 2204| r2204_24(vector &) = Load[(__range)] : &:r2204_23, ~m? -#-----| r0_20(glval>) = CopyValue : r2204_24 -#-----| r0_21(glval>) = Convert : r0_20 -# 2204| r2204_25(glval) = FunctionAddress[end] : -# 2204| r2204_26(iterator) = Call[end] : func:r2204_25, this:r0_21 -#-----| v0_22(void) = ^IndirectReadSideEffect[-1] : &:r0_21, ~m? -# 2204| mu2204_27(iterator) = Store[(__end)] : &:r2204_22, r2204_26 +# 2204| r2204_1(glval>) = VariableAddress[ys] : +# 2204| mu2204_2(vector) = Uninitialized[ys] : &:r2204_1 +# 2204| r2204_3(glval) = FunctionAddress[vector] : +# 2204| r2204_4(glval) = VariableAddress[#temp2204:45] : +# 2204| r2204_5(glval) = VariableAddress[x] : +# 2204| r2204_6(ClassWithDestructor) = Load[x] : &:r2204_5, ~m? +# 2204| mu2204_7(ClassWithDestructor) = Store[#temp2204:45] : &:r2204_4, r2204_6 +# 2204| r2204_8(ClassWithDestructor) = Load[#temp2204:45] : &:r2204_4, ~m? +# 2204| v2204_9(void) = Call[vector] : func:r2204_3, this:r2204_1, 0:r2204_8 +# 2204| mu2204_10(unknown) = ^CallSideEffect : ~m? +# 2204| mu2204_11(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2204_1 +# 2204| r2204_12(glval) = CopyValue : r2204_4 +# 2204| r2204_13(glval) = FunctionAddress[~ClassWithDestructor] : +# 2204| v2204_14(void) = Call[~ClassWithDestructor] : func:r2204_13, this:r2204_12 +# 2204| mu2204_15(unknown) = ^CallSideEffect : ~m? +# 2204| v2204_16(void) = ^IndirectReadSideEffect[-1] : &:r2204_12, ~m? +# 2204| mu2204_17(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2204_12 +# 2204| r2204_18(glval &>) = VariableAddress[(__range)] : +# 2204| r2204_19(glval>) = VariableAddress[ys] : +# 2204| r2204_20(vector &) = CopyValue : r2204_19 +# 2204| mu2204_21(vector &) = Store[(__range)] : &:r2204_18, r2204_20 +# 2204| r2204_22(glval>) = VariableAddress[(__begin)] : +# 2204| r2204_23(glval &>) = VariableAddress[(__range)] : +# 2204| r2204_24(vector &) = Load[(__range)] : &:r2204_23, ~m? +#-----| r0_17(glval>) = CopyValue : r2204_24 +#-----| r0_18(glval>) = Convert : r0_17 +# 2204| r2204_25(glval) = FunctionAddress[begin] : +# 2204| r2204_26(iterator) = Call[begin] : func:r2204_25, this:r0_18 +#-----| v0_19(void) = ^IndirectReadSideEffect[-1] : &:r0_18, ~m? +# 2204| mu2204_27(iterator) = Store[(__begin)] : &:r2204_22, r2204_26 +# 2204| r2204_28(glval>) = VariableAddress[(__end)] : +# 2204| r2204_29(glval &>) = VariableAddress[(__range)] : +# 2204| r2204_30(vector &) = Load[(__range)] : &:r2204_29, ~m? +#-----| r0_20(glval>) = CopyValue : r2204_30 +#-----| r0_21(glval>) = Convert : r0_20 +# 2204| r2204_31(glval) = FunctionAddress[end] : +# 2204| r2204_32(iterator) = Call[end] : func:r2204_31, this:r0_21 +#-----| v0_22(void) = ^IndirectReadSideEffect[-1] : &:r0_21, ~m? +# 2204| mu2204_33(iterator) = Store[(__end)] : &:r2204_28, r2204_32 #-----| Goto -> Block 15 # 2204| Block 15 -# 2204| r2204_28(glval>) = VariableAddress[(__begin)] : -#-----| r0_23(glval>) = Convert : r2204_28 -# 2204| r2204_29(glval) = FunctionAddress[operator!=] : +# 2204| r2204_34(glval>) = VariableAddress[(__begin)] : +#-----| r0_23(glval>) = Convert : r2204_34 +# 2204| r2204_35(glval) = FunctionAddress[operator!=] : #-----| r0_24(glval>) = VariableAddress[#temp0:0] : #-----| mu0_25(iterator) = Uninitialized[#temp0:0] : &:r0_24 -# 2204| r2204_30(glval) = FunctionAddress[iterator] : -# 2204| r2204_31(glval>) = VariableAddress[(__end)] : -#-----| r0_26(glval>) = Convert : r2204_31 +# 2204| r2204_36(glval) = FunctionAddress[iterator] : +# 2204| r2204_37(glval>) = VariableAddress[(__end)] : +#-----| r0_26(glval>) = Convert : r2204_37 #-----| r0_27(iterator &) = CopyValue : r0_26 -# 2204| v2204_32(void) = Call[iterator] : func:r2204_30, this:r0_24, 0:r0_27 -# 2204| mu2204_33(unknown) = ^CallSideEffect : ~m? +# 2204| v2204_38(void) = Call[iterator] : func:r2204_36, this:r0_24, 0:r0_27 +# 2204| mu2204_39(unknown) = ^CallSideEffect : ~m? #-----| v0_28(void) = ^BufferReadSideEffect[0] : &:r0_27, ~m? -# 2204| mu2204_34(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_24 +# 2204| mu2204_40(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_24 #-----| r0_29(iterator) = Load[#temp0:0] : &:r0_24, ~m? -# 2204| r2204_35(bool) = Call[operator!=] : func:r2204_29, this:r0_23, 0:r0_29 -# 2204| mu2204_36(unknown) = ^CallSideEffect : ~m? +# 2204| r2204_41(bool) = Call[operator!=] : func:r2204_35, this:r0_23, 0:r0_29 +# 2204| mu2204_42(unknown) = ^CallSideEffect : ~m? #-----| v0_30(void) = ^IndirectReadSideEffect[-1] : &:r0_23, ~m? -# 2204| v2204_37(void) = ConditionalBranch : r2204_35 +# 2204| v2204_43(void) = ConditionalBranch : r2204_41 #-----| False -> Block 20 #-----| True -> Block 16 # 2204| Block 16 -# 2204| r2204_38(glval) = VariableAddress[y] : -# 2204| r2204_39(glval>) = VariableAddress[(__begin)] : -#-----| r0_31(glval>) = Convert : r2204_39 -# 2204| r2204_40(glval) = FunctionAddress[operator*] : -# 2204| r2204_41(ClassWithDestructor &) = Call[operator*] : func:r2204_40, this:r0_31 -# 2204| mu2204_42(unknown) = ^CallSideEffect : ~m? +# 2204| r2204_44(glval) = VariableAddress[y] : +# 2204| r2204_45(glval>) = VariableAddress[(__begin)] : +#-----| r0_31(glval>) = Convert : r2204_45 +# 2204| r2204_46(glval) = FunctionAddress[operator*] : +# 2204| r2204_47(ClassWithDestructor &) = Call[operator*] : func:r2204_46, this:r0_31 +# 2204| mu2204_48(unknown) = ^CallSideEffect : ~m? #-----| v0_32(void) = ^IndirectReadSideEffect[-1] : &:r0_31, ~m? -# 2204| r2204_43(ClassWithDestructor) = Load[?] : &:r2204_41, ~m? -# 2204| mu2204_44(ClassWithDestructor) = Store[y] : &:r2204_38, r2204_43 +# 2204| r2204_49(ClassWithDestructor) = Load[?] : &:r2204_47, ~m? +# 2204| mu2204_50(ClassWithDestructor) = Store[y] : &:r2204_44, r2204_49 # 2205| r2205_1(glval) = VariableAddress[y] : # 2205| r2205_2(glval) = FunctionAddress[set_x] : # 2205| r2205_3(char) = Constant[97] : @@ -12720,18 +12962,18 @@ ir.cpp: # 2207| Block 17 # 2207| v2207_1(void) = NoOp : -# 2204| r2204_45(glval) = VariableAddress[y] : -# 2204| r2204_46(glval) = FunctionAddress[~ClassWithDestructor] : -# 2204| v2204_47(void) = Call[~ClassWithDestructor] : func:r2204_46, this:r2204_45 -# 2204| mu2204_48(unknown) = ^CallSideEffect : ~m? -# 2204| v2204_49(void) = ^IndirectReadSideEffect[-1] : &:r2204_45, ~m? -# 2204| mu2204_50(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2204_45 -# 2204| r2204_51(glval>) = VariableAddress[ys] : -# 2204| r2204_52(glval) = FunctionAddress[~vector] : -# 2204| v2204_53(void) = Call[~vector] : func:r2204_52, this:r2204_51 +# 2204| r2204_51(glval) = VariableAddress[y] : +# 2204| r2204_52(glval) = FunctionAddress[~ClassWithDestructor] : +# 2204| v2204_53(void) = Call[~ClassWithDestructor] : func:r2204_52, this:r2204_51 # 2204| mu2204_54(unknown) = ^CallSideEffect : ~m? # 2204| v2204_55(void) = ^IndirectReadSideEffect[-1] : &:r2204_51, ~m? -# 2204| mu2204_56(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2204_51 +# 2204| mu2204_56(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2204_51 +# 2204| r2204_57(glval>) = VariableAddress[ys] : +# 2204| r2204_58(glval) = FunctionAddress[~vector] : +# 2204| v2204_59(void) = Call[~vector] : func:r2204_58, this:r2204_57 +# 2204| mu2204_60(unknown) = ^CallSideEffect : ~m? +# 2204| v2204_61(void) = ^IndirectReadSideEffect[-1] : &:r2204_57, ~m? +# 2204| mu2204_62(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2204_57 # 2219| r2219_1(glval) = VariableAddress[x] : # 2219| r2219_2(glval) = FunctionAddress[~ClassWithDestructor] : # 2219| v2219_3(void) = Call[~ClassWithDestructor] : func:r2219_2, this:r2219_1 @@ -12741,28 +12983,28 @@ ir.cpp: #-----| Goto -> Block 1 # 2204| Block 18 -# 2204| r2204_57(glval) = VariableAddress[y] : -# 2204| r2204_58(glval) = FunctionAddress[~ClassWithDestructor] : -# 2204| v2204_59(void) = Call[~ClassWithDestructor] : func:r2204_58, this:r2204_57 -# 2204| mu2204_60(unknown) = ^CallSideEffect : ~m? -# 2204| v2204_61(void) = ^IndirectReadSideEffect[-1] : &:r2204_57, ~m? -# 2204| mu2204_62(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2204_57 -# 2204| r2204_63(glval>) = VariableAddress[(__begin)] : -# 2204| r2204_64(glval) = FunctionAddress[operator++] : -# 2204| r2204_65(iterator &) = Call[operator++] : func:r2204_64, this:r2204_63 +# 2204| r2204_63(glval) = VariableAddress[y] : +# 2204| r2204_64(glval) = FunctionAddress[~ClassWithDestructor] : +# 2204| v2204_65(void) = Call[~ClassWithDestructor] : func:r2204_64, this:r2204_63 # 2204| mu2204_66(unknown) = ^CallSideEffect : ~m? # 2204| v2204_67(void) = ^IndirectReadSideEffect[-1] : &:r2204_63, ~m? -# 2204| mu2204_68(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2204_63 -# 2204| r2204_69(glval>) = CopyValue : r2204_65 +# 2204| mu2204_68(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2204_63 +# 2204| r2204_69(glval>) = VariableAddress[(__begin)] : +# 2204| r2204_70(glval) = FunctionAddress[operator++] : +# 2204| r2204_71(iterator &) = Call[operator++] : func:r2204_70, this:r2204_69 +# 2204| mu2204_72(unknown) = ^CallSideEffect : ~m? +# 2204| v2204_73(void) = ^IndirectReadSideEffect[-1] : &:r2204_69, ~m? +# 2204| mu2204_74(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2204_69 +# 2204| r2204_75(glval>) = CopyValue : r2204_71 #-----| Goto (back edge) -> Block 15 # 2204| Block 19 -# 2204| r2204_70(glval>) = VariableAddress[ys] : -# 2204| r2204_71(glval) = FunctionAddress[~vector] : -# 2204| v2204_72(void) = Call[~vector] : func:r2204_71, this:r2204_70 -# 2204| mu2204_73(unknown) = ^CallSideEffect : ~m? -# 2204| v2204_74(void) = ^IndirectReadSideEffect[-1] : &:r2204_70, ~m? -# 2204| mu2204_75(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2204_70 +# 2204| r2204_76(glval>) = VariableAddress[ys] : +# 2204| r2204_77(glval) = FunctionAddress[~vector] : +# 2204| v2204_78(void) = Call[~vector] : func:r2204_77, this:r2204_76 +# 2204| mu2204_79(unknown) = ^CallSideEffect : ~m? +# 2204| v2204_80(void) = ^IndirectReadSideEffect[-1] : &:r2204_76, ~m? +# 2204| mu2204_81(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2204_76 #-----| Goto -> Block 20 # 2210| Block 20 @@ -12873,73 +13115,79 @@ ir.cpp: #-----| Goto -> Block 26 # 2215| Block 26 -# 2215| r2215_1(glval>) = VariableAddress[ys] : -# 2215| mu2215_2(vector) = Uninitialized[ys] : &:r2215_1 -# 2215| r2215_3(glval) = FunctionAddress[vector] : -# 2215| r2215_4(glval) = VariableAddress[#temp2215:45] : -# 2215| r2215_5(glval) = VariableAddress[x] : -# 2215| r2215_6(ClassWithDestructor) = Load[x] : &:r2215_5, ~m? -# 2215| mu2215_7(ClassWithDestructor) = Store[#temp2215:45] : &:r2215_4, r2215_6 -# 2215| r2215_8(ClassWithDestructor) = Load[#temp2215:45] : &:r2215_4, ~m? -# 2215| v2215_9(void) = Call[vector] : func:r2215_3, this:r2215_1, 0:r2215_8 -# 2215| mu2215_10(unknown) = ^CallSideEffect : ~m? -# 2215| mu2215_11(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2215_1 -# 2215| r2215_12(glval &>) = VariableAddress[(__range)] : -# 2215| r2215_13(glval>) = VariableAddress[ys] : -# 2215| r2215_14(vector &) = CopyValue : r2215_13 -# 2215| mu2215_15(vector &) = Store[(__range)] : &:r2215_12, r2215_14 -# 2215| r2215_16(glval>) = VariableAddress[(__begin)] : -# 2215| r2215_17(glval &>) = VariableAddress[(__range)] : -# 2215| r2215_18(vector &) = Load[(__range)] : &:r2215_17, ~m? -#-----| r0_49(glval>) = CopyValue : r2215_18 -#-----| r0_50(glval>) = Convert : r0_49 -# 2215| r2215_19(glval) = FunctionAddress[begin] : -# 2215| r2215_20(iterator) = Call[begin] : func:r2215_19, this:r0_50 -#-----| v0_51(void) = ^IndirectReadSideEffect[-1] : &:r0_50, ~m? -# 2215| mu2215_21(iterator) = Store[(__begin)] : &:r2215_16, r2215_20 -# 2215| r2215_22(glval>) = VariableAddress[(__end)] : -# 2215| r2215_23(glval &>) = VariableAddress[(__range)] : -# 2215| r2215_24(vector &) = Load[(__range)] : &:r2215_23, ~m? -#-----| r0_52(glval>) = CopyValue : r2215_24 -#-----| r0_53(glval>) = Convert : r0_52 -# 2215| r2215_25(glval) = FunctionAddress[end] : -# 2215| r2215_26(iterator) = Call[end] : func:r2215_25, this:r0_53 -#-----| v0_54(void) = ^IndirectReadSideEffect[-1] : &:r0_53, ~m? -# 2215| mu2215_27(iterator) = Store[(__end)] : &:r2215_22, r2215_26 +# 2215| r2215_1(glval>) = VariableAddress[ys] : +# 2215| mu2215_2(vector) = Uninitialized[ys] : &:r2215_1 +# 2215| r2215_3(glval) = FunctionAddress[vector] : +# 2215| r2215_4(glval) = VariableAddress[#temp2215:45] : +# 2215| r2215_5(glval) = VariableAddress[x] : +# 2215| r2215_6(ClassWithDestructor) = Load[x] : &:r2215_5, ~m? +# 2215| mu2215_7(ClassWithDestructor) = Store[#temp2215:45] : &:r2215_4, r2215_6 +# 2215| r2215_8(ClassWithDestructor) = Load[#temp2215:45] : &:r2215_4, ~m? +# 2215| v2215_9(void) = Call[vector] : func:r2215_3, this:r2215_1, 0:r2215_8 +# 2215| mu2215_10(unknown) = ^CallSideEffect : ~m? +# 2215| mu2215_11(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2215_1 +# 2215| r2215_12(glval) = CopyValue : r2215_4 +# 2215| r2215_13(glval) = FunctionAddress[~ClassWithDestructor] : +# 2215| v2215_14(void) = Call[~ClassWithDestructor] : func:r2215_13, this:r2215_12 +# 2215| mu2215_15(unknown) = ^CallSideEffect : ~m? +# 2215| v2215_16(void) = ^IndirectReadSideEffect[-1] : &:r2215_12, ~m? +# 2215| mu2215_17(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2215_12 +# 2215| r2215_18(glval &>) = VariableAddress[(__range)] : +# 2215| r2215_19(glval>) = VariableAddress[ys] : +# 2215| r2215_20(vector &) = CopyValue : r2215_19 +# 2215| mu2215_21(vector &) = Store[(__range)] : &:r2215_18, r2215_20 +# 2215| r2215_22(glval>) = VariableAddress[(__begin)] : +# 2215| r2215_23(glval &>) = VariableAddress[(__range)] : +# 2215| r2215_24(vector &) = Load[(__range)] : &:r2215_23, ~m? +#-----| r0_49(glval>) = CopyValue : r2215_24 +#-----| r0_50(glval>) = Convert : r0_49 +# 2215| r2215_25(glval) = FunctionAddress[begin] : +# 2215| r2215_26(iterator) = Call[begin] : func:r2215_25, this:r0_50 +#-----| v0_51(void) = ^IndirectReadSideEffect[-1] : &:r0_50, ~m? +# 2215| mu2215_27(iterator) = Store[(__begin)] : &:r2215_22, r2215_26 +# 2215| r2215_28(glval>) = VariableAddress[(__end)] : +# 2215| r2215_29(glval &>) = VariableAddress[(__range)] : +# 2215| r2215_30(vector &) = Load[(__range)] : &:r2215_29, ~m? +#-----| r0_52(glval>) = CopyValue : r2215_30 +#-----| r0_53(glval>) = Convert : r0_52 +# 2215| r2215_31(glval) = FunctionAddress[end] : +# 2215| r2215_32(iterator) = Call[end] : func:r2215_31, this:r0_53 +#-----| v0_54(void) = ^IndirectReadSideEffect[-1] : &:r0_53, ~m? +# 2215| mu2215_33(iterator) = Store[(__end)] : &:r2215_28, r2215_32 #-----| Goto -> Block 27 # 2215| Block 27 -# 2215| r2215_28(glval>) = VariableAddress[(__begin)] : -#-----| r0_55(glval>) = Convert : r2215_28 -# 2215| r2215_29(glval) = FunctionAddress[operator!=] : +# 2215| r2215_34(glval>) = VariableAddress[(__begin)] : +#-----| r0_55(glval>) = Convert : r2215_34 +# 2215| r2215_35(glval) = FunctionAddress[operator!=] : #-----| r0_56(glval>) = VariableAddress[#temp0:0] : #-----| mu0_57(iterator) = Uninitialized[#temp0:0] : &:r0_56 -# 2215| r2215_30(glval) = FunctionAddress[iterator] : -# 2215| r2215_31(glval>) = VariableAddress[(__end)] : -#-----| r0_58(glval>) = Convert : r2215_31 +# 2215| r2215_36(glval) = FunctionAddress[iterator] : +# 2215| r2215_37(glval>) = VariableAddress[(__end)] : +#-----| r0_58(glval>) = Convert : r2215_37 #-----| r0_59(iterator &) = CopyValue : r0_58 -# 2215| v2215_32(void) = Call[iterator] : func:r2215_30, this:r0_56, 0:r0_59 -# 2215| mu2215_33(unknown) = ^CallSideEffect : ~m? +# 2215| v2215_38(void) = Call[iterator] : func:r2215_36, this:r0_56, 0:r0_59 +# 2215| mu2215_39(unknown) = ^CallSideEffect : ~m? #-----| v0_60(void) = ^BufferReadSideEffect[0] : &:r0_59, ~m? -# 2215| mu2215_34(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_56 +# 2215| mu2215_40(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_56 #-----| r0_61(iterator) = Load[#temp0:0] : &:r0_56, ~m? -# 2215| r2215_35(bool) = Call[operator!=] : func:r2215_29, this:r0_55, 0:r0_61 -# 2215| mu2215_36(unknown) = ^CallSideEffect : ~m? +# 2215| r2215_41(bool) = Call[operator!=] : func:r2215_35, this:r0_55, 0:r0_61 +# 2215| mu2215_42(unknown) = ^CallSideEffect : ~m? #-----| v0_62(void) = ^IndirectReadSideEffect[-1] : &:r0_55, ~m? -# 2215| v2215_37(void) = ConditionalBranch : r2215_35 +# 2215| v2215_43(void) = ConditionalBranch : r2215_41 #-----| False -> Block 30 #-----| True -> Block 28 # 2215| Block 28 -# 2215| r2215_38(glval) = VariableAddress[y] : -# 2215| r2215_39(glval>) = VariableAddress[(__begin)] : -#-----| r0_63(glval>) = Convert : r2215_39 -# 2215| r2215_40(glval) = FunctionAddress[operator*] : -# 2215| r2215_41(ClassWithDestructor &) = Call[operator*] : func:r2215_40, this:r0_63 -# 2215| mu2215_42(unknown) = ^CallSideEffect : ~m? +# 2215| r2215_44(glval) = VariableAddress[y] : +# 2215| r2215_45(glval>) = VariableAddress[(__begin)] : +#-----| r0_63(glval>) = Convert : r2215_45 +# 2215| r2215_46(glval) = FunctionAddress[operator*] : +# 2215| r2215_47(ClassWithDestructor &) = Call[operator*] : func:r2215_46, this:r0_63 +# 2215| mu2215_48(unknown) = ^CallSideEffect : ~m? #-----| v0_64(void) = ^IndirectReadSideEffect[-1] : &:r0_63, ~m? -# 2215| r2215_43(ClassWithDestructor) = Load[?] : &:r2215_41, ~m? -# 2215| mu2215_44(ClassWithDestructor) = Store[y] : &:r2215_38, r2215_43 +# 2215| r2215_49(ClassWithDestructor) = Load[?] : &:r2215_47, ~m? +# 2215| mu2215_50(ClassWithDestructor) = Store[y] : &:r2215_44, r2215_49 # 2216| r2216_1(glval) = VariableAddress[z1] : # 2216| mu2216_2(ClassWithDestructor) = Uninitialized[z1] : &:r2216_1 # 2216| r2216_3(glval) = FunctionAddress[ClassWithDestructor] : @@ -12964,28 +13212,28 @@ ir.cpp: # 2218| mu2218_10(unknown) = ^CallSideEffect : ~m? # 2218| v2218_11(void) = ^IndirectReadSideEffect[-1] : &:r2218_7, ~m? # 2218| mu2218_12(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2218_7 -# 2215| r2215_45(glval) = VariableAddress[y] : -# 2215| r2215_46(glval) = FunctionAddress[~ClassWithDestructor] : -# 2215| v2215_47(void) = Call[~ClassWithDestructor] : func:r2215_46, this:r2215_45 -# 2215| mu2215_48(unknown) = ^CallSideEffect : ~m? -# 2215| v2215_49(void) = ^IndirectReadSideEffect[-1] : &:r2215_45, ~m? -# 2215| mu2215_50(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2215_45 -# 2215| r2215_51(glval>) = VariableAddress[(__begin)] : -# 2215| r2215_52(glval) = FunctionAddress[operator++] : -# 2215| r2215_53(iterator &) = Call[operator++] : func:r2215_52, this:r2215_51 +# 2215| r2215_51(glval) = VariableAddress[y] : +# 2215| r2215_52(glval) = FunctionAddress[~ClassWithDestructor] : +# 2215| v2215_53(void) = Call[~ClassWithDestructor] : func:r2215_52, this:r2215_51 # 2215| mu2215_54(unknown) = ^CallSideEffect : ~m? # 2215| v2215_55(void) = ^IndirectReadSideEffect[-1] : &:r2215_51, ~m? -# 2215| mu2215_56(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2215_51 -# 2215| r2215_57(glval>) = CopyValue : r2215_53 +# 2215| mu2215_56(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2215_51 +# 2215| r2215_57(glval>) = VariableAddress[(__begin)] : +# 2215| r2215_58(glval) = FunctionAddress[operator++] : +# 2215| r2215_59(iterator &) = Call[operator++] : func:r2215_58, this:r2215_57 +# 2215| mu2215_60(unknown) = ^CallSideEffect : ~m? +# 2215| v2215_61(void) = ^IndirectReadSideEffect[-1] : &:r2215_57, ~m? +# 2215| mu2215_62(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2215_57 +# 2215| r2215_63(glval>) = CopyValue : r2215_59 #-----| Goto (back edge) -> Block 27 # 2215| Block 29 -# 2215| r2215_58(glval>) = VariableAddress[ys] : -# 2215| r2215_59(glval) = FunctionAddress[~vector] : -# 2215| v2215_60(void) = Call[~vector] : func:r2215_59, this:r2215_58 -# 2215| mu2215_61(unknown) = ^CallSideEffect : ~m? -# 2215| v2215_62(void) = ^IndirectReadSideEffect[-1] : &:r2215_58, ~m? -# 2215| mu2215_63(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2215_58 +# 2215| r2215_64(glval>) = VariableAddress[ys] : +# 2215| r2215_65(glval) = FunctionAddress[~vector] : +# 2215| v2215_66(void) = Call[~vector] : func:r2215_65, this:r2215_64 +# 2215| mu2215_67(unknown) = ^CallSideEffect : ~m? +# 2215| v2215_68(void) = ^IndirectReadSideEffect[-1] : &:r2215_64, ~m? +# 2215| mu2215_69(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2215_64 #-----| Goto -> Block 30 # 2219| Block 30 @@ -13301,7 +13549,7 @@ ir.cpp: # 2262| r2262_1(glval) = VariableAddress[b] : # 2262| r2262_2(bool) = Load[b] : &:r2262_1, ~m? # 2262| v2262_3(void) = ConditionalBranch : r2262_2 -#-----| False -> Block 4 +#-----| False -> Block 5 #-----| True -> Block 3 # 2259| Block 1 @@ -13318,35 +13566,44 @@ ir.cpp: # 2263| r2263_3(char *) = Convert : r2263_2 # 2263| mu2263_4(char *) = Store[#throw2263:7] : &:r2263_1, r2263_3 # 2263| v2263_5(void) = ThrowValue : &:r2263_1, ~m? -#-----| Exception -> Block 5 +#-----| Exception -> Block 6 -# 2265| Block 4 -# 2265| r2265_1(glval) = VariableAddress[s2] : -# 2265| mu2265_2(String) = Uninitialized[s2] : &:r2265_1 -# 2265| r2265_3(glval) = FunctionAddress[String] : -# 2265| v2265_4(void) = Call[String] : func:r2265_3, this:r2265_1 -# 2265| mu2265_5(unknown) = ^CallSideEffect : ~m? -# 2265| mu2265_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2265_1 -# 2266| r2266_1(glval) = VariableAddress[s2] : +# 2266| Block 4 +# 2266| r2266_1(glval) = VariableAddress[s] : # 2266| r2266_2(glval) = FunctionAddress[~String] : # 2266| v2266_3(void) = Call[~String] : func:r2266_2, this:r2266_1 # 2266| mu2266_4(unknown) = ^CallSideEffect : ~m? # 2266| v2266_5(void) = ^IndirectReadSideEffect[-1] : &:r2266_1, ~m? # 2266| mu2266_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2266_1 -# 2266| r2266_7(glval) = VariableAddress[s] : -# 2266| r2266_8(glval) = FunctionAddress[~String] : -# 2266| v2266_9(void) = Call[~String] : func:r2266_8, this:r2266_7 -# 2266| mu2266_10(unknown) = ^CallSideEffect : ~m? -# 2266| v2266_11(void) = ^IndirectReadSideEffect[-1] : &:r2266_7, ~m? -# 2266| mu2266_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r2266_7 -#-----| Goto -> Block 10 +#-----| Goto -> Block 5 -# 2267| Block 5 -# 2267| v2267_1(void) = CatchByType[const char *] : -#-----| Exception -> Block 7 -#-----| Goto -> Block 6 +# 2265| Block 5 +# 2265| r2265_1(glval) = VariableAddress[s2] : +# 2265| mu2265_2(String) = Uninitialized[s2] : &:r2265_1 +# 2265| r2265_3(glval) = FunctionAddress[String] : +# 2265| v2265_4(void) = Call[String] : func:r2265_3, this:r2265_1 +# 2265| mu2265_5(unknown) = ^CallSideEffect : ~m? +# 2265| mu2265_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2265_1 +# 2266| r2266_7(glval) = VariableAddress[s2] : +# 2266| r2266_8(glval) = FunctionAddress[~String] : +# 2266| v2266_9(void) = Call[~String] : func:r2266_8, this:r2266_7 +# 2266| mu2266_10(unknown) = ^CallSideEffect : ~m? +# 2266| v2266_11(void) = ^IndirectReadSideEffect[-1] : &:r2266_7, ~m? +# 2266| mu2266_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r2266_7 +# 2266| r2266_13(glval) = VariableAddress[s] : +# 2266| r2266_14(glval) = FunctionAddress[~String] : +# 2266| v2266_15(void) = Call[~String] : func:r2266_14, this:r2266_13 +# 2266| mu2266_16(unknown) = ^CallSideEffect : ~m? +# 2266| v2266_17(void) = ^IndirectReadSideEffect[-1] : &:r2266_13, ~m? +# 2266| mu2266_18(String) = ^IndirectMayWriteSideEffect[-1] : &:r2266_13 +#-----| Goto -> Block 11 # 2267| Block 6 +# 2267| v2267_1(void) = CatchByType[const char *] : +#-----| Exception -> Block 8 +#-----| Goto -> Block 7 + +# 2267| Block 7 # 2267| r2267_2(glval) = VariableAddress[s] : # 2267| mu2267_3(char *) = InitializeParameter[s] : &:r2267_2 # 2267| r2267_4(char *) = Load[s] : &:r2267_2, ~m? @@ -13363,25 +13620,25 @@ ir.cpp: # 2268| v2268_10(void) = ThrowValue : &:r2268_1, ~m? #-----| Exception -> Block 2 -# 2270| Block 7 +# 2270| Block 8 # 2270| v2270_1(void) = CatchByType[const String &] : -#-----| Exception -> Block 9 -#-----| Goto -> Block 8 +#-----| Exception -> Block 10 +#-----| Goto -> Block 9 -# 2270| Block 8 +# 2270| Block 9 # 2270| r2270_2(glval) = VariableAddress[e] : # 2270| mu2270_3(String &) = InitializeParameter[e] : &:r2270_2 # 2270| r2270_4(String &) = Load[e] : &:r2270_2, ~m? # 2270| mu2270_5(unknown) = InitializeIndirection[e] : &:r2270_4 # 2270| v2270_6(void) = NoOp : -#-----| Goto -> Block 10 +#-----| Goto -> Block 11 -# 2272| Block 9 +# 2272| Block 10 # 2272| v2272_1(void) = CatchAny : # 2273| v2273_1(void) = ReThrow : #-----| Exception -> Block 2 -# 2275| Block 10 +# 2275| Block 11 # 2275| v2275_1(void) = NoOp : # 2259| v2259_9(void) = ReturnVoid : #-----| Goto -> Block 1 @@ -13535,67 +13792,73 @@ ir.cpp: # 2293| v2293_15(void) = Call[vector] : func:r2293_4, this:r2293_2, 0:r2293_14 # 2293| mu2293_16(unknown) = ^CallSideEffect : ~m? # 2293| mu2293_17(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2293_2 -# 2293| r2293_18(vector &) = CopyValue : r2293_2 -# 2293| mu2293_19(vector &&) = Store[(__range)] : &:r2293_1, r2293_18 -# 2293| r2293_20(glval>) = VariableAddress[(__begin)] : -# 2293| r2293_21(glval &&>) = VariableAddress[(__range)] : -# 2293| r2293_22(vector &&) = Load[(__range)] : &:r2293_21, ~m? -#-----| r0_1(glval>) = CopyValue : r2293_22 -#-----| r0_2(glval>) = Convert : r0_1 -# 2293| r2293_23(glval) = FunctionAddress[begin] : -# 2293| r2293_24(iterator) = Call[begin] : func:r2293_23, this:r0_2 -#-----| v0_3(void) = ^IndirectReadSideEffect[-1] : &:r0_2, ~m? -# 2293| mu2293_25(iterator) = Store[(__begin)] : &:r2293_20, r2293_24 -# 2293| r2293_26(glval>) = VariableAddress[(__end)] : +# 2293| r2293_18(glval) = CopyValue : r2293_5 +# 2293| r2293_19(glval) = FunctionAddress[~String] : +# 2293| v2293_20(void) = Call[~String] : func:r2293_19, this:r2293_18 +# 2293| mu2293_21(unknown) = ^CallSideEffect : ~m? +# 2293| v2293_22(void) = ^IndirectReadSideEffect[-1] : &:r2293_18, ~m? +# 2293| mu2293_23(String) = ^IndirectMayWriteSideEffect[-1] : &:r2293_18 +# 2293| r2293_24(vector &) = CopyValue : r2293_2 +# 2293| mu2293_25(vector &&) = Store[(__range)] : &:r2293_1, r2293_24 +# 2293| r2293_26(glval>) = VariableAddress[(__begin)] : # 2293| r2293_27(glval &&>) = VariableAddress[(__range)] : # 2293| r2293_28(vector &&) = Load[(__range)] : &:r2293_27, ~m? -#-----| r0_4(glval>) = CopyValue : r2293_28 +#-----| r0_1(glval>) = CopyValue : r2293_28 +#-----| r0_2(glval>) = Convert : r0_1 +# 2293| r2293_29(glval) = FunctionAddress[begin] : +# 2293| r2293_30(iterator) = Call[begin] : func:r2293_29, this:r0_2 +#-----| v0_3(void) = ^IndirectReadSideEffect[-1] : &:r0_2, ~m? +# 2293| mu2293_31(iterator) = Store[(__begin)] : &:r2293_26, r2293_30 +# 2293| r2293_32(glval>) = VariableAddress[(__end)] : +# 2293| r2293_33(glval &&>) = VariableAddress[(__range)] : +# 2293| r2293_34(vector &&) = Load[(__range)] : &:r2293_33, ~m? +#-----| r0_4(glval>) = CopyValue : r2293_34 #-----| r0_5(glval>) = Convert : r0_4 -# 2293| r2293_29(glval) = FunctionAddress[end] : -# 2293| r2293_30(iterator) = Call[end] : func:r2293_29, this:r0_5 +# 2293| r2293_35(glval) = FunctionAddress[end] : +# 2293| r2293_36(iterator) = Call[end] : func:r2293_35, this:r0_5 #-----| v0_6(void) = ^IndirectReadSideEffect[-1] : &:r0_5, ~m? -# 2293| mu2293_31(iterator) = Store[(__end)] : &:r2293_26, r2293_30 +# 2293| mu2293_37(iterator) = Store[(__end)] : &:r2293_32, r2293_36 #-----| Goto -> Block 4 # 2293| Block 4 -# 2293| r2293_32(glval>) = VariableAddress[(__begin)] : -#-----| r0_7(glval>) = Convert : r2293_32 -# 2293| r2293_33(glval) = FunctionAddress[operator!=] : +# 2293| r2293_38(glval>) = VariableAddress[(__begin)] : +#-----| r0_7(glval>) = Convert : r2293_38 +# 2293| r2293_39(glval) = FunctionAddress[operator!=] : #-----| r0_8(glval>) = VariableAddress[#temp0:0] : #-----| mu0_9(iterator) = Uninitialized[#temp0:0] : &:r0_8 -# 2293| r2293_34(glval) = FunctionAddress[iterator] : -# 2293| r2293_35(glval>) = VariableAddress[(__end)] : -#-----| r0_10(glval>) = Convert : r2293_35 +# 2293| r2293_40(glval) = FunctionAddress[iterator] : +# 2293| r2293_41(glval>) = VariableAddress[(__end)] : +#-----| r0_10(glval>) = Convert : r2293_41 #-----| r0_11(iterator &) = CopyValue : r0_10 -# 2293| v2293_36(void) = Call[iterator] : func:r2293_34, this:r0_8, 0:r0_11 -# 2293| mu2293_37(unknown) = ^CallSideEffect : ~m? +# 2293| v2293_42(void) = Call[iterator] : func:r2293_40, this:r0_8, 0:r0_11 +# 2293| mu2293_43(unknown) = ^CallSideEffect : ~m? #-----| v0_12(void) = ^BufferReadSideEffect[0] : &:r0_11, ~m? -# 2293| mu2293_38(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_8 +# 2293| mu2293_44(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_8 #-----| r0_13(iterator) = Load[#temp0:0] : &:r0_8, ~m? -# 2293| r2293_39(bool) = Call[operator!=] : func:r2293_33, this:r0_7, 0:r0_13 -# 2293| mu2293_40(unknown) = ^CallSideEffect : ~m? +# 2293| r2293_45(bool) = Call[operator!=] : func:r2293_39, this:r0_7, 0:r0_13 +# 2293| mu2293_46(unknown) = ^CallSideEffect : ~m? #-----| v0_14(void) = ^IndirectReadSideEffect[-1] : &:r0_7, ~m? -# 2293| v2293_41(void) = ConditionalBranch : r2293_39 +# 2293| v2293_47(void) = ConditionalBranch : r2293_45 #-----| False -> Block 6 #-----| True -> Block 5 # 2293| Block 5 -# 2293| r2293_42(glval) = VariableAddress[s] : -# 2293| mu2293_43(String) = Uninitialized[s] : &:r2293_42 -# 2293| r2293_44(glval) = FunctionAddress[String] : -# 2293| r2293_45(glval>) = VariableAddress[(__begin)] : -#-----| r0_15(glval>) = Convert : r2293_45 -# 2293| r2293_46(glval) = FunctionAddress[operator*] : -# 2293| r2293_47(String &) = Call[operator*] : func:r2293_46, this:r0_15 -# 2293| mu2293_48(unknown) = ^CallSideEffect : ~m? +# 2293| r2293_48(glval) = VariableAddress[s] : +# 2293| mu2293_49(String) = Uninitialized[s] : &:r2293_48 +# 2293| r2293_50(glval) = FunctionAddress[String] : +# 2293| r2293_51(glval>) = VariableAddress[(__begin)] : +#-----| r0_15(glval>) = Convert : r2293_51 +# 2293| r2293_52(glval) = FunctionAddress[operator*] : +# 2293| r2293_53(String &) = Call[operator*] : func:r2293_52, this:r0_15 +# 2293| mu2293_54(unknown) = ^CallSideEffect : ~m? #-----| v0_16(void) = ^IndirectReadSideEffect[-1] : &:r0_15, ~m? -# 2293| r2293_49(glval) = CopyValue : r2293_47 -# 2293| r2293_50(glval) = Convert : r2293_49 -# 2293| r2293_51(String &) = CopyValue : r2293_50 -# 2293| v2293_52(void) = Call[String] : func:r2293_44, this:r2293_42, 0:r2293_51 -# 2293| mu2293_53(unknown) = ^CallSideEffect : ~m? -# 2293| v2293_54(void) = ^BufferReadSideEffect[0] : &:r2293_51, ~m? -# 2293| mu2293_55(String) = ^IndirectMayWriteSideEffect[-1] : &:r2293_42 +# 2293| r2293_55(glval) = CopyValue : r2293_53 +# 2293| r2293_56(glval) = Convert : r2293_55 +# 2293| r2293_57(String &) = CopyValue : r2293_56 +# 2293| v2293_58(void) = Call[String] : func:r2293_50, this:r2293_48, 0:r2293_57 +# 2293| mu2293_59(unknown) = ^CallSideEffect : ~m? +# 2293| v2293_60(void) = ^BufferReadSideEffect[0] : &:r2293_57, ~m? +# 2293| mu2293_61(String) = ^IndirectMayWriteSideEffect[-1] : &:r2293_48 # 2294| r2294_1(glval) = VariableAddress[s2] : # 2294| mu2294_2(String) = Uninitialized[s2] : &:r2294_1 # 2294| r2294_3(glval) = FunctionAddress[String] : @@ -13608,19 +13871,19 @@ ir.cpp: # 2295| mu2295_4(unknown) = ^CallSideEffect : ~m? # 2295| v2295_5(void) = ^IndirectReadSideEffect[-1] : &:r2295_1, ~m? # 2295| mu2295_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2295_1 -# 2293| r2293_56(glval) = VariableAddress[s] : -# 2293| r2293_57(glval) = FunctionAddress[~String] : -# 2293| v2293_58(void) = Call[~String] : func:r2293_57, this:r2293_56 -# 2293| mu2293_59(unknown) = ^CallSideEffect : ~m? -# 2293| v2293_60(void) = ^IndirectReadSideEffect[-1] : &:r2293_56, ~m? -# 2293| mu2293_61(String) = ^IndirectMayWriteSideEffect[-1] : &:r2293_56 -# 2293| r2293_62(glval>) = VariableAddress[(__begin)] : -# 2293| r2293_63(glval) = FunctionAddress[operator++] : -# 2293| r2293_64(iterator &) = Call[operator++] : func:r2293_63, this:r2293_62 +# 2293| r2293_62(glval) = VariableAddress[s] : +# 2293| r2293_63(glval) = FunctionAddress[~String] : +# 2293| v2293_64(void) = Call[~String] : func:r2293_63, this:r2293_62 # 2293| mu2293_65(unknown) = ^CallSideEffect : ~m? # 2293| v2293_66(void) = ^IndirectReadSideEffect[-1] : &:r2293_62, ~m? -# 2293| mu2293_67(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2293_62 -# 2293| r2293_68(glval>) = CopyValue : r2293_64 +# 2293| mu2293_67(String) = ^IndirectMayWriteSideEffect[-1] : &:r2293_62 +# 2293| r2293_68(glval>) = VariableAddress[(__begin)] : +# 2293| r2293_69(glval) = FunctionAddress[operator++] : +# 2293| r2293_70(iterator &) = Call[operator++] : func:r2293_69, this:r2293_68 +# 2293| mu2293_71(unknown) = ^CallSideEffect : ~m? +# 2293| v2293_72(void) = ^IndirectReadSideEffect[-1] : &:r2293_68, ~m? +# 2293| mu2293_73(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2293_68 +# 2293| r2293_74(glval>) = CopyValue : r2293_70 #-----| Goto (back edge) -> Block 4 # 2297| Block 6 @@ -14073,28 +14336,34 @@ ir.cpp: # 2396| void initialization_with_temp_destructor() # 2396| Block 0 -# 2396| v2396_1(void) = EnterFunction : -# 2396| mu2396_2(unknown) = AliasedDefinition : -# 2396| mu2396_3(unknown) = InitializeNonLocal : -# 2397| r2397_1(glval) = VariableAddress[x] : -# 2397| r2397_2(glval) = VariableAddress[#temp2397:18] : -# 2397| mu2397_3(ClassWithDestructor) = Uninitialized[#temp2397:18] : &:r2397_2 -# 2397| r2397_4(glval) = FunctionAddress[ClassWithDestructor] : -# 2397| v2397_5(void) = Call[ClassWithDestructor] : func:r2397_4, this:r2397_2 -# 2397| mu2397_6(unknown) = ^CallSideEffect : ~m? -# 2397| mu2397_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2397_2 -# 2397| r2397_8(glval) = FunctionAddress[get_x] : -# 2397| r2397_9(char) = Call[get_x] : func:r2397_8, this:r2397_2 -# 2397| mu2397_10(unknown) = ^CallSideEffect : ~m? -# 2397| v2397_11(void) = ^IndirectReadSideEffect[-1] : &:r2397_2, ~m? -# 2397| mu2397_12(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2397_2 -# 2397| mu2397_13(char) = Store[x] : &:r2397_1, r2397_9 -# 2397| r2397_14(glval) = VariableAddress[x] : -# 2397| r2397_15(char) = Load[x] : &:r2397_14, ~m? -# 2397| r2397_16(char) = Constant[0] : -# 2397| r2397_17(bool) = CompareNE : r2397_15, r2397_16 -# 2397| r2397_18(bool) = CopyValue : r2397_17 -# 2397| v2397_19(void) = ConditionalBranch : r2397_18 +# 2396| v2396_1(void) = EnterFunction : +# 2396| mu2396_2(unknown) = AliasedDefinition : +# 2396| mu2396_3(unknown) = InitializeNonLocal : +# 2397| r2397_1(glval) = VariableAddress[x] : +# 2397| r2397_2(glval) = VariableAddress[#temp2397:18] : +# 2397| mu2397_3(ClassWithDestructor) = Uninitialized[#temp2397:18] : &:r2397_2 +# 2397| r2397_4(glval) = FunctionAddress[ClassWithDestructor] : +# 2397| v2397_5(void) = Call[ClassWithDestructor] : func:r2397_4, this:r2397_2 +# 2397| mu2397_6(unknown) = ^CallSideEffect : ~m? +# 2397| mu2397_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2397_2 +# 2397| r2397_8(glval) = FunctionAddress[get_x] : +# 2397| r2397_9(char) = Call[get_x] : func:r2397_8, this:r2397_2 +# 2397| mu2397_10(unknown) = ^CallSideEffect : ~m? +# 2397| v2397_11(void) = ^IndirectReadSideEffect[-1] : &:r2397_2, ~m? +# 2397| mu2397_12(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2397_2 +# 2397| r2397_13(glval) = CopyValue : r2397_2 +# 2397| r2397_14(glval) = FunctionAddress[~ClassWithDestructor] : +# 2397| v2397_15(void) = Call[~ClassWithDestructor] : func:r2397_14, this:r2397_13 +# 2397| mu2397_16(unknown) = ^CallSideEffect : ~m? +# 2397| v2397_17(void) = ^IndirectReadSideEffect[-1] : &:r2397_13, ~m? +# 2397| mu2397_18(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2397_13 +# 2397| mu2397_19(char) = Store[x] : &:r2397_1, r2397_9 +# 2397| r2397_20(glval) = VariableAddress[x] : +# 2397| r2397_21(char) = Load[x] : &:r2397_20, ~m? +# 2397| r2397_22(char) = Constant[0] : +# 2397| r2397_23(bool) = CompareNE : r2397_21, r2397_22 +# 2397| r2397_24(bool) = CopyValue : r2397_23 +# 2397| v2397_25(void) = ConditionalBranch : r2397_24 #-----| False -> Block 2 #-----| True -> Block 1 @@ -14107,24 +14376,30 @@ ir.cpp: #-----| Goto -> Block 2 # 2400| Block 2 -# 2400| r2400_1(glval) = VariableAddress[x] : -# 2400| r2400_2(glval) = VariableAddress[#temp2400:18] : -# 2400| mu2400_3(ClassWithDestructor) = Uninitialized[#temp2400:18] : &:r2400_2 -# 2400| r2400_4(glval) = FunctionAddress[ClassWithDestructor] : -# 2400| v2400_5(void) = Call[ClassWithDestructor] : func:r2400_4, this:r2400_2 -# 2400| mu2400_6(unknown) = ^CallSideEffect : ~m? -# 2400| mu2400_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2400_2 -# 2400| r2400_8(glval) = FunctionAddress[get_x] : -# 2400| r2400_9(char) = Call[get_x] : func:r2400_8, this:r2400_2 -# 2400| mu2400_10(unknown) = ^CallSideEffect : ~m? -# 2400| v2400_11(void) = ^IndirectReadSideEffect[-1] : &:r2400_2, ~m? -# 2400| mu2400_12(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2400_2 -# 2400| mu2400_13(char) = Store[x] : &:r2400_1, r2400_9 -# 2400| r2400_14(glval) = VariableAddress[x] : -# 2400| r2400_15(char) = Load[x] : &:r2400_14, ~m? -# 2400| r2400_16(char) = Constant[0] : -# 2400| r2400_17(bool) = CompareNE : r2400_15, r2400_16 -# 2400| v2400_18(void) = ConditionalBranch : r2400_17 +# 2400| r2400_1(glval) = VariableAddress[x] : +# 2400| r2400_2(glval) = VariableAddress[#temp2400:18] : +# 2400| mu2400_3(ClassWithDestructor) = Uninitialized[#temp2400:18] : &:r2400_2 +# 2400| r2400_4(glval) = FunctionAddress[ClassWithDestructor] : +# 2400| v2400_5(void) = Call[ClassWithDestructor] : func:r2400_4, this:r2400_2 +# 2400| mu2400_6(unknown) = ^CallSideEffect : ~m? +# 2400| mu2400_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2400_2 +# 2400| r2400_8(glval) = FunctionAddress[get_x] : +# 2400| r2400_9(char) = Call[get_x] : func:r2400_8, this:r2400_2 +# 2400| mu2400_10(unknown) = ^CallSideEffect : ~m? +# 2400| v2400_11(void) = ^IndirectReadSideEffect[-1] : &:r2400_2, ~m? +# 2400| mu2400_12(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2400_2 +# 2400| r2400_13(glval) = CopyValue : r2400_2 +# 2400| r2400_14(glval) = FunctionAddress[~ClassWithDestructor] : +# 2400| v2400_15(void) = Call[~ClassWithDestructor] : func:r2400_14, this:r2400_13 +# 2400| mu2400_16(unknown) = ^CallSideEffect : ~m? +# 2400| v2400_17(void) = ^IndirectReadSideEffect[-1] : &:r2400_13, ~m? +# 2400| mu2400_18(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2400_13 +# 2400| mu2400_19(char) = Store[x] : &:r2400_1, r2400_9 +# 2400| r2400_20(glval) = VariableAddress[x] : +# 2400| r2400_21(char) = Load[x] : &:r2400_20, ~m? +# 2400| r2400_22(char) = Constant[0] : +# 2400| r2400_23(bool) = CompareNE : r2400_21, r2400_22 +# 2400| v2400_24(void) = ConditionalBranch : r2400_23 #-----| False -> Block 4 #-----| True -> Block 3 @@ -14137,21 +14412,27 @@ ir.cpp: #-----| Goto -> Block 4 # 2403| Block 4 -# 2403| r2403_1(glval) = VariableAddress[x] : -# 2403| r2403_2(glval) = VariableAddress[#temp2403:28] : -# 2403| mu2403_3(ClassWithDestructor) = Uninitialized[#temp2403:28] : &:r2403_2 -# 2403| r2403_4(glval) = FunctionAddress[ClassWithDestructor] : -# 2403| v2403_5(void) = Call[ClassWithDestructor] : func:r2403_4, this:r2403_2 -# 2403| mu2403_6(unknown) = ^CallSideEffect : ~m? -# 2403| mu2403_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2403_2 -# 2403| r2403_8(glval) = FunctionAddress[get_x] : -# 2403| r2403_9(char) = Call[get_x] : func:r2403_8, this:r2403_2 -# 2403| mu2403_10(unknown) = ^CallSideEffect : ~m? -# 2403| v2403_11(void) = ^IndirectReadSideEffect[-1] : &:r2403_2, ~m? -# 2403| mu2403_12(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2403_2 -# 2403| mu2403_13(char) = Store[x] : &:r2403_1, r2403_9 -# 2403| r2403_14(bool) = Constant[1] : -# 2403| v2403_15(void) = ConditionalBranch : r2403_14 +# 2403| r2403_1(glval) = VariableAddress[x] : +# 2403| r2403_2(glval) = VariableAddress[#temp2403:28] : +# 2403| mu2403_3(ClassWithDestructor) = Uninitialized[#temp2403:28] : &:r2403_2 +# 2403| r2403_4(glval) = FunctionAddress[ClassWithDestructor] : +# 2403| v2403_5(void) = Call[ClassWithDestructor] : func:r2403_4, this:r2403_2 +# 2403| mu2403_6(unknown) = ^CallSideEffect : ~m? +# 2403| mu2403_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2403_2 +# 2403| r2403_8(glval) = FunctionAddress[get_x] : +# 2403| r2403_9(char) = Call[get_x] : func:r2403_8, this:r2403_2 +# 2403| mu2403_10(unknown) = ^CallSideEffect : ~m? +# 2403| v2403_11(void) = ^IndirectReadSideEffect[-1] : &:r2403_2, ~m? +# 2403| mu2403_12(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2403_2 +# 2403| r2403_13(glval) = CopyValue : r2403_2 +# 2403| r2403_14(glval) = FunctionAddress[~ClassWithDestructor] : +# 2403| v2403_15(void) = Call[~ClassWithDestructor] : func:r2403_14, this:r2403_13 +# 2403| mu2403_16(unknown) = ^CallSideEffect : ~m? +# 2403| v2403_17(void) = ^IndirectReadSideEffect[-1] : &:r2403_13, ~m? +# 2403| mu2403_18(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2403_13 +# 2403| mu2403_19(char) = Store[x] : &:r2403_1, r2403_9 +# 2403| r2403_20(bool) = Constant[1] : +# 2403| v2403_21(void) = ConditionalBranch : r2403_20 #-----| False -> Block 6 #-----| True -> Block 5 @@ -14164,24 +14445,30 @@ ir.cpp: #-----| Goto -> Block 6 # 2406| Block 6 -# 2406| r2406_1(glval) = VariableAddress[x] : -# 2406| r2406_2(glval) = VariableAddress[#temp2406:21] : -# 2406| mu2406_3(ClassWithDestructor) = Uninitialized[#temp2406:21] : &:r2406_2 -# 2406| r2406_4(glval) = FunctionAddress[ClassWithDestructor] : -# 2406| v2406_5(void) = Call[ClassWithDestructor] : func:r2406_4, this:r2406_2 -# 2406| mu2406_6(unknown) = ^CallSideEffect : ~m? -# 2406| mu2406_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2406_2 -# 2406| r2406_8(glval) = FunctionAddress[get_x] : -# 2406| r2406_9(char) = Call[get_x] : func:r2406_8, this:r2406_2 -# 2406| mu2406_10(unknown) = ^CallSideEffect : ~m? -# 2406| v2406_11(void) = ^IndirectReadSideEffect[-1] : &:r2406_2, ~m? -# 2406| mu2406_12(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2406_2 -# 2406| mu2406_13(char) = Store[x] : &:r2406_1, r2406_9 -# 2406| r2406_14(glval) = VariableAddress[x] : -# 2406| r2406_15(char) = Load[x] : &:r2406_14, ~m? -# 2406| r2406_16(int) = Convert : r2406_15 -# 2406| r2406_17(int) = CopyValue : r2406_16 -# 2406| v2406_18(void) = Switch : r2406_17 +# 2406| r2406_1(glval) = VariableAddress[x] : +# 2406| r2406_2(glval) = VariableAddress[#temp2406:21] : +# 2406| mu2406_3(ClassWithDestructor) = Uninitialized[#temp2406:21] : &:r2406_2 +# 2406| r2406_4(glval) = FunctionAddress[ClassWithDestructor] : +# 2406| v2406_5(void) = Call[ClassWithDestructor] : func:r2406_4, this:r2406_2 +# 2406| mu2406_6(unknown) = ^CallSideEffect : ~m? +# 2406| mu2406_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2406_2 +# 2406| r2406_8(glval) = FunctionAddress[get_x] : +# 2406| r2406_9(char) = Call[get_x] : func:r2406_8, this:r2406_2 +# 2406| mu2406_10(unknown) = ^CallSideEffect : ~m? +# 2406| v2406_11(void) = ^IndirectReadSideEffect[-1] : &:r2406_2, ~m? +# 2406| mu2406_12(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2406_2 +# 2406| r2406_13(glval) = CopyValue : r2406_2 +# 2406| r2406_14(glval) = FunctionAddress[~ClassWithDestructor] : +# 2406| v2406_15(void) = Call[~ClassWithDestructor] : func:r2406_14, this:r2406_13 +# 2406| mu2406_16(unknown) = ^CallSideEffect : ~m? +# 2406| v2406_17(void) = ^IndirectReadSideEffect[-1] : &:r2406_13, ~m? +# 2406| mu2406_18(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2406_13 +# 2406| mu2406_19(char) = Store[x] : &:r2406_1, r2406_9 +# 2406| r2406_20(glval) = VariableAddress[x] : +# 2406| r2406_21(char) = Load[x] : &:r2406_20, ~m? +# 2406| r2406_22(int) = Convert : r2406_21 +# 2406| r2406_23(int) = CopyValue : r2406_22 +# 2406| v2406_24(void) = Switch : r2406_23 #-----| Case[97] -> Block 7 #-----| Default -> Block 8 @@ -14195,23 +14482,29 @@ ir.cpp: #-----| Goto -> Block 8 # 2411| Block 8 -# 2411| r2411_1(glval) = VariableAddress[x] : -# 2411| r2411_2(glval) = VariableAddress[#temp2411:21] : -# 2411| mu2411_3(ClassWithDestructor) = Uninitialized[#temp2411:21] : &:r2411_2 -# 2411| r2411_4(glval) = FunctionAddress[ClassWithDestructor] : -# 2411| v2411_5(void) = Call[ClassWithDestructor] : func:r2411_4, this:r2411_2 -# 2411| mu2411_6(unknown) = ^CallSideEffect : ~m? -# 2411| mu2411_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2411_2 -# 2411| r2411_8(glval) = FunctionAddress[get_x] : -# 2411| r2411_9(char) = Call[get_x] : func:r2411_8, this:r2411_2 -# 2411| mu2411_10(unknown) = ^CallSideEffect : ~m? -# 2411| v2411_11(void) = ^IndirectReadSideEffect[-1] : &:r2411_2, ~m? -# 2411| mu2411_12(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2411_2 -# 2411| mu2411_13(char) = Store[x] : &:r2411_1, r2411_9 -# 2411| r2411_14(glval) = VariableAddress[x] : -# 2411| r2411_15(char) = Load[x] : &:r2411_14, ~m? -# 2411| r2411_16(int) = Convert : r2411_15 -# 2411| v2411_17(void) = Switch : r2411_16 +# 2411| r2411_1(glval) = VariableAddress[x] : +# 2411| r2411_2(glval) = VariableAddress[#temp2411:21] : +# 2411| mu2411_3(ClassWithDestructor) = Uninitialized[#temp2411:21] : &:r2411_2 +# 2411| r2411_4(glval) = FunctionAddress[ClassWithDestructor] : +# 2411| v2411_5(void) = Call[ClassWithDestructor] : func:r2411_4, this:r2411_2 +# 2411| mu2411_6(unknown) = ^CallSideEffect : ~m? +# 2411| mu2411_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2411_2 +# 2411| r2411_8(glval) = FunctionAddress[get_x] : +# 2411| r2411_9(char) = Call[get_x] : func:r2411_8, this:r2411_2 +# 2411| mu2411_10(unknown) = ^CallSideEffect : ~m? +# 2411| v2411_11(void) = ^IndirectReadSideEffect[-1] : &:r2411_2, ~m? +# 2411| mu2411_12(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2411_2 +# 2411| r2411_13(glval) = CopyValue : r2411_2 +# 2411| r2411_14(glval) = FunctionAddress[~ClassWithDestructor] : +# 2411| v2411_15(void) = Call[~ClassWithDestructor] : func:r2411_14, this:r2411_13 +# 2411| mu2411_16(unknown) = ^CallSideEffect : ~m? +# 2411| v2411_17(void) = ^IndirectReadSideEffect[-1] : &:r2411_13, ~m? +# 2411| mu2411_18(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2411_13 +# 2411| mu2411_19(char) = Store[x] : &:r2411_1, r2411_9 +# 2411| r2411_20(glval) = VariableAddress[x] : +# 2411| r2411_21(char) = Load[x] : &:r2411_20, ~m? +# 2411| r2411_22(int) = Convert : r2411_21 +# 2411| v2411_23(void) = Switch : r2411_22 #-----| Case[97] -> Block 9 #-----| Default -> Block 10 @@ -14225,82 +14518,88 @@ ir.cpp: #-----| Goto -> Block 10 # 2416| Block 10 -# 2416| r2416_1(glval) = VariableAddress[x] : -# 2416| r2416_2(glval) = VariableAddress[#temp2416:18] : -# 2416| mu2416_3(ClassWithDestructor) = Uninitialized[#temp2416:18] : &:r2416_2 -# 2416| r2416_4(glval) = FunctionAddress[ClassWithDestructor] : -# 2416| v2416_5(void) = Call[ClassWithDestructor] : func:r2416_4, this:r2416_2 -# 2416| mu2416_6(unknown) = ^CallSideEffect : ~m? -# 2416| mu2416_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2416_2 -# 2416| r2416_8(glval) = FunctionAddress[get_x] : -# 2416| r2416_9(char) = Call[get_x] : func:r2416_8, this:r2416_2 -# 2416| mu2416_10(unknown) = ^CallSideEffect : ~m? -# 2416| v2416_11(void) = ^IndirectReadSideEffect[-1] : &:r2416_2, ~m? -# 2416| mu2416_12(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2416_2 -# 2416| mu2416_13(char) = Store[x] : &:r2416_1, r2416_9 -# 2416| r2416_14(glval &&>) = VariableAddress[(__range)] : -# 2416| r2416_15(glval>) = VariableAddress[#temp2416:58] : -# 2416| mu2416_16(vector) = Uninitialized[#temp2416:58] : &:r2416_15 -# 2416| r2416_17(glval) = FunctionAddress[vector] : -# 2416| r2416_18(glval) = VariableAddress[x] : -# 2416| r2416_19(char) = Load[x] : &:r2416_18, ~m? -# 2416| v2416_20(void) = Call[vector] : func:r2416_17, this:r2416_15, 0:r2416_19 -# 2416| mu2416_21(unknown) = ^CallSideEffect : ~m? -# 2416| mu2416_22(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2416_15 -# 2416| r2416_23(vector &) = CopyValue : r2416_15 -# 2416| mu2416_24(vector &&) = Store[(__range)] : &:r2416_14, r2416_23 -# 2416| r2416_25(glval>) = VariableAddress[(__begin)] : -# 2416| r2416_26(glval &&>) = VariableAddress[(__range)] : -# 2416| r2416_27(vector &&) = Load[(__range)] : &:r2416_26, ~m? -#-----| r0_1(glval>) = CopyValue : r2416_27 -#-----| r0_2(glval>) = Convert : r0_1 -# 2416| r2416_28(glval) = FunctionAddress[begin] : -# 2416| r2416_29(iterator) = Call[begin] : func:r2416_28, this:r0_2 -#-----| v0_3(void) = ^IndirectReadSideEffect[-1] : &:r0_2, ~m? -# 2416| mu2416_30(iterator) = Store[(__begin)] : &:r2416_25, r2416_29 -# 2416| r2416_31(glval>) = VariableAddress[(__end)] : -# 2416| r2416_32(glval &&>) = VariableAddress[(__range)] : -# 2416| r2416_33(vector &&) = Load[(__range)] : &:r2416_32, ~m? -#-----| r0_4(glval>) = CopyValue : r2416_33 -#-----| r0_5(glval>) = Convert : r0_4 -# 2416| r2416_34(glval) = FunctionAddress[end] : -# 2416| r2416_35(iterator) = Call[end] : func:r2416_34, this:r0_5 -#-----| v0_6(void) = ^IndirectReadSideEffect[-1] : &:r0_5, ~m? -# 2416| mu2416_36(iterator) = Store[(__end)] : &:r2416_31, r2416_35 +# 2416| r2416_1(glval) = VariableAddress[x] : +# 2416| r2416_2(glval) = VariableAddress[#temp2416:18] : +# 2416| mu2416_3(ClassWithDestructor) = Uninitialized[#temp2416:18] : &:r2416_2 +# 2416| r2416_4(glval) = FunctionAddress[ClassWithDestructor] : +# 2416| v2416_5(void) = Call[ClassWithDestructor] : func:r2416_4, this:r2416_2 +# 2416| mu2416_6(unknown) = ^CallSideEffect : ~m? +# 2416| mu2416_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2416_2 +# 2416| r2416_8(glval) = FunctionAddress[get_x] : +# 2416| r2416_9(char) = Call[get_x] : func:r2416_8, this:r2416_2 +# 2416| mu2416_10(unknown) = ^CallSideEffect : ~m? +# 2416| v2416_11(void) = ^IndirectReadSideEffect[-1] : &:r2416_2, ~m? +# 2416| mu2416_12(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2416_2 +# 2416| r2416_13(glval) = CopyValue : r2416_2 +# 2416| r2416_14(glval) = FunctionAddress[~ClassWithDestructor] : +# 2416| v2416_15(void) = Call[~ClassWithDestructor] : func:r2416_14, this:r2416_13 +# 2416| mu2416_16(unknown) = ^CallSideEffect : ~m? +# 2416| v2416_17(void) = ^IndirectReadSideEffect[-1] : &:r2416_13, ~m? +# 2416| mu2416_18(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2416_13 +# 2416| mu2416_19(char) = Store[x] : &:r2416_1, r2416_9 +# 2416| r2416_20(glval &&>) = VariableAddress[(__range)] : +# 2416| r2416_21(glval>) = VariableAddress[#temp2416:58] : +# 2416| mu2416_22(vector) = Uninitialized[#temp2416:58] : &:r2416_21 +# 2416| r2416_23(glval) = FunctionAddress[vector] : +# 2416| r2416_24(glval) = VariableAddress[x] : +# 2416| r2416_25(char) = Load[x] : &:r2416_24, ~m? +# 2416| v2416_26(void) = Call[vector] : func:r2416_23, this:r2416_21, 0:r2416_25 +# 2416| mu2416_27(unknown) = ^CallSideEffect : ~m? +# 2416| mu2416_28(vector) = ^IndirectMayWriteSideEffect[-1] : &:r2416_21 +# 2416| r2416_29(vector &) = CopyValue : r2416_21 +# 2416| mu2416_30(vector &&) = Store[(__range)] : &:r2416_20, r2416_29 +# 2416| r2416_31(glval>) = VariableAddress[(__begin)] : +# 2416| r2416_32(glval &&>) = VariableAddress[(__range)] : +# 2416| r2416_33(vector &&) = Load[(__range)] : &:r2416_32, ~m? +#-----| r0_1(glval>) = CopyValue : r2416_33 +#-----| r0_2(glval>) = Convert : r0_1 +# 2416| r2416_34(glval) = FunctionAddress[begin] : +# 2416| r2416_35(iterator) = Call[begin] : func:r2416_34, this:r0_2 +#-----| v0_3(void) = ^IndirectReadSideEffect[-1] : &:r0_2, ~m? +# 2416| mu2416_36(iterator) = Store[(__begin)] : &:r2416_31, r2416_35 +# 2416| r2416_37(glval>) = VariableAddress[(__end)] : +# 2416| r2416_38(glval &&>) = VariableAddress[(__range)] : +# 2416| r2416_39(vector &&) = Load[(__range)] : &:r2416_38, ~m? +#-----| r0_4(glval>) = CopyValue : r2416_39 +#-----| r0_5(glval>) = Convert : r0_4 +# 2416| r2416_40(glval) = FunctionAddress[end] : +# 2416| r2416_41(iterator) = Call[end] : func:r2416_40, this:r0_5 +#-----| v0_6(void) = ^IndirectReadSideEffect[-1] : &:r0_5, ~m? +# 2416| mu2416_42(iterator) = Store[(__end)] : &:r2416_37, r2416_41 #-----| Goto -> Block 11 # 2416| Block 11 -# 2416| r2416_37(glval>) = VariableAddress[(__begin)] : -#-----| r0_7(glval>) = Convert : r2416_37 -# 2416| r2416_38(glval) = FunctionAddress[operator!=] : +# 2416| r2416_43(glval>) = VariableAddress[(__begin)] : +#-----| r0_7(glval>) = Convert : r2416_43 +# 2416| r2416_44(glval) = FunctionAddress[operator!=] : #-----| r0_8(glval>) = VariableAddress[#temp0:0] : #-----| mu0_9(iterator) = Uninitialized[#temp0:0] : &:r0_8 -# 2416| r2416_39(glval) = FunctionAddress[iterator] : -# 2416| r2416_40(glval>) = VariableAddress[(__end)] : -#-----| r0_10(glval>) = Convert : r2416_40 +# 2416| r2416_45(glval) = FunctionAddress[iterator] : +# 2416| r2416_46(glval>) = VariableAddress[(__end)] : +#-----| r0_10(glval>) = Convert : r2416_46 #-----| r0_11(iterator &) = CopyValue : r0_10 -# 2416| v2416_41(void) = Call[iterator] : func:r2416_39, this:r0_8, 0:r0_11 -# 2416| mu2416_42(unknown) = ^CallSideEffect : ~m? +# 2416| v2416_47(void) = Call[iterator] : func:r2416_45, this:r0_8, 0:r0_11 +# 2416| mu2416_48(unknown) = ^CallSideEffect : ~m? #-----| v0_12(void) = ^BufferReadSideEffect[0] : &:r0_11, ~m? -# 2416| mu2416_43(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_8 +# 2416| mu2416_49(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r0_8 #-----| r0_13(iterator) = Load[#temp0:0] : &:r0_8, ~m? -# 2416| r2416_44(bool) = Call[operator!=] : func:r2416_38, this:r0_7, 0:r0_13 -# 2416| mu2416_45(unknown) = ^CallSideEffect : ~m? +# 2416| r2416_50(bool) = Call[operator!=] : func:r2416_44, this:r0_7, 0:r0_13 +# 2416| mu2416_51(unknown) = ^CallSideEffect : ~m? #-----| v0_14(void) = ^IndirectReadSideEffect[-1] : &:r0_7, ~m? -# 2416| v2416_46(void) = ConditionalBranch : r2416_44 +# 2416| v2416_52(void) = ConditionalBranch : r2416_50 #-----| False -> Block 13 #-----| True -> Block 12 # 2416| Block 12 -# 2416| r2416_47(glval) = VariableAddress[y] : -# 2416| r2416_48(glval>) = VariableAddress[(__begin)] : -#-----| r0_15(glval>) = Convert : r2416_48 -# 2416| r2416_49(glval) = FunctionAddress[operator*] : -# 2416| r2416_50(char &) = Call[operator*] : func:r2416_49, this:r0_15 -# 2416| mu2416_51(unknown) = ^CallSideEffect : ~m? +# 2416| r2416_53(glval) = VariableAddress[y] : +# 2416| r2416_54(glval>) = VariableAddress[(__begin)] : +#-----| r0_15(glval>) = Convert : r2416_54 +# 2416| r2416_55(glval) = FunctionAddress[operator*] : +# 2416| r2416_56(char &) = Call[operator*] : func:r2416_55, this:r0_15 +# 2416| mu2416_57(unknown) = ^CallSideEffect : ~m? #-----| v0_16(void) = ^IndirectReadSideEffect[-1] : &:r0_15, ~m? -# 2416| r2416_52(char) = Load[?] : &:r2416_50, ~m? -# 2416| mu2416_53(char) = Store[y] : &:r2416_47, r2416_52 +# 2416| r2416_58(char) = Load[?] : &:r2416_56, ~m? +# 2416| mu2416_59(char) = Store[y] : &:r2416_53, r2416_58 # 2417| r2417_1(glval) = VariableAddress[x] : # 2417| r2417_2(char) = Load[x] : &:r2417_1, ~m? # 2417| r2417_3(int) = Convert : r2417_2 @@ -14310,13 +14609,13 @@ ir.cpp: # 2417| r2417_7(int) = Add : r2417_6, r2417_3 # 2417| r2417_8(char) = Convert : r2417_7 # 2417| mu2417_9(char) = Store[y] : &:r2417_4, r2417_8 -# 2416| r2416_54(glval>) = VariableAddress[(__begin)] : -# 2416| r2416_55(glval) = FunctionAddress[operator++] : -# 2416| r2416_56(iterator &) = Call[operator++] : func:r2416_55, this:r2416_54 -# 2416| mu2416_57(unknown) = ^CallSideEffect : ~m? -# 2416| v2416_58(void) = ^IndirectReadSideEffect[-1] : &:r2416_54, ~m? -# 2416| mu2416_59(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2416_54 -# 2416| r2416_60(glval>) = CopyValue : r2416_56 +# 2416| r2416_60(glval>) = VariableAddress[(__begin)] : +# 2416| r2416_61(glval) = FunctionAddress[operator++] : +# 2416| r2416_62(iterator &) = Call[operator++] : func:r2416_61, this:r2416_60 +# 2416| mu2416_63(unknown) = ^CallSideEffect : ~m? +# 2416| v2416_64(void) = ^IndirectReadSideEffect[-1] : &:r2416_60, ~m? +# 2416| mu2416_65(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2416_60 +# 2416| r2416_66(glval>) = CopyValue : r2416_62 #-----| Goto (back edge) -> Block 11 # 2418| Block 13 @@ -14374,211 +14673,246 @@ perf-regression.cpp: smart_ptr.cpp: # 10| void call_unique_ptr_arg(int*) # 10| Block 0 -# 10| v10_1(void) = EnterFunction : -# 10| mu10_2(unknown) = AliasedDefinition : -# 10| mu10_3(unknown) = InitializeNonLocal : -# 10| r10_4(glval) = VariableAddress[p] : -# 10| mu10_5(int *) = InitializeParameter[p] : &:r10_4 -# 10| r10_6(int *) = Load[p] : &:r10_4, ~m? -# 10| mu10_7(unknown) = InitializeIndirection[p] : &:r10_6 -# 11| r11_1(glval>>) = VariableAddress[up] : -# 11| mu11_2(unique_ptr>) = Uninitialized[up] : &:r11_1 -# 11| r11_3(glval) = FunctionAddress[unique_ptr] : -# 11| r11_4(glval) = VariableAddress[p] : -# 11| r11_5(int *) = Load[p] : &:r11_4, ~m? -# 11| v11_6(void) = Call[unique_ptr] : func:r11_3, this:r11_1, 0:r11_5 -# 11| mu11_7(unknown) = ^CallSideEffect : ~m? -# 11| mu11_8(unique_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r11_1 -# 12| r12_1(glval) = FunctionAddress[unique_ptr_arg] : -# 12| r12_2(glval>>) = VariableAddress[#temp12:20] : -# 12| r12_3(glval) = FunctionAddress[move] : -# 12| r12_4(glval>>) = VariableAddress[up] : -# 12| r12_5(unique_ptr> &) = CopyValue : r12_4 -# 12| r12_6(unique_ptr> &&) = Call[move] : func:r12_3, 0:r12_5 -# 12| r12_7(unique_ptr>) = Load[?] : &:r12_6, ~m? -# 12| mu12_8(unique_ptr>) = Store[#temp12:20] : &:r12_2, r12_7 -# 12| r12_9(unique_ptr>) = Load[#temp12:20] : &:r12_2, ~m? -# 12| v12_10(void) = Call[unique_ptr_arg] : func:r12_1, 0:r12_9 -# 12| mu12_11(unknown) = ^CallSideEffect : ~m? -# 12| v12_12(void) = ^BufferReadSideEffect[0] : &:r12_9, ~m? -# 12| mu12_13(unknown) = ^BufferMayWriteSideEffect[0] : &:r12_9 -# 13| v13_1(void) = NoOp : -# 13| r13_2(glval>>) = VariableAddress[up] : -# 13| r13_3(glval) = FunctionAddress[~unique_ptr] : -# 13| v13_4(void) = Call[~unique_ptr] : func:r13_3, this:r13_2 -# 13| v13_5(void) = ^IndirectReadSideEffect[-1] : &:r13_2, ~m? -# 13| mu13_6(unique_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r13_2 -# 10| v10_8(void) = ReturnIndirection[p] : &:r10_6, ~m? -# 10| v10_9(void) = ReturnVoid : -# 10| v10_10(void) = AliasedUse : ~m? -# 10| v10_11(void) = ExitFunction : +# 10| v10_1(void) = EnterFunction : +# 10| mu10_2(unknown) = AliasedDefinition : +# 10| mu10_3(unknown) = InitializeNonLocal : +# 10| r10_4(glval) = VariableAddress[p] : +# 10| mu10_5(int *) = InitializeParameter[p] : &:r10_4 +# 10| r10_6(int *) = Load[p] : &:r10_4, ~m? +# 10| mu10_7(unknown) = InitializeIndirection[p] : &:r10_6 +# 11| r11_1(glval>>) = VariableAddress[up] : +# 11| mu11_2(unique_ptr>) = Uninitialized[up] : &:r11_1 +# 11| r11_3(glval) = FunctionAddress[unique_ptr] : +# 11| r11_4(glval) = VariableAddress[p] : +# 11| r11_5(int *) = Load[p] : &:r11_4, ~m? +# 11| v11_6(void) = Call[unique_ptr] : func:r11_3, this:r11_1, 0:r11_5 +# 11| mu11_7(unknown) = ^CallSideEffect : ~m? +# 11| mu11_8(unique_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r11_1 +# 12| r12_1(glval) = FunctionAddress[unique_ptr_arg] : +# 12| r12_2(glval>>) = VariableAddress[#temp12:20] : +# 12| r12_3(glval) = FunctionAddress[move] : +# 12| r12_4(glval>>) = VariableAddress[up] : +# 12| r12_5(unique_ptr> &) = CopyValue : r12_4 +# 12| r12_6(unique_ptr> &&) = Call[move] : func:r12_3, 0:r12_5 +# 12| r12_7(unique_ptr>) = Load[?] : &:r12_6, ~m? +# 12| mu12_8(unique_ptr>) = Store[#temp12:20] : &:r12_2, r12_7 +# 12| r12_9(unique_ptr>) = Load[#temp12:20] : &:r12_2, ~m? +# 12| v12_10(void) = Call[unique_ptr_arg] : func:r12_1, 0:r12_9 +# 12| mu12_11(unknown) = ^CallSideEffect : ~m? +# 12| v12_12(void) = ^BufferReadSideEffect[0] : &:r12_9, ~m? +# 12| mu12_13(unknown) = ^BufferMayWriteSideEffect[0] : &:r12_9 +# 12| r12_14(glval>>) = CopyValue : r12_2 +# 12| r12_15(glval) = FunctionAddress[~unique_ptr] : +# 12| v12_16(void) = Call[~unique_ptr] : func:r12_15, this:r12_14 +# 12| v12_17(void) = ^IndirectReadSideEffect[-1] : &:r12_14, ~m? +# 12| mu12_18(unique_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r12_14 +# 13| v13_1(void) = NoOp : +# 13| r13_2(glval>>) = VariableAddress[up] : +# 13| r13_3(glval) = FunctionAddress[~unique_ptr] : +# 13| v13_4(void) = Call[~unique_ptr] : func:r13_3, this:r13_2 +# 13| v13_5(void) = ^IndirectReadSideEffect[-1] : &:r13_2, ~m? +# 13| mu13_6(unique_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r13_2 +# 10| v10_8(void) = ReturnIndirection[p] : &:r10_6, ~m? +# 10| v10_9(void) = ReturnVoid : +# 10| v10_10(void) = AliasedUse : ~m? +# 10| v10_11(void) = ExitFunction : # 17| void call_shared_ptr_arg(float*) # 17| Block 0 -# 17| v17_1(void) = EnterFunction : -# 17| mu17_2(unknown) = AliasedDefinition : -# 17| mu17_3(unknown) = InitializeNonLocal : -# 17| r17_4(glval) = VariableAddress[p] : -# 17| mu17_5(float *) = InitializeParameter[p] : &:r17_4 -# 17| r17_6(float *) = Load[p] : &:r17_4, ~m? -# 17| mu17_7(unknown) = InitializeIndirection[p] : &:r17_6 -# 18| r18_1(glval>) = VariableAddress[sp] : -# 18| mu18_2(shared_ptr) = Uninitialized[sp] : &:r18_1 -# 18| r18_3(glval) = FunctionAddress[shared_ptr] : -# 18| r18_4(glval) = VariableAddress[p] : -# 18| r18_5(float *) = Load[p] : &:r18_4, ~m? -# 18| v18_6(void) = Call[shared_ptr] : func:r18_3, this:r18_1, 0:r18_5 -# 18| mu18_7(unknown) = ^CallSideEffect : ~m? -# 18| mu18_8(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r18_1 -# 19| r19_1(glval) = FunctionAddress[shared_ptr_arg] : -# 19| r19_2(glval>) = VariableAddress[#temp19:20] : -# 19| mu19_3(shared_ptr) = Uninitialized[#temp19:20] : &:r19_2 -# 19| r19_4(glval) = FunctionAddress[shared_ptr] : -# 19| r19_5(glval>) = VariableAddress[sp] : -# 19| r19_6(glval>) = Convert : r19_5 -# 19| r19_7(shared_ptr &) = CopyValue : r19_6 -# 19| v19_8(void) = Call[shared_ptr] : func:r19_4, this:r19_2, 0:r19_7 -# 19| mu19_9(unknown) = ^CallSideEffect : ~m? -# 19| v19_10(void) = ^IndirectReadSideEffect[0] : &:r19_7, ~m? -# 19| mu19_11(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r19_2 -# 19| r19_12(shared_ptr) = Load[#temp19:20] : &:r19_2, ~m? -# 19| v19_13(void) = Call[shared_ptr_arg] : func:r19_1, 0:r19_12 -# 19| mu19_14(unknown) = ^CallSideEffect : ~m? -# 19| v19_15(void) = ^BufferReadSideEffect[0] : &:r19_12, ~m? -# 19| mu19_16(unknown) = ^BufferMayWriteSideEffect[0] : &:r19_12 -# 20| v20_1(void) = NoOp : -# 20| r20_2(glval>) = VariableAddress[sp] : -# 20| r20_3(glval) = FunctionAddress[~shared_ptr] : -# 20| v20_4(void) = Call[~shared_ptr] : func:r20_3, this:r20_2 -# 20| v20_5(void) = ^IndirectReadSideEffect[-1] : &:r20_2, ~m? -# 20| mu20_6(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r20_2 -# 17| v17_8(void) = ReturnIndirection[p] : &:r17_6, ~m? -# 17| v17_9(void) = ReturnVoid : -# 17| v17_10(void) = AliasedUse : ~m? -# 17| v17_11(void) = ExitFunction : +# 17| v17_1(void) = EnterFunction : +# 17| mu17_2(unknown) = AliasedDefinition : +# 17| mu17_3(unknown) = InitializeNonLocal : +# 17| r17_4(glval) = VariableAddress[p] : +# 17| mu17_5(float *) = InitializeParameter[p] : &:r17_4 +# 17| r17_6(float *) = Load[p] : &:r17_4, ~m? +# 17| mu17_7(unknown) = InitializeIndirection[p] : &:r17_6 +# 18| r18_1(glval>) = VariableAddress[sp] : +# 18| mu18_2(shared_ptr) = Uninitialized[sp] : &:r18_1 +# 18| r18_3(glval) = FunctionAddress[shared_ptr] : +# 18| r18_4(glval) = VariableAddress[p] : +# 18| r18_5(float *) = Load[p] : &:r18_4, ~m? +# 18| v18_6(void) = Call[shared_ptr] : func:r18_3, this:r18_1, 0:r18_5 +# 18| mu18_7(unknown) = ^CallSideEffect : ~m? +# 18| mu18_8(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r18_1 +# 19| r19_1(glval) = FunctionAddress[shared_ptr_arg] : +# 19| r19_2(glval>) = VariableAddress[#temp19:20] : +# 19| mu19_3(shared_ptr) = Uninitialized[#temp19:20] : &:r19_2 +# 19| r19_4(glval) = FunctionAddress[shared_ptr] : +# 19| r19_5(glval>) = VariableAddress[sp] : +# 19| r19_6(glval>) = Convert : r19_5 +# 19| r19_7(shared_ptr &) = CopyValue : r19_6 +# 19| v19_8(void) = Call[shared_ptr] : func:r19_4, this:r19_2, 0:r19_7 +# 19| mu19_9(unknown) = ^CallSideEffect : ~m? +# 19| v19_10(void) = ^IndirectReadSideEffect[0] : &:r19_7, ~m? +# 19| mu19_11(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r19_2 +# 19| r19_12(shared_ptr) = Load[#temp19:20] : &:r19_2, ~m? +# 19| v19_13(void) = Call[shared_ptr_arg] : func:r19_1, 0:r19_12 +# 19| mu19_14(unknown) = ^CallSideEffect : ~m? +# 19| v19_15(void) = ^BufferReadSideEffect[0] : &:r19_12, ~m? +# 19| mu19_16(unknown) = ^BufferMayWriteSideEffect[0] : &:r19_12 +# 19| r19_17(glval>) = CopyValue : r19_2 +# 19| r19_18(glval) = FunctionAddress[~shared_ptr] : +# 19| v19_19(void) = Call[~shared_ptr] : func:r19_18, this:r19_17 +# 19| v19_20(void) = ^IndirectReadSideEffect[-1] : &:r19_17, ~m? +# 19| mu19_21(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r19_17 +# 20| v20_1(void) = NoOp : +# 20| r20_2(glval>) = VariableAddress[sp] : +# 20| r20_3(glval) = FunctionAddress[~shared_ptr] : +# 20| v20_4(void) = Call[~shared_ptr] : func:r20_3, this:r20_2 +# 20| v20_5(void) = ^IndirectReadSideEffect[-1] : &:r20_2, ~m? +# 20| mu20_6(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r20_2 +# 17| v17_8(void) = ReturnIndirection[p] : &:r17_6, ~m? +# 17| v17_9(void) = ReturnVoid : +# 17| v17_10(void) = AliasedUse : ~m? +# 17| v17_11(void) = ExitFunction : # 28| void call_shared_ptr_consts() # 28| Block 0 -# 28| v28_1(void) = EnterFunction : -# 28| mu28_2(unknown) = AliasedDefinition : -# 28| mu28_3(unknown) = InitializeNonLocal : -# 29| r29_1(glval>) = VariableAddress[sp_const_int] : -# 29| mu29_2(shared_ptr) = Uninitialized[sp_const_int] : &:r29_1 -# 31| r31_1(glval) = FunctionAddress[shared_ptr_const_int] : -# 31| r31_2(glval>) = VariableAddress[#temp31:26] : -# 31| mu31_3(shared_ptr) = Uninitialized[#temp31:26] : &:r31_2 -# 31| r31_4(glval) = FunctionAddress[shared_ptr] : -# 31| r31_5(glval>) = VariableAddress[sp_const_int] : -# 31| r31_6(glval>) = Convert : r31_5 -# 31| r31_7(shared_ptr &) = CopyValue : r31_6 -# 31| v31_8(void) = Call[shared_ptr] : func:r31_4, this:r31_2, 0:r31_7 -# 31| mu31_9(unknown) = ^CallSideEffect : ~m? -# 31| v31_10(void) = ^IndirectReadSideEffect[0] : &:r31_7, ~m? -# 31| mu31_11(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r31_2 -# 31| r31_12(shared_ptr) = Load[#temp31:26] : &:r31_2, ~m? -# 31| v31_13(void) = Call[shared_ptr_const_int] : func:r31_1, 0:r31_12 -# 31| mu31_14(unknown) = ^CallSideEffect : ~m? -# 31| v31_15(void) = ^BufferReadSideEffect[0] : &:r31_12, ~m? -# 33| r33_1(glval>) = VariableAddress[sp_const_int_pointer] : -# 33| mu33_2(shared_ptr) = Uninitialized[sp_const_int_pointer] : &:r33_1 -# 35| r35_1(glval) = FunctionAddress[shared_ptr_const_int_ptr] : -# 35| r35_2(glval>) = VariableAddress[#temp35:30] : -# 35| mu35_3(shared_ptr) = Uninitialized[#temp35:30] : &:r35_2 -# 35| r35_4(glval) = FunctionAddress[shared_ptr] : -# 35| r35_5(glval>) = VariableAddress[sp_const_int_pointer] : -# 35| r35_6(glval>) = Convert : r35_5 -# 35| r35_7(shared_ptr &) = CopyValue : r35_6 -# 35| v35_8(void) = Call[shared_ptr] : func:r35_4, this:r35_2, 0:r35_7 -# 35| mu35_9(unknown) = ^CallSideEffect : ~m? -# 35| v35_10(void) = ^IndirectReadSideEffect[0] : &:r35_7, ~m? -# 35| mu35_11(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r35_2 -# 35| r35_12(shared_ptr) = Load[#temp35:30] : &:r35_2, ~m? -# 35| v35_13(void) = Call[shared_ptr_const_int_ptr] : func:r35_1, 0:r35_12 -# 35| mu35_14(unknown) = ^CallSideEffect : ~m? -# 35| v35_15(void) = ^BufferReadSideEffect[0] : &:r35_12, ~m? -# 35| mu35_16(unknown) = ^BufferMayWriteSideEffect[0] : &:r35_12 -# 37| r37_1(glval>>) = VariableAddress[sp_sp_const_int] : -# 37| mu37_2(shared_ptr>) = Uninitialized[sp_sp_const_int] : &:r37_1 -# 39| r39_1(glval) = FunctionAddress[shared_ptr_shared_ptr_const_int] : -# 39| r39_2(glval>>) = VariableAddress[#temp39:37] : -# 39| mu39_3(shared_ptr>) = Uninitialized[#temp39:37] : &:r39_2 -# 39| r39_4(glval) = FunctionAddress[shared_ptr] : -# 39| r39_5(glval>>) = VariableAddress[sp_sp_const_int] : -# 39| r39_6(glval>>) = Convert : r39_5 -# 39| r39_7(shared_ptr> &) = CopyValue : r39_6 -# 39| v39_8(void) = Call[shared_ptr] : func:r39_4, this:r39_2, 0:r39_7 -# 39| mu39_9(unknown) = ^CallSideEffect : ~m? -# 39| v39_10(void) = ^IndirectReadSideEffect[0] : &:r39_7, ~m? -# 39| mu39_11(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r39_2 -# 39| r39_12(shared_ptr>) = Load[#temp39:37] : &:r39_2, ~m? -# 39| v39_13(void) = Call[shared_ptr_shared_ptr_const_int] : func:r39_1, 0:r39_12 -# 39| mu39_14(unknown) = ^CallSideEffect : ~m? -# 39| v39_15(void) = ^BufferReadSideEffect[0] : &:r39_12, ~m? -# 39| mu39_16(unknown) = ^BufferMayWriteSideEffect[0] : &:r39_12 -# 41| r41_1(glval>>) = VariableAddress[sp_const_sp_int] : -# 41| mu41_2(shared_ptr>) = Uninitialized[sp_const_sp_int] : &:r41_1 -# 43| r43_1(glval) = FunctionAddress[shared_ptr_const_shared_ptr_int] : -# 43| r43_2(glval>>) = VariableAddress[#temp43:37] : -# 43| mu43_3(shared_ptr>) = Uninitialized[#temp43:37] : &:r43_2 -# 43| r43_4(glval) = FunctionAddress[shared_ptr] : -# 43| r43_5(glval>>) = VariableAddress[sp_const_sp_int] : -# 43| r43_6(glval>>) = Convert : r43_5 -# 43| r43_7(shared_ptr> &) = CopyValue : r43_6 -# 43| v43_8(void) = Call[shared_ptr] : func:r43_4, this:r43_2, 0:r43_7 -# 43| mu43_9(unknown) = ^CallSideEffect : ~m? -# 43| v43_10(void) = ^IndirectReadSideEffect[0] : &:r43_7, ~m? -# 43| mu43_11(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r43_2 -# 43| r43_12(shared_ptr>) = Load[#temp43:37] : &:r43_2, ~m? -# 43| v43_13(void) = Call[shared_ptr_const_shared_ptr_int] : func:r43_1, 0:r43_12 -# 43| mu43_14(unknown) = ^CallSideEffect : ~m? -# 43| v43_15(void) = ^BufferReadSideEffect[0] : &:r43_12, ~m? -# 43| mu43_16(unknown) = ^BufferMayWriteSideEffect[0] : &:r43_12 -# 45| r45_1(glval>>) = VariableAddress[sp_const_sp_const_int] : -# 45| mu45_2(shared_ptr>) = Uninitialized[sp_const_sp_const_int] : &:r45_1 -# 47| r47_1(glval) = FunctionAddress[shared_ptr_const_shared_ptr_const_int] : -# 47| r47_2(glval>>) = VariableAddress[#temp47:43] : -# 47| mu47_3(shared_ptr>) = Uninitialized[#temp47:43] : &:r47_2 -# 47| r47_4(glval) = FunctionAddress[shared_ptr] : -# 47| r47_5(glval>>) = VariableAddress[sp_const_sp_const_int] : -# 47| r47_6(glval>>) = Convert : r47_5 -# 47| r47_7(shared_ptr> &) = CopyValue : r47_6 -# 47| v47_8(void) = Call[shared_ptr] : func:r47_4, this:r47_2, 0:r47_7 -# 47| mu47_9(unknown) = ^CallSideEffect : ~m? -# 47| v47_10(void) = ^IndirectReadSideEffect[0] : &:r47_7, ~m? -# 47| mu47_11(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r47_2 -# 47| r47_12(shared_ptr>) = Load[#temp47:43] : &:r47_2, ~m? -# 47| v47_13(void) = Call[shared_ptr_const_shared_ptr_const_int] : func:r47_1, 0:r47_12 -# 47| mu47_14(unknown) = ^CallSideEffect : ~m? -# 47| v47_15(void) = ^BufferReadSideEffect[0] : &:r47_12, ~m? -# 48| v48_1(void) = NoOp : -# 48| r48_2(glval>>) = VariableAddress[sp_const_sp_const_int] : -# 48| r48_3(glval) = FunctionAddress[~shared_ptr] : -# 48| v48_4(void) = Call[~shared_ptr] : func:r48_3, this:r48_2 -# 48| v48_5(void) = ^IndirectReadSideEffect[-1] : &:r48_2, ~m? -# 48| mu48_6(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r48_2 -# 48| r48_7(glval>>) = VariableAddress[sp_const_sp_int] : -# 48| r48_8(glval) = FunctionAddress[~shared_ptr] : -# 48| v48_9(void) = Call[~shared_ptr] : func:r48_8, this:r48_7 -# 48| v48_10(void) = ^IndirectReadSideEffect[-1] : &:r48_7, ~m? -# 48| mu48_11(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r48_7 -# 48| r48_12(glval>>) = VariableAddress[sp_sp_const_int] : -# 48| r48_13(glval) = FunctionAddress[~shared_ptr] : -# 48| v48_14(void) = Call[~shared_ptr] : func:r48_13, this:r48_12 -# 48| v48_15(void) = ^IndirectReadSideEffect[-1] : &:r48_12, ~m? -# 48| mu48_16(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r48_12 -# 48| r48_17(glval>) = VariableAddress[sp_const_int_pointer] : -# 48| r48_18(glval) = FunctionAddress[~shared_ptr] : -# 48| v48_19(void) = Call[~shared_ptr] : func:r48_18, this:r48_17 -# 48| v48_20(void) = ^IndirectReadSideEffect[-1] : &:r48_17, ~m? -# 48| mu48_21(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r48_17 -# 48| r48_22(glval>) = VariableAddress[sp_const_int] : -# 48| r48_23(glval) = FunctionAddress[~shared_ptr] : -# 48| v48_24(void) = Call[~shared_ptr] : func:r48_23, this:r48_22 -# 48| v48_25(void) = ^IndirectReadSideEffect[-1] : &:r48_22, ~m? -# 48| mu48_26(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r48_22 -# 28| v28_4(void) = ReturnVoid : -# 28| v28_5(void) = AliasedUse : ~m? -# 28| v28_6(void) = ExitFunction : +# 28| v28_1(void) = EnterFunction : +# 28| mu28_2(unknown) = AliasedDefinition : +# 28| mu28_3(unknown) = InitializeNonLocal : +# 29| r29_1(glval>) = VariableAddress[sp_const_int] : +# 29| mu29_2(shared_ptr) = Uninitialized[sp_const_int] : &:r29_1 +# 31| r31_1(glval) = FunctionAddress[shared_ptr_const_int] : +# 31| r31_2(glval>) = VariableAddress[#temp31:26] : +# 31| mu31_3(shared_ptr) = Uninitialized[#temp31:26] : &:r31_2 +# 31| r31_4(glval) = FunctionAddress[shared_ptr] : +# 31| r31_5(glval>) = VariableAddress[sp_const_int] : +# 31| r31_6(glval>) = Convert : r31_5 +# 31| r31_7(shared_ptr &) = CopyValue : r31_6 +# 31| v31_8(void) = Call[shared_ptr] : func:r31_4, this:r31_2, 0:r31_7 +# 31| mu31_9(unknown) = ^CallSideEffect : ~m? +# 31| v31_10(void) = ^IndirectReadSideEffect[0] : &:r31_7, ~m? +# 31| mu31_11(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r31_2 +# 31| r31_12(shared_ptr) = Load[#temp31:26] : &:r31_2, ~m? +# 31| v31_13(void) = Call[shared_ptr_const_int] : func:r31_1, 0:r31_12 +# 31| mu31_14(unknown) = ^CallSideEffect : ~m? +# 31| v31_15(void) = ^BufferReadSideEffect[0] : &:r31_12, ~m? +# 31| r31_16(glval>) = CopyValue : r31_2 +# 31| r31_17(glval) = FunctionAddress[~shared_ptr] : +# 31| v31_18(void) = Call[~shared_ptr] : func:r31_17, this:r31_16 +# 31| v31_19(void) = ^IndirectReadSideEffect[-1] : &:r31_16, ~m? +# 31| mu31_20(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r31_16 +# 33| r33_1(glval>) = VariableAddress[sp_const_int_pointer] : +# 33| mu33_2(shared_ptr) = Uninitialized[sp_const_int_pointer] : &:r33_1 +# 35| r35_1(glval) = FunctionAddress[shared_ptr_const_int_ptr] : +# 35| r35_2(glval>) = VariableAddress[#temp35:30] : +# 35| mu35_3(shared_ptr) = Uninitialized[#temp35:30] : &:r35_2 +# 35| r35_4(glval) = FunctionAddress[shared_ptr] : +# 35| r35_5(glval>) = VariableAddress[sp_const_int_pointer] : +# 35| r35_6(glval>) = Convert : r35_5 +# 35| r35_7(shared_ptr &) = CopyValue : r35_6 +# 35| v35_8(void) = Call[shared_ptr] : func:r35_4, this:r35_2, 0:r35_7 +# 35| mu35_9(unknown) = ^CallSideEffect : ~m? +# 35| v35_10(void) = ^IndirectReadSideEffect[0] : &:r35_7, ~m? +# 35| mu35_11(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r35_2 +# 35| r35_12(shared_ptr) = Load[#temp35:30] : &:r35_2, ~m? +# 35| v35_13(void) = Call[shared_ptr_const_int_ptr] : func:r35_1, 0:r35_12 +# 35| mu35_14(unknown) = ^CallSideEffect : ~m? +# 35| v35_15(void) = ^BufferReadSideEffect[0] : &:r35_12, ~m? +# 35| mu35_16(unknown) = ^BufferMayWriteSideEffect[0] : &:r35_12 +# 35| r35_17(glval>) = CopyValue : r35_2 +# 35| r35_18(glval) = FunctionAddress[~shared_ptr] : +# 35| v35_19(void) = Call[~shared_ptr] : func:r35_18, this:r35_17 +# 35| v35_20(void) = ^IndirectReadSideEffect[-1] : &:r35_17, ~m? +# 35| mu35_21(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r35_17 +# 37| r37_1(glval>>) = VariableAddress[sp_sp_const_int] : +# 37| mu37_2(shared_ptr>) = Uninitialized[sp_sp_const_int] : &:r37_1 +# 39| r39_1(glval) = FunctionAddress[shared_ptr_shared_ptr_const_int] : +# 39| r39_2(glval>>) = VariableAddress[#temp39:37] : +# 39| mu39_3(shared_ptr>) = Uninitialized[#temp39:37] : &:r39_2 +# 39| r39_4(glval) = FunctionAddress[shared_ptr] : +# 39| r39_5(glval>>) = VariableAddress[sp_sp_const_int] : +# 39| r39_6(glval>>) = Convert : r39_5 +# 39| r39_7(shared_ptr> &) = CopyValue : r39_6 +# 39| v39_8(void) = Call[shared_ptr] : func:r39_4, this:r39_2, 0:r39_7 +# 39| mu39_9(unknown) = ^CallSideEffect : ~m? +# 39| v39_10(void) = ^IndirectReadSideEffect[0] : &:r39_7, ~m? +# 39| mu39_11(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r39_2 +# 39| r39_12(shared_ptr>) = Load[#temp39:37] : &:r39_2, ~m? +# 39| v39_13(void) = Call[shared_ptr_shared_ptr_const_int] : func:r39_1, 0:r39_12 +# 39| mu39_14(unknown) = ^CallSideEffect : ~m? +# 39| v39_15(void) = ^BufferReadSideEffect[0] : &:r39_12, ~m? +# 39| mu39_16(unknown) = ^BufferMayWriteSideEffect[0] : &:r39_12 +# 39| r39_17(glval>>) = CopyValue : r39_2 +# 39| r39_18(glval) = FunctionAddress[~shared_ptr] : +# 39| v39_19(void) = Call[~shared_ptr] : func:r39_18, this:r39_17 +# 39| v39_20(void) = ^IndirectReadSideEffect[-1] : &:r39_17, ~m? +# 39| mu39_21(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r39_17 +# 41| r41_1(glval>>) = VariableAddress[sp_const_sp_int] : +# 41| mu41_2(shared_ptr>) = Uninitialized[sp_const_sp_int] : &:r41_1 +# 43| r43_1(glval) = FunctionAddress[shared_ptr_const_shared_ptr_int] : +# 43| r43_2(glval>>) = VariableAddress[#temp43:37] : +# 43| mu43_3(shared_ptr>) = Uninitialized[#temp43:37] : &:r43_2 +# 43| r43_4(glval) = FunctionAddress[shared_ptr] : +# 43| r43_5(glval>>) = VariableAddress[sp_const_sp_int] : +# 43| r43_6(glval>>) = Convert : r43_5 +# 43| r43_7(shared_ptr> &) = CopyValue : r43_6 +# 43| v43_8(void) = Call[shared_ptr] : func:r43_4, this:r43_2, 0:r43_7 +# 43| mu43_9(unknown) = ^CallSideEffect : ~m? +# 43| v43_10(void) = ^IndirectReadSideEffect[0] : &:r43_7, ~m? +# 43| mu43_11(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r43_2 +# 43| r43_12(shared_ptr>) = Load[#temp43:37] : &:r43_2, ~m? +# 43| v43_13(void) = Call[shared_ptr_const_shared_ptr_int] : func:r43_1, 0:r43_12 +# 43| mu43_14(unknown) = ^CallSideEffect : ~m? +# 43| v43_15(void) = ^BufferReadSideEffect[0] : &:r43_12, ~m? +# 43| mu43_16(unknown) = ^BufferMayWriteSideEffect[0] : &:r43_12 +# 43| r43_17(glval>>) = CopyValue : r43_2 +# 43| r43_18(glval) = FunctionAddress[~shared_ptr] : +# 43| v43_19(void) = Call[~shared_ptr] : func:r43_18, this:r43_17 +# 43| v43_20(void) = ^IndirectReadSideEffect[-1] : &:r43_17, ~m? +# 43| mu43_21(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r43_17 +# 45| r45_1(glval>>) = VariableAddress[sp_const_sp_const_int] : +# 45| mu45_2(shared_ptr>) = Uninitialized[sp_const_sp_const_int] : &:r45_1 +# 47| r47_1(glval) = FunctionAddress[shared_ptr_const_shared_ptr_const_int] : +# 47| r47_2(glval>>) = VariableAddress[#temp47:43] : +# 47| mu47_3(shared_ptr>) = Uninitialized[#temp47:43] : &:r47_2 +# 47| r47_4(glval) = FunctionAddress[shared_ptr] : +# 47| r47_5(glval>>) = VariableAddress[sp_const_sp_const_int] : +# 47| r47_6(glval>>) = Convert : r47_5 +# 47| r47_7(shared_ptr> &) = CopyValue : r47_6 +# 47| v47_8(void) = Call[shared_ptr] : func:r47_4, this:r47_2, 0:r47_7 +# 47| mu47_9(unknown) = ^CallSideEffect : ~m? +# 47| v47_10(void) = ^IndirectReadSideEffect[0] : &:r47_7, ~m? +# 47| mu47_11(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r47_2 +# 47| r47_12(shared_ptr>) = Load[#temp47:43] : &:r47_2, ~m? +# 47| v47_13(void) = Call[shared_ptr_const_shared_ptr_const_int] : func:r47_1, 0:r47_12 +# 47| mu47_14(unknown) = ^CallSideEffect : ~m? +# 47| v47_15(void) = ^BufferReadSideEffect[0] : &:r47_12, ~m? +# 47| r47_16(glval>>) = CopyValue : r47_2 +# 47| r47_17(glval) = FunctionAddress[~shared_ptr] : +# 47| v47_18(void) = Call[~shared_ptr] : func:r47_17, this:r47_16 +# 47| v47_19(void) = ^IndirectReadSideEffect[-1] : &:r47_16, ~m? +# 47| mu47_20(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r47_16 +# 48| v48_1(void) = NoOp : +# 48| r48_2(glval>>) = VariableAddress[sp_const_sp_const_int] : +# 48| r48_3(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_4(void) = Call[~shared_ptr] : func:r48_3, this:r48_2 +# 48| v48_5(void) = ^IndirectReadSideEffect[-1] : &:r48_2, ~m? +# 48| mu48_6(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r48_2 +# 48| r48_7(glval>>) = VariableAddress[sp_const_sp_int] : +# 48| r48_8(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_9(void) = Call[~shared_ptr] : func:r48_8, this:r48_7 +# 48| v48_10(void) = ^IndirectReadSideEffect[-1] : &:r48_7, ~m? +# 48| mu48_11(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r48_7 +# 48| r48_12(glval>>) = VariableAddress[sp_sp_const_int] : +# 48| r48_13(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_14(void) = Call[~shared_ptr] : func:r48_13, this:r48_12 +# 48| v48_15(void) = ^IndirectReadSideEffect[-1] : &:r48_12, ~m? +# 48| mu48_16(shared_ptr>) = ^IndirectMustWriteSideEffect[-1] : &:r48_12 +# 48| r48_17(glval>) = VariableAddress[sp_const_int_pointer] : +# 48| r48_18(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_19(void) = Call[~shared_ptr] : func:r48_18, this:r48_17 +# 48| v48_20(void) = ^IndirectReadSideEffect[-1] : &:r48_17, ~m? +# 48| mu48_21(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r48_17 +# 48| r48_22(glval>) = VariableAddress[sp_const_int] : +# 48| r48_23(glval) = FunctionAddress[~shared_ptr] : +# 48| v48_24(void) = Call[~shared_ptr] : func:r48_23, this:r48_22 +# 48| v48_25(void) = ^IndirectReadSideEffect[-1] : &:r48_22, ~m? +# 48| mu48_26(shared_ptr) = ^IndirectMustWriteSideEffect[-1] : &:r48_22 +# 28| v28_4(void) = ReturnVoid : +# 28| v28_5(void) = AliasedUse : ~m? +# 28| v28_6(void) = ExitFunction : struct_init.cpp: # 9| Info infos_in_file[] 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 b93c7d2649f8..44458377adc7 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 @@ -7,7 +7,47 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors +| destructors_for_temps.cpp:51:41:51:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:41:55:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unexplainedLoop +| destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -18,8 +58,16 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability +| destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Block 'Load: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:5 | Store: ... ? ... : ... | Block 'Store: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Block 'Load: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:5 | Store: ... ? ... : ... | Block 'Store: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | backEdgeCountMismatch useNotDominatedByDefinition +| destructors_for_temps.cpp:51:5:51:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:5:55:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 b93c7d2649f8..44458377adc7 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 @@ -7,7 +7,47 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors +| destructors_for_temps.cpp:51:41:51:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:41:55:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unexplainedLoop +| destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:75:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:75:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -18,8 +58,16 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability +| destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Block 'Load: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:5:51:5 | Store: ... ? ... : ... | Block 'Store: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Block 'Load: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:5:55:5 | Store: ... ? ... : ... | Block 'Store: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | backEdgeCountMismatch useNotDominatedByDefinition +| destructors_for_temps.cpp:51:5:51:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:51:41:51:62 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:5:55:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:55:41:55:62 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated From 17e8c95e7f94c7b8352ece678a5b020fadb6879d Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Tue, 12 Mar 2024 20:12:05 +0000 Subject: [PATCH 03/35] C++: suppress destructors on conditional temporaries --- .../raw/internal/TranslatedElement.qll | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) 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 6f8cfe93507b..b5a96f5c8b7c 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 @@ -127,6 +127,11 @@ private predicate ignoreExprAndDescendants(Expr expr) { exists(BuiltInVarArgsStart vaStartExpr | vaStartExpr.getLastNamedParameter().getFullyConverted() = expr ) + or + // Do not translate implicit destructor calls for unnamed temporary variables that are + // conditionally constructed (until we have a mechanism for calling these only when the + // temporary's constructor was run) + isConditionalTemporaryDestructorCall(expr) } /** @@ -252,6 +257,20 @@ private predicate usedAsCondition(Expr expr) { ) } +private predicate isInConditionalEvaluation(Expr e) { + exists(ConditionalExpr cond | + e = cond.getThen() and not cond.isTwoOperand() + or + e = cond.getElse() + ) + or + isInConditionalEvaluation(getRealParent(e)) +} + +private predicate isConditionalTemporaryDestructorCall(DestructorCall dc) { + isInConditionalEvaluation(dc.getQualifier().(ReuseExpr).getReusedExpr()) +} + /** * Holds if `conv` is an `InheritanceConversion` that requires a `TranslatedLoad`, despite not being * marked as having an lvalue-to-rvalue conversion. From cf996f8600027d539ad8824a1be006bffa6b523a Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 4 Apr 2024 11:05:14 +0100 Subject: [PATCH 04/35] C++: Accept test changes. --- .../library-tests/ir/ir/aliased_ir.expected | 108 +++---- .../ir/ir/aliased_ssa_consistency.expected | 22 +- .../aliased_ssa_consistency_unsound.expected | 26 +- .../ir/ir/operand_locations.expected | 280 +++++++----------- .../ir/ir/raw_consistency.expected | 18 +- .../test/library-tests/ir/ir/raw_ir.expected | 60 ++-- .../ir/ir/unaliased_ssa_consistency.expected | 18 +- ...unaliased_ssa_consistency_unsound.expected | 18 +- 8 files changed, 192 insertions(+), 358 deletions(-) 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 5f591651a2f4..2c49767d5010 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -1175,8 +1175,8 @@ destructors_for_temps.cpp: # 52| r52_2(glval) = VariableAddress[c] : # 52| r52_3(glval) = FunctionAddress[~ClassWithDestructor2] : # 52| v52_4(void) = Call[~ClassWithDestructor2] : func:r52_3, this:r52_2 -# 52| m52_5(unknown) = ^CallSideEffect : ~m51_104, ~m51_72 -# 52| m52_6(unknown) = Chi : total:m51_104, total:m51_72, partial:m52_5 +# 52| m52_5(unknown) = ^CallSideEffect : ~m51_62, ~m51_84 +# 52| m52_6(unknown) = Chi : total:m51_62, total:m51_84, partial:m52_5 # 52| v52_7(void) = ^IndirectReadSideEffect[-1] : &:r52_2, m50_8 # 52| m52_8(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r52_2 # 52| m52_9(ClassWithDestructor2) = Chi : total:m50_8, partial:m52_8 @@ -1233,40 +1233,31 @@ destructors_for_temps.cpp: #-----| Goto -> Block 8 # 51| Block 8 -# 51| m51_82(ClassWithDestructor2) = Phi : from 4:m51_59, from 4:m51_91 -# 51| m51_83(unknown) = Phi : from 4:~m51_104, from 4:~m51_72, from 6:~m51_37 -# 51| m51_80(ClassWithDestructor2) = Phi : from 4:m51_67, from 4:m51_99, from 6:m51_39 -# 51| m51_81(ClassWithDestructor2) = Phi : from 4:m51_107, from 4:m51_75 -# 51| r51_84(glval) = CopyValue : r51_1 -# 51| r51_85(glval) = FunctionAddress[~ClassWithDestructor2] : -# 51| v51_86(void) = Call[~ClassWithDestructor2] : func:r51_53, func:r51_85, this:r51_52, this:r51_84 -# 51| m51_87(unknown) = ^CallSideEffect : ~m51_47, ~m51_51, ~m51_79, ~m51_83 -# 51| m51_88(unknown) = Chi : total:m51_47, total:m51_51, total:m51_79, total:m51_83, partial:m51_55, partial:m51_87 -# 51| v51_89(void) = ^IndirectReadSideEffect[-1] : &:r51_52, &:r51_84, m51_46, m51_50, m51_78, m51_82 -# 51| m51_90(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_52, &:r51_84 -# 51| m51_91(ClassWithDestructor2) = Chi : total:m51_46, total:m51_50, total:m51_78, total:m51_82, partial:m51_58, partial:m51_90 -# 51| r51_92(glval) = CopyValue : r51_32 -# 51| r51_93(glval) = FunctionAddress[~ClassWithDestructor2] : -# 51| v51_94(void) = Call[~ClassWithDestructor2] : func:r51_61, func:r51_93, this:r51_60, this:r51_92 -# 51| m51_95(unknown) = ^CallSideEffect : ~m51_56, ~m51_88 -# 51| m51_96(unknown) = Chi : total:m51_56, total:m51_88, partial:m51_63, partial:m51_95 -# 51| v51_97(void) = ^IndirectReadSideEffect[-1] : &:r51_60, &:r51_92, m51_44, m51_48, m51_76, m51_80 -# 51| m51_98(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_60, &:r51_92 -# 51| m51_99(ClassWithDestructor2) = Chi : total:m51_44, total:m51_48, total:m51_76, total:m51_80, partial:m51_66, partial:m51_98 -# 51| r51_68(glval) = CopyValue : r51_11 -# 51| r51_69(glval) = FunctionAddress[~ClassWithDestructor2] : -# 51| v51_70(void) = Call[~ClassWithDestructor2] : func:r51_101, func:r51_69, this:r51_100, this:r51_68 -# 51| m51_71(unknown) = ^CallSideEffect : ~m51_64, ~m51_96 -# 51| m51_72(unknown) = Chi : total:m51_64, total:m51_96, partial:m51_103, partial:m51_71 -# 51| v51_73(void) = ^IndirectReadSideEffect[-1] : &:r51_100, &:r51_68, m51_45, m51_49, m51_77, m51_81 -# 51| m51_74(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_100, &:r51_68 -# 51| m51_75(ClassWithDestructor2) = Chi : total:m51_45, total:m51_49, total:m51_77, total:m51_81, partial:m51_106, partial:m51_74 -#-----| Goto (back edge) -> Block 4 +# 51| m51_70(ClassWithDestructor2) = Phi : from 4:m51_57, from 4:m51_79 +# 51| m51_71(unknown) = Phi : from 4:~m51_62, from 4:~m51_84, from 6:~m51_37 +# 51| m51_69(ClassWithDestructor2) = Phi : from 4:m51_65, from 4:m51_87, from 6:m51_39 +# 51| r51_72(glval) = CopyValue : r51_1 +# 51| r51_73(glval) = FunctionAddress[~ClassWithDestructor2] : +# 51| v51_74(void) = Call[~ClassWithDestructor2] : func:r51_51, func:r51_73, this:r51_50, this:r51_72 +# 51| m51_75(unknown) = ^CallSideEffect : ~m51_46, ~m51_49, ~m51_68, ~m51_71 +# 51| m51_76(unknown) = Chi : total:m51_46, total:m51_49, total:m51_68, total:m51_71, partial:m51_53, partial:m51_75 +# 51| v51_77(void) = ^IndirectReadSideEffect[-1] : &:r51_50, &:r51_72, m51_45, m51_48, m51_67, m51_70 +# 51| m51_78(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_50, &:r51_72 +# 51| m51_79(ClassWithDestructor2) = Chi : total:m51_45, total:m51_48, total:m51_67, total:m51_70, partial:m51_56, partial:m51_78 +# 51| r51_80(glval) = CopyValue : r51_32 +# 51| r51_81(glval) = FunctionAddress[~ClassWithDestructor2] : +# 51| v51_82(void) = Call[~ClassWithDestructor2] : func:r51_59, func:r51_81, this:r51_58, this:r51_80 +# 51| m51_83(unknown) = ^CallSideEffect : ~m51_54, ~m51_76 +# 51| m51_84(unknown) = Chi : total:m51_54, total:m51_76, partial:m51_61, partial:m51_83 +# 51| v51_85(void) = ^IndirectReadSideEffect[-1] : &:r51_58, &:r51_80, m51_44, m51_47, m51_66, m51_69 +# 51| m51_86(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_58, &:r51_80 +# 51| m51_87(ClassWithDestructor2) = Chi : total:m51_44, total:m51_47, total:m51_66, total:m51_69, partial:m51_64, partial:m51_86 #-----| Goto (back edge) -> Block 3 +#-----| Goto (back edge) -> Block 4 # 51| Block 8 -#-----| Goto (back edge) -> Block 4 #-----| Goto (back edge) -> Block 3 +#-----| Goto (back edge) -> Block 4 # 54| void temp_test8(bool) # 54| Block 0 @@ -1284,7 +1275,7 @@ destructors_for_temps.cpp: #-----| True -> Block 5 # 54| Block 1 -# 54| m54_7(unknown) = Phi : from 2:~m55_28, from 3:~m55_104, from 3:~m55_72 +# 54| m54_7(unknown) = Phi : from 2:~m55_28, from 3:~m55_62, from 3:~m55_84 # 54| v54_8(void) = AliasedUse : ~m54_7 # 54| v54_9(void) = ExitFunction : @@ -1348,40 +1339,31 @@ destructors_for_temps.cpp: #-----| Goto -> Block 8 # 55| Block 8 -# 55| m55_82(ClassWithDestructor2) = Phi : from 4:m55_107, from 4:m55_75 -# 55| m55_83(unknown) = Phi : from 4:~m55_104, from 4:~m55_72, from 6:~m55_37 -# 55| m55_80(ClassWithDestructor2) = Phi : from 4:m55_59, from 4:m55_91 -# 55| m55_81(ClassWithDestructor2) = Phi : from 4:m55_67, from 4:m55_99, from 6:m55_39 -# 55| r55_84(glval) = CopyValue : r55_1 -# 55| r55_85(glval) = FunctionAddress[~ClassWithDestructor2] : -# 55| v55_86(void) = Call[~ClassWithDestructor2] : func:r55_53, func:r55_85, this:r55_52, this:r55_84 -# 55| m55_87(unknown) = ^CallSideEffect : ~m55_47, ~m55_51, ~m55_79, ~m55_83 -# 55| m55_88(unknown) = Chi : total:m55_47, total:m55_51, total:m55_79, total:m55_83, partial:m55_55, partial:m55_87 -# 55| v55_89(void) = ^IndirectReadSideEffect[-1] : &:r55_52, &:r55_84, m55_44, m55_48, m55_76, m55_80 -# 55| m55_90(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_52, &:r55_84 -# 55| m55_91(ClassWithDestructor2) = Chi : total:m55_44, total:m55_48, total:m55_76, total:m55_80, partial:m55_58, partial:m55_90 -# 55| r55_92(glval) = CopyValue : r55_32 -# 55| r55_93(glval) = FunctionAddress[~ClassWithDestructor2] : -# 55| v55_94(void) = Call[~ClassWithDestructor2] : func:r55_61, func:r55_93, this:r55_60, this:r55_92 -# 55| m55_95(unknown) = ^CallSideEffect : ~m55_56, ~m55_88 -# 55| m55_96(unknown) = Chi : total:m55_56, total:m55_88, partial:m55_63, partial:m55_95 -# 55| v55_97(void) = ^IndirectReadSideEffect[-1] : &:r55_60, &:r55_92, m55_45, m55_49, m55_77, m55_81 -# 55| m55_98(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_60, &:r55_92 -# 55| m55_99(ClassWithDestructor2) = Chi : total:m55_45, total:m55_49, total:m55_77, total:m55_81, partial:m55_66, partial:m55_98 -# 55| r55_68(glval) = CopyValue : r55_11 -# 55| r55_69(glval) = FunctionAddress[~ClassWithDestructor2] : -# 55| v55_70(void) = Call[~ClassWithDestructor2] : func:r55_101, func:r55_69, this:r55_100, this:r55_68 -# 55| m55_71(unknown) = ^CallSideEffect : ~m55_64, ~m55_96 -# 55| m55_72(unknown) = Chi : total:m55_64, total:m55_96, partial:m55_103, partial:m55_71 -# 55| v55_73(void) = ^IndirectReadSideEffect[-1] : &:r55_100, &:r55_68, m55_46, m55_50, m55_78, m55_82 -# 55| m55_74(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_100, &:r55_68 -# 55| m55_75(ClassWithDestructor2) = Chi : total:m55_46, total:m55_50, total:m55_78, total:m55_82, partial:m55_106, partial:m55_74 -#-----| Goto (back edge) -> Block 4 +# 55| m55_70(ClassWithDestructor2) = Phi : from 4:m55_65, from 4:m55_87, from 6:m55_39 +# 55| m55_71(unknown) = Phi : from 4:~m55_62, from 4:~m55_84, from 6:~m55_37 +# 55| m55_69(ClassWithDestructor2) = Phi : from 4:m55_57, from 4:m55_79 +# 55| r55_72(glval) = CopyValue : r55_1 +# 55| r55_73(glval) = FunctionAddress[~ClassWithDestructor2] : +# 55| v55_74(void) = Call[~ClassWithDestructor2] : func:r55_51, func:r55_73, this:r55_50, this:r55_72 +# 55| m55_75(unknown) = ^CallSideEffect : ~m55_46, ~m55_49, ~m55_68, ~m55_71 +# 55| m55_76(unknown) = Chi : total:m55_46, total:m55_49, total:m55_68, total:m55_71, partial:m55_53, partial:m55_75 +# 55| v55_77(void) = ^IndirectReadSideEffect[-1] : &:r55_50, &:r55_72, m55_44, m55_47, m55_66, m55_69 +# 55| m55_78(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_50, &:r55_72 +# 55| m55_79(ClassWithDestructor2) = Chi : total:m55_44, total:m55_47, total:m55_66, total:m55_69, partial:m55_56, partial:m55_78 +# 55| r55_80(glval) = CopyValue : r55_32 +# 55| r55_81(glval) = FunctionAddress[~ClassWithDestructor2] : +# 55| v55_82(void) = Call[~ClassWithDestructor2] : func:r55_59, func:r55_81, this:r55_58, this:r55_80 +# 55| m55_83(unknown) = ^CallSideEffect : ~m55_54, ~m55_76 +# 55| m55_84(unknown) = Chi : total:m55_54, total:m55_76, partial:m55_61, partial:m55_83 +# 55| v55_85(void) = ^IndirectReadSideEffect[-1] : &:r55_58, &:r55_80, m55_45, m55_48, m55_67, m55_70 +# 55| m55_86(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_58, &:r55_80 +# 55| m55_87(ClassWithDestructor2) = Chi : total:m55_45, total:m55_48, total:m55_67, total:m55_70, partial:m55_64, partial:m55_86 #-----| Goto (back edge) -> Block 3 +#-----| Goto (back edge) -> Block 4 # 55| Block 8 -#-----| Goto (back edge) -> Block 4 #-----| Goto (back edge) -> Block 3 +#-----| Goto (back edge) -> Block 4 ir.c: # 7| void MyCoordsTest(int) 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 560bb8f4a358..236ed0188d40 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 @@ -7,8 +7,8 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| destructors_for_temps.cpp:51:41:51:62 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:41:55:62 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:51:75:51:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:75:55:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unexplainedLoop | destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | @@ -20,14 +20,6 @@ unexplainedLoop | destructors_for_temps.cpp:51:5:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:75:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:75:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:75:51:96 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | @@ -46,14 +38,6 @@ unexplainedLoop | destructors_for_temps.cpp:55:5:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:75:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:75:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:75:55:96 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | @@ -79,9 +63,7 @@ lostReachability backEdgeCountMismatch useNotDominatedByDefinition | destructors_for_temps.cpp:51:5:51:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:55:5:55:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 d8e6d0b173a1..b63b53e3fbe6 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 @@ -3,8 +3,6 @@ unexpectedOperand duplicateOperand missingPhiOperand | destructors_for_temps.cpp:51:5:51:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is missing an operand for predecessor block 'VariableAddress: temporary object' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is missing an operand for predecessor block 'VariableAddress: temporary object' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:5:55:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is missing an operand for predecessor block 'VariableAddress: temporary object' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is missing an operand for predecessor block 'VariableAddress: temporary object' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | missingOperandType | destructors_for_temps.cpp:39:3:39:53 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | destructors_for_temps.cpp:38:6:38:15 | void temp_test5(bool) | void temp_test5(bool) | @@ -14,8 +12,8 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| destructors_for_temps.cpp:51:41:51:62 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:41:55:62 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:51:75:51:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:75:55:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unexplainedLoop | destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | @@ -29,15 +27,6 @@ unexplainedLoop | destructors_for_temps.cpp:51:5:51:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:75:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:75:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:75:51:96 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | @@ -58,15 +47,6 @@ unexplainedLoop | destructors_for_temps.cpp:55:5:55:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:75:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:75:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:75:55:96 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | @@ -92,9 +72,7 @@ lostReachability backEdgeCountMismatch useNotDominatedByDefinition | destructors_for_temps.cpp:51:5:51:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:55:5:55:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 ca4a6d2b2b72..26ff6c1b050f 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -1060,44 +1060,42 @@ | destructors_for_temps.cpp:51:5:51:5 | Load | m51_42 | | destructors_for_temps.cpp:51:5:51:5 | StoreValue | r51_6 | | destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_1 | -| destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_52 | -| destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_52 | -| destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_84 | -| destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_84 | -| destructors_for_temps.cpp:51:5:51:96 | Arg(this) | this:r51_52 | -| destructors_for_temps.cpp:51:5:51:96 | Arg(this) | this:r51_84 | -| destructors_for_temps.cpp:51:5:51:96 | CallTarget | func:r51_53 | -| destructors_for_temps.cpp:51:5:51:96 | CallTarget | func:r51_85 | -| destructors_for_temps.cpp:51:5:51:96 | ChiPartial | partial:m51_55 | -| destructors_for_temps.cpp:51:5:51:96 | ChiPartial | partial:m51_58 | -| destructors_for_temps.cpp:51:5:51:96 | ChiPartial | partial:m51_87 | -| destructors_for_temps.cpp:51:5:51:96 | ChiPartial | partial:m51_90 | +| destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_50 | +| destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_50 | +| destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_72 | +| destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_72 | +| destructors_for_temps.cpp:51:5:51:96 | Arg(this) | this:r51_50 | +| destructors_for_temps.cpp:51:5:51:96 | Arg(this) | this:r51_72 | +| destructors_for_temps.cpp:51:5:51:96 | CallTarget | func:r51_51 | +| destructors_for_temps.cpp:51:5:51:96 | CallTarget | func:r51_73 | +| destructors_for_temps.cpp:51:5:51:96 | ChiPartial | partial:m51_53 | +| destructors_for_temps.cpp:51:5:51:96 | ChiPartial | partial:m51_56 | +| destructors_for_temps.cpp:51:5:51:96 | ChiPartial | partial:m51_75 | +| destructors_for_temps.cpp:51:5:51:96 | ChiPartial | partial:m51_78 | +| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_45 | | destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_46 | -| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_47 | -| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_50 | -| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_51 | -| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_78 | -| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_79 | -| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_82 | -| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_83 | -| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:m51_59 | -| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:m51_67 | -| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:m51_75 | -| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:m51_91 | -| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:m51_99 | -| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:m51_107 | -| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:~m51_72 | -| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:~m51_104 | +| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_48 | +| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_49 | +| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_67 | +| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_68 | +| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_70 | +| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_71 | +| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:m51_57 | +| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:m51_65 | +| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:m51_79 | +| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:m51_87 | +| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:~m51_62 | +| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:~m51_84 | | destructors_for_temps.cpp:51:5:51:96 | Phi | from 6:m51_39 | | destructors_for_temps.cpp:51:5:51:96 | Phi | from 6:~m51_37 | -| destructors_for_temps.cpp:51:5:51:96 | SideEffect | m51_46 | -| destructors_for_temps.cpp:51:5:51:96 | SideEffect | m51_50 | -| destructors_for_temps.cpp:51:5:51:96 | SideEffect | m51_78 | -| destructors_for_temps.cpp:51:5:51:96 | SideEffect | m51_82 | -| destructors_for_temps.cpp:51:5:51:96 | SideEffect | ~m51_47 | -| destructors_for_temps.cpp:51:5:51:96 | SideEffect | ~m51_51 | -| destructors_for_temps.cpp:51:5:51:96 | SideEffect | ~m51_79 | -| destructors_for_temps.cpp:51:5:51:96 | SideEffect | ~m51_83 | +| destructors_for_temps.cpp:51:5:51:96 | SideEffect | m51_45 | +| destructors_for_temps.cpp:51:5:51:96 | SideEffect | m51_48 | +| destructors_for_temps.cpp:51:5:51:96 | SideEffect | m51_67 | +| destructors_for_temps.cpp:51:5:51:96 | SideEffect | m51_70 | +| destructors_for_temps.cpp:51:5:51:96 | SideEffect | ~m51_46 | +| destructors_for_temps.cpp:51:5:51:96 | SideEffect | ~m51_49 | +| destructors_for_temps.cpp:51:5:51:96 | SideEffect | ~m51_68 | +| destructors_for_temps.cpp:51:5:51:96 | SideEffect | ~m51_71 | | destructors_for_temps.cpp:51:5:51:96 | Unary | r51_1 | | destructors_for_temps.cpp:51:9:51:71 | Address | &:r51_7 | | destructors_for_temps.cpp:51:9:51:71 | Address | &:r51_7 | @@ -1115,42 +1113,17 @@ | destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_11 | | destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_11 | | destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_11 | -| destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_68 | -| destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_68 | -| destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_100 | -| destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_100 | | destructors_for_temps.cpp:51:41:51:62 | Arg(this) | this:r51_11 | | destructors_for_temps.cpp:51:41:51:62 | Arg(this) | this:r51_11 | -| destructors_for_temps.cpp:51:41:51:62 | Arg(this) | this:r51_68 | -| destructors_for_temps.cpp:51:41:51:62 | Arg(this) | this:r51_100 | | destructors_for_temps.cpp:51:41:51:62 | CallTarget | func:r51_13 | -| destructors_for_temps.cpp:51:41:51:62 | CallTarget | func:r51_69 | -| destructors_for_temps.cpp:51:41:51:62 | CallTarget | func:r51_101 | | destructors_for_temps.cpp:51:41:51:62 | ChiPartial | partial:m51_15 | | destructors_for_temps.cpp:51:41:51:62 | ChiPartial | partial:m51_17 | | destructors_for_temps.cpp:51:41:51:62 | ChiPartial | partial:m51_24 | -| destructors_for_temps.cpp:51:41:51:62 | ChiPartial | partial:m51_71 | -| destructors_for_temps.cpp:51:41:51:62 | ChiPartial | partial:m51_74 | -| destructors_for_temps.cpp:51:41:51:62 | ChiPartial | partial:m51_103 | -| destructors_for_temps.cpp:51:41:51:62 | ChiPartial | partial:m51_106 | | destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m50_6 | | destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m51_12 | | destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m51_18 | -| destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m51_45 | -| destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m51_49 | -| destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m51_64 | -| destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m51_77 | -| destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m51_81 | -| destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m51_96 | | destructors_for_temps.cpp:51:41:51:62 | SideEffect | m51_18 | -| destructors_for_temps.cpp:51:41:51:62 | SideEffect | m51_45 | -| destructors_for_temps.cpp:51:41:51:62 | SideEffect | m51_49 | -| destructors_for_temps.cpp:51:41:51:62 | SideEffect | m51_77 | -| destructors_for_temps.cpp:51:41:51:62 | SideEffect | m51_81 | | destructors_for_temps.cpp:51:41:51:62 | SideEffect | ~m50_6 | -| destructors_for_temps.cpp:51:41:51:62 | SideEffect | ~m51_64 | -| destructors_for_temps.cpp:51:41:51:62 | SideEffect | ~m51_96 | -| destructors_for_temps.cpp:51:41:51:62 | Unary | r51_11 | | destructors_for_temps.cpp:51:64:51:68 | Arg(1) | 1:r51_20 | | destructors_for_temps.cpp:51:64:51:68 | CallTarget | func:r51_19 | | destructors_for_temps.cpp:51:64:51:68 | ChiPartial | partial:m51_21 | @@ -1159,38 +1132,38 @@ | destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_32 | | destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_32 | | destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_32 | -| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_60 | -| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_60 | -| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_92 | -| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_92 | +| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_58 | +| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_58 | +| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_80 | +| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_80 | | destructors_for_temps.cpp:51:75:51:96 | Arg(this) | this:r51_32 | -| destructors_for_temps.cpp:51:75:51:96 | Arg(this) | this:r51_60 | -| destructors_for_temps.cpp:51:75:51:96 | Arg(this) | this:r51_92 | +| destructors_for_temps.cpp:51:75:51:96 | Arg(this) | this:r51_58 | +| destructors_for_temps.cpp:51:75:51:96 | Arg(this) | this:r51_80 | | destructors_for_temps.cpp:51:75:51:96 | CallTarget | func:r51_34 | -| destructors_for_temps.cpp:51:75:51:96 | CallTarget | func:r51_61 | -| destructors_for_temps.cpp:51:75:51:96 | CallTarget | func:r51_93 | +| destructors_for_temps.cpp:51:75:51:96 | CallTarget | func:r51_59 | +| destructors_for_temps.cpp:51:75:51:96 | CallTarget | func:r51_81 | | destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_36 | | destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_38 | -| destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_63 | -| destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_66 | -| destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_95 | -| destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_98 | +| destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_61 | +| destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_64 | +| destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_83 | +| destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_86 | | destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m50_6 | | destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_33 | | destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_44 | -| destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_48 | -| destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_56 | +| destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_47 | +| destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_54 | +| destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_66 | +| destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_69 | | destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_76 | -| destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_80 | -| destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_88 | | destructors_for_temps.cpp:51:75:51:96 | Load | m51_39 | | destructors_for_temps.cpp:51:75:51:96 | SideEffect | m51_44 | -| destructors_for_temps.cpp:51:75:51:96 | SideEffect | m51_48 | -| destructors_for_temps.cpp:51:75:51:96 | SideEffect | m51_76 | -| destructors_for_temps.cpp:51:75:51:96 | SideEffect | m51_80 | +| destructors_for_temps.cpp:51:75:51:96 | SideEffect | m51_47 | +| destructors_for_temps.cpp:51:75:51:96 | SideEffect | m51_66 | +| destructors_for_temps.cpp:51:75:51:96 | SideEffect | m51_69 | | destructors_for_temps.cpp:51:75:51:96 | SideEffect | ~m50_6 | -| destructors_for_temps.cpp:51:75:51:96 | SideEffect | ~m51_56 | -| destructors_for_temps.cpp:51:75:51:96 | SideEffect | ~m51_88 | +| destructors_for_temps.cpp:51:75:51:96 | SideEffect | ~m51_54 | +| destructors_for_temps.cpp:51:75:51:96 | SideEffect | ~m51_76 | | destructors_for_temps.cpp:51:75:51:96 | StoreValue | r51_40 | | destructors_for_temps.cpp:51:75:51:96 | Unary | r51_32 | | destructors_for_temps.cpp:52:1:52:1 | Address | &:r52_2 | @@ -1200,16 +1173,16 @@ | destructors_for_temps.cpp:52:1:52:1 | ChiPartial | partial:m52_5 | | destructors_for_temps.cpp:52:1:52:1 | ChiPartial | partial:m52_8 | | destructors_for_temps.cpp:52:1:52:1 | ChiTotal | total:m50_8 | -| destructors_for_temps.cpp:52:1:52:1 | ChiTotal | total:m51_72 | -| destructors_for_temps.cpp:52:1:52:1 | ChiTotal | total:m51_104 | +| destructors_for_temps.cpp:52:1:52:1 | ChiTotal | total:m51_62 | +| destructors_for_temps.cpp:52:1:52:1 | ChiTotal | total:m51_84 | | destructors_for_temps.cpp:52:1:52:1 | SideEffect | m50_8 | -| destructors_for_temps.cpp:52:1:52:1 | SideEffect | ~m51_72 | -| destructors_for_temps.cpp:52:1:52:1 | SideEffect | ~m51_104 | +| destructors_for_temps.cpp:52:1:52:1 | SideEffect | ~m51_62 | +| destructors_for_temps.cpp:52:1:52:1 | SideEffect | ~m51_84 | | destructors_for_temps.cpp:54:6:54:15 | ChiPartial | partial:m54_3 | | destructors_for_temps.cpp:54:6:54:15 | ChiTotal | total:m54_2 | | destructors_for_temps.cpp:54:6:54:15 | Phi | from 2:~m55_28 | -| destructors_for_temps.cpp:54:6:54:15 | Phi | from 3:~m55_72 | -| destructors_for_temps.cpp:54:6:54:15 | Phi | from 3:~m55_104 | +| destructors_for_temps.cpp:54:6:54:15 | Phi | from 3:~m55_62 | +| destructors_for_temps.cpp:54:6:54:15 | Phi | from 3:~m55_84 | | destructors_for_temps.cpp:54:6:54:15 | SideEffect | ~m54_7 | | destructors_for_temps.cpp:54:22:54:22 | Address | &:r54_5 | | destructors_for_temps.cpp:55:5:55:5 | Address | &:r55_2 | @@ -1220,44 +1193,42 @@ | destructors_for_temps.cpp:55:5:55:5 | Load | m55_42 | | destructors_for_temps.cpp:55:5:55:5 | StoreValue | r55_6 | | destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_1 | -| destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_52 | -| destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_52 | -| destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_84 | -| destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_84 | -| destructors_for_temps.cpp:55:5:55:96 | Arg(this) | this:r55_52 | -| destructors_for_temps.cpp:55:5:55:96 | Arg(this) | this:r55_84 | -| destructors_for_temps.cpp:55:5:55:96 | CallTarget | func:r55_53 | -| destructors_for_temps.cpp:55:5:55:96 | CallTarget | func:r55_85 | -| destructors_for_temps.cpp:55:5:55:96 | ChiPartial | partial:m55_55 | -| destructors_for_temps.cpp:55:5:55:96 | ChiPartial | partial:m55_58 | -| destructors_for_temps.cpp:55:5:55:96 | ChiPartial | partial:m55_87 | -| destructors_for_temps.cpp:55:5:55:96 | ChiPartial | partial:m55_90 | +| destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_50 | +| destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_50 | +| destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_72 | +| destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_72 | +| destructors_for_temps.cpp:55:5:55:96 | Arg(this) | this:r55_50 | +| destructors_for_temps.cpp:55:5:55:96 | Arg(this) | this:r55_72 | +| destructors_for_temps.cpp:55:5:55:96 | CallTarget | func:r55_51 | +| destructors_for_temps.cpp:55:5:55:96 | CallTarget | func:r55_73 | +| destructors_for_temps.cpp:55:5:55:96 | ChiPartial | partial:m55_53 | +| destructors_for_temps.cpp:55:5:55:96 | ChiPartial | partial:m55_56 | +| destructors_for_temps.cpp:55:5:55:96 | ChiPartial | partial:m55_75 | +| destructors_for_temps.cpp:55:5:55:96 | ChiPartial | partial:m55_78 | | destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_44 | +| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_46 | | destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_47 | -| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_48 | -| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_51 | -| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_76 | -| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_79 | -| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_80 | -| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_83 | -| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:m55_59 | -| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:m55_67 | -| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:m55_75 | -| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:m55_91 | -| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:m55_99 | -| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:m55_107 | -| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:~m55_72 | -| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:~m55_104 | +| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_49 | +| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_66 | +| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_68 | +| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_69 | +| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_71 | +| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:m55_57 | +| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:m55_65 | +| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:m55_79 | +| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:m55_87 | +| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:~m55_62 | +| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:~m55_84 | | destructors_for_temps.cpp:55:5:55:96 | Phi | from 6:m55_39 | | destructors_for_temps.cpp:55:5:55:96 | Phi | from 6:~m55_37 | | destructors_for_temps.cpp:55:5:55:96 | SideEffect | m55_44 | -| destructors_for_temps.cpp:55:5:55:96 | SideEffect | m55_48 | -| destructors_for_temps.cpp:55:5:55:96 | SideEffect | m55_76 | -| destructors_for_temps.cpp:55:5:55:96 | SideEffect | m55_80 | -| destructors_for_temps.cpp:55:5:55:96 | SideEffect | ~m55_47 | -| destructors_for_temps.cpp:55:5:55:96 | SideEffect | ~m55_51 | -| destructors_for_temps.cpp:55:5:55:96 | SideEffect | ~m55_79 | -| destructors_for_temps.cpp:55:5:55:96 | SideEffect | ~m55_83 | +| destructors_for_temps.cpp:55:5:55:96 | SideEffect | m55_47 | +| destructors_for_temps.cpp:55:5:55:96 | SideEffect | m55_66 | +| destructors_for_temps.cpp:55:5:55:96 | SideEffect | m55_69 | +| destructors_for_temps.cpp:55:5:55:96 | SideEffect | ~m55_46 | +| destructors_for_temps.cpp:55:5:55:96 | SideEffect | ~m55_49 | +| destructors_for_temps.cpp:55:5:55:96 | SideEffect | ~m55_68 | +| destructors_for_temps.cpp:55:5:55:96 | SideEffect | ~m55_71 | | destructors_for_temps.cpp:55:5:55:96 | Unary | r55_1 | | destructors_for_temps.cpp:55:9:55:71 | Address | &:r55_7 | | destructors_for_temps.cpp:55:9:55:71 | Address | &:r55_7 | @@ -1275,42 +1246,17 @@ | destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_11 | | destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_11 | | destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_11 | -| destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_68 | -| destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_68 | -| destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_100 | -| destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_100 | | destructors_for_temps.cpp:55:41:55:62 | Arg(this) | this:r55_11 | | destructors_for_temps.cpp:55:41:55:62 | Arg(this) | this:r55_11 | -| destructors_for_temps.cpp:55:41:55:62 | Arg(this) | this:r55_68 | -| destructors_for_temps.cpp:55:41:55:62 | Arg(this) | this:r55_100 | | destructors_for_temps.cpp:55:41:55:62 | CallTarget | func:r55_13 | -| destructors_for_temps.cpp:55:41:55:62 | CallTarget | func:r55_69 | -| destructors_for_temps.cpp:55:41:55:62 | CallTarget | func:r55_101 | | destructors_for_temps.cpp:55:41:55:62 | ChiPartial | partial:m55_15 | | destructors_for_temps.cpp:55:41:55:62 | ChiPartial | partial:m55_17 | | destructors_for_temps.cpp:55:41:55:62 | ChiPartial | partial:m55_24 | -| destructors_for_temps.cpp:55:41:55:62 | ChiPartial | partial:m55_71 | -| destructors_for_temps.cpp:55:41:55:62 | ChiPartial | partial:m55_74 | -| destructors_for_temps.cpp:55:41:55:62 | ChiPartial | partial:m55_103 | -| destructors_for_temps.cpp:55:41:55:62 | ChiPartial | partial:m55_106 | | destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m54_4 | | destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m55_12 | | destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m55_18 | -| destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m55_46 | -| destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m55_50 | -| destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m55_64 | -| destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m55_78 | -| destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m55_82 | -| destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m55_96 | | destructors_for_temps.cpp:55:41:55:62 | SideEffect | m55_18 | -| destructors_for_temps.cpp:55:41:55:62 | SideEffect | m55_46 | -| destructors_for_temps.cpp:55:41:55:62 | SideEffect | m55_50 | -| destructors_for_temps.cpp:55:41:55:62 | SideEffect | m55_78 | -| destructors_for_temps.cpp:55:41:55:62 | SideEffect | m55_82 | | destructors_for_temps.cpp:55:41:55:62 | SideEffect | ~m54_4 | -| destructors_for_temps.cpp:55:41:55:62 | SideEffect | ~m55_64 | -| destructors_for_temps.cpp:55:41:55:62 | SideEffect | ~m55_96 | -| destructors_for_temps.cpp:55:41:55:62 | Unary | r55_11 | | destructors_for_temps.cpp:55:64:55:68 | Arg(1) | 1:r55_20 | | destructors_for_temps.cpp:55:64:55:68 | CallTarget | func:r55_19 | | destructors_for_temps.cpp:55:64:55:68 | ChiPartial | partial:m55_21 | @@ -1319,38 +1265,38 @@ | destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_32 | | destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_32 | | destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_32 | -| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_60 | -| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_60 | -| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_92 | -| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_92 | +| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_58 | +| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_58 | +| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_80 | +| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_80 | | destructors_for_temps.cpp:55:75:55:96 | Arg(this) | this:r55_32 | -| destructors_for_temps.cpp:55:75:55:96 | Arg(this) | this:r55_60 | -| destructors_for_temps.cpp:55:75:55:96 | Arg(this) | this:r55_92 | +| destructors_for_temps.cpp:55:75:55:96 | Arg(this) | this:r55_58 | +| destructors_for_temps.cpp:55:75:55:96 | Arg(this) | this:r55_80 | | destructors_for_temps.cpp:55:75:55:96 | CallTarget | func:r55_34 | -| destructors_for_temps.cpp:55:75:55:96 | CallTarget | func:r55_61 | -| destructors_for_temps.cpp:55:75:55:96 | CallTarget | func:r55_93 | +| destructors_for_temps.cpp:55:75:55:96 | CallTarget | func:r55_59 | +| destructors_for_temps.cpp:55:75:55:96 | CallTarget | func:r55_81 | | destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_36 | | destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_38 | -| destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_63 | -| destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_66 | -| destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_95 | -| destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_98 | +| destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_61 | +| destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_64 | +| destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_83 | +| destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_86 | | destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m54_4 | | destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_33 | | destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_45 | -| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_49 | -| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_56 | -| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_77 | -| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_81 | -| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_88 | +| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_48 | +| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_54 | +| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_67 | +| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_70 | +| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_76 | | destructors_for_temps.cpp:55:75:55:96 | Load | m55_39 | | destructors_for_temps.cpp:55:75:55:96 | SideEffect | m55_45 | -| destructors_for_temps.cpp:55:75:55:96 | SideEffect | m55_49 | -| destructors_for_temps.cpp:55:75:55:96 | SideEffect | m55_77 | -| destructors_for_temps.cpp:55:75:55:96 | SideEffect | m55_81 | +| destructors_for_temps.cpp:55:75:55:96 | SideEffect | m55_48 | +| destructors_for_temps.cpp:55:75:55:96 | SideEffect | m55_67 | +| destructors_for_temps.cpp:55:75:55:96 | SideEffect | m55_70 | | destructors_for_temps.cpp:55:75:55:96 | SideEffect | ~m54_4 | -| destructors_for_temps.cpp:55:75:55:96 | SideEffect | ~m55_56 | -| destructors_for_temps.cpp:55:75:55:96 | SideEffect | ~m55_88 | +| destructors_for_temps.cpp:55:75:55:96 | SideEffect | ~m55_54 | +| destructors_for_temps.cpp:55:75:55:96 | SideEffect | ~m55_76 | | destructors_for_temps.cpp:55:75:55:96 | StoreValue | r55_40 | | destructors_for_temps.cpp:55:75:55:96 | Unary | r55_32 | | file://:0:0:0:0 | Address | &:r0_1 | 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 2df766d81285..89fb2db36adf 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -7,8 +7,8 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| destructors_for_temps.cpp:51:41:51:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:41:55:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:51:75:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:75:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unexplainedLoop | destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | @@ -17,12 +17,6 @@ unexplainedLoop | destructors_for_temps.cpp:51:5:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:75:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:75:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:75:51:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | @@ -36,12 +30,6 @@ unexplainedLoop | destructors_for_temps.cpp:55:5:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:75:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:75:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:75:55:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | @@ -66,9 +54,7 @@ backEdgeCountMismatch useNotDominatedByDefinition | destructors_for_temps.cpp:45:39:45:60 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:42:6:42:15 | void temp_test6(bool) | void temp_test6(bool) | | destructors_for_temps.cpp:51:5:51:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:55:5:55:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | ir.cpp:1535:8:1535:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1535:8:1535:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | 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 9d6c43a008e0..9b92a3b34cdf 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -1158,30 +1158,24 @@ destructors_for_temps.cpp: #-----| Goto -> Block 8 # 51| Block 8 -# 51| r51_54(glval) = CopyValue : r51_1 +# 51| r51_48(glval) = CopyValue : r51_1 +# 51| r51_49(glval) = FunctionAddress[~ClassWithDestructor2] : +# 51| v51_50(void) = Call[~ClassWithDestructor2] : func:r51_37, func:r51_49, this:r51_36, this:r51_48 +# 51| mu51_51(unknown) = ^CallSideEffect : ~m? +# 51| v51_52(void) = ^IndirectReadSideEffect[-1] : &:r51_36, &:r51_48, ~m? +# 51| mu51_53(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_36, &:r51_48 +# 51| r51_54(glval) = CopyValue : r51_26 # 51| r51_55(glval) = FunctionAddress[~ClassWithDestructor2] : -# 51| v51_56(void) = Call[~ClassWithDestructor2] : func:r51_37, func:r51_55, this:r51_36, this:r51_54 +# 51| v51_56(void) = Call[~ClassWithDestructor2] : func:r51_43, func:r51_55, this:r51_42, this:r51_54 # 51| mu51_57(unknown) = ^CallSideEffect : ~m? -# 51| v51_58(void) = ^IndirectReadSideEffect[-1] : &:r51_36, &:r51_54, ~m? -# 51| mu51_59(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_36, &:r51_54 -# 51| r51_60(glval) = CopyValue : r51_26 -# 51| r51_61(glval) = FunctionAddress[~ClassWithDestructor2] : -# 51| v51_62(void) = Call[~ClassWithDestructor2] : func:r51_43, func:r51_61, this:r51_42, this:r51_60 -# 51| mu51_63(unknown) = ^CallSideEffect : ~m? -# 51| v51_64(void) = ^IndirectReadSideEffect[-1] : &:r51_42, &:r51_60, ~m? -# 51| mu51_65(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_42, &:r51_60 -# 51| r51_66(glval) = CopyValue : r51_11 -# 51| r51_67(glval) = FunctionAddress[~ClassWithDestructor2] : -# 51| v51_68(void) = Call[~ClassWithDestructor2] : func:r51_49, func:r51_67, this:r51_48, this:r51_66 -# 51| mu51_69(unknown) = ^CallSideEffect : ~m? -# 51| v51_70(void) = ^IndirectReadSideEffect[-1] : &:r51_48, &:r51_66, ~m? -# 51| mu51_71(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_48, &:r51_66 -#-----| Goto (back edge) -> Block 4 +# 51| v51_58(void) = ^IndirectReadSideEffect[-1] : &:r51_42, &:r51_54, ~m? +# 51| mu51_59(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_42, &:r51_54 #-----| Goto (back edge) -> Block 3 +#-----| Goto (back edge) -> Block 4 # 51| Block 8 -#-----| Goto (back edge) -> Block 4 #-----| Goto (back edge) -> Block 3 +#-----| Goto (back edge) -> Block 4 # 54| void temp_test8(bool) # 54| Block 0 @@ -1253,30 +1247,24 @@ destructors_for_temps.cpp: #-----| Goto -> Block 8 # 55| Block 8 -# 55| r55_54(glval) = CopyValue : r55_1 +# 55| r55_48(glval) = CopyValue : r55_1 +# 55| r55_49(glval) = FunctionAddress[~ClassWithDestructor2] : +# 55| v55_50(void) = Call[~ClassWithDestructor2] : func:r55_37, func:r55_49, this:r55_36, this:r55_48 +# 55| mu55_51(unknown) = ^CallSideEffect : ~m? +# 55| v55_52(void) = ^IndirectReadSideEffect[-1] : &:r55_36, &:r55_48, ~m? +# 55| mu55_53(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_36, &:r55_48 +# 55| r55_54(glval) = CopyValue : r55_26 # 55| r55_55(glval) = FunctionAddress[~ClassWithDestructor2] : -# 55| v55_56(void) = Call[~ClassWithDestructor2] : func:r55_37, func:r55_55, this:r55_36, this:r55_54 +# 55| v55_56(void) = Call[~ClassWithDestructor2] : func:r55_43, func:r55_55, this:r55_42, this:r55_54 # 55| mu55_57(unknown) = ^CallSideEffect : ~m? -# 55| v55_58(void) = ^IndirectReadSideEffect[-1] : &:r55_36, &:r55_54, ~m? -# 55| mu55_59(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_36, &:r55_54 -# 55| r55_60(glval) = CopyValue : r55_26 -# 55| r55_61(glval) = FunctionAddress[~ClassWithDestructor2] : -# 55| v55_62(void) = Call[~ClassWithDestructor2] : func:r55_43, func:r55_61, this:r55_42, this:r55_60 -# 55| mu55_63(unknown) = ^CallSideEffect : ~m? -# 55| v55_64(void) = ^IndirectReadSideEffect[-1] : &:r55_42, &:r55_60, ~m? -# 55| mu55_65(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_42, &:r55_60 -# 55| r55_66(glval) = CopyValue : r55_11 -# 55| r55_67(glval) = FunctionAddress[~ClassWithDestructor2] : -# 55| v55_68(void) = Call[~ClassWithDestructor2] : func:r55_49, func:r55_67, this:r55_48, this:r55_66 -# 55| mu55_69(unknown) = ^CallSideEffect : ~m? -# 55| v55_70(void) = ^IndirectReadSideEffect[-1] : &:r55_48, &:r55_66, ~m? -# 55| mu55_71(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_48, &:r55_66 -#-----| Goto (back edge) -> Block 4 +# 55| v55_58(void) = ^IndirectReadSideEffect[-1] : &:r55_42, &:r55_54, ~m? +# 55| mu55_59(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_42, &:r55_54 #-----| Goto (back edge) -> Block 3 +#-----| Goto (back edge) -> Block 4 # 55| Block 8 -#-----| Goto (back edge) -> Block 4 #-----| Goto (back edge) -> Block 3 +#-----| Goto (back edge) -> Block 4 ir.c: # 7| void MyCoordsTest(int) 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 44458377adc7..bf0401594d26 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 @@ -7,8 +7,8 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| destructors_for_temps.cpp:51:41:51:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:41:55:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:51:75:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:75:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unexplainedLoop | destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | @@ -17,12 +17,6 @@ unexplainedLoop | destructors_for_temps.cpp:51:5:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:75:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:75:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:75:51:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | @@ -36,12 +30,6 @@ unexplainedLoop | destructors_for_temps.cpp:55:5:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:75:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:75:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:75:55:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | @@ -65,9 +53,7 @@ lostReachability backEdgeCountMismatch useNotDominatedByDefinition | destructors_for_temps.cpp:51:5:51:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:55:5:55:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 44458377adc7..bf0401594d26 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 @@ -7,8 +7,8 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| destructors_for_temps.cpp:51:41:51:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:41:55:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:51:75:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:75:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unexplainedLoop | destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | @@ -17,12 +17,6 @@ unexplainedLoop | destructors_for_temps.cpp:51:5:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:75:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:75:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:75:51:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | @@ -36,12 +30,6 @@ unexplainedLoop | destructors_for_temps.cpp:55:5:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:75:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:75:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:75:55:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | @@ -65,9 +53,7 @@ lostReachability backEdgeCountMismatch useNotDominatedByDefinition | destructors_for_temps.cpp:51:5:51:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:41:51:62 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:55:5:55:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:41:55:62 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated From d4e2d373110007fb9408e5c11a3ea84b0ecc5512 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 4 Apr 2024 11:06:36 +0100 Subject: [PATCH 05/35] C++: Add a simple test that fails. --- .../library-tests/ir/ir/PrintAST.expected | 35 +++++++++++ .../library-tests/ir/ir/aliased_ir.expected | 55 ++++++++++++++++-- .../ir/ir/aliased_ssa_consistency.expected | 1 + .../aliased_ssa_consistency_unsound.expected | 1 + .../ir/ir/destructors_for_temps.cpp | 4 ++ .../ir/ir/operand_locations.expected | 34 +++++++++++ .../ir/ir/raw_consistency.expected | 1 + .../test/library-tests/ir/ir/raw_ir.expected | 58 +++++++++++++++++-- .../ir/ir/unaliased_ssa_consistency.expected | 1 + ...unaliased_ssa_consistency_unsound.expected | 1 + 10 files changed, 183 insertions(+), 8 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index ea9f82fbf400..50c979720684 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -2186,6 +2186,41 @@ destructors_for_temps.cpp: # 55| Type = [Class] ClassWithDestructor2 # 55| ValueCategory = prvalue # 56| getStmt(1): [ReturnStmt] return ... +# 58| [TopLevelFunction] void temp_test8_simple(bool) +# 58| : +# 58| getParameter(0): [Parameter] b +# 58| Type = [BoolType] bool +# 58| getEntryPoint(): [BlockStmt] { ... } +# 59| getStmt(0): [ExprStmt] ExprStmt +# 59| getExpr(): [ConditionalExpr] ... ? ... : ... +# 59| Type = [PlainCharType] char +# 59| ValueCategory = prvalue +# 59| getCondition(): [VariableAccess] b +# 59| Type = [BoolType] bool +# 59| ValueCategory = prvalue(load) +# 59| getThen(): [ThrowExpr] throw ... +# 59| Type = [PlainCharType] char +# 59| ValueCategory = prvalue +# 59| getExpr(): [FunctionCall] call to get_x +# 59| Type = [PlainCharType] char +# 59| ValueCategory = prvalue +# 59| getQualifier(): [ConstructorCall] call to ClassWithDestructor2 +# 59| Type = [VoidType] void +# 59| ValueCategory = prvalue +# 59| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 59| Type = [Class] ClassWithDestructor2 +# 59| ValueCategory = prvalue(load) +# 59| getElse(): [CharLiteral] 97 +# 59| Type = [PlainCharType] char +# 59| Value = [CharLiteral] 97 +# 59| ValueCategory = prvalue +# 59| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor2 +# 59| Type = [VoidType] void +# 59| ValueCategory = prvalue +# 59| getQualifier(): [ReuseExpr] reuse of temporary object +# 59| Type = [Class] ClassWithDestructor2 +# 59| ValueCategory = xvalue +# 60| getStmt(1): [ReturnStmt] return ... ir.c: # 5| [TopLevelFunction] int getX(MyCoords*) # 5| : 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 2c49767d5010..cc9dd7370445 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -1252,12 +1252,12 @@ destructors_for_temps.cpp: # 51| v51_85(void) = ^IndirectReadSideEffect[-1] : &:r51_58, &:r51_80, m51_44, m51_47, m51_66, m51_69 # 51| m51_86(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_58, &:r51_80 # 51| m51_87(ClassWithDestructor2) = Chi : total:m51_44, total:m51_47, total:m51_66, total:m51_69, partial:m51_64, partial:m51_86 -#-----| Goto (back edge) -> Block 3 #-----| Goto (back edge) -> Block 4 +#-----| Goto (back edge) -> Block 3 # 51| Block 8 -#-----| Goto (back edge) -> Block 3 #-----| Goto (back edge) -> Block 4 +#-----| Goto (back edge) -> Block 3 # 54| void temp_test8(bool) # 54| Block 0 @@ -1358,12 +1358,59 @@ destructors_for_temps.cpp: # 55| v55_85(void) = ^IndirectReadSideEffect[-1] : &:r55_58, &:r55_80, m55_45, m55_48, m55_67, m55_70 # 55| m55_86(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_58, &:r55_80 # 55| m55_87(ClassWithDestructor2) = Chi : total:m55_45, total:m55_48, total:m55_67, total:m55_70, partial:m55_64, partial:m55_86 -#-----| Goto (back edge) -> Block 3 #-----| Goto (back edge) -> Block 4 +#-----| Goto (back edge) -> Block 3 # 55| Block 8 -#-----| Goto (back edge) -> Block 3 #-----| Goto (back edge) -> Block 4 +#-----| Goto (back edge) -> Block 3 + +# 58| void temp_test8_simple(bool) +# 58| Block 0 +# 58| v58_1(void) = EnterFunction : +# 58| m58_2(unknown) = AliasedDefinition : +# 58| m58_3(unknown) = InitializeNonLocal : +# 58| m58_4(unknown) = Chi : total:m58_2, partial:m58_3 +# 58| r58_5(glval) = VariableAddress[b] : +# 58| m58_6(bool) = InitializeParameter[b] : &:r58_5 +# 59| r59_1(glval) = VariableAddress[b] : +# 59| r59_2(bool) = Load[b] : &:r59_1, m58_6 +# 59| v59_3(void) = ConditionalBranch : r59_2 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 58| Block 1 +# 58| v58_7(void) = Unwind : +# 58| v58_8(void) = AliasedUse : ~m59_16 +# 58| v58_9(void) = ExitFunction : + +# 59| Block 2 +# 59| r59_4(glval) = VariableAddress[#throw59:9] : +# 59| r59_5(glval) = VariableAddress[#temp59:15] : +# 59| m59_6(ClassWithDestructor2) = Uninitialized[#temp59:15] : &:r59_5 +# 59| r59_7(glval) = FunctionAddress[ClassWithDestructor2] : +# 59| v59_8(void) = Call[ClassWithDestructor2] : func:r59_7, this:r59_5 +# 59| m59_9(unknown) = ^CallSideEffect : ~m58_4 +# 59| m59_10(unknown) = Chi : total:m58_4, partial:m59_9 +# 59| m59_11(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r59_5 +# 59| m59_12(ClassWithDestructor2) = Chi : total:m59_6, partial:m59_11 +# 59| r59_13(glval) = FunctionAddress[get_x] : +# 59| r59_14(char) = Call[get_x] : func:r59_13, this:r59_5 +# 59| m59_15(unknown) = ^CallSideEffect : ~m59_10 +# 59| m59_16(unknown) = Chi : total:m59_10, partial:m59_15 +# 59| v59_17(void) = ^IndirectReadSideEffect[-1] : &:r59_5, m59_12 +# 59| m59_18(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r59_5 +# 59| m59_19(ClassWithDestructor2) = Chi : total:m59_12, partial:m59_18 +# 59| m59_20(char) = Store[#throw59:9] : &:r59_4, r59_14 +# 59| v59_21(void) = ThrowValue : &:r59_4, m59_20 +#-----| Exception -> Block 1 + +# 59| Block 3 +# 59| r59_22(char) = Constant[97] : +# 59| r59_23(glval) = VariableAddress[#temp59:5] : +# 59| m59_24(char) = Store[#temp59:5] : &:r59_23, r59_22 +# 59| r59_25(glval) = VariableAddress[#temp59:5] : +# 59| r59_26(char) = Load[#temp59:5] : &:r59_25, m59_24 ir.c: # 7| void MyCoordsTest(int) 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 236ed0188d40..cf946f6075a7 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,6 +6,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| destructors_for_temps.cpp:59:5:59:50 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' has no successors in function '$@'. | destructors_for_temps.cpp:58:6:58:22 | void temp_test8_simple(bool) | void temp_test8_simple(bool) | ambiguousSuccessors | destructors_for_temps.cpp:51:75:51:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:55:75:55:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | 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 b63b53e3fbe6..afa2abb3d6c8 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 @@ -11,6 +11,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| destructors_for_temps.cpp:59:5:59:50 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' has no successors in function '$@'. | destructors_for_temps.cpp:58:6:58:22 | void temp_test8_simple(bool) | void temp_test8_simple(bool) | ambiguousSuccessors | destructors_for_temps.cpp:51:75:51:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:55:75:55:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | diff --git a/cpp/ql/test/library-tests/ir/ir/destructors_for_temps.cpp b/cpp/ql/test/library-tests/ir/ir/destructors_for_temps.cpp index 572c81ac111b..7a781d2c22ea 100644 --- a/cpp/ql/test/library-tests/ir/ir/destructors_for_temps.cpp +++ b/cpp/ql/test/library-tests/ir/ir/destructors_for_temps.cpp @@ -54,3 +54,7 @@ void temp_test7(bool b) { void temp_test8(bool b) { b ? throw ClassWithConstructor('x', ClassWithDestructor2().get_x()) : ClassWithDestructor2(); } + +void temp_test8_simple(bool b) { + b ? throw ClassWithDestructor2().get_x() : 'a'; +} \ No newline at end of file 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 26ff6c1b050f..966f48c4e4f3 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -1299,6 +1299,40 @@ | destructors_for_temps.cpp:55:75:55:96 | SideEffect | ~m55_76 | | destructors_for_temps.cpp:55:75:55:96 | StoreValue | r55_40 | | destructors_for_temps.cpp:55:75:55:96 | Unary | r55_32 | +| destructors_for_temps.cpp:58:6:58:22 | ChiPartial | partial:m58_3 | +| destructors_for_temps.cpp:58:6:58:22 | ChiTotal | total:m58_2 | +| destructors_for_temps.cpp:58:6:58:22 | SideEffect | ~m59_16 | +| destructors_for_temps.cpp:58:29:58:29 | Address | &:r58_5 | +| destructors_for_temps.cpp:59:5:59:5 | Address | &:r59_1 | +| destructors_for_temps.cpp:59:5:59:5 | Condition | r59_2 | +| destructors_for_temps.cpp:59:5:59:5 | Load | m58_6 | +| destructors_for_temps.cpp:59:5:59:50 | Address | &:r59_23 | +| destructors_for_temps.cpp:59:5:59:50 | Address | &:r59_25 | +| destructors_for_temps.cpp:59:5:59:50 | Load | m59_24 | +| destructors_for_temps.cpp:59:9:59:44 | Address | &:r59_4 | +| destructors_for_temps.cpp:59:9:59:44 | Address | &:r59_4 | +| destructors_for_temps.cpp:59:9:59:44 | Load | m59_20 | +| destructors_for_temps.cpp:59:15:59:36 | Address | &:r59_5 | +| destructors_for_temps.cpp:59:15:59:36 | Address | &:r59_5 | +| destructors_for_temps.cpp:59:15:59:36 | Address | &:r59_5 | +| destructors_for_temps.cpp:59:15:59:36 | Address | &:r59_5 | +| destructors_for_temps.cpp:59:15:59:36 | Arg(this) | this:r59_5 | +| destructors_for_temps.cpp:59:15:59:36 | Arg(this) | this:r59_5 | +| destructors_for_temps.cpp:59:15:59:36 | CallTarget | func:r59_7 | +| destructors_for_temps.cpp:59:15:59:36 | ChiPartial | partial:m59_9 | +| destructors_for_temps.cpp:59:15:59:36 | ChiPartial | partial:m59_11 | +| destructors_for_temps.cpp:59:15:59:36 | ChiPartial | partial:m59_18 | +| destructors_for_temps.cpp:59:15:59:36 | ChiTotal | total:m58_4 | +| destructors_for_temps.cpp:59:15:59:36 | ChiTotal | total:m59_6 | +| destructors_for_temps.cpp:59:15:59:36 | ChiTotal | total:m59_12 | +| destructors_for_temps.cpp:59:15:59:36 | SideEffect | m59_12 | +| destructors_for_temps.cpp:59:15:59:36 | SideEffect | ~m58_4 | +| destructors_for_temps.cpp:59:38:59:42 | CallTarget | func:r59_13 | +| destructors_for_temps.cpp:59:38:59:42 | ChiPartial | partial:m59_15 | +| destructors_for_temps.cpp:59:38:59:42 | ChiTotal | total:m59_10 | +| destructors_for_temps.cpp:59:38:59:42 | SideEffect | ~m59_10 | +| destructors_for_temps.cpp:59:38:59:42 | StoreValue | r59_14 | +| destructors_for_temps.cpp:59:48:59:50 | StoreValue | r59_22 | | file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_1 | 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 89fb2db36adf..a9e26772d728 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -6,6 +6,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| destructors_for_temps.cpp:59:5:59:50 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' has no successors in function '$@'. | destructors_for_temps.cpp:58:6:58:22 | void temp_test8_simple(bool) | void temp_test8_simple(bool) | ambiguousSuccessors | destructors_for_temps.cpp:51:75:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:55:75:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | 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 9b92a3b34cdf..adaefb9937df 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -1170,12 +1170,12 @@ destructors_for_temps.cpp: # 51| mu51_57(unknown) = ^CallSideEffect : ~m? # 51| v51_58(void) = ^IndirectReadSideEffect[-1] : &:r51_42, &:r51_54, ~m? # 51| mu51_59(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_42, &:r51_54 -#-----| Goto (back edge) -> Block 3 #-----| Goto (back edge) -> Block 4 +#-----| Goto (back edge) -> Block 3 # 51| Block 8 -#-----| Goto (back edge) -> Block 3 #-----| Goto (back edge) -> Block 4 +#-----| Goto (back edge) -> Block 3 # 54| void temp_test8(bool) # 54| Block 0 @@ -1259,12 +1259,62 @@ destructors_for_temps.cpp: # 55| mu55_57(unknown) = ^CallSideEffect : ~m? # 55| v55_58(void) = ^IndirectReadSideEffect[-1] : &:r55_42, &:r55_54, ~m? # 55| mu55_59(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_42, &:r55_54 -#-----| Goto (back edge) -> Block 3 #-----| Goto (back edge) -> Block 4 +#-----| Goto (back edge) -> Block 3 # 55| Block 8 -#-----| Goto (back edge) -> Block 3 #-----| Goto (back edge) -> Block 4 +#-----| Goto (back edge) -> Block 3 + +# 58| void temp_test8_simple(bool) +# 58| Block 0 +# 58| v58_1(void) = EnterFunction : +# 58| mu58_2(unknown) = AliasedDefinition : +# 58| mu58_3(unknown) = InitializeNonLocal : +# 58| r58_4(glval) = VariableAddress[b] : +# 58| mu58_5(bool) = InitializeParameter[b] : &:r58_4 +# 59| r59_1(glval) = VariableAddress[b] : +# 59| r59_2(bool) = Load[b] : &:r59_1, ~m? +# 59| v59_3(void) = ConditionalBranch : r59_2 +#-----| False -> Block 4 +#-----| True -> Block 3 + +# 58| Block 1 +# 58| v58_6(void) = AliasedUse : ~m? +# 58| v58_7(void) = ExitFunction : + +# 58| Block 2 +# 58| v58_8(void) = Unwind : +#-----| Goto -> Block 1 + +# 59| Block 3 +# 59| r59_4(glval) = VariableAddress[#throw59:9] : +# 59| r59_5(glval) = VariableAddress[#temp59:15] : +# 59| mu59_6(ClassWithDestructor2) = Uninitialized[#temp59:15] : &:r59_5 +# 59| r59_7(glval) = FunctionAddress[ClassWithDestructor2] : +# 59| v59_8(void) = Call[ClassWithDestructor2] : func:r59_7, this:r59_5 +# 59| mu59_9(unknown) = ^CallSideEffect : ~m? +# 59| mu59_10(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r59_5 +# 59| r59_11(glval) = FunctionAddress[get_x] : +# 59| r59_12(char) = Call[get_x] : func:r59_11, this:r59_5 +# 59| mu59_13(unknown) = ^CallSideEffect : ~m? +# 59| v59_14(void) = ^IndirectReadSideEffect[-1] : &:r59_5, ~m? +# 59| mu59_15(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r59_5 +# 59| mu59_16(char) = Store[#throw59:9] : &:r59_4, r59_12 +# 59| v59_17(void) = ThrowValue : &:r59_4, ~m? +#-----| Exception -> Block 2 + +# 59| Block 4 +# 59| r59_18(char) = Constant[97] : +# 59| r59_19(glval) = VariableAddress[#temp59:5] : +# 59| mu59_20(char) = Store[#temp59:5] : &:r59_19, r59_18 +# 59| r59_21(glval) = VariableAddress[#temp59:5] : +# 59| r59_22(char) = Load[#temp59:5] : &:r59_21, ~m? + +# 60| Block 5 +# 60| v60_1(void) = NoOp : +# 58| v58_9(void) = ReturnVoid : +#-----| Goto -> Block 1 ir.c: # 7| void MyCoordsTest(int) 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 bf0401594d26..7636894a5c4c 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,6 +6,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| destructors_for_temps.cpp:59:5:59:50 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' has no successors in function '$@'. | destructors_for_temps.cpp:58:6:58:22 | void temp_test8_simple(bool) | void temp_test8_simple(bool) | ambiguousSuccessors | destructors_for_temps.cpp:51:75:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:55:75:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | 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 bf0401594d26..7636894a5c4c 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,6 +6,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| destructors_for_temps.cpp:59:5:59:50 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' has no successors in function '$@'. | destructors_for_temps.cpp:58:6:58:22 | void temp_test8_simple(bool) | void temp_test8_simple(bool) | ambiguousSuccessors | destructors_for_temps.cpp:51:75:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:55:75:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | From a756f14e7728e4350da57329f7a5d2229c6a2d1f Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 4 Apr 2024 11:13:52 +0100 Subject: [PATCH 06/35] C++: Only report implicit destructors if we need to translate them. --- .../cpp/ir/implementation/raw/internal/TranslatedExpr.qll | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll index 2b6a22d0e452..84ab2989e58e 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll @@ -92,13 +92,17 @@ abstract class TranslatedExpr extends TranslatedElement { or exists(int maxChildId, int destructorIndex | maxChildId = max(int childId | exists(this.getChildInternal(childId))) and - result.(TranslatedExpr).getExpr() = expr.getImplicitDestructorCall(destructorIndex) and + result = this.getImplicitDestructorCall(destructorIndex) and id = maxChildId + 1 + destructorIndex ) } + final private TranslatedExpr getImplicitDestructorCall(int index) { + result.getExpr() = expr.getImplicitDestructorCall(index) + } + final override predicate hasAnImplicitDestructorCall() { - exists(expr.getAnImplicitDestructorCall()) + exists(this.getImplicitDestructorCall(_)) } final override int getFirstDestructorCallIndex() { From 56a132fa8ef5ec7f332197bc2cf9db1a8ed7ff9f Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 4 Apr 2024 11:13:57 +0100 Subject: [PATCH 07/35] C++: Accept test changes. --- .../library-tests/ir/ir/aliased_ir.expected | 23 ++++++++++++------- .../ir/ir/aliased_ssa_consistency.expected | 1 - .../aliased_ssa_consistency_unsound.expected | 1 - .../ir/ir/operand_locations.expected | 4 +++- .../ir/ir/raw_consistency.expected | 1 - .../test/library-tests/ir/ir/raw_ir.expected | 6 ++--- .../ir/ir/unaliased_ssa_consistency.expected | 1 - ...unaliased_ssa_consistency_unsound.expected | 1 - .../modulus-analysis/ModulusAnalysis.expected | 2 +- .../ir/range-analysis/Overflow.expected | 2 +- .../ir/range-analysis/RangeAnalysis.expected | 2 +- .../ir/sign-analysis/SignAnalysis.expected | 2 +- .../ir/ssa/aliased_ssa_consistency.expected | 8 +++---- .../aliased_ssa_consistency_unsound.expected | 8 +++---- .../ir/ssa/unaliased_ssa_consistency.expected | 8 +++---- ...unaliased_ssa_consistency_unsound.expected | 8 +++---- .../library-tests/ir/types/irtypes.expected | 2 +- 17 files changed, 41 insertions(+), 39 deletions(-) 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 cc9dd7370445..59d887770a1f 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -1376,15 +1376,19 @@ destructors_for_temps.cpp: # 59| r59_1(glval) = VariableAddress[b] : # 59| r59_2(bool) = Load[b] : &:r59_1, m58_6 # 59| v59_3(void) = ConditionalBranch : r59_2 -#-----| False -> Block 3 -#-----| True -> Block 2 +#-----| False -> Block 4 +#-----| True -> Block 3 # 58| Block 1 -# 58| v58_7(void) = Unwind : -# 58| v58_8(void) = AliasedUse : ~m59_16 -# 58| v58_9(void) = ExitFunction : +# 58| m58_7(unknown) = Phi : from 2:~m59_16, from 4:~m58_4 +# 58| v58_8(void) = AliasedUse : ~m58_7 +# 58| v58_9(void) = ExitFunction : + +# 58| Block 2 +# 58| v58_10(void) = Unwind : +#-----| Goto -> Block 1 -# 59| Block 2 +# 59| Block 3 # 59| r59_4(glval) = VariableAddress[#throw59:9] : # 59| r59_5(glval) = VariableAddress[#temp59:15] : # 59| m59_6(ClassWithDestructor2) = Uninitialized[#temp59:15] : &:r59_5 @@ -1403,14 +1407,17 @@ destructors_for_temps.cpp: # 59| m59_19(ClassWithDestructor2) = Chi : total:m59_12, partial:m59_18 # 59| m59_20(char) = Store[#throw59:9] : &:r59_4, r59_14 # 59| v59_21(void) = ThrowValue : &:r59_4, m59_20 -#-----| Exception -> Block 1 +#-----| Exception -> Block 2 -# 59| Block 3 +# 59| Block 4 # 59| r59_22(char) = Constant[97] : # 59| r59_23(glval) = VariableAddress[#temp59:5] : # 59| m59_24(char) = Store[#temp59:5] : &:r59_23, r59_22 # 59| r59_25(glval) = VariableAddress[#temp59:5] : # 59| r59_26(char) = Load[#temp59:5] : &:r59_25, m59_24 +# 60| v60_1(void) = NoOp : +# 58| v58_11(void) = ReturnVoid : +#-----| Goto -> Block 1 ir.c: # 7| void MyCoordsTest(int) 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 cf946f6075a7..236ed0188d40 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 -| destructors_for_temps.cpp:59:5:59:50 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' has no successors in function '$@'. | destructors_for_temps.cpp:58:6:58:22 | void temp_test8_simple(bool) | void temp_test8_simple(bool) | ambiguousSuccessors | destructors_for_temps.cpp:51:75:51:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:55:75:55:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | 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 afa2abb3d6c8..b63b53e3fbe6 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 @@ -11,7 +11,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| destructors_for_temps.cpp:59:5:59:50 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' has no successors in function '$@'. | destructors_for_temps.cpp:58:6:58:22 | void temp_test8_simple(bool) | void temp_test8_simple(bool) | ambiguousSuccessors | destructors_for_temps.cpp:51:75:51:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:55:75:55:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | 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 966f48c4e4f3..5e424cd84070 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -1301,7 +1301,9 @@ | destructors_for_temps.cpp:55:75:55:96 | Unary | r55_32 | | destructors_for_temps.cpp:58:6:58:22 | ChiPartial | partial:m58_3 | | destructors_for_temps.cpp:58:6:58:22 | ChiTotal | total:m58_2 | -| destructors_for_temps.cpp:58:6:58:22 | SideEffect | ~m59_16 | +| destructors_for_temps.cpp:58:6:58:22 | Phi | from 2:~m59_16 | +| destructors_for_temps.cpp:58:6:58:22 | Phi | from 4:~m58_4 | +| destructors_for_temps.cpp:58:6:58:22 | SideEffect | ~m58_7 | | destructors_for_temps.cpp:58:29:58:29 | Address | &:r58_5 | | destructors_for_temps.cpp:59:5:59:5 | Address | &:r59_1 | | destructors_for_temps.cpp:59:5:59:5 | Condition | r59_2 | 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 a9e26772d728..89fb2db36adf 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -6,7 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| destructors_for_temps.cpp:59:5:59:50 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' has no successors in function '$@'. | destructors_for_temps.cpp:58:6:58:22 | void temp_test8_simple(bool) | void temp_test8_simple(bool) | ambiguousSuccessors | destructors_for_temps.cpp:51:75:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:55:75:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | 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 adaefb9937df..8ffbd965edb8 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -1310,10 +1310,8 @@ destructors_for_temps.cpp: # 59| mu59_20(char) = Store[#temp59:5] : &:r59_19, r59_18 # 59| r59_21(glval) = VariableAddress[#temp59:5] : # 59| r59_22(char) = Load[#temp59:5] : &:r59_21, ~m? - -# 60| Block 5 -# 60| v60_1(void) = NoOp : -# 58| v58_9(void) = ReturnVoid : +# 60| v60_1(void) = NoOp : +# 58| v58_9(void) = ReturnVoid : #-----| Goto -> Block 1 ir.c: 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 7636894a5c4c..bf0401594d26 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 -| destructors_for_temps.cpp:59:5:59:50 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' has no successors in function '$@'. | destructors_for_temps.cpp:58:6:58:22 | void temp_test8_simple(bool) | void temp_test8_simple(bool) | ambiguousSuccessors | destructors_for_temps.cpp:51:75:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:55:75:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | 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 7636894a5c4c..bf0401594d26 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 -| destructors_for_temps.cpp:59:5:59:50 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' has no successors in function '$@'. | destructors_for_temps.cpp:58:6:58:22 | void temp_test8_simple(bool) | void temp_test8_simple(bool) | ambiguousSuccessors | destructors_for_temps.cpp:51:75:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:55:75:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | diff --git a/cpp/ql/test/library-tests/ir/modulus-analysis/ModulusAnalysis.expected b/cpp/ql/test/library-tests/ir/modulus-analysis/ModulusAnalysis.expected index 48de9172b362..8ec8033d086e 100644 --- a/cpp/ql/test/library-tests/ir/modulus-analysis/ModulusAnalysis.expected +++ b/cpp/ql/test/library-tests/ir/modulus-analysis/ModulusAnalysis.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/cpp/ql/test/library-tests/ir/range-analysis/Overflow.expected b/cpp/ql/test/library-tests/ir/range-analysis/Overflow.expected index 48de9172b362..8ec8033d086e 100644 --- a/cpp/ql/test/library-tests/ir/range-analysis/Overflow.expected +++ b/cpp/ql/test/library-tests/ir/range-analysis/Overflow.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/cpp/ql/test/library-tests/ir/range-analysis/RangeAnalysis.expected b/cpp/ql/test/library-tests/ir/range-analysis/RangeAnalysis.expected index 48de9172b362..8ec8033d086e 100644 --- a/cpp/ql/test/library-tests/ir/range-analysis/RangeAnalysis.expected +++ b/cpp/ql/test/library-tests/ir/range-analysis/RangeAnalysis.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/cpp/ql/test/library-tests/ir/sign-analysis/SignAnalysis.expected b/cpp/ql/test/library-tests/ir/sign-analysis/SignAnalysis.expected index 48de9172b362..8ec8033d086e 100644 --- a/cpp/ql/test/library-tests/ir/sign-analysis/SignAnalysis.expected +++ b/cpp/ql/test/library-tests/ir/sign-analysis/SignAnalysis.expected @@ -1,2 +1,2 @@ -failures testFailures +failures diff --git a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency.expected index 79887fffc1ff..b93c7d2649f8 100644 --- a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency.expected @@ -12,7 +12,11 @@ unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions instructionWithoutUniqueBlock +missingCanonicalLanguageType +multipleCanonicalLanguageTypes containsLoopOfForwardEdges +missingIRType +multipleIRTypes lostReachability backEdgeCountMismatch useNotDominatedByDefinition @@ -24,8 +28,4 @@ nonUniqueEnclosingIRFunction fieldAddressOnNonPointer thisArgumentIsNonPointer nonUniqueIRVariable -missingCanonicalLanguageType -multipleCanonicalLanguageTypes -missingIRType -multipleIRTypes missingCppType diff --git a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency_unsound.expected index 79887fffc1ff..b93c7d2649f8 100644 --- a/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ssa/aliased_ssa_consistency_unsound.expected @@ -12,7 +12,11 @@ unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions instructionWithoutUniqueBlock +missingCanonicalLanguageType +multipleCanonicalLanguageTypes containsLoopOfForwardEdges +missingIRType +multipleIRTypes lostReachability backEdgeCountMismatch useNotDominatedByDefinition @@ -24,8 +28,4 @@ nonUniqueEnclosingIRFunction fieldAddressOnNonPointer thisArgumentIsNonPointer nonUniqueIRVariable -missingCanonicalLanguageType -multipleCanonicalLanguageTypes -missingIRType -multipleIRTypes missingCppType diff --git a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_consistency.expected index 79887fffc1ff..b93c7d2649f8 100644 --- a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_consistency.expected @@ -12,7 +12,11 @@ unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions instructionWithoutUniqueBlock +missingCanonicalLanguageType +multipleCanonicalLanguageTypes containsLoopOfForwardEdges +missingIRType +multipleIRTypes lostReachability backEdgeCountMismatch useNotDominatedByDefinition @@ -24,8 +28,4 @@ nonUniqueEnclosingIRFunction fieldAddressOnNonPointer thisArgumentIsNonPointer nonUniqueIRVariable -missingCanonicalLanguageType -multipleCanonicalLanguageTypes -missingIRType -multipleIRTypes missingCppType diff --git a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_consistency_unsound.expected index 79887fffc1ff..b93c7d2649f8 100644 --- a/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ssa/unaliased_ssa_consistency_unsound.expected @@ -12,7 +12,11 @@ unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions instructionWithoutUniqueBlock +missingCanonicalLanguageType +multipleCanonicalLanguageTypes containsLoopOfForwardEdges +missingIRType +multipleIRTypes lostReachability backEdgeCountMismatch useNotDominatedByDefinition @@ -24,8 +28,4 @@ nonUniqueEnclosingIRFunction fieldAddressOnNonPointer thisArgumentIsNonPointer nonUniqueIRVariable -missingCanonicalLanguageType -multipleCanonicalLanguageTypes -missingIRType -multipleIRTypes missingCppType diff --git a/cpp/ql/test/library-tests/ir/types/irtypes.expected b/cpp/ql/test/library-tests/ir/types/irtypes.expected index 48de9172b362..8ec8033d086e 100644 --- a/cpp/ql/test/library-tests/ir/types/irtypes.expected +++ b/cpp/ql/test/library-tests/ir/types/irtypes.expected @@ -1,2 +1,2 @@ -failures testFailures +failures From 796fcfec6c82ee7796642f8f8aa09b644304d498 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 4 Apr 2024 14:44:16 +0100 Subject: [PATCH 08/35] C++: Handle conversions in 'isInConditionalEvaluation'. --- .../cpp/ir/implementation/raw/internal/TranslatedElement.qll | 4 ++-- 1 file changed, 2 insertions(+), 2 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 b5a96f5c8b7c..47c629057fba 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 @@ -259,9 +259,9 @@ private predicate usedAsCondition(Expr expr) { private predicate isInConditionalEvaluation(Expr e) { exists(ConditionalExpr cond | - e = cond.getThen() and not cond.isTwoOperand() + e = cond.getThen().getFullyConverted() and not cond.isTwoOperand() or - e = cond.getElse() + e = cond.getElse().getFullyConverted() ) or isInConditionalEvaluation(getRealParent(e)) From a6a0e2017659f299337b20fd68504a3825b702ba Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 4 Apr 2024 14:45:20 +0100 Subject: [PATCH 09/35] C++: Accept test changes. --- .../library-tests/ir/ir/aliased_ir.expected | 64 +++--- .../ir/ir/aliased_ssa_consistency.expected | 20 +- .../aliased_ssa_consistency_unsound.expected | 22 +-- .../ir/ir/operand_locations.expected | 184 ++++++------------ .../ir/ir/raw_consistency.expected | 16 +- .../test/library-tests/ir/ir/raw_ir.expected | 36 ++-- .../ir/ir/unaliased_ssa_consistency.expected | 16 +- ...unaliased_ssa_consistency_unsound.expected | 16 +- 8 files changed, 109 insertions(+), 265 deletions(-) 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 59d887770a1f..7ffd971dd6ad 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -1175,8 +1175,8 @@ destructors_for_temps.cpp: # 52| r52_2(glval) = VariableAddress[c] : # 52| r52_3(glval) = FunctionAddress[~ClassWithDestructor2] : # 52| v52_4(void) = Call[~ClassWithDestructor2] : func:r52_3, this:r52_2 -# 52| m52_5(unknown) = ^CallSideEffect : ~m51_62, ~m51_84 -# 52| m52_6(unknown) = Chi : total:m51_62, total:m51_84, partial:m52_5 +# 52| m52_5(unknown) = ^CallSideEffect : ~m51_52, ~m51_64 +# 52| m52_6(unknown) = Chi : total:m51_52, total:m51_64, partial:m52_5 # 52| v52_7(void) = ^IndirectReadSideEffect[-1] : &:r52_2, m50_8 # 52| m52_8(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r52_2 # 52| m52_9(ClassWithDestructor2) = Chi : total:m50_8, partial:m52_8 @@ -1233,25 +1233,16 @@ destructors_for_temps.cpp: #-----| Goto -> Block 8 # 51| Block 8 -# 51| m51_70(ClassWithDestructor2) = Phi : from 4:m51_57, from 4:m51_79 -# 51| m51_71(unknown) = Phi : from 4:~m51_62, from 4:~m51_84, from 6:~m51_37 -# 51| m51_69(ClassWithDestructor2) = Phi : from 4:m51_65, from 4:m51_87, from 6:m51_39 -# 51| r51_72(glval) = CopyValue : r51_1 -# 51| r51_73(glval) = FunctionAddress[~ClassWithDestructor2] : -# 51| v51_74(void) = Call[~ClassWithDestructor2] : func:r51_51, func:r51_73, this:r51_50, this:r51_72 -# 51| m51_75(unknown) = ^CallSideEffect : ~m51_46, ~m51_49, ~m51_68, ~m51_71 -# 51| m51_76(unknown) = Chi : total:m51_46, total:m51_49, total:m51_68, total:m51_71, partial:m51_53, partial:m51_75 -# 51| v51_77(void) = ^IndirectReadSideEffect[-1] : &:r51_50, &:r51_72, m51_45, m51_48, m51_67, m51_70 -# 51| m51_78(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_50, &:r51_72 -# 51| m51_79(ClassWithDestructor2) = Chi : total:m51_45, total:m51_48, total:m51_67, total:m51_70, partial:m51_56, partial:m51_78 -# 51| r51_80(glval) = CopyValue : r51_32 -# 51| r51_81(glval) = FunctionAddress[~ClassWithDestructor2] : -# 51| v51_82(void) = Call[~ClassWithDestructor2] : func:r51_59, func:r51_81, this:r51_58, this:r51_80 -# 51| m51_83(unknown) = ^CallSideEffect : ~m51_54, ~m51_76 -# 51| m51_84(unknown) = Chi : total:m51_54, total:m51_76, partial:m51_61, partial:m51_83 -# 51| v51_85(void) = ^IndirectReadSideEffect[-1] : &:r51_58, &:r51_80, m51_44, m51_47, m51_66, m51_69 -# 51| m51_86(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_58, &:r51_80 -# 51| m51_87(ClassWithDestructor2) = Chi : total:m51_44, total:m51_47, total:m51_66, total:m51_69, partial:m51_64, partial:m51_86 +# 51| m51_58(ClassWithDestructor2) = Phi : from 4:m51_55, from 4:m51_67 +# 51| m51_59(unknown) = Phi : from 4:~m51_52, from 4:~m51_64, from 6:~m51_37 +# 51| r51_60(glval) = CopyValue : r51_1 +# 51| r51_61(glval) = FunctionAddress[~ClassWithDestructor2] : +# 51| v51_62(void) = Call[~ClassWithDestructor2] : func:r51_49, func:r51_61, this:r51_48, this:r51_60 +# 51| m51_63(unknown) = ^CallSideEffect : ~m51_45, ~m51_47, ~m51_57, ~m51_59 +# 51| m51_64(unknown) = Chi : total:m51_45, total:m51_47, total:m51_57, total:m51_59, partial:m51_51, partial:m51_63 +# 51| v51_65(void) = ^IndirectReadSideEffect[-1] : &:r51_48, &:r51_60, m51_44, m51_46, m51_56, m51_58 +# 51| m51_66(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_48, &:r51_60 +# 51| m51_67(ClassWithDestructor2) = Chi : total:m51_44, total:m51_46, total:m51_56, total:m51_58, partial:m51_54, partial:m51_66 #-----| Goto (back edge) -> Block 4 #-----| Goto (back edge) -> Block 3 @@ -1275,7 +1266,7 @@ destructors_for_temps.cpp: #-----| True -> Block 5 # 54| Block 1 -# 54| m54_7(unknown) = Phi : from 2:~m55_28, from 3:~m55_62, from 3:~m55_84 +# 54| m54_7(unknown) = Phi : from 2:~m55_28, from 3:~m55_52, from 3:~m55_64 # 54| v54_8(void) = AliasedUse : ~m54_7 # 54| v54_9(void) = ExitFunction : @@ -1339,25 +1330,16 @@ destructors_for_temps.cpp: #-----| Goto -> Block 8 # 55| Block 8 -# 55| m55_70(ClassWithDestructor2) = Phi : from 4:m55_65, from 4:m55_87, from 6:m55_39 -# 55| m55_71(unknown) = Phi : from 4:~m55_62, from 4:~m55_84, from 6:~m55_37 -# 55| m55_69(ClassWithDestructor2) = Phi : from 4:m55_57, from 4:m55_79 -# 55| r55_72(glval) = CopyValue : r55_1 -# 55| r55_73(glval) = FunctionAddress[~ClassWithDestructor2] : -# 55| v55_74(void) = Call[~ClassWithDestructor2] : func:r55_51, func:r55_73, this:r55_50, this:r55_72 -# 55| m55_75(unknown) = ^CallSideEffect : ~m55_46, ~m55_49, ~m55_68, ~m55_71 -# 55| m55_76(unknown) = Chi : total:m55_46, total:m55_49, total:m55_68, total:m55_71, partial:m55_53, partial:m55_75 -# 55| v55_77(void) = ^IndirectReadSideEffect[-1] : &:r55_50, &:r55_72, m55_44, m55_47, m55_66, m55_69 -# 55| m55_78(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_50, &:r55_72 -# 55| m55_79(ClassWithDestructor2) = Chi : total:m55_44, total:m55_47, total:m55_66, total:m55_69, partial:m55_56, partial:m55_78 -# 55| r55_80(glval) = CopyValue : r55_32 -# 55| r55_81(glval) = FunctionAddress[~ClassWithDestructor2] : -# 55| v55_82(void) = Call[~ClassWithDestructor2] : func:r55_59, func:r55_81, this:r55_58, this:r55_80 -# 55| m55_83(unknown) = ^CallSideEffect : ~m55_54, ~m55_76 -# 55| m55_84(unknown) = Chi : total:m55_54, total:m55_76, partial:m55_61, partial:m55_83 -# 55| v55_85(void) = ^IndirectReadSideEffect[-1] : &:r55_58, &:r55_80, m55_45, m55_48, m55_67, m55_70 -# 55| m55_86(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_58, &:r55_80 -# 55| m55_87(ClassWithDestructor2) = Chi : total:m55_45, total:m55_48, total:m55_67, total:m55_70, partial:m55_64, partial:m55_86 +# 55| m55_58(ClassWithDestructor2) = Phi : from 4:m55_55, from 4:m55_67 +# 55| m55_59(unknown) = Phi : from 4:~m55_52, from 4:~m55_64, from 6:~m55_37 +# 55| r55_60(glval) = CopyValue : r55_1 +# 55| r55_61(glval) = FunctionAddress[~ClassWithDestructor2] : +# 55| v55_62(void) = Call[~ClassWithDestructor2] : func:r55_49, func:r55_61, this:r55_48, this:r55_60 +# 55| m55_63(unknown) = ^CallSideEffect : ~m55_45, ~m55_47, ~m55_57, ~m55_59 +# 55| m55_64(unknown) = Chi : total:m55_45, total:m55_47, total:m55_57, total:m55_59, partial:m55_51, partial:m55_63 +# 55| v55_65(void) = ^IndirectReadSideEffect[-1] : &:r55_48, &:r55_60, m55_44, m55_46, m55_56, m55_58 +# 55| m55_66(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_48, &:r55_60 +# 55| m55_67(ClassWithDestructor2) = Chi : total:m55_44, total:m55_46, total:m55_56, total:m55_58, partial:m55_54, partial:m55_66 #-----| Goto (back edge) -> Block 4 #-----| Goto (back edge) -> Block 3 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 236ed0188d40..997d109c0832 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 @@ -7,8 +7,8 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| destructors_for_temps.cpp:51:75:51:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:75:55:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:51:5:51:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:5:55:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unexplainedLoop | destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | @@ -20,14 +20,6 @@ unexplainedLoop | destructors_for_temps.cpp:51:5:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | @@ -38,14 +30,6 @@ unexplainedLoop | destructors_for_temps.cpp:55:5:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions 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 b63b53e3fbe6..f39e72da367d 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 @@ -12,8 +12,8 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| destructors_for_temps.cpp:51:75:51:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:75:55:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:51:5:51:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:5:55:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unexplainedLoop | destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | @@ -26,15 +26,6 @@ unexplainedLoop | destructors_for_temps.cpp:51:5:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | @@ -46,15 +37,6 @@ unexplainedLoop | destructors_for_temps.cpp:55:5:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions 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 5e424cd84070..38ff259e484f 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -1060,42 +1060,39 @@ | destructors_for_temps.cpp:51:5:51:5 | Load | m51_42 | | destructors_for_temps.cpp:51:5:51:5 | StoreValue | r51_6 | | destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_1 | -| destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_50 | -| destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_50 | -| destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_72 | -| destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_72 | -| destructors_for_temps.cpp:51:5:51:96 | Arg(this) | this:r51_50 | -| destructors_for_temps.cpp:51:5:51:96 | Arg(this) | this:r51_72 | -| destructors_for_temps.cpp:51:5:51:96 | CallTarget | func:r51_51 | -| destructors_for_temps.cpp:51:5:51:96 | CallTarget | func:r51_73 | -| destructors_for_temps.cpp:51:5:51:96 | ChiPartial | partial:m51_53 | -| destructors_for_temps.cpp:51:5:51:96 | ChiPartial | partial:m51_56 | -| destructors_for_temps.cpp:51:5:51:96 | ChiPartial | partial:m51_75 | -| destructors_for_temps.cpp:51:5:51:96 | ChiPartial | partial:m51_78 | +| destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_48 | +| destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_48 | +| destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_60 | +| destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_60 | +| destructors_for_temps.cpp:51:5:51:96 | Arg(this) | this:r51_48 | +| destructors_for_temps.cpp:51:5:51:96 | Arg(this) | this:r51_60 | +| destructors_for_temps.cpp:51:5:51:96 | CallTarget | func:r51_49 | +| destructors_for_temps.cpp:51:5:51:96 | CallTarget | func:r51_61 | +| destructors_for_temps.cpp:51:5:51:96 | ChiPartial | partial:m51_51 | +| destructors_for_temps.cpp:51:5:51:96 | ChiPartial | partial:m51_54 | +| destructors_for_temps.cpp:51:5:51:96 | ChiPartial | partial:m51_63 | +| destructors_for_temps.cpp:51:5:51:96 | ChiPartial | partial:m51_66 | +| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_44 | | destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_45 | | destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_46 | -| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_48 | -| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_49 | -| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_67 | -| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_68 | -| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_70 | -| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_71 | -| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:m51_57 | -| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:m51_65 | -| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:m51_79 | -| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:m51_87 | -| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:~m51_62 | -| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:~m51_84 | -| destructors_for_temps.cpp:51:5:51:96 | Phi | from 6:m51_39 | +| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_47 | +| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_56 | +| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_57 | +| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_58 | +| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_59 | +| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:m51_55 | +| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:m51_67 | +| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:~m51_52 | +| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:~m51_64 | | destructors_for_temps.cpp:51:5:51:96 | Phi | from 6:~m51_37 | -| destructors_for_temps.cpp:51:5:51:96 | SideEffect | m51_45 | -| destructors_for_temps.cpp:51:5:51:96 | SideEffect | m51_48 | -| destructors_for_temps.cpp:51:5:51:96 | SideEffect | m51_67 | -| destructors_for_temps.cpp:51:5:51:96 | SideEffect | m51_70 | -| destructors_for_temps.cpp:51:5:51:96 | SideEffect | ~m51_46 | -| destructors_for_temps.cpp:51:5:51:96 | SideEffect | ~m51_49 | -| destructors_for_temps.cpp:51:5:51:96 | SideEffect | ~m51_68 | -| destructors_for_temps.cpp:51:5:51:96 | SideEffect | ~m51_71 | +| destructors_for_temps.cpp:51:5:51:96 | SideEffect | m51_44 | +| destructors_for_temps.cpp:51:5:51:96 | SideEffect | m51_46 | +| destructors_for_temps.cpp:51:5:51:96 | SideEffect | m51_56 | +| destructors_for_temps.cpp:51:5:51:96 | SideEffect | m51_58 | +| destructors_for_temps.cpp:51:5:51:96 | SideEffect | ~m51_45 | +| destructors_for_temps.cpp:51:5:51:96 | SideEffect | ~m51_47 | +| destructors_for_temps.cpp:51:5:51:96 | SideEffect | ~m51_57 | +| destructors_for_temps.cpp:51:5:51:96 | SideEffect | ~m51_59 | | destructors_for_temps.cpp:51:5:51:96 | Unary | r51_1 | | destructors_for_temps.cpp:51:9:51:71 | Address | &:r51_7 | | destructors_for_temps.cpp:51:9:51:71 | Address | &:r51_7 | @@ -1132,40 +1129,15 @@ | destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_32 | | destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_32 | | destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_32 | -| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_58 | -| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_58 | -| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_80 | -| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_80 | | destructors_for_temps.cpp:51:75:51:96 | Arg(this) | this:r51_32 | -| destructors_for_temps.cpp:51:75:51:96 | Arg(this) | this:r51_58 | -| destructors_for_temps.cpp:51:75:51:96 | Arg(this) | this:r51_80 | | destructors_for_temps.cpp:51:75:51:96 | CallTarget | func:r51_34 | -| destructors_for_temps.cpp:51:75:51:96 | CallTarget | func:r51_59 | -| destructors_for_temps.cpp:51:75:51:96 | CallTarget | func:r51_81 | | destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_36 | | destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_38 | -| destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_61 | -| destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_64 | -| destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_83 | -| destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_86 | | destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m50_6 | | destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_33 | -| destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_44 | -| destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_47 | -| destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_54 | -| destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_66 | -| destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_69 | -| destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_76 | | destructors_for_temps.cpp:51:75:51:96 | Load | m51_39 | -| destructors_for_temps.cpp:51:75:51:96 | SideEffect | m51_44 | -| destructors_for_temps.cpp:51:75:51:96 | SideEffect | m51_47 | -| destructors_for_temps.cpp:51:75:51:96 | SideEffect | m51_66 | -| destructors_for_temps.cpp:51:75:51:96 | SideEffect | m51_69 | | destructors_for_temps.cpp:51:75:51:96 | SideEffect | ~m50_6 | -| destructors_for_temps.cpp:51:75:51:96 | SideEffect | ~m51_54 | -| destructors_for_temps.cpp:51:75:51:96 | SideEffect | ~m51_76 | | destructors_for_temps.cpp:51:75:51:96 | StoreValue | r51_40 | -| destructors_for_temps.cpp:51:75:51:96 | Unary | r51_32 | | destructors_for_temps.cpp:52:1:52:1 | Address | &:r52_2 | | destructors_for_temps.cpp:52:1:52:1 | Address | &:r52_2 | | destructors_for_temps.cpp:52:1:52:1 | Arg(this) | this:r52_2 | @@ -1173,16 +1145,16 @@ | destructors_for_temps.cpp:52:1:52:1 | ChiPartial | partial:m52_5 | | destructors_for_temps.cpp:52:1:52:1 | ChiPartial | partial:m52_8 | | destructors_for_temps.cpp:52:1:52:1 | ChiTotal | total:m50_8 | -| destructors_for_temps.cpp:52:1:52:1 | ChiTotal | total:m51_62 | -| destructors_for_temps.cpp:52:1:52:1 | ChiTotal | total:m51_84 | +| destructors_for_temps.cpp:52:1:52:1 | ChiTotal | total:m51_52 | +| destructors_for_temps.cpp:52:1:52:1 | ChiTotal | total:m51_64 | | destructors_for_temps.cpp:52:1:52:1 | SideEffect | m50_8 | -| destructors_for_temps.cpp:52:1:52:1 | SideEffect | ~m51_62 | -| destructors_for_temps.cpp:52:1:52:1 | SideEffect | ~m51_84 | +| destructors_for_temps.cpp:52:1:52:1 | SideEffect | ~m51_52 | +| destructors_for_temps.cpp:52:1:52:1 | SideEffect | ~m51_64 | | destructors_for_temps.cpp:54:6:54:15 | ChiPartial | partial:m54_3 | | destructors_for_temps.cpp:54:6:54:15 | ChiTotal | total:m54_2 | | destructors_for_temps.cpp:54:6:54:15 | Phi | from 2:~m55_28 | -| destructors_for_temps.cpp:54:6:54:15 | Phi | from 3:~m55_62 | -| destructors_for_temps.cpp:54:6:54:15 | Phi | from 3:~m55_84 | +| destructors_for_temps.cpp:54:6:54:15 | Phi | from 3:~m55_52 | +| destructors_for_temps.cpp:54:6:54:15 | Phi | from 3:~m55_64 | | destructors_for_temps.cpp:54:6:54:15 | SideEffect | ~m54_7 | | destructors_for_temps.cpp:54:22:54:22 | Address | &:r54_5 | | destructors_for_temps.cpp:55:5:55:5 | Address | &:r55_2 | @@ -1193,42 +1165,39 @@ | destructors_for_temps.cpp:55:5:55:5 | Load | m55_42 | | destructors_for_temps.cpp:55:5:55:5 | StoreValue | r55_6 | | destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_1 | -| destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_50 | -| destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_50 | -| destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_72 | -| destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_72 | -| destructors_for_temps.cpp:55:5:55:96 | Arg(this) | this:r55_50 | -| destructors_for_temps.cpp:55:5:55:96 | Arg(this) | this:r55_72 | -| destructors_for_temps.cpp:55:5:55:96 | CallTarget | func:r55_51 | -| destructors_for_temps.cpp:55:5:55:96 | CallTarget | func:r55_73 | -| destructors_for_temps.cpp:55:5:55:96 | ChiPartial | partial:m55_53 | -| destructors_for_temps.cpp:55:5:55:96 | ChiPartial | partial:m55_56 | -| destructors_for_temps.cpp:55:5:55:96 | ChiPartial | partial:m55_75 | -| destructors_for_temps.cpp:55:5:55:96 | ChiPartial | partial:m55_78 | +| destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_48 | +| destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_48 | +| destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_60 | +| destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_60 | +| destructors_for_temps.cpp:55:5:55:96 | Arg(this) | this:r55_48 | +| destructors_for_temps.cpp:55:5:55:96 | Arg(this) | this:r55_60 | +| destructors_for_temps.cpp:55:5:55:96 | CallTarget | func:r55_49 | +| destructors_for_temps.cpp:55:5:55:96 | CallTarget | func:r55_61 | +| destructors_for_temps.cpp:55:5:55:96 | ChiPartial | partial:m55_51 | +| destructors_for_temps.cpp:55:5:55:96 | ChiPartial | partial:m55_54 | +| destructors_for_temps.cpp:55:5:55:96 | ChiPartial | partial:m55_63 | +| destructors_for_temps.cpp:55:5:55:96 | ChiPartial | partial:m55_66 | | destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_44 | +| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_45 | | destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_46 | | destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_47 | -| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_49 | -| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_66 | -| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_68 | -| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_69 | -| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_71 | -| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:m55_57 | -| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:m55_65 | -| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:m55_79 | -| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:m55_87 | -| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:~m55_62 | -| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:~m55_84 | -| destructors_for_temps.cpp:55:5:55:96 | Phi | from 6:m55_39 | +| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_56 | +| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_57 | +| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_58 | +| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_59 | +| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:m55_55 | +| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:m55_67 | +| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:~m55_52 | +| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:~m55_64 | | destructors_for_temps.cpp:55:5:55:96 | Phi | from 6:~m55_37 | | destructors_for_temps.cpp:55:5:55:96 | SideEffect | m55_44 | -| destructors_for_temps.cpp:55:5:55:96 | SideEffect | m55_47 | -| destructors_for_temps.cpp:55:5:55:96 | SideEffect | m55_66 | -| destructors_for_temps.cpp:55:5:55:96 | SideEffect | m55_69 | -| destructors_for_temps.cpp:55:5:55:96 | SideEffect | ~m55_46 | -| destructors_for_temps.cpp:55:5:55:96 | SideEffect | ~m55_49 | -| destructors_for_temps.cpp:55:5:55:96 | SideEffect | ~m55_68 | -| destructors_for_temps.cpp:55:5:55:96 | SideEffect | ~m55_71 | +| destructors_for_temps.cpp:55:5:55:96 | SideEffect | m55_46 | +| destructors_for_temps.cpp:55:5:55:96 | SideEffect | m55_56 | +| destructors_for_temps.cpp:55:5:55:96 | SideEffect | m55_58 | +| destructors_for_temps.cpp:55:5:55:96 | SideEffect | ~m55_45 | +| destructors_for_temps.cpp:55:5:55:96 | SideEffect | ~m55_47 | +| destructors_for_temps.cpp:55:5:55:96 | SideEffect | ~m55_57 | +| destructors_for_temps.cpp:55:5:55:96 | SideEffect | ~m55_59 | | destructors_for_temps.cpp:55:5:55:96 | Unary | r55_1 | | destructors_for_temps.cpp:55:9:55:71 | Address | &:r55_7 | | destructors_for_temps.cpp:55:9:55:71 | Address | &:r55_7 | @@ -1265,40 +1234,15 @@ | destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_32 | | destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_32 | | destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_32 | -| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_58 | -| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_58 | -| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_80 | -| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_80 | | destructors_for_temps.cpp:55:75:55:96 | Arg(this) | this:r55_32 | -| destructors_for_temps.cpp:55:75:55:96 | Arg(this) | this:r55_58 | -| destructors_for_temps.cpp:55:75:55:96 | Arg(this) | this:r55_80 | | destructors_for_temps.cpp:55:75:55:96 | CallTarget | func:r55_34 | -| destructors_for_temps.cpp:55:75:55:96 | CallTarget | func:r55_59 | -| destructors_for_temps.cpp:55:75:55:96 | CallTarget | func:r55_81 | | destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_36 | | destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_38 | -| destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_61 | -| destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_64 | -| destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_83 | -| destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_86 | | destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m54_4 | | destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_33 | -| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_45 | -| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_48 | -| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_54 | -| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_67 | -| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_70 | -| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_76 | | destructors_for_temps.cpp:55:75:55:96 | Load | m55_39 | -| destructors_for_temps.cpp:55:75:55:96 | SideEffect | m55_45 | -| destructors_for_temps.cpp:55:75:55:96 | SideEffect | m55_48 | -| destructors_for_temps.cpp:55:75:55:96 | SideEffect | m55_67 | -| destructors_for_temps.cpp:55:75:55:96 | SideEffect | m55_70 | | destructors_for_temps.cpp:55:75:55:96 | SideEffect | ~m54_4 | -| destructors_for_temps.cpp:55:75:55:96 | SideEffect | ~m55_54 | -| destructors_for_temps.cpp:55:75:55:96 | SideEffect | ~m55_76 | | destructors_for_temps.cpp:55:75:55:96 | StoreValue | r55_40 | -| destructors_for_temps.cpp:55:75:55:96 | Unary | r55_32 | | destructors_for_temps.cpp:58:6:58:22 | ChiPartial | partial:m58_3 | | destructors_for_temps.cpp:58:6:58:22 | ChiTotal | total:m58_2 | | destructors_for_temps.cpp:58:6:58:22 | Phi | from 2:~m59_16 | 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 89fb2db36adf..cfa570510301 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -7,8 +7,8 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| destructors_for_temps.cpp:51:75:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:75:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:51:5:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:5:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unexplainedLoop | destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | @@ -17,12 +17,6 @@ unexplainedLoop | destructors_for_temps.cpp:51:5:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | @@ -30,12 +24,6 @@ unexplainedLoop | destructors_for_temps.cpp:55:5:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions 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 8ffbd965edb8..a1de7cba4692 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -1158,18 +1158,12 @@ destructors_for_temps.cpp: #-----| Goto -> Block 8 # 51| Block 8 -# 51| r51_48(glval) = CopyValue : r51_1 -# 51| r51_49(glval) = FunctionAddress[~ClassWithDestructor2] : -# 51| v51_50(void) = Call[~ClassWithDestructor2] : func:r51_37, func:r51_49, this:r51_36, this:r51_48 -# 51| mu51_51(unknown) = ^CallSideEffect : ~m? -# 51| v51_52(void) = ^IndirectReadSideEffect[-1] : &:r51_36, &:r51_48, ~m? -# 51| mu51_53(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_36, &:r51_48 -# 51| r51_54(glval) = CopyValue : r51_26 -# 51| r51_55(glval) = FunctionAddress[~ClassWithDestructor2] : -# 51| v51_56(void) = Call[~ClassWithDestructor2] : func:r51_43, func:r51_55, this:r51_42, this:r51_54 -# 51| mu51_57(unknown) = ^CallSideEffect : ~m? -# 51| v51_58(void) = ^IndirectReadSideEffect[-1] : &:r51_42, &:r51_54, ~m? -# 51| mu51_59(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_42, &:r51_54 +# 51| r51_42(glval) = CopyValue : r51_1 +# 51| r51_43(glval) = FunctionAddress[~ClassWithDestructor2] : +# 51| v51_44(void) = Call[~ClassWithDestructor2] : func:r51_37, func:r51_43, this:r51_36, this:r51_42 +# 51| mu51_45(unknown) = ^CallSideEffect : ~m? +# 51| v51_46(void) = ^IndirectReadSideEffect[-1] : &:r51_36, &:r51_42, ~m? +# 51| mu51_47(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_36, &:r51_42 #-----| Goto (back edge) -> Block 4 #-----| Goto (back edge) -> Block 3 @@ -1247,18 +1241,12 @@ destructors_for_temps.cpp: #-----| Goto -> Block 8 # 55| Block 8 -# 55| r55_48(glval) = CopyValue : r55_1 -# 55| r55_49(glval) = FunctionAddress[~ClassWithDestructor2] : -# 55| v55_50(void) = Call[~ClassWithDestructor2] : func:r55_37, func:r55_49, this:r55_36, this:r55_48 -# 55| mu55_51(unknown) = ^CallSideEffect : ~m? -# 55| v55_52(void) = ^IndirectReadSideEffect[-1] : &:r55_36, &:r55_48, ~m? -# 55| mu55_53(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_36, &:r55_48 -# 55| r55_54(glval) = CopyValue : r55_26 -# 55| r55_55(glval) = FunctionAddress[~ClassWithDestructor2] : -# 55| v55_56(void) = Call[~ClassWithDestructor2] : func:r55_43, func:r55_55, this:r55_42, this:r55_54 -# 55| mu55_57(unknown) = ^CallSideEffect : ~m? -# 55| v55_58(void) = ^IndirectReadSideEffect[-1] : &:r55_42, &:r55_54, ~m? -# 55| mu55_59(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_42, &:r55_54 +# 55| r55_42(glval) = CopyValue : r55_1 +# 55| r55_43(glval) = FunctionAddress[~ClassWithDestructor2] : +# 55| v55_44(void) = Call[~ClassWithDestructor2] : func:r55_37, func:r55_43, this:r55_36, this:r55_42 +# 55| mu55_45(unknown) = ^CallSideEffect : ~m? +# 55| v55_46(void) = ^IndirectReadSideEffect[-1] : &:r55_36, &:r55_42, ~m? +# 55| mu55_47(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_36, &:r55_42 #-----| Goto (back edge) -> Block 4 #-----| Goto (back edge) -> Block 3 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 bf0401594d26..6ed9bab7c8c8 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 @@ -7,8 +7,8 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| destructors_for_temps.cpp:51:75:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:75:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:51:5:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:5:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unexplainedLoop | destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | @@ -17,12 +17,6 @@ unexplainedLoop | destructors_for_temps.cpp:51:5:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | @@ -30,12 +24,6 @@ unexplainedLoop | destructors_for_temps.cpp:55:5:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions 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 bf0401594d26..6ed9bab7c8c8 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 @@ -7,8 +7,8 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| destructors_for_temps.cpp:51:75:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:75:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | +| destructors_for_temps.cpp:51:5:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | +| destructors_for_temps.cpp:55:5:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unexplainedLoop | destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | @@ -17,12 +17,6 @@ unexplainedLoop | destructors_for_temps.cpp:51:5:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:51:5:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:75:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | | destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | @@ -30,12 +24,6 @@ unexplainedLoop | destructors_for_temps.cpp:55:5:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | destructors_for_temps.cpp:55:5:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:75:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions From 73602dca9217445a17c18ea34d01214a20fe2a27 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 4 Apr 2024 14:51:11 +0100 Subject: [PATCH 10/35] C++: Also suppress destructor calls on throwing ternary expressions. --- .../raw/internal/TranslatedElement.qll | 15 +++++++++++++++ 1 file changed, 15 insertions(+) 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 47c629057fba..9b0e52c2a464 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 @@ -257,11 +257,26 @@ private predicate usedAsCondition(Expr expr) { ) } +private predicate hasThrowingChild(Expr e) { + e = any(ThrowExpr throw).getFullyConverted() + or + exists(Expr child | + e = getRealParent(child) and + hasThrowingChild(child) + ) +} + private predicate isInConditionalEvaluation(Expr e) { exists(ConditionalExpr cond | e = cond.getThen().getFullyConverted() and not cond.isTwoOperand() or e = cond.getElse().getFullyConverted() + or + // If one of the operands throws then the temporaries constructed in either + // branch will also be attached to the ternary expression. We suppress + // those destructor calls as well. + hasThrowingChild([cond.getThen(), cond.getElse()]) and + e = cond.getFullyConverted() ) or isInConditionalEvaluation(getRealParent(e)) From 0b7070feecc14a2c0df02aca24b7582ef5b7aedd Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 4 Apr 2024 14:51:16 +0100 Subject: [PATCH 11/35] C++: Accept test changes. --- .../library-tests/ir/ir/aliased_ir.expected | 250 +++++++----------- .../ir/ir/aliased_ssa_consistency.expected | 28 -- .../aliased_ssa_consistency_unsound.expected | 32 --- .../ir/ir/operand_locations.expected | 243 ++++++----------- .../ir/ir/raw_consistency.expected | 22 -- .../test/library-tests/ir/ir/raw_ir.expected | 129 +++------ .../ir/ir/unaliased_ssa_consistency.expected | 22 -- ...unaliased_ssa_consistency_unsound.expected | 22 -- 8 files changed, 229 insertions(+), 519 deletions(-) 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 7ffd971dd6ad..43c6b251a14a 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -1157,11 +1157,11 @@ destructors_for_temps.cpp: # 51| r51_2(glval) = VariableAddress[b] : # 51| r51_3(bool) = Load[b] : &:r51_2, m49_6 # 51| v51_4(void) = ConditionalBranch : r51_3 -#-----| False -> Block 6 -#-----| True -> Block 5 +#-----| False -> Block 4 +#-----| True -> Block 3 # 49| Block 1 -# 49| m49_7(unknown) = Phi : from 2:~m51_28, from 3:~m52_6 +# 49| m49_7(unknown) = Phi : from 2:~m51_26, from 4:~m52_6 # 49| v49_8(void) = AliasedUse : ~m49_7 # 49| v49_9(void) = ExitFunction : @@ -1170,85 +1170,59 @@ destructors_for_temps.cpp: #-----| Goto -> Block 1 # 51| Block 3 -# 51| m51_5(ClassWithDestructor2) = Store[#temp51:5] : &:r51_1, r51_6 -# 52| v52_1(void) = NoOp : -# 52| r52_2(glval) = VariableAddress[c] : -# 52| r52_3(glval) = FunctionAddress[~ClassWithDestructor2] : -# 52| v52_4(void) = Call[~ClassWithDestructor2] : func:r52_3, this:r52_2 -# 52| m52_5(unknown) = ^CallSideEffect : ~m51_52, ~m51_64 -# 52| m52_6(unknown) = Chi : total:m51_52, total:m51_64, partial:m52_5 -# 52| v52_7(void) = ^IndirectReadSideEffect[-1] : &:r52_2, m50_8 -# 52| m52_8(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r52_2 -# 52| m52_9(ClassWithDestructor2) = Chi : total:m50_8, partial:m52_8 -# 49| v49_11(void) = ReturnVoid : -#-----| Goto -> Block 1 - -# 51| Block 4 -# 51| r51_6(ClassWithDestructor2) = Load[#temp51:5] : &:r51_43, m51_42 -#-----| Goto (back edge) -> Block 8 -#-----| Goto (back edge) -> Block 8 - -# 51| Block 5 -# 51| r51_7(glval) = VariableAddress[#throw51:9] : -# 51| m51_8(ClassWithConstructor) = Uninitialized[#throw51:9] : &:r51_7 -# 51| r51_9(glval) = FunctionAddress[ClassWithConstructor] : -# 51| r51_10(char) = Constant[120] : -# 51| r51_11(glval) = VariableAddress[#temp51:41] : -# 51| m51_12(ClassWithDestructor2) = Uninitialized[#temp51:41] : &:r51_11 -# 51| r51_13(glval) = FunctionAddress[ClassWithDestructor2] : -# 51| v51_14(void) = Call[ClassWithDestructor2] : func:r51_13, this:r51_11 -# 51| m51_15(unknown) = ^CallSideEffect : ~m50_6 -# 51| m51_16(unknown) = Chi : total:m50_6, partial:m51_15 -# 51| m51_17(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_11 -# 51| m51_18(ClassWithDestructor2) = Chi : total:m51_12, partial:m51_17 -# 51| r51_19(glval) = FunctionAddress[get_x] : -# 51| r51_20(char) = Call[get_x] : func:r51_19, this:r51_11 -# 51| m51_21(unknown) = ^CallSideEffect : ~m51_16 -# 51| m51_22(unknown) = Chi : total:m51_16, partial:m51_21 -# 51| v51_23(void) = ^IndirectReadSideEffect[-1] : &:r51_11, m51_18 -# 51| m51_24(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_11 -# 51| m51_25(ClassWithDestructor2) = Chi : total:m51_18, partial:m51_24 -# 51| v51_26(void) = Call[ClassWithConstructor] : func:r51_9, this:r51_7, 0:r51_10, 1:r51_20 -# 51| m51_27(unknown) = ^CallSideEffect : ~m51_22 -# 51| m51_28(unknown) = Chi : total:m51_22, partial:m51_27 -# 51| m51_29(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r51_7 -# 51| m51_30(ClassWithConstructor) = Chi : total:m51_8, partial:m51_29 -# 51| v51_31(void) = ThrowValue : &:r51_7, m51_30 +# 51| r51_5(glval) = VariableAddress[#throw51:9] : +# 51| m51_6(ClassWithConstructor) = Uninitialized[#throw51:9] : &:r51_5 +# 51| r51_7(glval) = FunctionAddress[ClassWithConstructor] : +# 51| r51_8(char) = Constant[120] : +# 51| r51_9(glval) = VariableAddress[#temp51:41] : +# 51| m51_10(ClassWithDestructor2) = Uninitialized[#temp51:41] : &:r51_9 +# 51| r51_11(glval) = FunctionAddress[ClassWithDestructor2] : +# 51| v51_12(void) = Call[ClassWithDestructor2] : func:r51_11, this:r51_9 +# 51| m51_13(unknown) = ^CallSideEffect : ~m50_6 +# 51| m51_14(unknown) = Chi : total:m50_6, partial:m51_13 +# 51| m51_15(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_9 +# 51| m51_16(ClassWithDestructor2) = Chi : total:m51_10, partial:m51_15 +# 51| r51_17(glval) = FunctionAddress[get_x] : +# 51| r51_18(char) = Call[get_x] : func:r51_17, this:r51_9 +# 51| m51_19(unknown) = ^CallSideEffect : ~m51_14 +# 51| m51_20(unknown) = Chi : total:m51_14, partial:m51_19 +# 51| v51_21(void) = ^IndirectReadSideEffect[-1] : &:r51_9, m51_16 +# 51| m51_22(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_9 +# 51| m51_23(ClassWithDestructor2) = Chi : total:m51_16, partial:m51_22 +# 51| v51_24(void) = Call[ClassWithConstructor] : func:r51_7, this:r51_5, 0:r51_8, 1:r51_18 +# 51| m51_25(unknown) = ^CallSideEffect : ~m51_20 +# 51| m51_26(unknown) = Chi : total:m51_20, partial:m51_25 +# 51| m51_27(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r51_5 +# 51| m51_28(ClassWithConstructor) = Chi : total:m51_6, partial:m51_27 +# 51| v51_29(void) = ThrowValue : &:r51_5, m51_28 #-----| Exception -> Block 2 -# 51| Block 6 -# 51| r51_32(glval) = VariableAddress[#temp51:75] : -# 51| m51_33(ClassWithDestructor2) = Uninitialized[#temp51:75] : &:r51_32 -# 51| r51_34(glval) = FunctionAddress[ClassWithDestructor2] : -# 51| v51_35(void) = Call[ClassWithDestructor2] : func:r51_34, this:r51_32 -# 51| m51_36(unknown) = ^CallSideEffect : ~m50_6 -# 51| m51_37(unknown) = Chi : total:m50_6, partial:m51_36 -# 51| m51_38(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_32 -# 51| m51_39(ClassWithDestructor2) = Chi : total:m51_33, partial:m51_38 -# 51| r51_40(ClassWithDestructor2) = Load[#temp51:75] : &:r51_32, m51_39 -# 51| r51_41(glval) = VariableAddress[#temp51:5] : -# 51| m51_42(ClassWithDestructor2) = Store[#temp51:5] : &:r51_41, r51_40 -# 51| r51_43(glval) = VariableAddress[#temp51:5] : -#-----| Goto -> Block 8 -#-----| Goto -> Block 8 - -# 51| Block 8 -# 51| m51_58(ClassWithDestructor2) = Phi : from 4:m51_55, from 4:m51_67 -# 51| m51_59(unknown) = Phi : from 4:~m51_52, from 4:~m51_64, from 6:~m51_37 -# 51| r51_60(glval) = CopyValue : r51_1 -# 51| r51_61(glval) = FunctionAddress[~ClassWithDestructor2] : -# 51| v51_62(void) = Call[~ClassWithDestructor2] : func:r51_49, func:r51_61, this:r51_48, this:r51_60 -# 51| m51_63(unknown) = ^CallSideEffect : ~m51_45, ~m51_47, ~m51_57, ~m51_59 -# 51| m51_64(unknown) = Chi : total:m51_45, total:m51_47, total:m51_57, total:m51_59, partial:m51_51, partial:m51_63 -# 51| v51_65(void) = ^IndirectReadSideEffect[-1] : &:r51_48, &:r51_60, m51_44, m51_46, m51_56, m51_58 -# 51| m51_66(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_48, &:r51_60 -# 51| m51_67(ClassWithDestructor2) = Chi : total:m51_44, total:m51_46, total:m51_56, total:m51_58, partial:m51_54, partial:m51_66 -#-----| Goto (back edge) -> Block 4 -#-----| Goto (back edge) -> Block 3 - -# 51| Block 8 -#-----| Goto (back edge) -> Block 4 -#-----| Goto (back edge) -> Block 3 +# 51| Block 4 +# 51| r51_30(glval) = VariableAddress[#temp51:75] : +# 51| m51_31(ClassWithDestructor2) = Uninitialized[#temp51:75] : &:r51_30 +# 51| r51_32(glval) = FunctionAddress[ClassWithDestructor2] : +# 51| v51_33(void) = Call[ClassWithDestructor2] : func:r51_32, this:r51_30 +# 51| m51_34(unknown) = ^CallSideEffect : ~m50_6 +# 51| m51_35(unknown) = Chi : total:m50_6, partial:m51_34 +# 51| m51_36(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_30 +# 51| m51_37(ClassWithDestructor2) = Chi : total:m51_31, partial:m51_36 +# 51| r51_38(ClassWithDestructor2) = Load[#temp51:75] : &:r51_30, m51_37 +# 51| r51_39(glval) = VariableAddress[#temp51:5] : +# 51| m51_40(ClassWithDestructor2) = Store[#temp51:5] : &:r51_39, r51_38 +# 51| r51_41(glval) = VariableAddress[#temp51:5] : +# 51| r51_42(ClassWithDestructor2) = Load[#temp51:5] : &:r51_41, m51_40 +# 51| m51_43(ClassWithDestructor2) = Store[#temp51:5] : &:r51_1, r51_42 +# 52| v52_1(void) = NoOp : +# 52| r52_2(glval) = VariableAddress[c] : +# 52| r52_3(glval) = FunctionAddress[~ClassWithDestructor2] : +# 52| v52_4(void) = Call[~ClassWithDestructor2] : func:r52_3, this:r52_2 +# 52| m52_5(unknown) = ^CallSideEffect : ~m51_35 +# 52| m52_6(unknown) = Chi : total:m51_35, partial:m52_5 +# 52| v52_7(void) = ^IndirectReadSideEffect[-1] : &:r52_2, m50_8 +# 52| m52_8(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r52_2 +# 52| m52_9(ClassWithDestructor2) = Chi : total:m50_8, partial:m52_8 +# 49| v49_11(void) = ReturnVoid : +#-----| Goto -> Block 1 # 54| void temp_test8(bool) # 54| Block 0 @@ -1262,11 +1236,11 @@ destructors_for_temps.cpp: # 55| r55_2(glval) = VariableAddress[b] : # 55| r55_3(bool) = Load[b] : &:r55_2, m54_6 # 55| v55_4(void) = ConditionalBranch : r55_3 -#-----| False -> Block 6 -#-----| True -> Block 5 +#-----| False -> Block 4 +#-----| True -> Block 3 # 54| Block 1 -# 54| m54_7(unknown) = Phi : from 2:~m55_28, from 3:~m55_52, from 3:~m55_64 +# 54| m54_7(unknown) = Phi : from 2:~m55_26, from 4:~m55_35 # 54| v54_8(void) = AliasedUse : ~m54_7 # 54| v54_9(void) = ExitFunction : @@ -1275,77 +1249,51 @@ destructors_for_temps.cpp: #-----| Goto -> Block 1 # 55| Block 3 -# 55| m55_5(ClassWithDestructor2) = Store[#temp55:5] : &:r55_1, r55_6 -# 56| v56_1(void) = NoOp : -# 54| v54_11(void) = ReturnVoid : -#-----| Goto -> Block 1 - -# 55| Block 4 -# 55| r55_6(ClassWithDestructor2) = Load[#temp55:5] : &:r55_43, m55_42 -#-----| Goto (back edge) -> Block 8 -#-----| Goto (back edge) -> Block 8 - -# 55| Block 5 -# 55| r55_7(glval) = VariableAddress[#throw55:9] : -# 55| m55_8(ClassWithConstructor) = Uninitialized[#throw55:9] : &:r55_7 -# 55| r55_9(glval) = FunctionAddress[ClassWithConstructor] : -# 55| r55_10(char) = Constant[120] : -# 55| r55_11(glval) = VariableAddress[#temp55:41] : -# 55| m55_12(ClassWithDestructor2) = Uninitialized[#temp55:41] : &:r55_11 -# 55| r55_13(glval) = FunctionAddress[ClassWithDestructor2] : -# 55| v55_14(void) = Call[ClassWithDestructor2] : func:r55_13, this:r55_11 -# 55| m55_15(unknown) = ^CallSideEffect : ~m54_4 -# 55| m55_16(unknown) = Chi : total:m54_4, partial:m55_15 -# 55| m55_17(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_11 -# 55| m55_18(ClassWithDestructor2) = Chi : total:m55_12, partial:m55_17 -# 55| r55_19(glval) = FunctionAddress[get_x] : -# 55| r55_20(char) = Call[get_x] : func:r55_19, this:r55_11 -# 55| m55_21(unknown) = ^CallSideEffect : ~m55_16 -# 55| m55_22(unknown) = Chi : total:m55_16, partial:m55_21 -# 55| v55_23(void) = ^IndirectReadSideEffect[-1] : &:r55_11, m55_18 -# 55| m55_24(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_11 -# 55| m55_25(ClassWithDestructor2) = Chi : total:m55_18, partial:m55_24 -# 55| v55_26(void) = Call[ClassWithConstructor] : func:r55_9, this:r55_7, 0:r55_10, 1:r55_20 -# 55| m55_27(unknown) = ^CallSideEffect : ~m55_22 -# 55| m55_28(unknown) = Chi : total:m55_22, partial:m55_27 -# 55| m55_29(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r55_7 -# 55| m55_30(ClassWithConstructor) = Chi : total:m55_8, partial:m55_29 -# 55| v55_31(void) = ThrowValue : &:r55_7, m55_30 +# 55| r55_5(glval) = VariableAddress[#throw55:9] : +# 55| m55_6(ClassWithConstructor) = Uninitialized[#throw55:9] : &:r55_5 +# 55| r55_7(glval) = FunctionAddress[ClassWithConstructor] : +# 55| r55_8(char) = Constant[120] : +# 55| r55_9(glval) = VariableAddress[#temp55:41] : +# 55| m55_10(ClassWithDestructor2) = Uninitialized[#temp55:41] : &:r55_9 +# 55| r55_11(glval) = FunctionAddress[ClassWithDestructor2] : +# 55| v55_12(void) = Call[ClassWithDestructor2] : func:r55_11, this:r55_9 +# 55| m55_13(unknown) = ^CallSideEffect : ~m54_4 +# 55| m55_14(unknown) = Chi : total:m54_4, partial:m55_13 +# 55| m55_15(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_9 +# 55| m55_16(ClassWithDestructor2) = Chi : total:m55_10, partial:m55_15 +# 55| r55_17(glval) = FunctionAddress[get_x] : +# 55| r55_18(char) = Call[get_x] : func:r55_17, this:r55_9 +# 55| m55_19(unknown) = ^CallSideEffect : ~m55_14 +# 55| m55_20(unknown) = Chi : total:m55_14, partial:m55_19 +# 55| v55_21(void) = ^IndirectReadSideEffect[-1] : &:r55_9, m55_16 +# 55| m55_22(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_9 +# 55| m55_23(ClassWithDestructor2) = Chi : total:m55_16, partial:m55_22 +# 55| v55_24(void) = Call[ClassWithConstructor] : func:r55_7, this:r55_5, 0:r55_8, 1:r55_18 +# 55| m55_25(unknown) = ^CallSideEffect : ~m55_20 +# 55| m55_26(unknown) = Chi : total:m55_20, partial:m55_25 +# 55| m55_27(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r55_5 +# 55| m55_28(ClassWithConstructor) = Chi : total:m55_6, partial:m55_27 +# 55| v55_29(void) = ThrowValue : &:r55_5, m55_28 #-----| Exception -> Block 2 -# 55| Block 6 -# 55| r55_32(glval) = VariableAddress[#temp55:75] : -# 55| m55_33(ClassWithDestructor2) = Uninitialized[#temp55:75] : &:r55_32 -# 55| r55_34(glval) = FunctionAddress[ClassWithDestructor2] : -# 55| v55_35(void) = Call[ClassWithDestructor2] : func:r55_34, this:r55_32 -# 55| m55_36(unknown) = ^CallSideEffect : ~m54_4 -# 55| m55_37(unknown) = Chi : total:m54_4, partial:m55_36 -# 55| m55_38(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_32 -# 55| m55_39(ClassWithDestructor2) = Chi : total:m55_33, partial:m55_38 -# 55| r55_40(ClassWithDestructor2) = Load[#temp55:75] : &:r55_32, m55_39 +# 55| Block 4 +# 55| r55_30(glval) = VariableAddress[#temp55:75] : +# 55| m55_31(ClassWithDestructor2) = Uninitialized[#temp55:75] : &:r55_30 +# 55| r55_32(glval) = FunctionAddress[ClassWithDestructor2] : +# 55| v55_33(void) = Call[ClassWithDestructor2] : func:r55_32, this:r55_30 +# 55| m55_34(unknown) = ^CallSideEffect : ~m54_4 +# 55| m55_35(unknown) = Chi : total:m54_4, partial:m55_34 +# 55| m55_36(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_30 +# 55| m55_37(ClassWithDestructor2) = Chi : total:m55_31, partial:m55_36 +# 55| r55_38(ClassWithDestructor2) = Load[#temp55:75] : &:r55_30, m55_37 +# 55| r55_39(glval) = VariableAddress[#temp55:5] : +# 55| m55_40(ClassWithDestructor2) = Store[#temp55:5] : &:r55_39, r55_38 # 55| r55_41(glval) = VariableAddress[#temp55:5] : -# 55| m55_42(ClassWithDestructor2) = Store[#temp55:5] : &:r55_41, r55_40 -# 55| r55_43(glval) = VariableAddress[#temp55:5] : -#-----| Goto -> Block 8 -#-----| Goto -> Block 8 - -# 55| Block 8 -# 55| m55_58(ClassWithDestructor2) = Phi : from 4:m55_55, from 4:m55_67 -# 55| m55_59(unknown) = Phi : from 4:~m55_52, from 4:~m55_64, from 6:~m55_37 -# 55| r55_60(glval) = CopyValue : r55_1 -# 55| r55_61(glval) = FunctionAddress[~ClassWithDestructor2] : -# 55| v55_62(void) = Call[~ClassWithDestructor2] : func:r55_49, func:r55_61, this:r55_48, this:r55_60 -# 55| m55_63(unknown) = ^CallSideEffect : ~m55_45, ~m55_47, ~m55_57, ~m55_59 -# 55| m55_64(unknown) = Chi : total:m55_45, total:m55_47, total:m55_57, total:m55_59, partial:m55_51, partial:m55_63 -# 55| v55_65(void) = ^IndirectReadSideEffect[-1] : &:r55_48, &:r55_60, m55_44, m55_46, m55_56, m55_58 -# 55| m55_66(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_48, &:r55_60 -# 55| m55_67(ClassWithDestructor2) = Chi : total:m55_44, total:m55_46, total:m55_56, total:m55_58, partial:m55_54, partial:m55_66 -#-----| Goto (back edge) -> Block 4 -#-----| Goto (back edge) -> Block 3 - -# 55| Block 8 -#-----| Goto (back edge) -> Block 4 -#-----| Goto (back edge) -> Block 3 +# 55| r55_42(ClassWithDestructor2) = Load[#temp55:5] : &:r55_41, m55_40 +# 55| m55_43(ClassWithDestructor2) = Store[#temp55:5] : &:r55_1, r55_42 +# 56| v56_1(void) = NoOp : +# 54| v54_11(void) = ReturnVoid : +#-----| Goto -> Block 1 # 58| void temp_test8_simple(bool) # 58| Block 0 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 997d109c0832..b93c7d2649f8 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 @@ -7,29 +7,7 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| destructors_for_temps.cpp:51:5:51:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:5:55:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unexplainedLoop -| destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -40,14 +18,8 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability -| destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Block 'Load: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:5 | Store: ... ? ... : ... | Block 'Store: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Block 'Load: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:5 | Store: ... ? ... : ... | Block 'Store: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | backEdgeCountMismatch useNotDominatedByDefinition -| destructors_for_temps.cpp:51:5:51:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:5:55:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 f39e72da367d..ef225d8ad6cb 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 @@ -2,8 +2,6 @@ missingOperand unexpectedOperand duplicateOperand missingPhiOperand -| destructors_for_temps.cpp:51:5:51:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is missing an operand for predecessor block 'VariableAddress: temporary object' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:5:55:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is missing an operand for predecessor block 'VariableAddress: temporary object' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | missingOperandType | destructors_for_temps.cpp:39:3:39:53 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | destructors_for_temps.cpp:38:6:38:15 | void temp_test5(bool) | void temp_test5(bool) | | ir.cpp:1425:5:1425:30 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | ir.cpp:1414:6:1414:21 | void temporary_string() | void temporary_string() | @@ -12,31 +10,7 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| destructors_for_temps.cpp:51:5:51:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:5:55:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unexplainedLoop -| destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | Chi: call to ~ClassWithDestructor2 | Instruction 'Chi: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -47,14 +21,8 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability -| destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Block 'Load: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:5 | Store: ... ? ... : ... | Block 'Store: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Block 'Load: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:5 | Store: ... ? ... : ... | Block 'Store: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | backEdgeCountMismatch useNotDominatedByDefinition -| destructors_for_temps.cpp:51:5:51:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:5:55:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 38ff259e484f..e6144cc31530 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -1039,8 +1039,8 @@ | destructors_for_temps.cpp:47:1:47:1 | SideEffect | ~m43_6 | | destructors_for_temps.cpp:49:6:49:15 | ChiPartial | partial:m49_3 | | destructors_for_temps.cpp:49:6:49:15 | ChiTotal | total:m49_2 | -| destructors_for_temps.cpp:49:6:49:15 | Phi | from 2:~m51_28 | -| destructors_for_temps.cpp:49:6:49:15 | Phi | from 3:~m52_6 | +| destructors_for_temps.cpp:49:6:49:15 | Phi | from 2:~m51_26 | +| destructors_for_temps.cpp:49:6:49:15 | Phi | from 4:~m52_6 | | destructors_for_temps.cpp:49:6:49:15 | SideEffect | ~m49_7 | | destructors_for_temps.cpp:49:22:49:22 | Address | &:r49_5 | | destructors_for_temps.cpp:50:26:50:26 | Address | &:r50_1 | @@ -1053,91 +1053,57 @@ | destructors_for_temps.cpp:50:26:50:26 | ChiTotal | total:m50_2 | | destructors_for_temps.cpp:50:26:50:26 | SideEffect | ~m49_4 | | destructors_for_temps.cpp:51:5:51:5 | Address | &:r51_2 | +| destructors_for_temps.cpp:51:5:51:5 | Address | &:r51_39 | | destructors_for_temps.cpp:51:5:51:5 | Address | &:r51_41 | -| destructors_for_temps.cpp:51:5:51:5 | Address | &:r51_43 | | destructors_for_temps.cpp:51:5:51:5 | Condition | r51_3 | | destructors_for_temps.cpp:51:5:51:5 | Load | m49_6 | -| destructors_for_temps.cpp:51:5:51:5 | Load | m51_42 | -| destructors_for_temps.cpp:51:5:51:5 | StoreValue | r51_6 | +| destructors_for_temps.cpp:51:5:51:5 | Load | m51_40 | +| destructors_for_temps.cpp:51:5:51:5 | StoreValue | r51_42 | | destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_1 | -| destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_48 | -| destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_48 | -| destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_60 | -| destructors_for_temps.cpp:51:5:51:96 | Address | &:r51_60 | -| destructors_for_temps.cpp:51:5:51:96 | Arg(this) | this:r51_48 | -| destructors_for_temps.cpp:51:5:51:96 | Arg(this) | this:r51_60 | -| destructors_for_temps.cpp:51:5:51:96 | CallTarget | func:r51_49 | -| destructors_for_temps.cpp:51:5:51:96 | CallTarget | func:r51_61 | -| destructors_for_temps.cpp:51:5:51:96 | ChiPartial | partial:m51_51 | -| destructors_for_temps.cpp:51:5:51:96 | ChiPartial | partial:m51_54 | -| destructors_for_temps.cpp:51:5:51:96 | ChiPartial | partial:m51_63 | -| destructors_for_temps.cpp:51:5:51:96 | ChiPartial | partial:m51_66 | -| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_44 | -| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_45 | -| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_46 | -| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_47 | -| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_56 | -| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_57 | -| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_58 | -| destructors_for_temps.cpp:51:5:51:96 | ChiTotal | total:m51_59 | -| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:m51_55 | -| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:m51_67 | -| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:~m51_52 | -| destructors_for_temps.cpp:51:5:51:96 | Phi | from 4:~m51_64 | -| destructors_for_temps.cpp:51:5:51:96 | Phi | from 6:~m51_37 | -| destructors_for_temps.cpp:51:5:51:96 | SideEffect | m51_44 | -| destructors_for_temps.cpp:51:5:51:96 | SideEffect | m51_46 | -| destructors_for_temps.cpp:51:5:51:96 | SideEffect | m51_56 | -| destructors_for_temps.cpp:51:5:51:96 | SideEffect | m51_58 | -| destructors_for_temps.cpp:51:5:51:96 | SideEffect | ~m51_45 | -| destructors_for_temps.cpp:51:5:51:96 | SideEffect | ~m51_47 | -| destructors_for_temps.cpp:51:5:51:96 | SideEffect | ~m51_57 | -| destructors_for_temps.cpp:51:5:51:96 | SideEffect | ~m51_59 | -| destructors_for_temps.cpp:51:5:51:96 | Unary | r51_1 | -| destructors_for_temps.cpp:51:9:51:71 | Address | &:r51_7 | -| destructors_for_temps.cpp:51:9:51:71 | Address | &:r51_7 | -| destructors_for_temps.cpp:51:9:51:71 | Address | &:r51_7 | -| destructors_for_temps.cpp:51:9:51:71 | Arg(this) | this:r51_7 | -| destructors_for_temps.cpp:51:9:51:71 | CallTarget | func:r51_9 | +| destructors_for_temps.cpp:51:9:51:71 | Address | &:r51_5 | +| destructors_for_temps.cpp:51:9:51:71 | Address | &:r51_5 | +| destructors_for_temps.cpp:51:9:51:71 | Address | &:r51_5 | +| destructors_for_temps.cpp:51:9:51:71 | Arg(this) | this:r51_5 | +| destructors_for_temps.cpp:51:9:51:71 | CallTarget | func:r51_7 | +| destructors_for_temps.cpp:51:9:51:71 | ChiPartial | partial:m51_25 | | destructors_for_temps.cpp:51:9:51:71 | ChiPartial | partial:m51_27 | -| destructors_for_temps.cpp:51:9:51:71 | ChiPartial | partial:m51_29 | -| destructors_for_temps.cpp:51:9:51:71 | ChiTotal | total:m51_8 | -| destructors_for_temps.cpp:51:9:51:71 | ChiTotal | total:m51_22 | -| destructors_for_temps.cpp:51:9:51:71 | Load | m51_30 | -| destructors_for_temps.cpp:51:9:51:71 | SideEffect | ~m51_22 | -| destructors_for_temps.cpp:51:36:51:38 | Arg(0) | 0:r51_10 | -| destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_11 | -| destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_11 | -| destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_11 | -| destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_11 | -| destructors_for_temps.cpp:51:41:51:62 | Arg(this) | this:r51_11 | -| destructors_for_temps.cpp:51:41:51:62 | Arg(this) | this:r51_11 | -| destructors_for_temps.cpp:51:41:51:62 | CallTarget | func:r51_13 | +| destructors_for_temps.cpp:51:9:51:71 | ChiTotal | total:m51_6 | +| destructors_for_temps.cpp:51:9:51:71 | ChiTotal | total:m51_20 | +| destructors_for_temps.cpp:51:9:51:71 | Load | m51_28 | +| destructors_for_temps.cpp:51:9:51:71 | SideEffect | ~m51_20 | +| destructors_for_temps.cpp:51:36:51:38 | Arg(0) | 0:r51_8 | +| destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_9 | +| destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_9 | +| destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_9 | +| destructors_for_temps.cpp:51:41:51:62 | Address | &:r51_9 | +| destructors_for_temps.cpp:51:41:51:62 | Arg(this) | this:r51_9 | +| destructors_for_temps.cpp:51:41:51:62 | Arg(this) | this:r51_9 | +| destructors_for_temps.cpp:51:41:51:62 | CallTarget | func:r51_11 | +| destructors_for_temps.cpp:51:41:51:62 | ChiPartial | partial:m51_13 | | destructors_for_temps.cpp:51:41:51:62 | ChiPartial | partial:m51_15 | -| destructors_for_temps.cpp:51:41:51:62 | ChiPartial | partial:m51_17 | -| destructors_for_temps.cpp:51:41:51:62 | ChiPartial | partial:m51_24 | +| destructors_for_temps.cpp:51:41:51:62 | ChiPartial | partial:m51_22 | | destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m50_6 | -| destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m51_12 | -| destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m51_18 | -| destructors_for_temps.cpp:51:41:51:62 | SideEffect | m51_18 | +| destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m51_10 | +| destructors_for_temps.cpp:51:41:51:62 | ChiTotal | total:m51_16 | +| destructors_for_temps.cpp:51:41:51:62 | SideEffect | m51_16 | | destructors_for_temps.cpp:51:41:51:62 | SideEffect | ~m50_6 | -| destructors_for_temps.cpp:51:64:51:68 | Arg(1) | 1:r51_20 | -| destructors_for_temps.cpp:51:64:51:68 | CallTarget | func:r51_19 | -| destructors_for_temps.cpp:51:64:51:68 | ChiPartial | partial:m51_21 | -| destructors_for_temps.cpp:51:64:51:68 | ChiTotal | total:m51_16 | -| destructors_for_temps.cpp:51:64:51:68 | SideEffect | ~m51_16 | -| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_32 | -| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_32 | -| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_32 | -| destructors_for_temps.cpp:51:75:51:96 | Arg(this) | this:r51_32 | -| destructors_for_temps.cpp:51:75:51:96 | CallTarget | func:r51_34 | +| destructors_for_temps.cpp:51:64:51:68 | Arg(1) | 1:r51_18 | +| destructors_for_temps.cpp:51:64:51:68 | CallTarget | func:r51_17 | +| destructors_for_temps.cpp:51:64:51:68 | ChiPartial | partial:m51_19 | +| destructors_for_temps.cpp:51:64:51:68 | ChiTotal | total:m51_14 | +| destructors_for_temps.cpp:51:64:51:68 | SideEffect | ~m51_14 | +| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_30 | +| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_30 | +| destructors_for_temps.cpp:51:75:51:96 | Address | &:r51_30 | +| destructors_for_temps.cpp:51:75:51:96 | Arg(this) | this:r51_30 | +| destructors_for_temps.cpp:51:75:51:96 | CallTarget | func:r51_32 | +| destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_34 | | destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_36 | -| destructors_for_temps.cpp:51:75:51:96 | ChiPartial | partial:m51_38 | | destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m50_6 | -| destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_33 | -| destructors_for_temps.cpp:51:75:51:96 | Load | m51_39 | +| destructors_for_temps.cpp:51:75:51:96 | ChiTotal | total:m51_31 | +| destructors_for_temps.cpp:51:75:51:96 | Load | m51_37 | | destructors_for_temps.cpp:51:75:51:96 | SideEffect | ~m50_6 | -| destructors_for_temps.cpp:51:75:51:96 | StoreValue | r51_40 | +| destructors_for_temps.cpp:51:75:51:96 | StoreValue | r51_38 | | destructors_for_temps.cpp:52:1:52:1 | Address | &:r52_2 | | destructors_for_temps.cpp:52:1:52:1 | Address | &:r52_2 | | destructors_for_temps.cpp:52:1:52:1 | Arg(this) | this:r52_2 | @@ -1145,104 +1111,67 @@ | destructors_for_temps.cpp:52:1:52:1 | ChiPartial | partial:m52_5 | | destructors_for_temps.cpp:52:1:52:1 | ChiPartial | partial:m52_8 | | destructors_for_temps.cpp:52:1:52:1 | ChiTotal | total:m50_8 | -| destructors_for_temps.cpp:52:1:52:1 | ChiTotal | total:m51_52 | -| destructors_for_temps.cpp:52:1:52:1 | ChiTotal | total:m51_64 | +| destructors_for_temps.cpp:52:1:52:1 | ChiTotal | total:m51_35 | | destructors_for_temps.cpp:52:1:52:1 | SideEffect | m50_8 | -| destructors_for_temps.cpp:52:1:52:1 | SideEffect | ~m51_52 | -| destructors_for_temps.cpp:52:1:52:1 | SideEffect | ~m51_64 | +| destructors_for_temps.cpp:52:1:52:1 | SideEffect | ~m51_35 | | destructors_for_temps.cpp:54:6:54:15 | ChiPartial | partial:m54_3 | | destructors_for_temps.cpp:54:6:54:15 | ChiTotal | total:m54_2 | -| destructors_for_temps.cpp:54:6:54:15 | Phi | from 2:~m55_28 | -| destructors_for_temps.cpp:54:6:54:15 | Phi | from 3:~m55_52 | -| destructors_for_temps.cpp:54:6:54:15 | Phi | from 3:~m55_64 | +| destructors_for_temps.cpp:54:6:54:15 | Phi | from 2:~m55_26 | +| destructors_for_temps.cpp:54:6:54:15 | Phi | from 4:~m55_35 | | destructors_for_temps.cpp:54:6:54:15 | SideEffect | ~m54_7 | | destructors_for_temps.cpp:54:22:54:22 | Address | &:r54_5 | | destructors_for_temps.cpp:55:5:55:5 | Address | &:r55_2 | +| destructors_for_temps.cpp:55:5:55:5 | Address | &:r55_39 | | destructors_for_temps.cpp:55:5:55:5 | Address | &:r55_41 | -| destructors_for_temps.cpp:55:5:55:5 | Address | &:r55_43 | | destructors_for_temps.cpp:55:5:55:5 | Condition | r55_3 | | destructors_for_temps.cpp:55:5:55:5 | Load | m54_6 | -| destructors_for_temps.cpp:55:5:55:5 | Load | m55_42 | -| destructors_for_temps.cpp:55:5:55:5 | StoreValue | r55_6 | +| destructors_for_temps.cpp:55:5:55:5 | Load | m55_40 | +| destructors_for_temps.cpp:55:5:55:5 | StoreValue | r55_42 | | destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_1 | -| destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_48 | -| destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_48 | -| destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_60 | -| destructors_for_temps.cpp:55:5:55:96 | Address | &:r55_60 | -| destructors_for_temps.cpp:55:5:55:96 | Arg(this) | this:r55_48 | -| destructors_for_temps.cpp:55:5:55:96 | Arg(this) | this:r55_60 | -| destructors_for_temps.cpp:55:5:55:96 | CallTarget | func:r55_49 | -| destructors_for_temps.cpp:55:5:55:96 | CallTarget | func:r55_61 | -| destructors_for_temps.cpp:55:5:55:96 | ChiPartial | partial:m55_51 | -| destructors_for_temps.cpp:55:5:55:96 | ChiPartial | partial:m55_54 | -| destructors_for_temps.cpp:55:5:55:96 | ChiPartial | partial:m55_63 | -| destructors_for_temps.cpp:55:5:55:96 | ChiPartial | partial:m55_66 | -| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_44 | -| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_45 | -| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_46 | -| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_47 | -| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_56 | -| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_57 | -| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_58 | -| destructors_for_temps.cpp:55:5:55:96 | ChiTotal | total:m55_59 | -| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:m55_55 | -| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:m55_67 | -| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:~m55_52 | -| destructors_for_temps.cpp:55:5:55:96 | Phi | from 4:~m55_64 | -| destructors_for_temps.cpp:55:5:55:96 | Phi | from 6:~m55_37 | -| destructors_for_temps.cpp:55:5:55:96 | SideEffect | m55_44 | -| destructors_for_temps.cpp:55:5:55:96 | SideEffect | m55_46 | -| destructors_for_temps.cpp:55:5:55:96 | SideEffect | m55_56 | -| destructors_for_temps.cpp:55:5:55:96 | SideEffect | m55_58 | -| destructors_for_temps.cpp:55:5:55:96 | SideEffect | ~m55_45 | -| destructors_for_temps.cpp:55:5:55:96 | SideEffect | ~m55_47 | -| destructors_for_temps.cpp:55:5:55:96 | SideEffect | ~m55_57 | -| destructors_for_temps.cpp:55:5:55:96 | SideEffect | ~m55_59 | -| destructors_for_temps.cpp:55:5:55:96 | Unary | r55_1 | -| destructors_for_temps.cpp:55:9:55:71 | Address | &:r55_7 | -| destructors_for_temps.cpp:55:9:55:71 | Address | &:r55_7 | -| destructors_for_temps.cpp:55:9:55:71 | Address | &:r55_7 | -| destructors_for_temps.cpp:55:9:55:71 | Arg(this) | this:r55_7 | -| destructors_for_temps.cpp:55:9:55:71 | CallTarget | func:r55_9 | +| destructors_for_temps.cpp:55:9:55:71 | Address | &:r55_5 | +| destructors_for_temps.cpp:55:9:55:71 | Address | &:r55_5 | +| destructors_for_temps.cpp:55:9:55:71 | Address | &:r55_5 | +| destructors_for_temps.cpp:55:9:55:71 | Arg(this) | this:r55_5 | +| destructors_for_temps.cpp:55:9:55:71 | CallTarget | func:r55_7 | +| destructors_for_temps.cpp:55:9:55:71 | ChiPartial | partial:m55_25 | | destructors_for_temps.cpp:55:9:55:71 | ChiPartial | partial:m55_27 | -| destructors_for_temps.cpp:55:9:55:71 | ChiPartial | partial:m55_29 | -| destructors_for_temps.cpp:55:9:55:71 | ChiTotal | total:m55_8 | -| destructors_for_temps.cpp:55:9:55:71 | ChiTotal | total:m55_22 | -| destructors_for_temps.cpp:55:9:55:71 | Load | m55_30 | -| destructors_for_temps.cpp:55:9:55:71 | SideEffect | ~m55_22 | -| destructors_for_temps.cpp:55:36:55:38 | Arg(0) | 0:r55_10 | -| destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_11 | -| destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_11 | -| destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_11 | -| destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_11 | -| destructors_for_temps.cpp:55:41:55:62 | Arg(this) | this:r55_11 | -| destructors_for_temps.cpp:55:41:55:62 | Arg(this) | this:r55_11 | -| destructors_for_temps.cpp:55:41:55:62 | CallTarget | func:r55_13 | +| destructors_for_temps.cpp:55:9:55:71 | ChiTotal | total:m55_6 | +| destructors_for_temps.cpp:55:9:55:71 | ChiTotal | total:m55_20 | +| destructors_for_temps.cpp:55:9:55:71 | Load | m55_28 | +| destructors_for_temps.cpp:55:9:55:71 | SideEffect | ~m55_20 | +| destructors_for_temps.cpp:55:36:55:38 | Arg(0) | 0:r55_8 | +| destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_9 | +| destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_9 | +| destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_9 | +| destructors_for_temps.cpp:55:41:55:62 | Address | &:r55_9 | +| destructors_for_temps.cpp:55:41:55:62 | Arg(this) | this:r55_9 | +| destructors_for_temps.cpp:55:41:55:62 | Arg(this) | this:r55_9 | +| destructors_for_temps.cpp:55:41:55:62 | CallTarget | func:r55_11 | +| destructors_for_temps.cpp:55:41:55:62 | ChiPartial | partial:m55_13 | | destructors_for_temps.cpp:55:41:55:62 | ChiPartial | partial:m55_15 | -| destructors_for_temps.cpp:55:41:55:62 | ChiPartial | partial:m55_17 | -| destructors_for_temps.cpp:55:41:55:62 | ChiPartial | partial:m55_24 | +| destructors_for_temps.cpp:55:41:55:62 | ChiPartial | partial:m55_22 | | destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m54_4 | -| destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m55_12 | -| destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m55_18 | -| destructors_for_temps.cpp:55:41:55:62 | SideEffect | m55_18 | +| destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m55_10 | +| destructors_for_temps.cpp:55:41:55:62 | ChiTotal | total:m55_16 | +| destructors_for_temps.cpp:55:41:55:62 | SideEffect | m55_16 | | destructors_for_temps.cpp:55:41:55:62 | SideEffect | ~m54_4 | -| destructors_for_temps.cpp:55:64:55:68 | Arg(1) | 1:r55_20 | -| destructors_for_temps.cpp:55:64:55:68 | CallTarget | func:r55_19 | -| destructors_for_temps.cpp:55:64:55:68 | ChiPartial | partial:m55_21 | -| destructors_for_temps.cpp:55:64:55:68 | ChiTotal | total:m55_16 | -| destructors_for_temps.cpp:55:64:55:68 | SideEffect | ~m55_16 | -| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_32 | -| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_32 | -| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_32 | -| destructors_for_temps.cpp:55:75:55:96 | Arg(this) | this:r55_32 | -| destructors_for_temps.cpp:55:75:55:96 | CallTarget | func:r55_34 | +| destructors_for_temps.cpp:55:64:55:68 | Arg(1) | 1:r55_18 | +| destructors_for_temps.cpp:55:64:55:68 | CallTarget | func:r55_17 | +| destructors_for_temps.cpp:55:64:55:68 | ChiPartial | partial:m55_19 | +| destructors_for_temps.cpp:55:64:55:68 | ChiTotal | total:m55_14 | +| destructors_for_temps.cpp:55:64:55:68 | SideEffect | ~m55_14 | +| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_30 | +| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_30 | +| destructors_for_temps.cpp:55:75:55:96 | Address | &:r55_30 | +| destructors_for_temps.cpp:55:75:55:96 | Arg(this) | this:r55_30 | +| destructors_for_temps.cpp:55:75:55:96 | CallTarget | func:r55_32 | +| destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_34 | | destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_36 | -| destructors_for_temps.cpp:55:75:55:96 | ChiPartial | partial:m55_38 | | destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m54_4 | -| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_33 | -| destructors_for_temps.cpp:55:75:55:96 | Load | m55_39 | +| destructors_for_temps.cpp:55:75:55:96 | ChiTotal | total:m55_31 | +| destructors_for_temps.cpp:55:75:55:96 | Load | m55_37 | | destructors_for_temps.cpp:55:75:55:96 | SideEffect | ~m54_4 | -| destructors_for_temps.cpp:55:75:55:96 | StoreValue | r55_40 | +| destructors_for_temps.cpp:55:75:55:96 | StoreValue | r55_38 | | destructors_for_temps.cpp:58:6:58:22 | ChiPartial | partial:m58_3 | | destructors_for_temps.cpp:58:6:58:22 | ChiTotal | total:m58_2 | | destructors_for_temps.cpp:58:6:58:22 | Phi | from 2:~m59_16 | 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 cfa570510301..904538a00069 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -7,23 +7,7 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| destructors_for_temps.cpp:51:5:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:5:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unexplainedLoop -| destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -34,15 +18,9 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability -| destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Block 'Load: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:5 | Store: ... ? ... : ... | Block 'Store: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Block 'Load: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:5 | Store: ... ? ... : ... | Block 'Store: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | backEdgeCountMismatch useNotDominatedByDefinition | destructors_for_temps.cpp:45:39:45:60 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:42:6:42:15 | void temp_test6(bool) | void temp_test6(bool) | -| destructors_for_temps.cpp:51:5:51:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:5:55:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | | ir.cpp:1535:8:1535:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1535:8:1535:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | 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 a1de7cba4692..e5420147b587 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -1084,8 +1084,8 @@ destructors_for_temps.cpp: # 51| r51_2(glval) = VariableAddress[b] : # 51| r51_3(bool) = Load[b] : &:r51_2, ~m? # 51| v51_4(void) = ConditionalBranch : r51_3 -#-----| False -> Block 7 -#-----| True -> Block 5 +#-----| False -> Block 6 +#-----| True -> Block 4 # 49| Block 1 # 49| v49_6(void) = AliasedUse : ~m? @@ -1096,7 +1096,8 @@ destructors_for_temps.cpp: #-----| Goto -> Block 1 # 51| Block 3 -# 51| mu51_5(ClassWithDestructor2) = Store[#temp51:5] : &:r51_1, r51_6 +# 51| r51_5(ClassWithDestructor2) = Load[#temp51:5] : &:r51_35, ~m? +# 51| mu51_6(ClassWithDestructor2) = Store[#temp51:5] : &:r51_1, r51_5 # 52| v52_1(void) = NoOp : # 52| r52_2(glval) = VariableAddress[c] : # 52| r52_3(glval) = FunctionAddress[~ClassWithDestructor2] : @@ -1108,11 +1109,6 @@ destructors_for_temps.cpp: #-----| Goto -> Block 1 # 51| Block 4 -# 51| r51_6(ClassWithDestructor2) = Load[#temp51:5] : &:r51_35, ~m? -#-----| Goto (back edge) -> Block 8 -#-----| Goto (back edge) -> Block 8 - -# 51| Block 5 # 51| r51_7(glval) = VariableAddress[#throw51:9] : # 51| mu51_8(ClassWithConstructor) = Uninitialized[#throw51:9] : &:r51_7 # 51| r51_9(glval) = FunctionAddress[ClassWithConstructor] : @@ -1134,16 +1130,16 @@ destructors_for_temps.cpp: # 51| v51_25(void) = ThrowValue : &:r51_7, ~m? #-----| Exception -> Block 2 -# 52| Block 6 +# 52| Block 5 # 52| r52_8(glval) = VariableAddress[c] : # 52| r52_9(glval) = FunctionAddress[~ClassWithDestructor2] : # 52| v52_10(void) = Call[~ClassWithDestructor2] : func:r52_9, this:r52_8 # 52| mu52_11(unknown) = ^CallSideEffect : ~m? # 52| v52_12(void) = ^IndirectReadSideEffect[-1] : &:r52_8, ~m? # 52| mu52_13(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r52_8 -#-----| Goto -> Block 4 +#-----| Goto -> Block 3 -# 51| Block 7 +# 51| Block 6 # 51| r51_26(glval) = VariableAddress[#temp51:75] : # 51| mu51_27(ClassWithDestructor2) = Uninitialized[#temp51:75] : &:r51_26 # 51| r51_28(glval) = FunctionAddress[ClassWithDestructor2] : @@ -1154,22 +1150,7 @@ destructors_for_temps.cpp: # 51| r51_33(glval) = VariableAddress[#temp51:5] : # 51| mu51_34(ClassWithDestructor2) = Store[#temp51:5] : &:r51_33, r51_32 # 51| r51_35(glval) = VariableAddress[#temp51:5] : -#-----| Goto -> Block 8 -#-----| Goto -> Block 8 - -# 51| Block 8 -# 51| r51_42(glval) = CopyValue : r51_1 -# 51| r51_43(glval) = FunctionAddress[~ClassWithDestructor2] : -# 51| v51_44(void) = Call[~ClassWithDestructor2] : func:r51_37, func:r51_43, this:r51_36, this:r51_42 -# 51| mu51_45(unknown) = ^CallSideEffect : ~m? -# 51| v51_46(void) = ^IndirectReadSideEffect[-1] : &:r51_36, &:r51_42, ~m? -# 51| mu51_47(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_36, &:r51_42 -#-----| Goto (back edge) -> Block 4 -#-----| Goto (back edge) -> Block 3 - -# 51| Block 8 -#-----| Goto (back edge) -> Block 4 -#-----| Goto (back edge) -> Block 3 +#-----| Goto -> Block 3 # 54| void temp_test8(bool) # 54| Block 0 @@ -1182,8 +1163,8 @@ destructors_for_temps.cpp: # 55| r55_2(glval) = VariableAddress[b] : # 55| r55_3(bool) = Load[b] : &:r55_2, ~m? # 55| v55_4(void) = ConditionalBranch : r55_3 -#-----| False -> Block 6 -#-----| True -> Block 5 +#-----| False -> Block 4 +#-----| True -> Block 3 # 54| Block 1 # 54| v54_6(void) = AliasedUse : ~m? @@ -1194,65 +1175,43 @@ destructors_for_temps.cpp: #-----| Goto -> Block 1 # 55| Block 3 -# 55| mu55_5(ClassWithDestructor2) = Store[#temp55:5] : &:r55_1, r55_6 -# 56| v56_1(void) = NoOp : -# 54| v54_9(void) = ReturnVoid : -#-----| Goto -> Block 1 - -# 55| Block 4 -# 55| r55_6(ClassWithDestructor2) = Load[#temp55:5] : &:r55_35, ~m? -#-----| Goto (back edge) -> Block 8 -#-----| Goto (back edge) -> Block 8 - -# 55| Block 5 -# 55| r55_7(glval) = VariableAddress[#throw55:9] : -# 55| mu55_8(ClassWithConstructor) = Uninitialized[#throw55:9] : &:r55_7 -# 55| r55_9(glval) = FunctionAddress[ClassWithConstructor] : -# 55| r55_10(char) = Constant[120] : -# 55| r55_11(glval) = VariableAddress[#temp55:41] : -# 55| mu55_12(ClassWithDestructor2) = Uninitialized[#temp55:41] : &:r55_11 -# 55| r55_13(glval) = FunctionAddress[ClassWithDestructor2] : -# 55| v55_14(void) = Call[ClassWithDestructor2] : func:r55_13, this:r55_11 -# 55| mu55_15(unknown) = ^CallSideEffect : ~m? -# 55| mu55_16(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_11 -# 55| r55_17(glval) = FunctionAddress[get_x] : -# 55| r55_18(char) = Call[get_x] : func:r55_17, this:r55_11 -# 55| mu55_19(unknown) = ^CallSideEffect : ~m? -# 55| v55_20(void) = ^IndirectReadSideEffect[-1] : &:r55_11, ~m? -# 55| mu55_21(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_11 -# 55| v55_22(void) = Call[ClassWithConstructor] : func:r55_9, this:r55_7, 0:r55_10, 1:r55_18 -# 55| mu55_23(unknown) = ^CallSideEffect : ~m? -# 55| mu55_24(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r55_7 -# 55| v55_25(void) = ThrowValue : &:r55_7, ~m? +# 55| r55_5(glval) = VariableAddress[#throw55:9] : +# 55| mu55_6(ClassWithConstructor) = Uninitialized[#throw55:9] : &:r55_5 +# 55| r55_7(glval) = FunctionAddress[ClassWithConstructor] : +# 55| r55_8(char) = Constant[120] : +# 55| r55_9(glval) = VariableAddress[#temp55:41] : +# 55| mu55_10(ClassWithDestructor2) = Uninitialized[#temp55:41] : &:r55_9 +# 55| r55_11(glval) = FunctionAddress[ClassWithDestructor2] : +# 55| v55_12(void) = Call[ClassWithDestructor2] : func:r55_11, this:r55_9 +# 55| mu55_13(unknown) = ^CallSideEffect : ~m? +# 55| mu55_14(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_9 +# 55| r55_15(glval) = FunctionAddress[get_x] : +# 55| r55_16(char) = Call[get_x] : func:r55_15, this:r55_9 +# 55| mu55_17(unknown) = ^CallSideEffect : ~m? +# 55| v55_18(void) = ^IndirectReadSideEffect[-1] : &:r55_9, ~m? +# 55| mu55_19(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_9 +# 55| v55_20(void) = Call[ClassWithConstructor] : func:r55_7, this:r55_5, 0:r55_8, 1:r55_16 +# 55| mu55_21(unknown) = ^CallSideEffect : ~m? +# 55| mu55_22(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r55_5 +# 55| v55_23(void) = ThrowValue : &:r55_5, ~m? #-----| Exception -> Block 2 -# 55| Block 6 -# 55| r55_26(glval) = VariableAddress[#temp55:75] : -# 55| mu55_27(ClassWithDestructor2) = Uninitialized[#temp55:75] : &:r55_26 -# 55| r55_28(glval) = FunctionAddress[ClassWithDestructor2] : -# 55| v55_29(void) = Call[ClassWithDestructor2] : func:r55_28, this:r55_26 -# 55| mu55_30(unknown) = ^CallSideEffect : ~m? -# 55| mu55_31(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_26 -# 55| r55_32(ClassWithDestructor2) = Load[#temp55:75] : &:r55_26, ~m? +# 55| Block 4 +# 55| r55_24(glval) = VariableAddress[#temp55:75] : +# 55| mu55_25(ClassWithDestructor2) = Uninitialized[#temp55:75] : &:r55_24 +# 55| r55_26(glval) = FunctionAddress[ClassWithDestructor2] : +# 55| v55_27(void) = Call[ClassWithDestructor2] : func:r55_26, this:r55_24 +# 55| mu55_28(unknown) = ^CallSideEffect : ~m? +# 55| mu55_29(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_24 +# 55| r55_30(ClassWithDestructor2) = Load[#temp55:75] : &:r55_24, ~m? +# 55| r55_31(glval) = VariableAddress[#temp55:5] : +# 55| mu55_32(ClassWithDestructor2) = Store[#temp55:5] : &:r55_31, r55_30 # 55| r55_33(glval) = VariableAddress[#temp55:5] : -# 55| mu55_34(ClassWithDestructor2) = Store[#temp55:5] : &:r55_33, r55_32 -# 55| r55_35(glval) = VariableAddress[#temp55:5] : -#-----| Goto -> Block 8 -#-----| Goto -> Block 8 - -# 55| Block 8 -# 55| r55_42(glval) = CopyValue : r55_1 -# 55| r55_43(glval) = FunctionAddress[~ClassWithDestructor2] : -# 55| v55_44(void) = Call[~ClassWithDestructor2] : func:r55_37, func:r55_43, this:r55_36, this:r55_42 -# 55| mu55_45(unknown) = ^CallSideEffect : ~m? -# 55| v55_46(void) = ^IndirectReadSideEffect[-1] : &:r55_36, &:r55_42, ~m? -# 55| mu55_47(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r55_36, &:r55_42 -#-----| Goto (back edge) -> Block 4 -#-----| Goto (back edge) -> Block 3 - -# 55| Block 8 -#-----| Goto (back edge) -> Block 4 -#-----| Goto (back edge) -> Block 3 +# 55| r55_34(ClassWithDestructor2) = Load[#temp55:5] : &:r55_33, ~m? +# 55| mu55_35(ClassWithDestructor2) = Store[#temp55:5] : &:r55_1, r55_34 +# 56| v56_1(void) = NoOp : +# 54| v54_9(void) = ReturnVoid : +#-----| Goto -> Block 1 # 58| void temp_test8_simple(bool) # 58| Block 0 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 6ed9bab7c8c8..b93c7d2649f8 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 @@ -7,23 +7,7 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| destructors_for_temps.cpp:51:5:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:5:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unexplainedLoop -| destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -34,14 +18,8 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability -| destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Block 'Load: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:5 | Store: ... ? ... : ... | Block 'Store: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Block 'Load: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:5 | Store: ... ? ... : ... | Block 'Store: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | backEdgeCountMismatch useNotDominatedByDefinition -| destructors_for_temps.cpp:51:5:51:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:5:55:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 6ed9bab7c8c8..b93c7d2649f8 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 @@ -7,23 +7,7 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| destructors_for_temps.cpp:51:5:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:5:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unexplainedLoop -| destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Instruction 'Load: ... ? ... : ...' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | Call: call to ~ClassWithDestructor2 | Instruction 'Call: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | CallSideEffect: call to ~ClassWithDestructor2 | Instruction 'CallSideEffect: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | FunctionAddress: call to ~ClassWithDestructor2 | Instruction 'FunctionAddress: call to ~ClassWithDestructor2' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:96 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -34,14 +18,8 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability -| destructors_for_temps.cpp:51:5:51:5 | Load: ... ? ... : ... | Block 'Load: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:51:5:51:5 | Store: ... ? ... : ... | Block 'Store: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:5:55:5 | Load: ... ? ... : ... | Block 'Load: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | -| destructors_for_temps.cpp:55:5:55:5 | Store: ... ? ... : ... | Block 'Store: ... ? ... : ...' is not reachable by traversing only forward edges in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | backEdgeCountMismatch useNotDominatedByDefinition -| destructors_for_temps.cpp:51:5:51:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:49:6:49:15 | void temp_test7(bool) | void temp_test7(bool) | -| destructors_for_temps.cpp:55:5:55:5 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:54:6:54:15 | void temp_test8(bool) | void temp_test8(bool) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated From 805b4d64657c38eb1bb4f68d42344379c8927525 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 4 Apr 2024 16:01:25 +0100 Subject: [PATCH 12/35] C++: Add a failing testcase. --- .../library-tests/ir/ir/PrintAST.expected | 22 ++++++++++++ .../library-tests/ir/ir/aliased_ir.expected | 18 ++++++++++ .../ir/ir/aliased_ssa_consistency.expected | 1 + .../aliased_ssa_consistency_unsound.expected | 1 + cpp/ql/test/library-tests/ir/ir/ir.cpp | 5 +++ .../ir/ir/operand_locations.expected | 12 +++++++ .../ir/ir/raw_consistency.expected | 2 ++ .../test/library-tests/ir/ir/raw_ir.expected | 35 +++++++++++++++++++ .../ir/ir/unaliased_ssa_consistency.expected | 1 + ...unaliased_ssa_consistency_unsound.expected | 1 + 10 files changed, 98 insertions(+) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 1b7ee785697b..40f40c3d0c5f 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -20198,6 +20198,28 @@ ir.cpp: # 2430| Type = [ClassTemplateInstantiation,Struct] iterator # 2430| ValueCategory = lvalue # 2432| getStmt(6): [ReturnStmt] return ... +# 2434| [TopLevelFunction] void rethrow_with_destruction(int) +# 2434| : +# 2434| getParameter(0): [Parameter] x +# 2434| Type = [IntType] int +# 2434| getEntryPoint(): [BlockStmt] { ... } +# 2435| getStmt(0): [DeclStmt] declaration +# 2435| getDeclarationEntry(0): [VariableDeclarationEntry] definition of c +# 2435| Type = [Class] ClassWithDestructor +# 2435| getVariable().getInitializer(): [Initializer] initializer for c +# 2435| getExpr(): [ConstructorCall] call to ClassWithDestructor +# 2435| Type = [VoidType] void +# 2435| ValueCategory = prvalue +# 2436| getStmt(1): [ExprStmt] ExprStmt +# 2436| getExpr(): [ReThrowExpr] re-throw exception +# 2436| Type = [VoidType] void +# 2436| ValueCategory = prvalue +# 2437| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2437| Type = [VoidType] void +# 2437| ValueCategory = prvalue +# 2437| getQualifier(): [VariableAccess] c +# 2437| Type = [Class] ClassWithDestructor +# 2437| ValueCategory = lvalue perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| : 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 63a7cd278d4d..650d637f820a 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -15901,6 +15901,24 @@ ir.cpp: # 2410| Block 13 # 2410| v2410_8(void) = Unreached : +# 2434| void rethrow_with_destruction(int) +# 2434| Block 0 +# 2434| v2434_1(void) = EnterFunction : +# 2434| m2434_2(unknown) = AliasedDefinition : +# 2434| m2434_3(unknown) = InitializeNonLocal : +# 2434| m2434_4(unknown) = Chi : total:m2434_2, partial:m2434_3 +# 2434| r2434_5(glval) = VariableAddress[x] : +# 2434| m2434_6(int) = InitializeParameter[x] : &:r2434_5 +# 2435| r2435_1(glval) = VariableAddress[c] : +# 2435| m2435_2(ClassWithDestructor) = Uninitialized[c] : &:r2435_1 +# 2435| r2435_3(glval) = FunctionAddress[ClassWithDestructor] : +# 2435| v2435_4(void) = Call[ClassWithDestructor] : func:r2435_3, this:r2435_1 +# 2435| m2435_5(unknown) = ^CallSideEffect : ~m2434_4 +# 2435| m2435_6(unknown) = Chi : total:m2434_4, partial:m2435_5 +# 2435| m2435_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2435_1 +# 2435| m2435_8(ClassWithDestructor) = Chi : total:m2435_2, partial:m2435_7 +# 2436| v2436_1(void) = ReThrow : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 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 b93c7d2649f8..20a620812999 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,6 +6,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2436:5:2436:9 | ReThrow: re-throw exception | Instruction 'ReThrow: re-throw exception ' has no successors in function '$@'. | ir.cpp:2434:6:2434:29 | void rethrow_with_destruction(int) | void rethrow_with_destruction(int) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction 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 ef225d8ad6cb..cece30ce4cb4 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 @@ -9,6 +9,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2436:5:2436:9 | ReThrow: re-throw exception | Instruction 'ReThrow: re-throw exception ' has no successors in function '$@'. | ir.cpp:2434:6:2434:29 | void rethrow_with_destruction(int) | void rethrow_with_destruction(int) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 2d476b11fd4e..3c50a2c2ca33 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -2431,4 +2431,9 @@ void initialization_with_temp_destructor() { y += x; } +void rethrow_with_destruction(int x) { + ClassWithDestructor c; + throw; +} + // semmle-extractor-options: -std=c++20 --clang 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 174635ec0ee7..2c24b3e29296 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -13367,6 +13367,18 @@ | ir.cpp:2431:14:2431:14 | Load | m2430_25 | | ir.cpp:2431:14:2431:14 | Right | r2431_3 | | ir.cpp:2431:14:2431:14 | Unary | r2431_2 | +| ir.cpp:2434:6:2434:29 | ChiPartial | partial:m2434_3 | +| ir.cpp:2434:6:2434:29 | ChiTotal | total:m2434_2 | +| ir.cpp:2434:35:2434:35 | Address | &:r2434_5 | +| ir.cpp:2435:25:2435:25 | Address | &:r2435_1 | +| ir.cpp:2435:25:2435:25 | Address | &:r2435_1 | +| ir.cpp:2435:25:2435:25 | Arg(this) | this:r2435_1 | +| ir.cpp:2435:25:2435:25 | CallTarget | func:r2435_3 | +| ir.cpp:2435:25:2435:25 | ChiPartial | partial:m2435_5 | +| ir.cpp:2435:25:2435:25 | ChiPartial | partial:m2435_7 | +| ir.cpp:2435:25:2435:25 | ChiTotal | total:m2434_4 | +| ir.cpp:2435:25:2435:25 | ChiTotal | total:m2435_2 | +| ir.cpp:2435:25:2435:25 | SideEffect | ~m2434_4 | | 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 904538a00069..cf198b5ed7db 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -6,6 +6,8 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2436:5:2436:9 | ReThrow: re-throw exception | Instruction 'ReThrow: re-throw exception ' has no successors in function '$@'. | ir.cpp:2434:6:2434:29 | void rethrow_with_destruction(int) | void rethrow_with_destruction(int) | +| ir.cpp:2437:1:2437:1 | IndirectMayWriteSideEffect: c | Instruction 'IndirectMayWriteSideEffect: c' has no successors in function '$@'. | ir.cpp:2434:6:2434:29 | void rethrow_with_destruction(int) | void rethrow_with_destruction(int) | 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 2bb5551a30c4..6903fd5a64c2 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -14644,6 +14644,41 @@ ir.cpp: # 2410| v2410_5(void) = AliasedUse : ~m? # 2410| v2410_6(void) = ExitFunction : +# 2434| void rethrow_with_destruction(int) +# 2434| Block 0 +# 2434| v2434_1(void) = EnterFunction : +# 2434| mu2434_2(unknown) = AliasedDefinition : +# 2434| mu2434_3(unknown) = InitializeNonLocal : +# 2434| r2434_4(glval) = VariableAddress[x] : +# 2434| mu2434_5(int) = InitializeParameter[x] : &:r2434_4 +# 2435| r2435_1(glval) = VariableAddress[c] : +# 2435| mu2435_2(ClassWithDestructor) = Uninitialized[c] : &:r2435_1 +# 2435| r2435_3(glval) = FunctionAddress[ClassWithDestructor] : +# 2435| v2435_4(void) = Call[ClassWithDestructor] : func:r2435_3, this:r2435_1 +# 2435| mu2435_5(unknown) = ^CallSideEffect : ~m? +# 2435| mu2435_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2435_1 +# 2436| v2436_1(void) = ReThrow : + +# 2434| Block 1 +# 2434| v2434_6(void) = AliasedUse : ~m? +# 2434| v2434_7(void) = ExitFunction : + +# 2434| Block 2 +# 2434| v2434_8(void) = ReturnVoid : +#-----| Goto -> Block 1 + +# 2434| Block 3 +# 2434| v2434_9(void) = Unwind : +#-----| Goto -> Block 1 + +# 2437| Block 4 +# 2437| r2437_1(glval) = VariableAddress[c] : +# 2437| r2437_2(glval) = FunctionAddress[~ClassWithDestructor] : +# 2437| v2437_3(void) = Call[~ClassWithDestructor] : func:r2437_2, this:r2437_1 +# 2437| mu2437_4(unknown) = ^CallSideEffect : ~m? +# 2437| v2437_5(void) = ^IndirectReadSideEffect[-1] : &:r2437_1, ~m? +# 2437| mu2437_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2437_1 + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 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 b93c7d2649f8..20a620812999 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,6 +6,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2436:5:2436:9 | ReThrow: re-throw exception | Instruction 'ReThrow: re-throw exception ' has no successors in function '$@'. | ir.cpp:2434:6:2434:29 | void rethrow_with_destruction(int) | void rethrow_with_destruction(int) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction 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 b93c7d2649f8..20a620812999 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,6 +6,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| ir.cpp:2436:5:2436:9 | ReThrow: re-throw exception | Instruction 'ReThrow: re-throw exception ' has no successors in function '$@'. | ir.cpp:2434:6:2434:29 | void rethrow_with_destruction(int) | void rethrow_with_destruction(int) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction From 180888616bea66ff6ff1e8bb773512d15c311cd7 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 4 Apr 2024 16:02:01 +0100 Subject: [PATCH 13/35] C++: Properly handle the case where a TranslatedElement has no children. --- .../cpp/ir/implementation/raw/internal/TranslatedExpr.qll | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll index 84ab2989e58e..c27cc7770d2d 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll @@ -90,10 +90,9 @@ abstract class TranslatedExpr extends TranslatedElement { final override TranslatedElement getChild(int id) { result = this.getChildInternal(id) or - exists(int maxChildId, int destructorIndex | - maxChildId = max(int childId | exists(this.getChildInternal(childId))) and + exists(int destructorIndex | result = this.getImplicitDestructorCall(destructorIndex) and - id = maxChildId + 1 + destructorIndex + id = this.getFirstDestructorCallIndex() + destructorIndex ) } From 8f11cb64ece4e2f08efd5f7e26007fdba62a9b13 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 4 Apr 2024 16:03:06 +0100 Subject: [PATCH 14/35] C++: Accept test changes. --- .../library-tests/ir/ir/aliased_ir.expected | 41 ++++++++++------ .../ir/ir/aliased_ssa_consistency.expected | 1 - .../aliased_ssa_consistency_unsound.expected | 1 - .../ir/ir/operand_locations.expected | 11 +++++ .../ir/ir/raw_consistency.expected | 2 - .../test/library-tests/ir/ir/raw_ir.expected | 48 +++++++++---------- .../ir/ir/unaliased_ssa_consistency.expected | 1 - ...unaliased_ssa_consistency_unsound.expected | 1 - 8 files changed, 59 insertions(+), 47 deletions(-) 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 650d637f820a..d781221eb91a 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -15903,21 +15903,32 @@ ir.cpp: # 2434| void rethrow_with_destruction(int) # 2434| Block 0 -# 2434| v2434_1(void) = EnterFunction : -# 2434| m2434_2(unknown) = AliasedDefinition : -# 2434| m2434_3(unknown) = InitializeNonLocal : -# 2434| m2434_4(unknown) = Chi : total:m2434_2, partial:m2434_3 -# 2434| r2434_5(glval) = VariableAddress[x] : -# 2434| m2434_6(int) = InitializeParameter[x] : &:r2434_5 -# 2435| r2435_1(glval) = VariableAddress[c] : -# 2435| m2435_2(ClassWithDestructor) = Uninitialized[c] : &:r2435_1 -# 2435| r2435_3(glval) = FunctionAddress[ClassWithDestructor] : -# 2435| v2435_4(void) = Call[ClassWithDestructor] : func:r2435_3, this:r2435_1 -# 2435| m2435_5(unknown) = ^CallSideEffect : ~m2434_4 -# 2435| m2435_6(unknown) = Chi : total:m2434_4, partial:m2435_5 -# 2435| m2435_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2435_1 -# 2435| m2435_8(ClassWithDestructor) = Chi : total:m2435_2, partial:m2435_7 -# 2436| v2436_1(void) = ReThrow : +# 2434| v2434_1(void) = EnterFunction : +# 2434| m2434_2(unknown) = AliasedDefinition : +# 2434| m2434_3(unknown) = InitializeNonLocal : +# 2434| m2434_4(unknown) = Chi : total:m2434_2, partial:m2434_3 +# 2434| r2434_5(glval) = VariableAddress[x] : +# 2434| m2434_6(int) = InitializeParameter[x] : &:r2434_5 +# 2435| r2435_1(glval) = VariableAddress[c] : +# 2435| m2435_2(ClassWithDestructor) = Uninitialized[c] : &:r2435_1 +# 2435| r2435_3(glval) = FunctionAddress[ClassWithDestructor] : +# 2435| v2435_4(void) = Call[ClassWithDestructor] : func:r2435_3, this:r2435_1 +# 2435| m2435_5(unknown) = ^CallSideEffect : ~m2434_4 +# 2435| m2435_6(unknown) = Chi : total:m2434_4, partial:m2435_5 +# 2435| m2435_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2435_1 +# 2435| m2435_8(ClassWithDestructor) = Chi : total:m2435_2, partial:m2435_7 +# 2436| v2436_1(void) = ReThrow : +# 2437| r2437_1(glval) = VariableAddress[c] : +# 2437| r2437_2(glval) = FunctionAddress[~ClassWithDestructor] : +# 2437| v2437_3(void) = Call[~ClassWithDestructor] : func:r2437_2, this:r2437_1 +# 2437| m2437_4(unknown) = ^CallSideEffect : ~m2435_6 +# 2437| m2437_5(unknown) = Chi : total:m2435_6, partial:m2437_4 +# 2437| v2437_6(void) = ^IndirectReadSideEffect[-1] : &:r2437_1, m2435_8 +# 2437| m2437_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2437_1 +# 2437| m2437_8(ClassWithDestructor) = Chi : total:m2435_8, partial:m2437_7 +# 2434| v2434_7(void) = ReturnVoid : +# 2434| v2434_8(void) = AliasedUse : ~m2437_5 +# 2434| v2434_9(void) = ExitFunction : 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 20a620812999..b93c7d2649f8 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:2436:5:2436:9 | ReThrow: re-throw exception | Instruction 'ReThrow: re-throw exception ' has no successors in function '$@'. | ir.cpp:2434:6:2434:29 | void rethrow_with_destruction(int) | void rethrow_with_destruction(int) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction 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 cece30ce4cb4..ef225d8ad6cb 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 @@ -9,7 +9,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:2436:5:2436:9 | ReThrow: re-throw exception | Instruction 'ReThrow: re-throw exception ' has no successors in function '$@'. | ir.cpp:2434:6:2434:29 | void rethrow_with_destruction(int) | void rethrow_with_destruction(int) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction 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 2c24b3e29296..d7527f2b78b1 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -13369,6 +13369,7 @@ | ir.cpp:2431:14:2431:14 | Unary | r2431_2 | | ir.cpp:2434:6:2434:29 | ChiPartial | partial:m2434_3 | | ir.cpp:2434:6:2434:29 | ChiTotal | total:m2434_2 | +| ir.cpp:2434:6:2434:29 | SideEffect | ~m2437_5 | | ir.cpp:2434:35:2434:35 | Address | &:r2434_5 | | ir.cpp:2435:25:2435:25 | Address | &:r2435_1 | | ir.cpp:2435:25:2435:25 | Address | &:r2435_1 | @@ -13379,6 +13380,16 @@ | ir.cpp:2435:25:2435:25 | ChiTotal | total:m2434_4 | | ir.cpp:2435:25:2435:25 | ChiTotal | total:m2435_2 | | ir.cpp:2435:25:2435:25 | SideEffect | ~m2434_4 | +| ir.cpp:2437:1:2437:1 | Address | &:r2437_1 | +| ir.cpp:2437:1:2437:1 | Address | &:r2437_1 | +| ir.cpp:2437:1:2437:1 | Arg(this) | this:r2437_1 | +| ir.cpp:2437:1:2437:1 | CallTarget | func:r2437_2 | +| ir.cpp:2437:1:2437:1 | ChiPartial | partial:m2437_4 | +| ir.cpp:2437:1:2437:1 | ChiPartial | partial:m2437_7 | +| ir.cpp:2437:1:2437:1 | ChiTotal | total:m2435_6 | +| ir.cpp:2437:1:2437:1 | ChiTotal | total:m2435_8 | +| ir.cpp:2437:1:2437:1 | SideEffect | m2435_8 | +| ir.cpp:2437:1:2437:1 | SideEffect | ~m2435_6 | | 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 cf198b5ed7db..904538a00069 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -6,8 +6,6 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ir.cpp:2436:5:2436:9 | ReThrow: re-throw exception | Instruction 'ReThrow: re-throw exception ' has no successors in function '$@'. | ir.cpp:2434:6:2434:29 | void rethrow_with_destruction(int) | void rethrow_with_destruction(int) | -| ir.cpp:2437:1:2437:1 | IndirectMayWriteSideEffect: c | Instruction 'IndirectMayWriteSideEffect: c' has no successors in function '$@'. | ir.cpp:2434:6:2434:29 | void rethrow_with_destruction(int) | void rethrow_with_destruction(int) | 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 6903fd5a64c2..6332cfe8cc7d 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -14646,38 +14646,34 @@ ir.cpp: # 2434| void rethrow_with_destruction(int) # 2434| Block 0 -# 2434| v2434_1(void) = EnterFunction : -# 2434| mu2434_2(unknown) = AliasedDefinition : -# 2434| mu2434_3(unknown) = InitializeNonLocal : -# 2434| r2434_4(glval) = VariableAddress[x] : -# 2434| mu2434_5(int) = InitializeParameter[x] : &:r2434_4 -# 2435| r2435_1(glval) = VariableAddress[c] : -# 2435| mu2435_2(ClassWithDestructor) = Uninitialized[c] : &:r2435_1 -# 2435| r2435_3(glval) = FunctionAddress[ClassWithDestructor] : -# 2435| v2435_4(void) = Call[ClassWithDestructor] : func:r2435_3, this:r2435_1 -# 2435| mu2435_5(unknown) = ^CallSideEffect : ~m? -# 2435| mu2435_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2435_1 -# 2436| v2436_1(void) = ReThrow : - -# 2434| Block 1 -# 2434| v2434_6(void) = AliasedUse : ~m? -# 2434| v2434_7(void) = ExitFunction : - -# 2434| Block 2 -# 2434| v2434_8(void) = ReturnVoid : -#-----| Goto -> Block 1 - -# 2434| Block 3 -# 2434| v2434_9(void) = Unwind : -#-----| Goto -> Block 1 - -# 2437| Block 4 +# 2434| v2434_1(void) = EnterFunction : +# 2434| mu2434_2(unknown) = AliasedDefinition : +# 2434| mu2434_3(unknown) = InitializeNonLocal : +# 2434| r2434_4(glval) = VariableAddress[x] : +# 2434| mu2434_5(int) = InitializeParameter[x] : &:r2434_4 +# 2435| r2435_1(glval) = VariableAddress[c] : +# 2435| mu2435_2(ClassWithDestructor) = Uninitialized[c] : &:r2435_1 +# 2435| r2435_3(glval) = FunctionAddress[ClassWithDestructor] : +# 2435| v2435_4(void) = Call[ClassWithDestructor] : func:r2435_3, this:r2435_1 +# 2435| mu2435_5(unknown) = ^CallSideEffect : ~m? +# 2435| mu2435_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2435_1 +# 2436| v2436_1(void) = ReThrow : # 2437| r2437_1(glval) = VariableAddress[c] : # 2437| r2437_2(glval) = FunctionAddress[~ClassWithDestructor] : # 2437| v2437_3(void) = Call[~ClassWithDestructor] : func:r2437_2, this:r2437_1 # 2437| mu2437_4(unknown) = ^CallSideEffect : ~m? # 2437| v2437_5(void) = ^IndirectReadSideEffect[-1] : &:r2437_1, ~m? # 2437| mu2437_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2437_1 +# 2434| v2434_6(void) = ReturnVoid : +#-----| Goto -> Block 1 + +# 2434| Block 1 +# 2434| v2434_7(void) = AliasedUse : ~m? +# 2434| v2434_8(void) = ExitFunction : + +# 2434| Block 2 +# 2434| v2434_9(void) = Unwind : +#-----| Goto -> Block 1 perf-regression.cpp: # 6| void Big::Big() 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 20a620812999..b93c7d2649f8 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:2436:5:2436:9 | ReThrow: re-throw exception | Instruction 'ReThrow: re-throw exception ' has no successors in function '$@'. | ir.cpp:2434:6:2434:29 | void rethrow_with_destruction(int) | void rethrow_with_destruction(int) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction 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 20a620812999..b93c7d2649f8 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:2436:5:2436:9 | ReThrow: re-throw exception | Instruction 'ReThrow: re-throw exception ' has no successors in function '$@'. | ir.cpp:2434:6:2434:29 | void rethrow_with_destruction(int) | void rethrow_with_destruction(int) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction From 587ae075798ba9a3a4a88911da066febbc6db705 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 4 Apr 2024 16:23:41 +0100 Subject: [PATCH 15/35] C++: Accept query test changes. --- .../CWE-416/IteratorToExpiredContainer.expected | 14 ++++++++++++++ .../query-tests/Security/CWE/CWE-416/test.cpp | 12 ++++++------ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-416/IteratorToExpiredContainer.expected b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-416/IteratorToExpiredContainer.expected index e69de29bb2d1..ed01e4836bac 100644 --- a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-416/IteratorToExpiredContainer.expected +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-416/IteratorToExpiredContainer.expected @@ -0,0 +1,14 @@ +| test.cpp:680:30:680:30 | call to operator[] | This object is destroyed before $@ is called. | test.cpp:680:17:680:17 | call to begin | call to begin | +| test.cpp:680:30:680:30 | call to operator[] | This object is destroyed before $@ is called. | test.cpp:680:17:680:17 | call to end | call to end | +| test.cpp:683:31:683:32 | call to at | This object is destroyed before $@ is called. | test.cpp:683:17:683:17 | call to begin | call to begin | +| test.cpp:683:31:683:32 | call to at | This object is destroyed before $@ is called. | test.cpp:683:17:683:17 | call to end | call to end | +| test.cpp:689:17:689:29 | temporary object | This object is destroyed before $@ is called. | test.cpp:689:31:689:35 | call to begin | call to begin | +| test.cpp:689:46:689:58 | temporary object | This object is destroyed before $@ is called. | test.cpp:689:60:689:62 | call to end | call to end | +| test.cpp:702:27:702:27 | call to operator[] | This object is destroyed before $@ is called. | test.cpp:703:19:703:23 | call to begin | call to begin | +| test.cpp:702:27:702:27 | call to operator[] | This object is destroyed before $@ is called. | test.cpp:703:36:703:38 | call to end | call to end | +| test.cpp:716:36:716:48 | temporary object | This object is destroyed before $@ is called. | test.cpp:716:17:716:17 | call to begin | call to begin | +| test.cpp:716:36:716:48 | temporary object | This object is destroyed before $@ is called. | test.cpp:716:17:716:17 | call to end | call to end | +| test.cpp:727:23:727:23 | call to operator[] | This object is destroyed before $@ is called. | test.cpp:750:17:750:17 | call to begin | call to begin | +| test.cpp:727:23:727:23 | call to operator[] | This object is destroyed before $@ is called. | test.cpp:750:17:750:17 | call to end | call to end | +| test.cpp:735:23:735:23 | call to operator[] | This object is destroyed before $@ is called. | test.cpp:759:17:759:17 | call to begin | call to begin | +| test.cpp:735:23:735:23 | call to operator[] | This object is destroyed before $@ is called. | test.cpp:759:17:759:17 | call to end | call to end | diff --git a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-416/test.cpp b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-416/test.cpp index 4e5fcbd21498..21fc2aba84ff 100644 --- a/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-416/test.cpp +++ b/cpp/ql/test/experimental/query-tests/Security/CWE/CWE-416/test.cpp @@ -677,10 +677,10 @@ std::vector> return_self_by_value(const std::vector& v) { } std::vector& ref_to_first_in_returnValue_1() { - return returnValue()[0]; // BAD [NOT DETECTED] (see *) + return returnValue()[0]; // BAD } std::vector& ref_to_first_in_returnValue_2() { @@ -732,7 +732,7 @@ std::vector& ref_to_first_in_returnValue_2() { } std::vector& ref_to_first_in_returnValue_3() { - return returnValue()[0]; // BAD [NOT DETECTED] (see *) + return returnValue()[0]; // BAD } std::vector first_in_returnValue_1() { From f098b8eb8243c1d35e2e1e3cdf74874826600b35 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 4 Apr 2024 20:01:52 +0100 Subject: [PATCH 16/35] C++: Make sure the edge kind out of a throw is an 'ExceptionEdge' even if destructors are called. --- .../raw/internal/TranslatedElement.qll | 10 +++ .../raw/internal/TranslatedExpr.qll | 90 ++++++++++++++++++- 2 files changed, 96 insertions(+), 4 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 9b0e52c2a464..b0cd33a42d0e 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 @@ -814,6 +814,16 @@ newtype TTranslatedElement = not ignoreSideEffects(expr) and opcode = getCallSideEffectOpcode(expr) } or + // The set of destructors to invoke after a `throw`. These need to be special + // cased because the edge kind following a throw is an `ExceptionEdge`, and + // we need to make sure that the edge kind is still an `ExceptionEdge` after + // all the destructors has run. + TTranslatedDestructorsAfterThrow(ThrowExpr throw) { + exists(DestructorCall dc | + dc = throw.getAnImplicitDestructorCall() and + not ignoreExpr(dc) + ) + } or // A precise side effect of an argument to a `Call` TTranslatedArgumentExprSideEffect(Call call, Expr expr, int n, SideEffectOpcode opcode) { not ignoreExpr(expr) and diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll index c27cc7770d2d..61beb1ab147f 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll @@ -2833,6 +2833,68 @@ class TranslatedReuseExpr extends TranslatedNonConstantExpr { } } +/** + * The IR translation of the destructor calls of the parent `TranslatedThrow`. + * + * This object does not itself generate the destructor calls. Instead, its + * children provide the actual calls, and this object ensures that we correctly + * exit with an `ExceptionEdge` after executing all the destructor calls. + */ +class TranslatedDestructorsAfterThrow extends TranslatedElement, TTranslatedDestructorsAfterThrow { + ThrowExpr throw; + + TranslatedDestructorsAfterThrow() { this = TTranslatedDestructorsAfterThrow(throw) } + + override string toString() { result = "Destructor calls after throw: " + throw } + + private TranslatedCall getTranslatedImplicitDestructorCall(int id) { + result.getExpr() = throw.getImplicitDestructorCall(id) + } + + override Instruction getFirstInstruction(EdgeKind kind) { + result = this.getChild(0).getFirstInstruction(kind) + } + + override ThrowExpr getAst() { result = throw } + + override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { none() } + + override TranslatedElement getChild(int id) { + result = this.getTranslatedImplicitDestructorCall(id) + } + + override predicate handlesDestructorsExplicitly() { any() } + + override Declaration getFunction() { result = throw.getEnclosingFunction() } + + override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { + exists(int id | child = this.getChild(id) | + // Transition to the next child, if any. + result = this.getChild(id + 1).getFirstInstruction(kind) + or + // And otherwise, exit this element with an exceptional edge + not exists(this.getChild(id + 1)) and + kind instanceof ExceptionEdge and + result = this.getParent().getExceptionSuccessorInstruction(any(GotoEdge edge)) + ) + } + + override TranslatedElement getLastChild() { + result = + this.getTranslatedImplicitDestructorCall(max(int id | + exists(throw.getImplicitDestructorCall(id)) + )) + } + + override Instruction getALastInstructionInternal() { + result = this.getLastChild().getALastInstruction() + } + + override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) { + none() + } +} + /** * IR translation of a `throw` expression. */ @@ -2847,13 +2909,22 @@ abstract class TranslatedThrowExpr extends TranslatedNonConstantExpr { override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) { tag = ThrowTag() and - kind instanceof ExceptionEdge and - result = this.getParent().getExceptionSuccessorInstruction(any(GotoEdge edge)) + ( + result = this.getDestructors().getFirstInstruction(kind) + or + not exists(this.getDestructors()) and + kind instanceof ExceptionEdge and + result = this.getParent().getExceptionSuccessorInstruction(any(GotoEdge edge)) + ) } override Instruction getResult() { none() } abstract Opcode getThrowOpcode(); + + override predicate handlesDestructorsExplicitly() { any() } + + TranslatedDestructorsAfterThrow getDestructors() { result.getAst() = expr } } /** @@ -2865,6 +2936,9 @@ class TranslatedThrowValueExpr extends TranslatedThrowExpr, TranslatedVariableIn final override TranslatedElement getChildInternal(int id) { result = TranslatedVariableInitialization.super.getChildInternal(id) + or + id = max(int i | exists(TranslatedVariableInitialization.super.getChildInternal(i))) + 1 and + result = this.getDestructors() } final override Instruction getChildSuccessorInternal(TranslatedElement elem, EdgeKind kind) { @@ -2930,14 +3004,22 @@ class TranslatedThrowValueExpr extends TranslatedThrowExpr, TranslatedVariableIn class TranslatedReThrowExpr extends TranslatedThrowExpr { override ReThrowExpr expr; - override TranslatedElement getChildInternal(int id) { none() } + override TranslatedElement getChildInternal(int id) { + id = 0 and + result = this.getDestructors() + } override Instruction getFirstInstruction(EdgeKind kind) { result = this.getInstruction(ThrowTag()) and kind instanceof GotoEdge } - override Instruction getALastInstructionInternal() { result = this.getInstruction(ThrowTag()) } + override Instruction getALastInstructionInternal() { + result = this.getDestructors().getALastInstruction() + or + not this.hasAnImplicitDestructorCall() and + result = this.getInstruction(ThrowTag()) + } override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) { none() } From b6ddb97e40099df42c1c4ea4f954458f074b0a6d Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 4 Apr 2024 20:02:02 +0100 Subject: [PATCH 17/35] C++: Accept test changes. --- .../library-tests/ir/ir/aliased_ir.expected | 217 +++++++++-------- .../ir/ir/operand_locations.expected | 87 +++++-- .../ir/ir/raw_consistency.expected | 1 - .../test/library-tests/ir/ir/raw_ir.expected | 219 ++++++++---------- .../aliased_ssa_consistency.expected | 2 +- .../syntax-zoo/raw_consistency.expected | 2 +- .../unaliased_ssa_consistency.expected | 2 +- 7 files changed, 292 insertions(+), 238 deletions(-) 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 d781221eb91a..2becff3237c0 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -1088,7 +1088,7 @@ destructors_for_temps.cpp: #-----| True -> Block 3 # 42| Block 1 -# 42| m42_7(unknown) = Phi : from 2:~m45_22, from 4:~m47_6 +# 42| m42_7(unknown) = Phi : from 2:~m47_5, from 4:~m47_14 # 42| v42_8(void) = AliasedUse : ~m42_7 # 42| v42_9(void) = ExitFunction : @@ -1097,44 +1097,60 @@ destructors_for_temps.cpp: #-----| Goto -> Block 1 # 45| Block 3 -# 45| r45_1(glval) = VariableAddress[#throw45:7] : -# 45| m45_2(ClassWithConstructor) = Uninitialized[#throw45:7] : &:r45_1 -# 45| r45_3(glval) = FunctionAddress[ClassWithConstructor] : -# 45| r45_4(char) = Constant[120] : -# 45| r45_5(glval) = VariableAddress[#temp45:39] : -# 45| m45_6(ClassWithDestructor2) = Uninitialized[#temp45:39] : &:r45_5 -# 45| r45_7(glval) = FunctionAddress[ClassWithDestructor2] : -# 45| v45_8(void) = Call[ClassWithDestructor2] : func:r45_7, this:r45_5 -# 45| m45_9(unknown) = ^CallSideEffect : ~m43_6 -# 45| m45_10(unknown) = Chi : total:m43_6, partial:m45_9 -# 45| m45_11(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r45_5 -# 45| m45_12(ClassWithDestructor2) = Chi : total:m45_6, partial:m45_11 -# 45| r45_13(glval) = FunctionAddress[get_x] : -# 45| r45_14(char) = Call[get_x] : func:r45_13, this:r45_5 -# 45| m45_15(unknown) = ^CallSideEffect : ~m45_10 -# 45| m45_16(unknown) = Chi : total:m45_10, partial:m45_15 -# 45| v45_17(void) = ^IndirectReadSideEffect[-1] : &:r45_5, m45_12 -# 45| m45_18(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r45_5 -# 45| m45_19(ClassWithDestructor2) = Chi : total:m45_12, partial:m45_18 -# 45| v45_20(void) = Call[ClassWithConstructor] : func:r45_3, this:r45_1, 0:r45_4, 1:r45_14 -# 45| m45_21(unknown) = ^CallSideEffect : ~m45_16 -# 45| m45_22(unknown) = Chi : total:m45_16, partial:m45_21 -# 45| m45_23(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r45_1 -# 45| m45_24(ClassWithConstructor) = Chi : total:m45_2, partial:m45_23 -# 45| v45_25(void) = ThrowValue : &:r45_1, m45_24 +# 45| r45_1(glval) = VariableAddress[#throw45:7] : +# 45| m45_2(ClassWithConstructor) = Uninitialized[#throw45:7] : &:r45_1 +# 45| r45_3(glval) = FunctionAddress[ClassWithConstructor] : +# 45| r45_4(char) = Constant[120] : +# 45| r45_5(glval) = VariableAddress[#temp45:39] : +# 45| m45_6(ClassWithDestructor2) = Uninitialized[#temp45:39] : &:r45_5 +# 45| r45_7(glval) = FunctionAddress[ClassWithDestructor2] : +# 45| v45_8(void) = Call[ClassWithDestructor2] : func:r45_7, this:r45_5 +# 45| m45_9(unknown) = ^CallSideEffect : ~m43_6 +# 45| m45_10(unknown) = Chi : total:m43_6, partial:m45_9 +# 45| m45_11(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r45_5 +# 45| m45_12(ClassWithDestructor2) = Chi : total:m45_6, partial:m45_11 +# 45| r45_13(glval) = FunctionAddress[get_x] : +# 45| r45_14(char) = Call[get_x] : func:r45_13, this:r45_5 +# 45| m45_15(unknown) = ^CallSideEffect : ~m45_10 +# 45| m45_16(unknown) = Chi : total:m45_10, partial:m45_15 +# 45| v45_17(void) = ^IndirectReadSideEffect[-1] : &:r45_5, m45_12 +# 45| m45_18(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r45_5 +# 45| m45_19(ClassWithDestructor2) = Chi : total:m45_12, partial:m45_18 +# 45| v45_20(void) = Call[ClassWithConstructor] : func:r45_3, this:r45_1, 0:r45_4, 1:r45_14 +# 45| m45_21(unknown) = ^CallSideEffect : ~m45_16 +# 45| m45_22(unknown) = Chi : total:m45_16, partial:m45_21 +# 45| m45_23(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r45_1 +# 45| m45_24(ClassWithConstructor) = Chi : total:m45_2, partial:m45_23 +# 45| v45_25(void) = ThrowValue : &:r45_1, m45_24 +# 45| r45_26(glval) = CopyValue : r45_5 +# 45| r45_27(glval) = FunctionAddress[~ClassWithDestructor2] : +# 45| v45_28(void) = Call[~ClassWithDestructor2] : func:r45_27, this:r45_26 +# 45| m45_29(unknown) = ^CallSideEffect : ~m45_22 +# 45| m45_30(unknown) = Chi : total:m45_22, partial:m45_29 +# 45| v45_31(void) = ^IndirectReadSideEffect[-1] : &:r45_26, m45_19 +# 45| m45_32(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r45_26 +# 45| m45_33(ClassWithDestructor2) = Chi : total:m45_19, partial:m45_32 +# 47| r47_1(glval) = VariableAddress[c] : +# 47| r47_2(glval) = FunctionAddress[~ClassWithDestructor2] : +# 47| v47_3(void) = Call[~ClassWithDestructor2] : func:r47_2, this:r47_1 +# 47| m47_4(unknown) = ^CallSideEffect : ~m45_30 +# 47| m47_5(unknown) = Chi : total:m45_30, partial:m47_4 +# 47| v47_6(void) = ^IndirectReadSideEffect[-1] : &:r47_1, m43_8 +# 47| m47_7(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r47_1 +# 47| m47_8(ClassWithDestructor2) = Chi : total:m43_8, partial:m47_7 #-----| Exception -> Block 2 # 47| Block 4 -# 47| v47_1(void) = NoOp : -# 47| r47_2(glval) = VariableAddress[c] : -# 47| r47_3(glval) = FunctionAddress[~ClassWithDestructor2] : -# 47| v47_4(void) = Call[~ClassWithDestructor2] : func:r47_3, this:r47_2 -# 47| m47_5(unknown) = ^CallSideEffect : ~m43_6 -# 47| m47_6(unknown) = Chi : total:m43_6, partial:m47_5 -# 47| v47_7(void) = ^IndirectReadSideEffect[-1] : &:r47_2, m43_8 -# 47| m47_8(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r47_2 -# 47| m47_9(ClassWithDestructor2) = Chi : total:m43_8, partial:m47_8 -# 42| v42_11(void) = ReturnVoid : +# 47| v47_9(void) = NoOp : +# 47| r47_10(glval) = VariableAddress[c] : +# 47| r47_11(glval) = FunctionAddress[~ClassWithDestructor2] : +# 47| v47_12(void) = Call[~ClassWithDestructor2] : func:r47_11, this:r47_10 +# 47| m47_13(unknown) = ^CallSideEffect : ~m43_6 +# 47| m47_14(unknown) = Chi : total:m43_6, partial:m47_13 +# 47| v47_15(void) = ^IndirectReadSideEffect[-1] : &:r47_10, m43_8 +# 47| m47_16(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r47_10 +# 47| m47_17(ClassWithDestructor2) = Chi : total:m43_8, partial:m47_16 +# 42| v42_11(void) = ReturnVoid : #-----| Goto -> Block 1 # 49| void temp_test7(bool) @@ -1161,7 +1177,7 @@ destructors_for_temps.cpp: #-----| True -> Block 3 # 49| Block 1 -# 49| m49_7(unknown) = Phi : from 2:~m51_26, from 4:~m52_6 +# 49| m49_7(unknown) = Phi : from 2:~m52_5, from 4:~m52_14 # 49| v49_8(void) = AliasedUse : ~m49_7 # 49| v49_9(void) = ExitFunction : @@ -1170,31 +1186,39 @@ destructors_for_temps.cpp: #-----| Goto -> Block 1 # 51| Block 3 -# 51| r51_5(glval) = VariableAddress[#throw51:9] : -# 51| m51_6(ClassWithConstructor) = Uninitialized[#throw51:9] : &:r51_5 -# 51| r51_7(glval) = FunctionAddress[ClassWithConstructor] : -# 51| r51_8(char) = Constant[120] : -# 51| r51_9(glval) = VariableAddress[#temp51:41] : -# 51| m51_10(ClassWithDestructor2) = Uninitialized[#temp51:41] : &:r51_9 -# 51| r51_11(glval) = FunctionAddress[ClassWithDestructor2] : -# 51| v51_12(void) = Call[ClassWithDestructor2] : func:r51_11, this:r51_9 -# 51| m51_13(unknown) = ^CallSideEffect : ~m50_6 -# 51| m51_14(unknown) = Chi : total:m50_6, partial:m51_13 -# 51| m51_15(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_9 -# 51| m51_16(ClassWithDestructor2) = Chi : total:m51_10, partial:m51_15 -# 51| r51_17(glval) = FunctionAddress[get_x] : -# 51| r51_18(char) = Call[get_x] : func:r51_17, this:r51_9 -# 51| m51_19(unknown) = ^CallSideEffect : ~m51_14 -# 51| m51_20(unknown) = Chi : total:m51_14, partial:m51_19 -# 51| v51_21(void) = ^IndirectReadSideEffect[-1] : &:r51_9, m51_16 -# 51| m51_22(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_9 -# 51| m51_23(ClassWithDestructor2) = Chi : total:m51_16, partial:m51_22 -# 51| v51_24(void) = Call[ClassWithConstructor] : func:r51_7, this:r51_5, 0:r51_8, 1:r51_18 -# 51| m51_25(unknown) = ^CallSideEffect : ~m51_20 -# 51| m51_26(unknown) = Chi : total:m51_20, partial:m51_25 -# 51| m51_27(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r51_5 -# 51| m51_28(ClassWithConstructor) = Chi : total:m51_6, partial:m51_27 -# 51| v51_29(void) = ThrowValue : &:r51_5, m51_28 +# 51| r51_5(glval) = VariableAddress[#throw51:9] : +# 51| m51_6(ClassWithConstructor) = Uninitialized[#throw51:9] : &:r51_5 +# 51| r51_7(glval) = FunctionAddress[ClassWithConstructor] : +# 51| r51_8(char) = Constant[120] : +# 51| r51_9(glval) = VariableAddress[#temp51:41] : +# 51| m51_10(ClassWithDestructor2) = Uninitialized[#temp51:41] : &:r51_9 +# 51| r51_11(glval) = FunctionAddress[ClassWithDestructor2] : +# 51| v51_12(void) = Call[ClassWithDestructor2] : func:r51_11, this:r51_9 +# 51| m51_13(unknown) = ^CallSideEffect : ~m50_6 +# 51| m51_14(unknown) = Chi : total:m50_6, partial:m51_13 +# 51| m51_15(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_9 +# 51| m51_16(ClassWithDestructor2) = Chi : total:m51_10, partial:m51_15 +# 51| r51_17(glval) = FunctionAddress[get_x] : +# 51| r51_18(char) = Call[get_x] : func:r51_17, this:r51_9 +# 51| m51_19(unknown) = ^CallSideEffect : ~m51_14 +# 51| m51_20(unknown) = Chi : total:m51_14, partial:m51_19 +# 51| v51_21(void) = ^IndirectReadSideEffect[-1] : &:r51_9, m51_16 +# 51| m51_22(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_9 +# 51| m51_23(ClassWithDestructor2) = Chi : total:m51_16, partial:m51_22 +# 51| v51_24(void) = Call[ClassWithConstructor] : func:r51_7, this:r51_5, 0:r51_8, 1:r51_18 +# 51| m51_25(unknown) = ^CallSideEffect : ~m51_20 +# 51| m51_26(unknown) = Chi : total:m51_20, partial:m51_25 +# 51| m51_27(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r51_5 +# 51| m51_28(ClassWithConstructor) = Chi : total:m51_6, partial:m51_27 +# 51| v51_29(void) = ThrowValue : &:r51_5, m51_28 +# 52| r52_1(glval) = VariableAddress[c] : +# 52| r52_2(glval) = FunctionAddress[~ClassWithDestructor2] : +# 52| v52_3(void) = Call[~ClassWithDestructor2] : func:r52_2, this:r52_1 +# 52| m52_4(unknown) = ^CallSideEffect : ~m51_26 +# 52| m52_5(unknown) = Chi : total:m51_26, partial:m52_4 +# 52| v52_6(void) = ^IndirectReadSideEffect[-1] : &:r52_1, m50_8 +# 52| m52_7(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r52_1 +# 52| m52_8(ClassWithDestructor2) = Chi : total:m50_8, partial:m52_7 #-----| Exception -> Block 2 # 51| Block 4 @@ -1212,15 +1236,15 @@ destructors_for_temps.cpp: # 51| r51_41(glval) = VariableAddress[#temp51:5] : # 51| r51_42(ClassWithDestructor2) = Load[#temp51:5] : &:r51_41, m51_40 # 51| m51_43(ClassWithDestructor2) = Store[#temp51:5] : &:r51_1, r51_42 -# 52| v52_1(void) = NoOp : -# 52| r52_2(glval) = VariableAddress[c] : -# 52| r52_3(glval) = FunctionAddress[~ClassWithDestructor2] : -# 52| v52_4(void) = Call[~ClassWithDestructor2] : func:r52_3, this:r52_2 -# 52| m52_5(unknown) = ^CallSideEffect : ~m51_35 -# 52| m52_6(unknown) = Chi : total:m51_35, partial:m52_5 -# 52| v52_7(void) = ^IndirectReadSideEffect[-1] : &:r52_2, m50_8 -# 52| m52_8(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r52_2 -# 52| m52_9(ClassWithDestructor2) = Chi : total:m50_8, partial:m52_8 +# 52| v52_9(void) = NoOp : +# 52| r52_10(glval) = VariableAddress[c] : +# 52| r52_11(glval) = FunctionAddress[~ClassWithDestructor2] : +# 52| v52_12(void) = Call[~ClassWithDestructor2] : func:r52_11, this:r52_10 +# 52| m52_13(unknown) = ^CallSideEffect : ~m51_35 +# 52| m52_14(unknown) = Chi : total:m51_35, partial:m52_13 +# 52| v52_15(void) = ^IndirectReadSideEffect[-1] : &:r52_10, m50_8 +# 52| m52_16(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r52_10 +# 52| m52_17(ClassWithDestructor2) = Chi : total:m50_8, partial:m52_16 # 49| v49_11(void) = ReturnVoid : #-----| Goto -> Block 1 @@ -14652,7 +14676,7 @@ ir.cpp: # 2273| v2273_9(void) = ExitFunction : # 2273| Block 2 -# 2273| m2273_10(unknown) = Phi : from 6:~m2282_8, from 9:~m2275_6 +# 2273| m2273_10(unknown) = Phi : from 6:~m2282_8, from 9:~m2280_5 # 2273| v2273_11(void) = Unwind : #-----| Goto -> Block 1 @@ -14662,6 +14686,14 @@ ir.cpp: # 2277| r2277_3(char *) = Convert : r2277_2 # 2277| m2277_4(char *) = Store[#throw2277:7] : &:r2277_1, r2277_3 # 2277| v2277_5(void) = ThrowValue : &:r2277_1, m2277_4 +# 2280| r2280_1(glval) = VariableAddress[s] : +# 2280| r2280_2(glval) = FunctionAddress[~String] : +# 2280| v2280_3(void) = Call[~String] : func:r2280_2, this:r2280_1 +# 2280| m2280_4(unknown) = ^CallSideEffect : ~m2275_6 +# 2280| m2280_5(unknown) = Chi : total:m2275_6, partial:m2280_4 +# 2280| v2280_6(void) = ^IndirectReadSideEffect[-1] : &:r2280_1, m2275_8 +# 2280| m2280_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2280_1 +# 2280| m2280_8(String) = Chi : total:m2275_8, partial:m2280_7 #-----| Exception -> Block 5 # 2279| Block 4 @@ -14673,22 +14705,22 @@ ir.cpp: # 2279| m2279_6(unknown) = Chi : total:m2275_6, partial:m2279_5 # 2279| m2279_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2279_1 # 2279| m2279_8(String) = Chi : total:m2279_2, partial:m2279_7 -# 2280| r2280_1(glval) = VariableAddress[s2] : -# 2280| r2280_2(glval) = FunctionAddress[~String] : -# 2280| v2280_3(void) = Call[~String] : func:r2280_2, this:r2280_1 -# 2280| m2280_4(unknown) = ^CallSideEffect : ~m2279_6 -# 2280| m2280_5(unknown) = Chi : total:m2279_6, partial:m2280_4 -# 2280| v2280_6(void) = ^IndirectReadSideEffect[-1] : &:r2280_1, m2279_8 -# 2280| m2280_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2280_1 -# 2280| m2280_8(String) = Chi : total:m2279_8, partial:m2280_7 -# 2280| r2280_9(glval) = VariableAddress[s] : +# 2280| r2280_9(glval) = VariableAddress[s2] : # 2280| r2280_10(glval) = FunctionAddress[~String] : # 2280| v2280_11(void) = Call[~String] : func:r2280_10, this:r2280_9 -# 2280| m2280_12(unknown) = ^CallSideEffect : ~m2280_5 -# 2280| m2280_13(unknown) = Chi : total:m2280_5, partial:m2280_12 -# 2280| v2280_14(void) = ^IndirectReadSideEffect[-1] : &:r2280_9, m2275_8 +# 2280| m2280_12(unknown) = ^CallSideEffect : ~m2279_6 +# 2280| m2280_13(unknown) = Chi : total:m2279_6, partial:m2280_12 +# 2280| v2280_14(void) = ^IndirectReadSideEffect[-1] : &:r2280_9, m2279_8 # 2280| m2280_15(String) = ^IndirectMayWriteSideEffect[-1] : &:r2280_9 -# 2280| m2280_16(String) = Chi : total:m2275_8, partial:m2280_15 +# 2280| m2280_16(String) = Chi : total:m2279_8, partial:m2280_15 +# 2280| r2280_17(glval) = VariableAddress[s] : +# 2280| r2280_18(glval) = FunctionAddress[~String] : +# 2280| v2280_19(void) = Call[~String] : func:r2280_18, this:r2280_17 +# 2280| m2280_20(unknown) = ^CallSideEffect : ~m2280_13 +# 2280| m2280_21(unknown) = Chi : total:m2280_13, partial:m2280_20 +# 2280| v2280_22(void) = ^IndirectReadSideEffect[-1] : &:r2280_17, m2275_8 +# 2280| m2280_23(String) = ^IndirectMayWriteSideEffect[-1] : &:r2280_17 +# 2280| m2280_24(String) = Chi : total:m2275_8, partial:m2280_23 #-----| Goto -> Block 10 # 2281| Block 5 @@ -14707,8 +14739,8 @@ ir.cpp: # 2282| r2282_4(glval) = VariableAddress[s] : # 2282| r2282_5(char *) = Load[s] : &:r2282_4, m2281_3 # 2282| v2282_6(void) = Call[String] : func:r2282_3, this:r2282_1, 0:r2282_5 -# 2282| m2282_7(unknown) = ^CallSideEffect : ~m2275_6 -# 2282| m2282_8(unknown) = Chi : total:m2275_6, partial:m2282_7 +# 2282| m2282_7(unknown) = ^CallSideEffect : ~m2280_5 +# 2282| m2282_8(unknown) = Chi : total:m2280_5, partial:m2282_7 # 2282| v2282_9(void) = ^BufferReadSideEffect[0] : &:r2282_5, ~m2281_5 # 2282| m2282_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r2282_1 # 2282| m2282_11(String) = Chi : total:m2282_2, partial:m2282_10 @@ -14734,7 +14766,7 @@ ir.cpp: #-----| Exception -> Block 2 # 2289| Block 10 -# 2289| m2289_1(unknown) = Phi : from 4:~m2280_13, from 8:~m2275_6 +# 2289| m2289_1(unknown) = Phi : from 4:~m2280_21, from 8:~m2280_5 # 2289| v2289_2(void) = NoOp : # 2273| v2273_12(void) = ReturnVoid : #-----| Goto -> Block 1 @@ -15926,9 +15958,12 @@ ir.cpp: # 2437| v2437_6(void) = ^IndirectReadSideEffect[-1] : &:r2437_1, m2435_8 # 2437| m2437_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2437_1 # 2437| m2437_8(ClassWithDestructor) = Chi : total:m2435_8, partial:m2437_7 -# 2434| v2434_7(void) = ReturnVoid : -# 2434| v2434_8(void) = AliasedUse : ~m2437_5 -# 2434| v2434_9(void) = ExitFunction : +#-----| Exception -> Block 1 + +# 2434| Block 1 +# 2434| v2434_7(void) = Unwind : +# 2434| v2434_8(void) = AliasedUse : ~m2437_5 +# 2434| v2434_9(void) = ExitFunction : perf-regression.cpp: # 6| void Big::Big() 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 d7527f2b78b1..e9d74dc6d18d 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -979,8 +979,8 @@ | destructors_for_temps.cpp:39:32:39:53 | StoreValue | r39_37 | | destructors_for_temps.cpp:42:6:42:15 | ChiPartial | partial:m42_3 | | destructors_for_temps.cpp:42:6:42:15 | ChiTotal | total:m42_2 | -| destructors_for_temps.cpp:42:6:42:15 | Phi | from 2:~m45_22 | -| destructors_for_temps.cpp:42:6:42:15 | Phi | from 4:~m47_6 | +| destructors_for_temps.cpp:42:6:42:15 | Phi | from 2:~m47_5 | +| destructors_for_temps.cpp:42:6:42:15 | Phi | from 4:~m47_14 | | destructors_for_temps.cpp:42:6:42:15 | SideEffect | ~m42_7 | | destructors_for_temps.cpp:42:22:42:22 | Address | &:r42_5 | | destructors_for_temps.cpp:43:26:43:26 | Address | &:r43_1 | @@ -1011,36 +1011,57 @@ | destructors_for_temps.cpp:45:39:45:60 | Address | &:r45_5 | | destructors_for_temps.cpp:45:39:45:60 | Address | &:r45_5 | | destructors_for_temps.cpp:45:39:45:60 | Address | &:r45_5 | +| destructors_for_temps.cpp:45:39:45:60 | Address | &:r45_26 | +| destructors_for_temps.cpp:45:39:45:60 | Address | &:r45_26 | | destructors_for_temps.cpp:45:39:45:60 | Arg(this) | this:r45_5 | | destructors_for_temps.cpp:45:39:45:60 | Arg(this) | this:r45_5 | +| destructors_for_temps.cpp:45:39:45:60 | Arg(this) | this:r45_26 | | destructors_for_temps.cpp:45:39:45:60 | CallTarget | func:r45_7 | +| destructors_for_temps.cpp:45:39:45:60 | CallTarget | func:r45_27 | | destructors_for_temps.cpp:45:39:45:60 | ChiPartial | partial:m45_9 | | destructors_for_temps.cpp:45:39:45:60 | ChiPartial | partial:m45_11 | | destructors_for_temps.cpp:45:39:45:60 | ChiPartial | partial:m45_18 | +| destructors_for_temps.cpp:45:39:45:60 | ChiPartial | partial:m45_29 | +| destructors_for_temps.cpp:45:39:45:60 | ChiPartial | partial:m45_32 | | destructors_for_temps.cpp:45:39:45:60 | ChiTotal | total:m43_6 | | destructors_for_temps.cpp:45:39:45:60 | ChiTotal | total:m45_6 | | destructors_for_temps.cpp:45:39:45:60 | ChiTotal | total:m45_12 | +| destructors_for_temps.cpp:45:39:45:60 | ChiTotal | total:m45_19 | +| destructors_for_temps.cpp:45:39:45:60 | ChiTotal | total:m45_22 | | destructors_for_temps.cpp:45:39:45:60 | SideEffect | m45_12 | +| destructors_for_temps.cpp:45:39:45:60 | SideEffect | m45_19 | | destructors_for_temps.cpp:45:39:45:60 | SideEffect | ~m43_6 | +| destructors_for_temps.cpp:45:39:45:60 | SideEffect | ~m45_22 | +| destructors_for_temps.cpp:45:39:45:60 | Unary | r45_5 | | destructors_for_temps.cpp:45:62:45:66 | Arg(1) | 1:r45_14 | | destructors_for_temps.cpp:45:62:45:66 | CallTarget | func:r45_13 | | destructors_for_temps.cpp:45:62:45:66 | ChiPartial | partial:m45_15 | | destructors_for_temps.cpp:45:62:45:66 | ChiTotal | total:m45_10 | | destructors_for_temps.cpp:45:62:45:66 | SideEffect | ~m45_10 | -| destructors_for_temps.cpp:47:1:47:1 | Address | &:r47_2 | -| destructors_for_temps.cpp:47:1:47:1 | Address | &:r47_2 | -| destructors_for_temps.cpp:47:1:47:1 | Arg(this) | this:r47_2 | -| destructors_for_temps.cpp:47:1:47:1 | CallTarget | func:r47_3 | -| destructors_for_temps.cpp:47:1:47:1 | ChiPartial | partial:m47_5 | -| destructors_for_temps.cpp:47:1:47:1 | ChiPartial | partial:m47_8 | +| destructors_for_temps.cpp:47:1:47:1 | Address | &:r47_1 | +| destructors_for_temps.cpp:47:1:47:1 | Address | &:r47_1 | +| destructors_for_temps.cpp:47:1:47:1 | Address | &:r47_10 | +| destructors_for_temps.cpp:47:1:47:1 | Address | &:r47_10 | +| destructors_for_temps.cpp:47:1:47:1 | Arg(this) | this:r47_1 | +| destructors_for_temps.cpp:47:1:47:1 | Arg(this) | this:r47_10 | +| destructors_for_temps.cpp:47:1:47:1 | CallTarget | func:r47_2 | +| destructors_for_temps.cpp:47:1:47:1 | CallTarget | func:r47_11 | +| destructors_for_temps.cpp:47:1:47:1 | ChiPartial | partial:m47_4 | +| destructors_for_temps.cpp:47:1:47:1 | ChiPartial | partial:m47_7 | +| destructors_for_temps.cpp:47:1:47:1 | ChiPartial | partial:m47_13 | +| destructors_for_temps.cpp:47:1:47:1 | ChiPartial | partial:m47_16 | | destructors_for_temps.cpp:47:1:47:1 | ChiTotal | total:m43_6 | | destructors_for_temps.cpp:47:1:47:1 | ChiTotal | total:m43_8 | +| destructors_for_temps.cpp:47:1:47:1 | ChiTotal | total:m43_8 | +| destructors_for_temps.cpp:47:1:47:1 | ChiTotal | total:m45_30 | +| destructors_for_temps.cpp:47:1:47:1 | SideEffect | m43_8 | | destructors_for_temps.cpp:47:1:47:1 | SideEffect | m43_8 | | destructors_for_temps.cpp:47:1:47:1 | SideEffect | ~m43_6 | +| destructors_for_temps.cpp:47:1:47:1 | SideEffect | ~m45_30 | | destructors_for_temps.cpp:49:6:49:15 | ChiPartial | partial:m49_3 | | destructors_for_temps.cpp:49:6:49:15 | ChiTotal | total:m49_2 | -| destructors_for_temps.cpp:49:6:49:15 | Phi | from 2:~m51_26 | -| destructors_for_temps.cpp:49:6:49:15 | Phi | from 4:~m52_6 | +| destructors_for_temps.cpp:49:6:49:15 | Phi | from 2:~m52_5 | +| destructors_for_temps.cpp:49:6:49:15 | Phi | from 4:~m52_14 | | destructors_for_temps.cpp:49:6:49:15 | SideEffect | ~m49_7 | | destructors_for_temps.cpp:49:22:49:22 | Address | &:r49_5 | | destructors_for_temps.cpp:50:26:50:26 | Address | &:r50_1 | @@ -1104,15 +1125,25 @@ | destructors_for_temps.cpp:51:75:51:96 | Load | m51_37 | | destructors_for_temps.cpp:51:75:51:96 | SideEffect | ~m50_6 | | destructors_for_temps.cpp:51:75:51:96 | StoreValue | r51_38 | -| destructors_for_temps.cpp:52:1:52:1 | Address | &:r52_2 | -| destructors_for_temps.cpp:52:1:52:1 | Address | &:r52_2 | -| destructors_for_temps.cpp:52:1:52:1 | Arg(this) | this:r52_2 | -| destructors_for_temps.cpp:52:1:52:1 | CallTarget | func:r52_3 | -| destructors_for_temps.cpp:52:1:52:1 | ChiPartial | partial:m52_5 | -| destructors_for_temps.cpp:52:1:52:1 | ChiPartial | partial:m52_8 | +| destructors_for_temps.cpp:52:1:52:1 | Address | &:r52_1 | +| destructors_for_temps.cpp:52:1:52:1 | Address | &:r52_1 | +| destructors_for_temps.cpp:52:1:52:1 | Address | &:r52_10 | +| destructors_for_temps.cpp:52:1:52:1 | Address | &:r52_10 | +| destructors_for_temps.cpp:52:1:52:1 | Arg(this) | this:r52_1 | +| destructors_for_temps.cpp:52:1:52:1 | Arg(this) | this:r52_10 | +| destructors_for_temps.cpp:52:1:52:1 | CallTarget | func:r52_2 | +| destructors_for_temps.cpp:52:1:52:1 | CallTarget | func:r52_11 | +| destructors_for_temps.cpp:52:1:52:1 | ChiPartial | partial:m52_4 | +| destructors_for_temps.cpp:52:1:52:1 | ChiPartial | partial:m52_7 | +| destructors_for_temps.cpp:52:1:52:1 | ChiPartial | partial:m52_13 | +| destructors_for_temps.cpp:52:1:52:1 | ChiPartial | partial:m52_16 | +| destructors_for_temps.cpp:52:1:52:1 | ChiTotal | total:m50_8 | | destructors_for_temps.cpp:52:1:52:1 | ChiTotal | total:m50_8 | +| destructors_for_temps.cpp:52:1:52:1 | ChiTotal | total:m51_26 | | destructors_for_temps.cpp:52:1:52:1 | ChiTotal | total:m51_35 | | destructors_for_temps.cpp:52:1:52:1 | SideEffect | m50_8 | +| destructors_for_temps.cpp:52:1:52:1 | SideEffect | m50_8 | +| destructors_for_temps.cpp:52:1:52:1 | SideEffect | ~m51_26 | | destructors_for_temps.cpp:52:1:52:1 | SideEffect | ~m51_35 | | destructors_for_temps.cpp:54:6:54:15 | ChiPartial | partial:m54_3 | | destructors_for_temps.cpp:54:6:54:15 | ChiTotal | total:m54_2 | @@ -12258,7 +12289,7 @@ | ir.cpp:2273:6:2273:24 | ChiTotal | total:m2273_2 | | ir.cpp:2273:6:2273:24 | Phi | from 2:~m2273_10 | | ir.cpp:2273:6:2273:24 | Phi | from 6:~m2282_8 | -| ir.cpp:2273:6:2273:24 | Phi | from 9:~m2275_6 | +| ir.cpp:2273:6:2273:24 | Phi | from 9:~m2280_5 | | ir.cpp:2273:6:2273:24 | Phi | from 10:~m2289_1 | | ir.cpp:2273:6:2273:24 | SideEffect | ~m2273_7 | | ir.cpp:2273:31:2273:31 | Address | &:r2273_5 | @@ -12292,22 +12323,32 @@ | ir.cpp:2280:3:2280:3 | Address | &:r2280_1 | | ir.cpp:2280:3:2280:3 | Address | &:r2280_9 | | ir.cpp:2280:3:2280:3 | Address | &:r2280_9 | +| ir.cpp:2280:3:2280:3 | Address | &:r2280_17 | +| ir.cpp:2280:3:2280:3 | Address | &:r2280_17 | | ir.cpp:2280:3:2280:3 | Arg(this) | this:r2280_1 | | ir.cpp:2280:3:2280:3 | Arg(this) | this:r2280_9 | +| ir.cpp:2280:3:2280:3 | Arg(this) | this:r2280_17 | | ir.cpp:2280:3:2280:3 | CallTarget | func:r2280_2 | | ir.cpp:2280:3:2280:3 | CallTarget | func:r2280_10 | +| ir.cpp:2280:3:2280:3 | CallTarget | func:r2280_18 | | ir.cpp:2280:3:2280:3 | ChiPartial | partial:m2280_4 | | ir.cpp:2280:3:2280:3 | ChiPartial | partial:m2280_7 | | ir.cpp:2280:3:2280:3 | ChiPartial | partial:m2280_12 | | ir.cpp:2280:3:2280:3 | ChiPartial | partial:m2280_15 | +| ir.cpp:2280:3:2280:3 | ChiPartial | partial:m2280_20 | +| ir.cpp:2280:3:2280:3 | ChiPartial | partial:m2280_23 | +| ir.cpp:2280:3:2280:3 | ChiTotal | total:m2275_6 | +| ir.cpp:2280:3:2280:3 | ChiTotal | total:m2275_8 | | ir.cpp:2280:3:2280:3 | ChiTotal | total:m2275_8 | | ir.cpp:2280:3:2280:3 | ChiTotal | total:m2279_6 | | ir.cpp:2280:3:2280:3 | ChiTotal | total:m2279_8 | -| ir.cpp:2280:3:2280:3 | ChiTotal | total:m2280_5 | +| ir.cpp:2280:3:2280:3 | ChiTotal | total:m2280_13 | +| ir.cpp:2280:3:2280:3 | SideEffect | m2275_8 | | ir.cpp:2280:3:2280:3 | SideEffect | m2275_8 | | ir.cpp:2280:3:2280:3 | SideEffect | m2279_8 | +| ir.cpp:2280:3:2280:3 | SideEffect | ~m2275_6 | | ir.cpp:2280:3:2280:3 | SideEffect | ~m2279_6 | -| ir.cpp:2280:3:2280:3 | SideEffect | ~m2280_5 | +| ir.cpp:2280:3:2280:3 | SideEffect | ~m2280_13 | | ir.cpp:2281:22:2281:22 | Address | &:r2281_2 | | ir.cpp:2281:22:2281:22 | Address | &:r2281_2 | | ir.cpp:2281:22:2281:22 | Address | &:r2281_4 | @@ -12319,10 +12360,10 @@ | ir.cpp:2282:5:2282:19 | CallTarget | func:r2282_3 | | ir.cpp:2282:5:2282:19 | ChiPartial | partial:m2282_7 | | ir.cpp:2282:5:2282:19 | ChiPartial | partial:m2282_10 | -| ir.cpp:2282:5:2282:19 | ChiTotal | total:m2275_6 | +| ir.cpp:2282:5:2282:19 | ChiTotal | total:m2280_5 | | ir.cpp:2282:5:2282:19 | ChiTotal | total:m2282_2 | | ir.cpp:2282:5:2282:19 | Load | m2282_11 | -| ir.cpp:2282:5:2282:19 | SideEffect | ~m2275_6 | +| ir.cpp:2282:5:2282:19 | SideEffect | ~m2280_5 | | ir.cpp:2282:18:2282:18 | Address | &:r2282_4 | | ir.cpp:2282:18:2282:18 | Address | &:r2282_5 | | ir.cpp:2282:18:2282:18 | Arg(0) | 0:r2282_5 | @@ -12332,8 +12373,8 @@ | ir.cpp:2284:24:2284:24 | Address | &:r2284_2 | | ir.cpp:2284:24:2284:24 | Address | &:r2284_4 | | ir.cpp:2284:24:2284:24 | Load | m2284_3 | -| ir.cpp:2289:1:2289:1 | Phi | from 4:~m2280_13 | -| ir.cpp:2289:1:2289:1 | Phi | from 8:~m2275_6 | +| ir.cpp:2289:1:2289:1 | Phi | from 4:~m2280_21 | +| ir.cpp:2289:1:2289:1 | Phi | from 8:~m2280_5 | | ir.cpp:2291:6:2291:18 | ChiPartial | partial:m2291_3 | | ir.cpp:2291:6:2291:18 | ChiTotal | total:m2291_2 | | ir.cpp:2291:6:2291:18 | SideEffect | ~m2299_14 | 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 904538a00069..356390f9b4ff 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -20,7 +20,6 @@ multipleIRTypes lostReachability backEdgeCountMismatch useNotDominatedByDefinition -| destructors_for_temps.cpp:45:39:45:60 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:42:6:42:15 | void temp_test6(bool) | void temp_test6(bool) | | ir.cpp:1535:8:1535:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1535:8:1535:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | 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 6332cfe8cc7d..2f1d82001972 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -1008,7 +1008,7 @@ destructors_for_temps.cpp: # 44| r44_1(glval) = VariableAddress[b] : # 44| r44_2(bool) = Load[b] : &:r44_1, ~m? # 44| v44_3(void) = ConditionalBranch : r44_2 -#-----| False -> Block 5 +#-----| False -> Block 4 #-----| True -> Block 3 # 42| Block 1 @@ -1020,28 +1020,25 @@ destructors_for_temps.cpp: #-----| Goto -> Block 1 # 45| Block 3 -# 45| r45_1(glval) = VariableAddress[#throw45:7] : -# 45| mu45_2(ClassWithConstructor) = Uninitialized[#throw45:7] : &:r45_1 -# 45| r45_3(glval) = FunctionAddress[ClassWithConstructor] : -# 45| r45_4(char) = Constant[120] : -# 45| r45_5(glval) = VariableAddress[#temp45:39] : -# 45| mu45_6(ClassWithDestructor2) = Uninitialized[#temp45:39] : &:r45_5 -# 45| r45_7(glval) = FunctionAddress[ClassWithDestructor2] : -# 45| v45_8(void) = Call[ClassWithDestructor2] : func:r45_7, this:r45_5 -# 45| mu45_9(unknown) = ^CallSideEffect : ~m? -# 45| mu45_10(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r45_5 -# 45| r45_11(glval) = FunctionAddress[get_x] : -# 45| r45_12(char) = Call[get_x] : func:r45_11, this:r45_5 -# 45| mu45_13(unknown) = ^CallSideEffect : ~m? -# 45| v45_14(void) = ^IndirectReadSideEffect[-1] : &:r45_5, ~m? -# 45| mu45_15(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r45_5 -# 45| v45_16(void) = Call[ClassWithConstructor] : func:r45_3, this:r45_1, 0:r45_4, 1:r45_12 -# 45| mu45_17(unknown) = ^CallSideEffect : ~m? -# 45| mu45_18(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r45_1 -# 45| v45_19(void) = ThrowValue : &:r45_1, ~m? -#-----| Exception -> Block 2 - -# 45| Block 4 +# 45| r45_1(glval) = VariableAddress[#throw45:7] : +# 45| mu45_2(ClassWithConstructor) = Uninitialized[#throw45:7] : &:r45_1 +# 45| r45_3(glval) = FunctionAddress[ClassWithConstructor] : +# 45| r45_4(char) = Constant[120] : +# 45| r45_5(glval) = VariableAddress[#temp45:39] : +# 45| mu45_6(ClassWithDestructor2) = Uninitialized[#temp45:39] : &:r45_5 +# 45| r45_7(glval) = FunctionAddress[ClassWithDestructor2] : +# 45| v45_8(void) = Call[ClassWithDestructor2] : func:r45_7, this:r45_5 +# 45| mu45_9(unknown) = ^CallSideEffect : ~m? +# 45| mu45_10(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r45_5 +# 45| r45_11(glval) = FunctionAddress[get_x] : +# 45| r45_12(char) = Call[get_x] : func:r45_11, this:r45_5 +# 45| mu45_13(unknown) = ^CallSideEffect : ~m? +# 45| v45_14(void) = ^IndirectReadSideEffect[-1] : &:r45_5, ~m? +# 45| mu45_15(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r45_5 +# 45| v45_16(void) = Call[ClassWithConstructor] : func:r45_3, this:r45_1, 0:r45_4, 1:r45_12 +# 45| mu45_17(unknown) = ^CallSideEffect : ~m? +# 45| mu45_18(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r45_1 +# 45| v45_19(void) = ThrowValue : &:r45_1, ~m? # 45| r45_20(glval) = CopyValue : r45_5 # 45| r45_21(glval) = FunctionAddress[~ClassWithDestructor2] : # 45| v45_22(void) = Call[~ClassWithDestructor2] : func:r45_21, this:r45_20 @@ -1054,9 +1051,9 @@ destructors_for_temps.cpp: # 47| mu47_4(unknown) = ^CallSideEffect : ~m? # 47| v47_5(void) = ^IndirectReadSideEffect[-1] : &:r47_1, ~m? # 47| mu47_6(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r47_1 -#-----| Goto -> Block 5 +#-----| Exception -> Block 2 -# 47| Block 5 +# 47| Block 4 # 47| v47_7(void) = NoOp : # 47| r47_8(glval) = VariableAddress[c] : # 47| r47_9(glval) = FunctionAddress[~ClassWithDestructor2] : @@ -1084,8 +1081,8 @@ destructors_for_temps.cpp: # 51| r51_2(glval) = VariableAddress[b] : # 51| r51_3(bool) = Load[b] : &:r51_2, ~m? # 51| v51_4(void) = ConditionalBranch : r51_3 -#-----| False -> Block 6 -#-----| True -> Block 4 +#-----| False -> Block 4 +#-----| True -> Block 3 # 49| Block 1 # 49| v49_6(void) = AliasedUse : ~m? @@ -1096,61 +1093,55 @@ destructors_for_temps.cpp: #-----| Goto -> Block 1 # 51| Block 3 -# 51| r51_5(ClassWithDestructor2) = Load[#temp51:5] : &:r51_35, ~m? -# 51| mu51_6(ClassWithDestructor2) = Store[#temp51:5] : &:r51_1, r51_5 -# 52| v52_1(void) = NoOp : -# 52| r52_2(glval) = VariableAddress[c] : -# 52| r52_3(glval) = FunctionAddress[~ClassWithDestructor2] : -# 52| v52_4(void) = Call[~ClassWithDestructor2] : func:r52_3, this:r52_2 -# 52| mu52_5(unknown) = ^CallSideEffect : ~m? -# 52| v52_6(void) = ^IndirectReadSideEffect[-1] : &:r52_2, ~m? -# 52| mu52_7(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r52_2 -# 49| v49_9(void) = ReturnVoid : -#-----| Goto -> Block 1 - -# 51| Block 4 -# 51| r51_7(glval) = VariableAddress[#throw51:9] : -# 51| mu51_8(ClassWithConstructor) = Uninitialized[#throw51:9] : &:r51_7 -# 51| r51_9(glval) = FunctionAddress[ClassWithConstructor] : -# 51| r51_10(char) = Constant[120] : -# 51| r51_11(glval) = VariableAddress[#temp51:41] : -# 51| mu51_12(ClassWithDestructor2) = Uninitialized[#temp51:41] : &:r51_11 -# 51| r51_13(glval) = FunctionAddress[ClassWithDestructor2] : -# 51| v51_14(void) = Call[ClassWithDestructor2] : func:r51_13, this:r51_11 -# 51| mu51_15(unknown) = ^CallSideEffect : ~m? -# 51| mu51_16(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_11 -# 51| r51_17(glval) = FunctionAddress[get_x] : -# 51| r51_18(char) = Call[get_x] : func:r51_17, this:r51_11 -# 51| mu51_19(unknown) = ^CallSideEffect : ~m? -# 51| v51_20(void) = ^IndirectReadSideEffect[-1] : &:r51_11, ~m? -# 51| mu51_21(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_11 -# 51| v51_22(void) = Call[ClassWithConstructor] : func:r51_9, this:r51_7, 0:r51_10, 1:r51_18 -# 51| mu51_23(unknown) = ^CallSideEffect : ~m? -# 51| mu51_24(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r51_7 -# 51| v51_25(void) = ThrowValue : &:r51_7, ~m? +# 51| r51_5(glval) = VariableAddress[#throw51:9] : +# 51| mu51_6(ClassWithConstructor) = Uninitialized[#throw51:9] : &:r51_5 +# 51| r51_7(glval) = FunctionAddress[ClassWithConstructor] : +# 51| r51_8(char) = Constant[120] : +# 51| r51_9(glval) = VariableAddress[#temp51:41] : +# 51| mu51_10(ClassWithDestructor2) = Uninitialized[#temp51:41] : &:r51_9 +# 51| r51_11(glval) = FunctionAddress[ClassWithDestructor2] : +# 51| v51_12(void) = Call[ClassWithDestructor2] : func:r51_11, this:r51_9 +# 51| mu51_13(unknown) = ^CallSideEffect : ~m? +# 51| mu51_14(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_9 +# 51| r51_15(glval) = FunctionAddress[get_x] : +# 51| r51_16(char) = Call[get_x] : func:r51_15, this:r51_9 +# 51| mu51_17(unknown) = ^CallSideEffect : ~m? +# 51| v51_18(void) = ^IndirectReadSideEffect[-1] : &:r51_9, ~m? +# 51| mu51_19(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_9 +# 51| v51_20(void) = Call[ClassWithConstructor] : func:r51_7, this:r51_5, 0:r51_8, 1:r51_16 +# 51| mu51_21(unknown) = ^CallSideEffect : ~m? +# 51| mu51_22(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r51_5 +# 51| v51_23(void) = ThrowValue : &:r51_5, ~m? +# 52| r52_1(glval) = VariableAddress[c] : +# 52| r52_2(glval) = FunctionAddress[~ClassWithDestructor2] : +# 52| v52_3(void) = Call[~ClassWithDestructor2] : func:r52_2, this:r52_1 +# 52| mu52_4(unknown) = ^CallSideEffect : ~m? +# 52| v52_5(void) = ^IndirectReadSideEffect[-1] : &:r52_1, ~m? +# 52| mu52_6(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r52_1 #-----| Exception -> Block 2 -# 52| Block 5 -# 52| r52_8(glval) = VariableAddress[c] : -# 52| r52_9(glval) = FunctionAddress[~ClassWithDestructor2] : -# 52| v52_10(void) = Call[~ClassWithDestructor2] : func:r52_9, this:r52_8 -# 52| mu52_11(unknown) = ^CallSideEffect : ~m? -# 52| v52_12(void) = ^IndirectReadSideEffect[-1] : &:r52_8, ~m? -# 52| mu52_13(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r52_8 -#-----| Goto -> Block 3 - -# 51| Block 6 -# 51| r51_26(glval) = VariableAddress[#temp51:75] : -# 51| mu51_27(ClassWithDestructor2) = Uninitialized[#temp51:75] : &:r51_26 -# 51| r51_28(glval) = FunctionAddress[ClassWithDestructor2] : -# 51| v51_29(void) = Call[ClassWithDestructor2] : func:r51_28, this:r51_26 -# 51| mu51_30(unknown) = ^CallSideEffect : ~m? -# 51| mu51_31(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_26 -# 51| r51_32(ClassWithDestructor2) = Load[#temp51:75] : &:r51_26, ~m? -# 51| r51_33(glval) = VariableAddress[#temp51:5] : -# 51| mu51_34(ClassWithDestructor2) = Store[#temp51:5] : &:r51_33, r51_32 -# 51| r51_35(glval) = VariableAddress[#temp51:5] : -#-----| Goto -> Block 3 +# 51| Block 4 +# 51| r51_24(glval) = VariableAddress[#temp51:75] : +# 51| mu51_25(ClassWithDestructor2) = Uninitialized[#temp51:75] : &:r51_24 +# 51| r51_26(glval) = FunctionAddress[ClassWithDestructor2] : +# 51| v51_27(void) = Call[ClassWithDestructor2] : func:r51_26, this:r51_24 +# 51| mu51_28(unknown) = ^CallSideEffect : ~m? +# 51| mu51_29(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r51_24 +# 51| r51_30(ClassWithDestructor2) = Load[#temp51:75] : &:r51_24, ~m? +# 51| r51_31(glval) = VariableAddress[#temp51:5] : +# 51| mu51_32(ClassWithDestructor2) = Store[#temp51:5] : &:r51_31, r51_30 +# 51| r51_33(glval) = VariableAddress[#temp51:5] : +# 51| r51_34(ClassWithDestructor2) = Load[#temp51:5] : &:r51_33, ~m? +# 51| mu51_35(ClassWithDestructor2) = Store[#temp51:5] : &:r51_1, r51_34 +# 52| v52_7(void) = NoOp : +# 52| r52_8(glval) = VariableAddress[c] : +# 52| r52_9(glval) = FunctionAddress[~ClassWithDestructor2] : +# 52| v52_10(void) = Call[~ClassWithDestructor2] : func:r52_9, this:r52_8 +# 52| mu52_11(unknown) = ^CallSideEffect : ~m? +# 52| v52_12(void) = ^IndirectReadSideEffect[-1] : &:r52_8, ~m? +# 52| mu52_13(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r52_8 +# 49| v49_9(void) = ReturnVoid : +#-----| Goto -> Block 1 # 54| void temp_test8(bool) # 54| Block 0 @@ -1194,7 +1185,6 @@ destructors_for_temps.cpp: # 55| mu55_21(unknown) = ^CallSideEffect : ~m? # 55| mu55_22(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r55_5 # 55| v55_23(void) = ThrowValue : &:r55_5, ~m? -#-----| Exception -> Block 2 # 55| Block 4 # 55| r55_24(glval) = VariableAddress[#temp55:75] : @@ -1249,7 +1239,6 @@ destructors_for_temps.cpp: # 59| mu59_15(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r59_5 # 59| mu59_16(char) = Store[#throw59:9] : &:r59_4, r59_12 # 59| v59_17(void) = ThrowValue : &:r59_4, ~m? -#-----| Exception -> Block 2 # 59| Block 4 # 59| r59_18(char) = Constant[97] : @@ -4629,7 +4618,6 @@ ir.cpp: # 728| r728_3(char *) = Convert : r728_2 # 728| mu728_4(char *) = Store[#throw728:7] : &:r728_1, r728_3 # 728| v728_5(void) = ThrowValue : &:r728_1, ~m? -#-----| Exception -> Block 9 # 730| Block 4 # 730| r730_1(glval) = VariableAddress[x] : @@ -4668,7 +4656,6 @@ ir.cpp: # 731| v731_18(void) = ^BufferReadSideEffect[0] : &:r731_15, ~m? # 731| mu731_19(String) = ^IndirectMayWriteSideEffect[-1] : &:r731_11 # 731| v731_20(void) = ThrowValue : &:r731_11, ~m? -#-----| Exception -> Block 9 # 733| Block 8 # 733| r733_1(int) = Constant[7] : @@ -4696,7 +4683,6 @@ ir.cpp: # 736| v736_8(void) = ^BufferReadSideEffect[0] : &:r736_5, ~m? # 736| mu736_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r736_1 # 736| v736_10(void) = ThrowValue : &:r736_1, ~m? -#-----| Exception -> Block 2 # 738| Block 11 # 738| v738_1(void) = CatchByType[const String &] : @@ -4714,7 +4700,6 @@ ir.cpp: # 740| Block 13 # 740| v740_1(void) = CatchAny : # 741| v741_1(void) = ReThrow : -#-----| Exception -> Block 2 # 743| Block 14 # 743| v743_1(void) = NoOp : @@ -7305,7 +7290,6 @@ ir.cpp: # 1195| r1195_3(char *) = Convert : r1195_2 # 1195| mu1195_4(char *) = Store[#throw1195:7] : &:r1195_1, r1195_3 # 1195| v1195_5(void) = ThrowValue : &:r1195_1, ~m? -#-----| Exception -> Block 9 # 1197| Block 4 # 1197| r1197_1(glval) = VariableAddress[x] : @@ -7344,7 +7328,6 @@ ir.cpp: # 1198| v1198_18(void) = ^BufferReadSideEffect[0] : &:r1198_15, ~m? # 1198| mu1198_19(String) = ^IndirectMayWriteSideEffect[-1] : &:r1198_11 # 1198| v1198_20(void) = ThrowValue : &:r1198_11, ~m? -#-----| Exception -> Block 9 # 1200| Block 8 # 1200| r1200_1(int) = Constant[7] : @@ -7372,7 +7355,6 @@ ir.cpp: # 1203| v1203_8(void) = ^BufferReadSideEffect[0] : &:r1203_5, ~m? # 1203| mu1203_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r1203_1 # 1203| v1203_10(void) = ThrowValue : &:r1203_1, ~m? -#-----| Exception -> Block 2 # 1205| Block 11 # 1205| v1205_1(void) = CatchByType[const String &] : @@ -13569,7 +13551,7 @@ ir.cpp: # 2276| r2276_1(glval) = VariableAddress[b] : # 2276| r2276_2(bool) = Load[b] : &:r2276_1, ~m? # 2276| v2276_3(void) = ConditionalBranch : r2276_2 -#-----| False -> Block 5 +#-----| False -> Block 4 #-----| True -> Block 3 # 2273| Block 1 @@ -13586,18 +13568,15 @@ ir.cpp: # 2277| r2277_3(char *) = Convert : r2277_2 # 2277| mu2277_4(char *) = Store[#throw2277:7] : &:r2277_1, r2277_3 # 2277| v2277_5(void) = ThrowValue : &:r2277_1, ~m? -#-----| Exception -> Block 6 - -# 2280| Block 4 -# 2280| r2280_1(glval) = VariableAddress[s] : -# 2280| r2280_2(glval) = FunctionAddress[~String] : -# 2280| v2280_3(void) = Call[~String] : func:r2280_2, this:r2280_1 -# 2280| mu2280_4(unknown) = ^CallSideEffect : ~m? -# 2280| v2280_5(void) = ^IndirectReadSideEffect[-1] : &:r2280_1, ~m? -# 2280| mu2280_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2280_1 -#-----| Goto -> Block 5 +# 2280| r2280_1(glval) = VariableAddress[s] : +# 2280| r2280_2(glval) = FunctionAddress[~String] : +# 2280| v2280_3(void) = Call[~String] : func:r2280_2, this:r2280_1 +# 2280| mu2280_4(unknown) = ^CallSideEffect : ~m? +# 2280| v2280_5(void) = ^IndirectReadSideEffect[-1] : &:r2280_1, ~m? +# 2280| mu2280_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2280_1 +#-----| Exception -> Block 5 -# 2279| Block 5 +# 2279| Block 4 # 2279| r2279_1(glval) = VariableAddress[s2] : # 2279| mu2279_2(String) = Uninitialized[s2] : &:r2279_1 # 2279| r2279_3(glval) = FunctionAddress[String] : @@ -13616,14 +13595,14 @@ ir.cpp: # 2280| mu2280_16(unknown) = ^CallSideEffect : ~m? # 2280| v2280_17(void) = ^IndirectReadSideEffect[-1] : &:r2280_13, ~m? # 2280| mu2280_18(String) = ^IndirectMayWriteSideEffect[-1] : &:r2280_13 -#-----| Goto -> Block 11 +#-----| Goto -> Block 10 -# 2281| Block 6 +# 2281| Block 5 # 2281| v2281_1(void) = CatchByType[const char *] : -#-----| Exception -> Block 8 -#-----| Goto -> Block 7 +#-----| Exception -> Block 7 +#-----| Goto -> Block 6 -# 2281| Block 7 +# 2281| Block 6 # 2281| r2281_2(glval) = VariableAddress[s] : # 2281| mu2281_3(char *) = InitializeParameter[s] : &:r2281_2 # 2281| r2281_4(char *) = Load[s] : &:r2281_2, ~m? @@ -13638,27 +13617,25 @@ ir.cpp: # 2282| v2282_8(void) = ^BufferReadSideEffect[0] : &:r2282_5, ~m? # 2282| mu2282_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r2282_1 # 2282| v2282_10(void) = ThrowValue : &:r2282_1, ~m? -#-----| Exception -> Block 2 -# 2284| Block 8 +# 2284| Block 7 # 2284| v2284_1(void) = CatchByType[const String &] : -#-----| Exception -> Block 10 -#-----| Goto -> Block 9 +#-----| Exception -> Block 9 +#-----| Goto -> Block 8 -# 2284| Block 9 +# 2284| Block 8 # 2284| r2284_2(glval) = VariableAddress[e] : # 2284| mu2284_3(String &) = InitializeParameter[e] : &:r2284_2 # 2284| r2284_4(String &) = Load[e] : &:r2284_2, ~m? # 2284| mu2284_5(unknown) = InitializeIndirection[e] : &:r2284_4 # 2284| v2284_6(void) = NoOp : -#-----| Goto -> Block 11 +#-----| Goto -> Block 10 -# 2286| Block 10 +# 2286| Block 9 # 2286| v2286_1(void) = CatchAny : # 2287| v2287_1(void) = ReThrow : -#-----| Exception -> Block 2 -# 2289| Block 11 +# 2289| Block 10 # 2289| v2289_1(void) = NoOp : # 2273| v2273_9(void) = ReturnVoid : #-----| Goto -> Block 1 @@ -14664,14 +14641,17 @@ ir.cpp: # 2437| mu2437_4(unknown) = ^CallSideEffect : ~m? # 2437| v2437_5(void) = ^IndirectReadSideEffect[-1] : &:r2437_1, ~m? # 2437| mu2437_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2437_1 -# 2434| v2434_6(void) = ReturnVoid : -#-----| Goto -> Block 1 +#-----| Exception -> Block 3 # 2434| Block 1 -# 2434| v2434_7(void) = AliasedUse : ~m? -# 2434| v2434_8(void) = ExitFunction : +# 2434| v2434_6(void) = AliasedUse : ~m? +# 2434| v2434_7(void) = ExitFunction : # 2434| Block 2 +# 2434| v2434_8(void) = ReturnVoid : +#-----| Goto -> Block 1 + +# 2434| Block 3 # 2434| v2434_9(void) = Unwind : #-----| Goto -> Block 1 @@ -15497,7 +15477,6 @@ try_except.cpp: # 48| r48_2(int) = Constant[1] : # 48| mu48_3(int) = Store[#throw48:13] : &:r48_1, r48_2 # 48| v48_4(void) = ThrowValue : &:r48_1, ~m? -#-----| Exception -> Block 7 # 51| Block 4 # 51| r51_1(int) = Constant[0] : diff --git a/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected index 48f73fa8d87c..064c06f91025 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/aliased_ssa_consistency.expected @@ -7,7 +7,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ms_try_mix.cpp:35:13:35:19 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:29:6:29:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | +| ms_try_mix.cpp:38:5:38:5 | Chi: c106 | Instruction 'Chi: c106' has no successors in function '$@'. | ms_try_mix.cpp:29:6:29:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | | ms_try_mix.cpp:53:5:53:11 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:49:6:49:28 | void ms_empty_finally_at_end() | void ms_empty_finally_at_end() | | stmt_expr.cpp:27:5:27:15 | Store: ... = ... | Instruction 'Store: ... = ...' has no successors in function '$@'. | stmt_expr.cpp:21:13:21:13 | void stmtexpr::g(int) | void stmtexpr::g(int) | ambiguousSuccessors diff --git a/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected index 9c9cad3aefb7..484e95869445 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/raw_consistency.expected @@ -8,7 +8,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ms_try_mix.cpp:35:13:35:19 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:29:6:29:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | +| ms_try_mix.cpp:38:5:38:5 | IndirectMayWriteSideEffect: c106 | Instruction 'IndirectMayWriteSideEffect: c106' has no successors in function '$@'. | ms_try_mix.cpp:29:6:29:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | | ms_try_mix.cpp:53:5:53:11 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:49:6:49:28 | void ms_empty_finally_at_end() | void ms_empty_finally_at_end() | | stmt_expr.cpp:27:5:27:15 | Store: ... = ... | Instruction 'Store: ... = ...' has no successors in function '$@'. | stmt_expr.cpp:21:13:21:13 | void stmtexpr::g(int) | void stmtexpr::g(int) | | stmt_expr.cpp:29:11:32:11 | CopyValue: (statement expression) | Instruction 'CopyValue: (statement expression)' has no successors in function '$@'. | stmt_expr.cpp:21:13:21:13 | void stmtexpr::g(int) | void stmtexpr::g(int) | diff --git a/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected index 48f73fa8d87c..c4d1fc89735c 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/unaliased_ssa_consistency.expected @@ -7,7 +7,7 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor -| ms_try_mix.cpp:35:13:35:19 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:29:6:29:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | +| ms_try_mix.cpp:38:5:38:5 | IndirectMayWriteSideEffect: c106 | Instruction 'IndirectMayWriteSideEffect: c106' has no successors in function '$@'. | ms_try_mix.cpp:29:6:29:19 | void ms_finally_mix(int) | void ms_finally_mix(int) | | ms_try_mix.cpp:53:5:53:11 | ThrowValue: throw ... | Instruction 'ThrowValue: throw ...' has no successors in function '$@'. | ms_try_mix.cpp:49:6:49:28 | void ms_empty_finally_at_end() | void ms_empty_finally_at_end() | | stmt_expr.cpp:27:5:27:15 | Store: ... = ... | Instruction 'Store: ... = ...' has no successors in function '$@'. | stmt_expr.cpp:21:13:21:13 | void stmtexpr::g(int) | void stmtexpr::g(int) | ambiguousSuccessors From e63a607eb3480b0647522d8e2240b4dfb50f92c9 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 5 Apr 2024 09:41:50 +0100 Subject: [PATCH 18/35] C++: Add another test with conditional construction. --- .../library-tests/ir/ir/PrintAST.expected | 55 ++++++++++++++ .../library-tests/ir/ir/aliased_ir.expected | 71 ++++++++++++++++++ .../ir/ir/aliased_ssa_consistency.expected | 1 + .../aliased_ssa_consistency_unsound.expected | 2 + .../ir/ir/destructors_for_temps.cpp | 13 ++++ .../ir/ir/operand_locations.expected | 59 +++++++++++++++ .../ir/ir/raw_consistency.expected | 1 + .../test/library-tests/ir/ir/raw_ir.expected | 72 +++++++++++++++++++ .../ir/ir/unaliased_ssa_consistency.expected | 1 + ...unaliased_ssa_consistency_unsound.expected | 1 + 10 files changed, 276 insertions(+) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 40f40c3d0c5f..e9e58ec9d9b7 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -2221,6 +2221,61 @@ destructors_for_temps.cpp: # 59| Type = [Class] ClassWithDestructor2 # 59| ValueCategory = xvalue # 60| getStmt(1): [ReturnStmt] return ... +# 62| [CopyAssignmentOperator] string& string::operator=(string const&) +# 62| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const string & +# 62| [CopyConstructor] void string::string(string const&) +# 62| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const string & +# 64| [Constructor] void string::string(char const*) +# 64| : +# 64| getParameter(0): [Parameter] (unnamed parameter 0) +# 64| Type = [PointerType] const char * +# 65| [Destructor] void string::~string() +# 65| : +# 68| [TopLevelFunction] bool const_ref_string(string const&) +# 68| : +# 68| getParameter(0): [Parameter] (unnamed parameter 0) +# 68| Type = [LValueReferenceType] const string & +# 70| [TopLevelFunction] bool conditional_temp_via_conjunction(bool) +# 70| : +# 70| getParameter(0): [Parameter] b +# 70| Type = [BoolType] bool +# 71| getEntryPoint(): [BlockStmt] { ... } +# 72| getStmt(0): [ReturnStmt] return ... +# 72| getExpr(): [LogicalAndExpr] ... && ... +# 72| Type = [BoolType] bool +# 72| ValueCategory = prvalue +# 72| getLeftOperand(): [VariableAccess] b +# 72| Type = [BoolType] bool +# 72| ValueCategory = prvalue(load) +# 72| getRightOperand(): [FunctionCall] call to const_ref_string +# 72| Type = [BoolType] bool +# 72| ValueCategory = prvalue +# 72| getArgument(0): [ConstructorCall] call to string +# 72| Type = [VoidType] void +# 72| ValueCategory = prvalue +# 72| getArgument(0): +# 72| Type = [ArrayType] const char[1] +# 72| Value = [StringLiteral] "" +# 72| ValueCategory = lvalue +# 72| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 72| Type = [PointerType] const char * +# 72| ValueCategory = prvalue +# 72| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to) +# 72| Type = [LValueReferenceType] const string & +# 72| ValueCategory = prvalue +# 72| getExpr(): [TemporaryObjectExpr] temporary object +# 72| Type = [SpecifiedType] const string +# 72| ValueCategory = lvalue +# 72| getImplicitDestructorCall(0): [DestructorCall] call to ~string +# 72| Type = [VoidType] void +# 72| ValueCategory = prvalue +# 72| getQualifier(): [ReuseExpr] reuse of temporary object +# 72| Type = [SpecifiedType] const string +# 72| ValueCategory = xvalue ir.c: # 5| [TopLevelFunction] int getX(MyCoords*) # 5| : 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 2becff3237c0..3bf488f073fc 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -1373,6 +1373,77 @@ destructors_for_temps.cpp: # 58| v58_11(void) = ReturnVoid : #-----| Goto -> Block 1 +# 70| bool conditional_temp_via_conjunction(bool) +# 70| Block 0 +# 70| v70_1(void) = EnterFunction : +# 70| m70_2(unknown) = AliasedDefinition : +# 70| m70_3(unknown) = InitializeNonLocal : +# 70| m70_4(unknown) = Chi : total:m70_2, partial:m70_3 +# 70| r70_5(glval) = VariableAddress[b] : +# 70| m70_6(bool) = InitializeParameter[b] : &:r70_5 +# 72| r72_1(glval) = VariableAddress[#return] : +# 72| r72_2(glval) = VariableAddress[b] : +# 72| r72_3(bool) = Load[b] : &:r72_2, m70_6 +# 72| v72_4(void) = ConditionalBranch : r72_3 +#-----| False -> Block 1 +#-----| True -> Block 4 + +# 72| Block 1 +# 72| m72_5(string) = Phi : from 4:m72_38 +# 72| m72_6(unknown) = Phi : from 0:~m70_4, from 4:~m72_42 +# 72| r72_7(glval) = VariableAddress[#temp72:12] : +# 72| r72_8(bool) = Constant[0] : +# 72| m72_9(bool) = Store[#temp72:12] : &:r72_7, r72_8 +#-----| Goto -> Block 2 + +# 72| Block 2 +# 72| m72_10(string) = Phi : from 1:m72_5, from 3:m72_38 +# 72| m72_11(unknown) = Phi : from 1:~m72_6, from 3:~m72_42 +# 72| m72_12(bool) = Phi : from 1:m72_9, from 3:m72_26 +# 72| r72_13(glval) = VariableAddress[#temp72:12] : +# 72| r72_14(bool) = Load[#temp72:12] : &:r72_13, m72_12 +# 72| r72_15(glval) = CopyValue : r72_28 +# 72| r72_16(glval) = FunctionAddress[~string] : +# 72| v72_17(void) = Call[~string] : func:r72_16, this:r72_15 +# 72| m72_18(unknown) = ^CallSideEffect : ~m72_11 +# 72| m72_19(unknown) = Chi : total:m72_11, partial:m72_18 +# 72| v72_20(void) = ^IndirectReadSideEffect[-1] : &:r72_15, m72_10 +# 72| m72_21(string) = ^IndirectMayWriteSideEffect[-1] : &:r72_15 +# 72| m72_22(string) = Chi : total:m72_10, partial:m72_21 +# 72| m72_23(bool) = Store[#return] : &:r72_1, r72_14 +# 70| r70_7(glval) = VariableAddress[#return] : +# 70| v70_8(void) = ReturnValue : &:r70_7, m72_23 +# 70| v70_9(void) = AliasedUse : ~m72_19 +# 70| v70_10(void) = ExitFunction : + +# 72| Block 3 +# 72| r72_24(glval) = VariableAddress[#temp72:12] : +# 72| r72_25(bool) = Constant[1] : +# 72| m72_26(bool) = Store[#temp72:12] : &:r72_24, r72_25 +#-----| Goto -> Block 2 + +# 72| Block 4 +# 72| r72_27(glval) = FunctionAddress[const_ref_string] : +# 72| r72_28(glval) = VariableAddress[#temp72:34] : +# 72| m72_29(string) = Uninitialized[#temp72:34] : &:r72_28 +# 72| r72_30(glval) = FunctionAddress[string] : +# 72| r72_31(glval) = StringConstant[""] : +# 72| r72_32(char *) = Convert : r72_31 +# 72| v72_33(void) = Call[string] : func:r72_30, this:r72_28, 0:r72_32 +# 72| m72_34(unknown) = ^CallSideEffect : ~m70_4 +# 72| m72_35(unknown) = Chi : total:m70_4, partial:m72_34 +# 72| v72_36(void) = ^BufferReadSideEffect[0] : &:r72_32, ~m70_3 +# 72| m72_37(string) = ^IndirectMayWriteSideEffect[-1] : &:r72_28 +# 72| m72_38(string) = Chi : total:m72_29, partial:m72_37 +# 72| r72_39(string &) = CopyValue : r72_28 +# 72| r72_40(bool) = Call[const_ref_string] : func:r72_27, 0:r72_39 +# 72| m72_41(unknown) = ^CallSideEffect : ~m72_35 +# 72| m72_42(unknown) = Chi : total:m72_35, partial:m72_41 +# 72| v72_43(void) = ^BufferReadSideEffect[0] : &:r72_39, ~m72_38 +# 72| v72_44(void) = ConditionalBranch : r72_40 +#-----| False -> Block 1 +#-----| True -> Block 3 + ir.c: # 7| void MyCoordsTest(int) # 7| Block 0 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 b93c7d2649f8..a85ba6b93894 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 @@ -20,6 +20,7 @@ multipleIRTypes lostReachability backEdgeCountMismatch useNotDominatedByDefinition +| destructors_for_temps.cpp:72:34:72:35 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:70:6:70:37 | bool conditional_temp_via_conjunction(bool) | bool conditional_temp_via_conjunction(bool) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 ef225d8ad6cb..3897a1ad6281 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 @@ -2,6 +2,7 @@ missingOperand unexpectedOperand duplicateOperand missingPhiOperand +| destructors_for_temps.cpp:72:12:72:36 | Phi: ... && ... | Instruction 'Phi: ... && ...' is missing an operand for predecessor block 'EnterFunction: conditional_temp_via_conjunction' in function '$@'. | destructors_for_temps.cpp:70:6:70:37 | bool conditional_temp_via_conjunction(bool) | bool conditional_temp_via_conjunction(bool) | missingOperandType | destructors_for_temps.cpp:39:3:39:53 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | destructors_for_temps.cpp:38:6:38:15 | void temp_test5(bool) | void temp_test5(bool) | | ir.cpp:1425:5:1425:30 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | ir.cpp:1414:6:1414:21 | void temporary_string() | void temporary_string() | @@ -23,6 +24,7 @@ multipleIRTypes lostReachability backEdgeCountMismatch useNotDominatedByDefinition +| destructors_for_temps.cpp:72:34:72:35 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:70:6:70:37 | bool conditional_temp_via_conjunction(bool) | bool conditional_temp_via_conjunction(bool) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated diff --git a/cpp/ql/test/library-tests/ir/ir/destructors_for_temps.cpp b/cpp/ql/test/library-tests/ir/ir/destructors_for_temps.cpp index 7a781d2c22ea..86d8d9173ee2 100644 --- a/cpp/ql/test/library-tests/ir/ir/destructors_for_temps.cpp +++ b/cpp/ql/test/library-tests/ir/ir/destructors_for_temps.cpp @@ -57,4 +57,17 @@ void temp_test8(bool b) { void temp_test8_simple(bool b) { b ? throw ClassWithDestructor2().get_x() : 'a'; +} + +struct string +{ + string(const char *); + ~string(); +}; + +bool const_ref_string(const string &); + +bool conditional_temp_via_conjunction(bool b) +{ + return b && const_ref_string(""); } \ No newline at end of file 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 e9d74dc6d18d..faaed2a3a84b 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -1239,6 +1239,65 @@ | destructors_for_temps.cpp:59:38:59:42 | SideEffect | ~m59_10 | | destructors_for_temps.cpp:59:38:59:42 | StoreValue | r59_14 | | destructors_for_temps.cpp:59:48:59:50 | StoreValue | r59_22 | +| destructors_for_temps.cpp:70:6:70:37 | Address | &:r70_7 | +| destructors_for_temps.cpp:70:6:70:37 | ChiPartial | partial:m70_3 | +| destructors_for_temps.cpp:70:6:70:37 | ChiTotal | total:m70_2 | +| destructors_for_temps.cpp:70:6:70:37 | Load | m72_23 | +| destructors_for_temps.cpp:70:6:70:37 | SideEffect | ~m72_19 | +| destructors_for_temps.cpp:70:44:70:44 | Address | &:r70_5 | +| destructors_for_temps.cpp:72:5:72:37 | Address | &:r72_1 | +| destructors_for_temps.cpp:72:12:72:12 | Address | &:r72_2 | +| destructors_for_temps.cpp:72:12:72:12 | Condition | r72_3 | +| destructors_for_temps.cpp:72:12:72:12 | Load | m70_6 | +| destructors_for_temps.cpp:72:12:72:36 | Address | &:r72_7 | +| destructors_for_temps.cpp:72:12:72:36 | Address | &:r72_13 | +| destructors_for_temps.cpp:72:12:72:36 | Address | &:r72_24 | +| destructors_for_temps.cpp:72:12:72:36 | Load | m72_12 | +| destructors_for_temps.cpp:72:12:72:36 | Phi | from 0:~m70_4 | +| destructors_for_temps.cpp:72:12:72:36 | Phi | from 1:m72_5 | +| destructors_for_temps.cpp:72:12:72:36 | Phi | from 1:m72_9 | +| destructors_for_temps.cpp:72:12:72:36 | Phi | from 1:~m72_6 | +| destructors_for_temps.cpp:72:12:72:36 | Phi | from 3:m72_26 | +| destructors_for_temps.cpp:72:12:72:36 | Phi | from 3:m72_38 | +| destructors_for_temps.cpp:72:12:72:36 | Phi | from 3:~m72_42 | +| destructors_for_temps.cpp:72:12:72:36 | Phi | from 4:m72_38 | +| destructors_for_temps.cpp:72:12:72:36 | Phi | from 4:~m72_42 | +| destructors_for_temps.cpp:72:12:72:36 | StoreValue | r72_8 | +| destructors_for_temps.cpp:72:12:72:36 | StoreValue | r72_14 | +| destructors_for_temps.cpp:72:12:72:36 | StoreValue | r72_25 | +| destructors_for_temps.cpp:72:17:72:32 | CallTarget | func:r72_27 | +| destructors_for_temps.cpp:72:17:72:32 | ChiPartial | partial:m72_41 | +| destructors_for_temps.cpp:72:17:72:32 | ChiTotal | total:m72_35 | +| destructors_for_temps.cpp:72:17:72:32 | Condition | r72_40 | +| destructors_for_temps.cpp:72:17:72:32 | SideEffect | ~m72_35 | +| destructors_for_temps.cpp:72:34:72:35 | Address | &:r72_15 | +| destructors_for_temps.cpp:72:34:72:35 | Address | &:r72_15 | +| destructors_for_temps.cpp:72:34:72:35 | Address | &:r72_28 | +| destructors_for_temps.cpp:72:34:72:35 | Address | &:r72_28 | +| destructors_for_temps.cpp:72:34:72:35 | Address | &:r72_32 | +| destructors_for_temps.cpp:72:34:72:35 | Address | &:r72_39 | +| destructors_for_temps.cpp:72:34:72:35 | Arg(0) | 0:r72_32 | +| destructors_for_temps.cpp:72:34:72:35 | Arg(0) | 0:r72_39 | +| destructors_for_temps.cpp:72:34:72:35 | Arg(this) | this:r72_15 | +| destructors_for_temps.cpp:72:34:72:35 | Arg(this) | this:r72_28 | +| destructors_for_temps.cpp:72:34:72:35 | CallTarget | func:r72_16 | +| destructors_for_temps.cpp:72:34:72:35 | CallTarget | func:r72_30 | +| destructors_for_temps.cpp:72:34:72:35 | ChiPartial | partial:m72_18 | +| destructors_for_temps.cpp:72:34:72:35 | ChiPartial | partial:m72_21 | +| destructors_for_temps.cpp:72:34:72:35 | ChiPartial | partial:m72_34 | +| destructors_for_temps.cpp:72:34:72:35 | ChiPartial | partial:m72_37 | +| destructors_for_temps.cpp:72:34:72:35 | ChiTotal | total:m70_4 | +| destructors_for_temps.cpp:72:34:72:35 | ChiTotal | total:m72_10 | +| destructors_for_temps.cpp:72:34:72:35 | ChiTotal | total:m72_11 | +| destructors_for_temps.cpp:72:34:72:35 | ChiTotal | total:m72_29 | +| destructors_for_temps.cpp:72:34:72:35 | SideEffect | m72_10 | +| destructors_for_temps.cpp:72:34:72:35 | SideEffect | ~m70_3 | +| destructors_for_temps.cpp:72:34:72:35 | SideEffect | ~m70_4 | +| destructors_for_temps.cpp:72:34:72:35 | SideEffect | ~m72_11 | +| destructors_for_temps.cpp:72:34:72:35 | SideEffect | ~m72_38 | +| destructors_for_temps.cpp:72:34:72:35 | Unary | r72_28 | +| destructors_for_temps.cpp:72:34:72:35 | Unary | r72_28 | +| destructors_for_temps.cpp:72:34:72:35 | Unary | r72_31 | | file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_1 | 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 356390f9b4ff..3a278aea06c4 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -20,6 +20,7 @@ multipleIRTypes lostReachability backEdgeCountMismatch useNotDominatedByDefinition +| destructors_for_temps.cpp:72:34:72:35 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:70:6:70:37 | bool conditional_temp_via_conjunction(bool) | bool conditional_temp_via_conjunction(bool) | | ir.cpp:1535:8:1535:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1535:8:1535:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | 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 2f1d82001972..6b3eb801eae7 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -1185,6 +1185,7 @@ destructors_for_temps.cpp: # 55| mu55_21(unknown) = ^CallSideEffect : ~m? # 55| mu55_22(ClassWithConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r55_5 # 55| v55_23(void) = ThrowValue : &:r55_5, ~m? +#-----| Exception -> Block 2 # 55| Block 4 # 55| r55_24(glval) = VariableAddress[#temp55:75] : @@ -1239,6 +1240,7 @@ destructors_for_temps.cpp: # 59| mu59_15(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r59_5 # 59| mu59_16(char) = Store[#throw59:9] : &:r59_4, r59_12 # 59| v59_17(void) = ThrowValue : &:r59_4, ~m? +#-----| Exception -> Block 2 # 59| Block 4 # 59| r59_18(char) = Constant[97] : @@ -1250,6 +1252,66 @@ destructors_for_temps.cpp: # 58| v58_9(void) = ReturnVoid : #-----| Goto -> Block 1 +# 70| bool conditional_temp_via_conjunction(bool) +# 70| Block 0 +# 70| v70_1(void) = EnterFunction : +# 70| mu70_2(unknown) = AliasedDefinition : +# 70| mu70_3(unknown) = InitializeNonLocal : +# 70| r70_4(glval) = VariableAddress[b] : +# 70| mu70_5(bool) = InitializeParameter[b] : &:r70_4 +# 72| r72_1(glval) = VariableAddress[#return] : +# 72| r72_2(glval) = VariableAddress[b] : +# 72| r72_3(bool) = Load[b] : &:r72_2, ~m? +# 72| v72_4(void) = ConditionalBranch : r72_3 +#-----| False -> Block 1 +#-----| True -> Block 4 + +# 72| Block 1 +# 72| r72_5(glval) = VariableAddress[#temp72:12] : +# 72| r72_6(bool) = Constant[0] : +# 72| mu72_7(bool) = Store[#temp72:12] : &:r72_5, r72_6 +#-----| Goto -> Block 2 + +# 72| Block 2 +# 72| r72_8(glval) = VariableAddress[#temp72:12] : +# 72| r72_9(bool) = Load[#temp72:12] : &:r72_8, ~m? +# 72| r72_10(glval) = CopyValue : r72_21 +# 72| r72_11(glval) = FunctionAddress[~string] : +# 72| v72_12(void) = Call[~string] : func:r72_11, this:r72_10 +# 72| mu72_13(unknown) = ^CallSideEffect : ~m? +# 72| v72_14(void) = ^IndirectReadSideEffect[-1] : &:r72_10, ~m? +# 72| mu72_15(string) = ^IndirectMayWriteSideEffect[-1] : &:r72_10 +# 72| mu72_16(bool) = Store[#return] : &:r72_1, r72_9 +# 70| r70_6(glval) = VariableAddress[#return] : +# 70| v70_7(void) = ReturnValue : &:r70_6, ~m? +# 70| v70_8(void) = AliasedUse : ~m? +# 70| v70_9(void) = ExitFunction : + +# 72| Block 3 +# 72| r72_17(glval) = VariableAddress[#temp72:12] : +# 72| r72_18(bool) = Constant[1] : +# 72| mu72_19(bool) = Store[#temp72:12] : &:r72_17, r72_18 +#-----| Goto -> Block 2 + +# 72| Block 4 +# 72| r72_20(glval) = FunctionAddress[const_ref_string] : +# 72| r72_21(glval) = VariableAddress[#temp72:34] : +# 72| mu72_22(string) = Uninitialized[#temp72:34] : &:r72_21 +# 72| r72_23(glval) = FunctionAddress[string] : +# 72| r72_24(glval) = StringConstant[""] : +# 72| r72_25(char *) = Convert : r72_24 +# 72| v72_26(void) = Call[string] : func:r72_23, this:r72_21, 0:r72_25 +# 72| mu72_27(unknown) = ^CallSideEffect : ~m? +# 72| v72_28(void) = ^BufferReadSideEffect[0] : &:r72_25, ~m? +# 72| mu72_29(string) = ^IndirectMayWriteSideEffect[-1] : &:r72_21 +# 72| r72_30(string &) = CopyValue : r72_21 +# 72| r72_31(bool) = Call[const_ref_string] : func:r72_20, 0:r72_30 +# 72| mu72_32(unknown) = ^CallSideEffect : ~m? +# 72| v72_33(void) = ^BufferReadSideEffect[0] : &:r72_30, ~m? +# 72| v72_34(void) = ConditionalBranch : r72_31 +#-----| False -> Block 1 +#-----| True -> Block 3 + ir.c: # 7| void MyCoordsTest(int) # 7| Block 0 @@ -4618,6 +4680,7 @@ ir.cpp: # 728| r728_3(char *) = Convert : r728_2 # 728| mu728_4(char *) = Store[#throw728:7] : &:r728_1, r728_3 # 728| v728_5(void) = ThrowValue : &:r728_1, ~m? +#-----| Exception -> Block 9 # 730| Block 4 # 730| r730_1(glval) = VariableAddress[x] : @@ -4656,6 +4719,7 @@ ir.cpp: # 731| v731_18(void) = ^BufferReadSideEffect[0] : &:r731_15, ~m? # 731| mu731_19(String) = ^IndirectMayWriteSideEffect[-1] : &:r731_11 # 731| v731_20(void) = ThrowValue : &:r731_11, ~m? +#-----| Exception -> Block 9 # 733| Block 8 # 733| r733_1(int) = Constant[7] : @@ -4683,6 +4747,7 @@ ir.cpp: # 736| v736_8(void) = ^BufferReadSideEffect[0] : &:r736_5, ~m? # 736| mu736_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r736_1 # 736| v736_10(void) = ThrowValue : &:r736_1, ~m? +#-----| Exception -> Block 2 # 738| Block 11 # 738| v738_1(void) = CatchByType[const String &] : @@ -4700,6 +4765,7 @@ ir.cpp: # 740| Block 13 # 740| v740_1(void) = CatchAny : # 741| v741_1(void) = ReThrow : +#-----| Exception -> Block 2 # 743| Block 14 # 743| v743_1(void) = NoOp : @@ -7290,6 +7356,7 @@ ir.cpp: # 1195| r1195_3(char *) = Convert : r1195_2 # 1195| mu1195_4(char *) = Store[#throw1195:7] : &:r1195_1, r1195_3 # 1195| v1195_5(void) = ThrowValue : &:r1195_1, ~m? +#-----| Exception -> Block 9 # 1197| Block 4 # 1197| r1197_1(glval) = VariableAddress[x] : @@ -7328,6 +7395,7 @@ ir.cpp: # 1198| v1198_18(void) = ^BufferReadSideEffect[0] : &:r1198_15, ~m? # 1198| mu1198_19(String) = ^IndirectMayWriteSideEffect[-1] : &:r1198_11 # 1198| v1198_20(void) = ThrowValue : &:r1198_11, ~m? +#-----| Exception -> Block 9 # 1200| Block 8 # 1200| r1200_1(int) = Constant[7] : @@ -7355,6 +7423,7 @@ ir.cpp: # 1203| v1203_8(void) = ^BufferReadSideEffect[0] : &:r1203_5, ~m? # 1203| mu1203_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r1203_1 # 1203| v1203_10(void) = ThrowValue : &:r1203_1, ~m? +#-----| Exception -> Block 2 # 1205| Block 11 # 1205| v1205_1(void) = CatchByType[const String &] : @@ -13617,6 +13686,7 @@ ir.cpp: # 2282| v2282_8(void) = ^BufferReadSideEffect[0] : &:r2282_5, ~m? # 2282| mu2282_9(String) = ^IndirectMayWriteSideEffect[-1] : &:r2282_1 # 2282| v2282_10(void) = ThrowValue : &:r2282_1, ~m? +#-----| Exception -> Block 2 # 2284| Block 7 # 2284| v2284_1(void) = CatchByType[const String &] : @@ -13634,6 +13704,7 @@ ir.cpp: # 2286| Block 9 # 2286| v2286_1(void) = CatchAny : # 2287| v2287_1(void) = ReThrow : +#-----| Exception -> Block 2 # 2289| Block 10 # 2289| v2289_1(void) = NoOp : @@ -15477,6 +15548,7 @@ try_except.cpp: # 48| r48_2(int) = Constant[1] : # 48| mu48_3(int) = Store[#throw48:13] : &:r48_1, r48_2 # 48| v48_4(void) = ThrowValue : &:r48_1, ~m? +#-----| Exception -> Block 7 # 51| Block 4 # 51| r51_1(int) = Constant[0] : 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 b93c7d2649f8..a85ba6b93894 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 @@ -20,6 +20,7 @@ multipleIRTypes lostReachability backEdgeCountMismatch useNotDominatedByDefinition +| destructors_for_temps.cpp:72:34:72:35 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:70:6:70:37 | bool conditional_temp_via_conjunction(bool) | bool conditional_temp_via_conjunction(bool) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 b93c7d2649f8..a85ba6b93894 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 @@ -20,6 +20,7 @@ multipleIRTypes lostReachability backEdgeCountMismatch useNotDominatedByDefinition +| destructors_for_temps.cpp:72:34:72:35 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:70:6:70:37 | bool conditional_temp_via_conjunction(bool) | bool conditional_temp_via_conjunction(bool) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated From d279e3f17a05e16bc99d2d7ada4fc96dc22c6c0d Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 5 Apr 2024 09:47:11 +0100 Subject: [PATCH 19/35] C++: Suppress destructor calls for the right-hand side of logical operations since these are also conditional. --- .../cpp/ir/implementation/raw/internal/TranslatedElement.qll | 4 ++++ 1 file changed, 4 insertions(+) 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 b0cd33a42d0e..3f7bfebcab33 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 @@ -279,6 +279,10 @@ private predicate isInConditionalEvaluation(Expr e) { e = cond.getFullyConverted() ) or + e = any(LogicalAndExpr lae).getRightOperand().getFullyConverted() + or + e = any(LogicalOrExpr loe).getRightOperand().getFullyConverted() + or isInConditionalEvaluation(getRealParent(e)) } From bb2c690bddd4e0c6fac3ebabc43c65d8b7984385 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 5 Apr 2024 09:49:38 +0100 Subject: [PATCH 20/35] C++: Accept test changes. --- .../library-tests/ir/ir/aliased_ir.expected | 78 ++++++++---------- .../ir/ir/aliased_ssa_consistency.expected | 1 - .../aliased_ssa_consistency_unsound.expected | 2 - .../ir/ir/operand_locations.expected | 80 ++++++++----------- .../ir/ir/raw_consistency.expected | 1 - .../test/library-tests/ir/ir/raw_ir.expected | 56 ++++++------- .../ir/ir/unaliased_ssa_consistency.expected | 1 - ...unaliased_ssa_consistency_unsound.expected | 1 - 8 files changed, 92 insertions(+), 128 deletions(-) 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 3bf488f073fc..acf30c145a11 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -1389,58 +1389,48 @@ destructors_for_temps.cpp: #-----| True -> Block 4 # 72| Block 1 -# 72| m72_5(string) = Phi : from 4:m72_38 -# 72| m72_6(unknown) = Phi : from 0:~m70_4, from 4:~m72_42 -# 72| r72_7(glval) = VariableAddress[#temp72:12] : -# 72| r72_8(bool) = Constant[0] : -# 72| m72_9(bool) = Store[#temp72:12] : &:r72_7, r72_8 +# 72| m72_5(unknown) = Phi : from 0:~m70_4, from 4:~m72_32 +# 72| r72_6(glval) = VariableAddress[#temp72:12] : +# 72| r72_7(bool) = Constant[0] : +# 72| m72_8(bool) = Store[#temp72:12] : &:r72_6, r72_7 #-----| Goto -> Block 2 # 72| Block 2 -# 72| m72_10(string) = Phi : from 1:m72_5, from 3:m72_38 -# 72| m72_11(unknown) = Phi : from 1:~m72_6, from 3:~m72_42 -# 72| m72_12(bool) = Phi : from 1:m72_9, from 3:m72_26 -# 72| r72_13(glval) = VariableAddress[#temp72:12] : -# 72| r72_14(bool) = Load[#temp72:12] : &:r72_13, m72_12 -# 72| r72_15(glval) = CopyValue : r72_28 -# 72| r72_16(glval) = FunctionAddress[~string] : -# 72| v72_17(void) = Call[~string] : func:r72_16, this:r72_15 -# 72| m72_18(unknown) = ^CallSideEffect : ~m72_11 -# 72| m72_19(unknown) = Chi : total:m72_11, partial:m72_18 -# 72| v72_20(void) = ^IndirectReadSideEffect[-1] : &:r72_15, m72_10 -# 72| m72_21(string) = ^IndirectMayWriteSideEffect[-1] : &:r72_15 -# 72| m72_22(string) = Chi : total:m72_10, partial:m72_21 -# 72| m72_23(bool) = Store[#return] : &:r72_1, r72_14 -# 70| r70_7(glval) = VariableAddress[#return] : -# 70| v70_8(void) = ReturnValue : &:r70_7, m72_23 -# 70| v70_9(void) = AliasedUse : ~m72_19 -# 70| v70_10(void) = ExitFunction : +# 72| m72_9(unknown) = Phi : from 1:~m72_5, from 3:~m72_32 +# 72| m72_10(bool) = Phi : from 1:m72_8, from 3:m72_16 +# 72| r72_11(glval) = VariableAddress[#temp72:12] : +# 72| r72_12(bool) = Load[#temp72:12] : &:r72_11, m72_10 +# 72| m72_13(bool) = Store[#return] : &:r72_1, r72_12 +# 70| r70_7(glval) = VariableAddress[#return] : +# 70| v70_8(void) = ReturnValue : &:r70_7, m72_13 +# 70| v70_9(void) = AliasedUse : ~m72_9 +# 70| v70_10(void) = ExitFunction : # 72| Block 3 -# 72| r72_24(glval) = VariableAddress[#temp72:12] : -# 72| r72_25(bool) = Constant[1] : -# 72| m72_26(bool) = Store[#temp72:12] : &:r72_24, r72_25 +# 72| r72_14(glval) = VariableAddress[#temp72:12] : +# 72| r72_15(bool) = Constant[1] : +# 72| m72_16(bool) = Store[#temp72:12] : &:r72_14, r72_15 #-----| Goto -> Block 2 # 72| Block 4 -# 72| r72_27(glval) = FunctionAddress[const_ref_string] : -# 72| r72_28(glval) = VariableAddress[#temp72:34] : -# 72| m72_29(string) = Uninitialized[#temp72:34] : &:r72_28 -# 72| r72_30(glval) = FunctionAddress[string] : -# 72| r72_31(glval) = StringConstant[""] : -# 72| r72_32(char *) = Convert : r72_31 -# 72| v72_33(void) = Call[string] : func:r72_30, this:r72_28, 0:r72_32 -# 72| m72_34(unknown) = ^CallSideEffect : ~m70_4 -# 72| m72_35(unknown) = Chi : total:m70_4, partial:m72_34 -# 72| v72_36(void) = ^BufferReadSideEffect[0] : &:r72_32, ~m70_3 -# 72| m72_37(string) = ^IndirectMayWriteSideEffect[-1] : &:r72_28 -# 72| m72_38(string) = Chi : total:m72_29, partial:m72_37 -# 72| r72_39(string &) = CopyValue : r72_28 -# 72| r72_40(bool) = Call[const_ref_string] : func:r72_27, 0:r72_39 -# 72| m72_41(unknown) = ^CallSideEffect : ~m72_35 -# 72| m72_42(unknown) = Chi : total:m72_35, partial:m72_41 -# 72| v72_43(void) = ^BufferReadSideEffect[0] : &:r72_39, ~m72_38 -# 72| v72_44(void) = ConditionalBranch : r72_40 +# 72| r72_17(glval) = FunctionAddress[const_ref_string] : +# 72| r72_18(glval) = VariableAddress[#temp72:34] : +# 72| m72_19(string) = Uninitialized[#temp72:34] : &:r72_18 +# 72| r72_20(glval) = FunctionAddress[string] : +# 72| r72_21(glval) = StringConstant[""] : +# 72| r72_22(char *) = Convert : r72_21 +# 72| v72_23(void) = Call[string] : func:r72_20, this:r72_18, 0:r72_22 +# 72| m72_24(unknown) = ^CallSideEffect : ~m70_4 +# 72| m72_25(unknown) = Chi : total:m70_4, partial:m72_24 +# 72| v72_26(void) = ^BufferReadSideEffect[0] : &:r72_22, ~m70_3 +# 72| m72_27(string) = ^IndirectMayWriteSideEffect[-1] : &:r72_18 +# 72| m72_28(string) = Chi : total:m72_19, partial:m72_27 +# 72| r72_29(string &) = CopyValue : r72_18 +# 72| r72_30(bool) = Call[const_ref_string] : func:r72_17, 0:r72_29 +# 72| m72_31(unknown) = ^CallSideEffect : ~m72_25 +# 72| m72_32(unknown) = Chi : total:m72_25, partial:m72_31 +# 72| v72_33(void) = ^BufferReadSideEffect[0] : &:r72_29, ~m72_28 +# 72| v72_34(void) = ConditionalBranch : r72_30 #-----| False -> Block 1 #-----| True -> Block 3 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 a85ba6b93894..b93c7d2649f8 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 @@ -20,7 +20,6 @@ multipleIRTypes lostReachability backEdgeCountMismatch useNotDominatedByDefinition -| destructors_for_temps.cpp:72:34:72:35 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:70:6:70:37 | bool conditional_temp_via_conjunction(bool) | bool conditional_temp_via_conjunction(bool) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 3897a1ad6281..ef225d8ad6cb 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 @@ -2,7 +2,6 @@ missingOperand unexpectedOperand duplicateOperand missingPhiOperand -| destructors_for_temps.cpp:72:12:72:36 | Phi: ... && ... | Instruction 'Phi: ... && ...' is missing an operand for predecessor block 'EnterFunction: conditional_temp_via_conjunction' in function '$@'. | destructors_for_temps.cpp:70:6:70:37 | bool conditional_temp_via_conjunction(bool) | bool conditional_temp_via_conjunction(bool) | missingOperandType | destructors_for_temps.cpp:39:3:39:53 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | destructors_for_temps.cpp:38:6:38:15 | void temp_test5(bool) | void temp_test5(bool) | | ir.cpp:1425:5:1425:30 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | ir.cpp:1414:6:1414:21 | void temporary_string() | void temporary_string() | @@ -24,7 +23,6 @@ multipleIRTypes lostReachability backEdgeCountMismatch useNotDominatedByDefinition -| destructors_for_temps.cpp:72:34:72:35 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:70:6:70:37 | bool conditional_temp_via_conjunction(bool) | bool conditional_temp_via_conjunction(bool) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 faaed2a3a84b..b8eb247e5e84 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -1242,62 +1242,48 @@ | destructors_for_temps.cpp:70:6:70:37 | Address | &:r70_7 | | destructors_for_temps.cpp:70:6:70:37 | ChiPartial | partial:m70_3 | | destructors_for_temps.cpp:70:6:70:37 | ChiTotal | total:m70_2 | -| destructors_for_temps.cpp:70:6:70:37 | Load | m72_23 | -| destructors_for_temps.cpp:70:6:70:37 | SideEffect | ~m72_19 | +| destructors_for_temps.cpp:70:6:70:37 | Load | m72_13 | +| destructors_for_temps.cpp:70:6:70:37 | SideEffect | ~m72_9 | | destructors_for_temps.cpp:70:44:70:44 | Address | &:r70_5 | | destructors_for_temps.cpp:72:5:72:37 | Address | &:r72_1 | | destructors_for_temps.cpp:72:12:72:12 | Address | &:r72_2 | | destructors_for_temps.cpp:72:12:72:12 | Condition | r72_3 | | destructors_for_temps.cpp:72:12:72:12 | Load | m70_6 | -| destructors_for_temps.cpp:72:12:72:36 | Address | &:r72_7 | -| destructors_for_temps.cpp:72:12:72:36 | Address | &:r72_13 | -| destructors_for_temps.cpp:72:12:72:36 | Address | &:r72_24 | -| destructors_for_temps.cpp:72:12:72:36 | Load | m72_12 | +| destructors_for_temps.cpp:72:12:72:36 | Address | &:r72_6 | +| destructors_for_temps.cpp:72:12:72:36 | Address | &:r72_11 | +| destructors_for_temps.cpp:72:12:72:36 | Address | &:r72_14 | +| destructors_for_temps.cpp:72:12:72:36 | Load | m72_10 | | destructors_for_temps.cpp:72:12:72:36 | Phi | from 0:~m70_4 | -| destructors_for_temps.cpp:72:12:72:36 | Phi | from 1:m72_5 | -| destructors_for_temps.cpp:72:12:72:36 | Phi | from 1:m72_9 | -| destructors_for_temps.cpp:72:12:72:36 | Phi | from 1:~m72_6 | -| destructors_for_temps.cpp:72:12:72:36 | Phi | from 3:m72_26 | -| destructors_for_temps.cpp:72:12:72:36 | Phi | from 3:m72_38 | -| destructors_for_temps.cpp:72:12:72:36 | Phi | from 3:~m72_42 | -| destructors_for_temps.cpp:72:12:72:36 | Phi | from 4:m72_38 | -| destructors_for_temps.cpp:72:12:72:36 | Phi | from 4:~m72_42 | -| destructors_for_temps.cpp:72:12:72:36 | StoreValue | r72_8 | -| destructors_for_temps.cpp:72:12:72:36 | StoreValue | r72_14 | -| destructors_for_temps.cpp:72:12:72:36 | StoreValue | r72_25 | -| destructors_for_temps.cpp:72:17:72:32 | CallTarget | func:r72_27 | -| destructors_for_temps.cpp:72:17:72:32 | ChiPartial | partial:m72_41 | -| destructors_for_temps.cpp:72:17:72:32 | ChiTotal | total:m72_35 | -| destructors_for_temps.cpp:72:17:72:32 | Condition | r72_40 | -| destructors_for_temps.cpp:72:17:72:32 | SideEffect | ~m72_35 | -| destructors_for_temps.cpp:72:34:72:35 | Address | &:r72_15 | -| destructors_for_temps.cpp:72:34:72:35 | Address | &:r72_15 | -| destructors_for_temps.cpp:72:34:72:35 | Address | &:r72_28 | -| destructors_for_temps.cpp:72:34:72:35 | Address | &:r72_28 | -| destructors_for_temps.cpp:72:34:72:35 | Address | &:r72_32 | -| destructors_for_temps.cpp:72:34:72:35 | Address | &:r72_39 | -| destructors_for_temps.cpp:72:34:72:35 | Arg(0) | 0:r72_32 | -| destructors_for_temps.cpp:72:34:72:35 | Arg(0) | 0:r72_39 | -| destructors_for_temps.cpp:72:34:72:35 | Arg(this) | this:r72_15 | -| destructors_for_temps.cpp:72:34:72:35 | Arg(this) | this:r72_28 | -| destructors_for_temps.cpp:72:34:72:35 | CallTarget | func:r72_16 | -| destructors_for_temps.cpp:72:34:72:35 | CallTarget | func:r72_30 | -| destructors_for_temps.cpp:72:34:72:35 | ChiPartial | partial:m72_18 | -| destructors_for_temps.cpp:72:34:72:35 | ChiPartial | partial:m72_21 | -| destructors_for_temps.cpp:72:34:72:35 | ChiPartial | partial:m72_34 | -| destructors_for_temps.cpp:72:34:72:35 | ChiPartial | partial:m72_37 | +| destructors_for_temps.cpp:72:12:72:36 | Phi | from 1:m72_8 | +| destructors_for_temps.cpp:72:12:72:36 | Phi | from 1:~m72_5 | +| destructors_for_temps.cpp:72:12:72:36 | Phi | from 3:m72_16 | +| destructors_for_temps.cpp:72:12:72:36 | Phi | from 3:~m72_32 | +| destructors_for_temps.cpp:72:12:72:36 | Phi | from 4:~m72_32 | +| destructors_for_temps.cpp:72:12:72:36 | StoreValue | r72_7 | +| destructors_for_temps.cpp:72:12:72:36 | StoreValue | r72_12 | +| destructors_for_temps.cpp:72:12:72:36 | StoreValue | r72_15 | +| destructors_for_temps.cpp:72:17:72:32 | CallTarget | func:r72_17 | +| destructors_for_temps.cpp:72:17:72:32 | ChiPartial | partial:m72_31 | +| destructors_for_temps.cpp:72:17:72:32 | ChiTotal | total:m72_25 | +| destructors_for_temps.cpp:72:17:72:32 | Condition | r72_30 | +| destructors_for_temps.cpp:72:17:72:32 | SideEffect | ~m72_25 | +| destructors_for_temps.cpp:72:34:72:35 | Address | &:r72_18 | +| destructors_for_temps.cpp:72:34:72:35 | Address | &:r72_18 | +| destructors_for_temps.cpp:72:34:72:35 | Address | &:r72_22 | +| destructors_for_temps.cpp:72:34:72:35 | Address | &:r72_29 | +| destructors_for_temps.cpp:72:34:72:35 | Arg(0) | 0:r72_22 | +| destructors_for_temps.cpp:72:34:72:35 | Arg(0) | 0:r72_29 | +| destructors_for_temps.cpp:72:34:72:35 | Arg(this) | this:r72_18 | +| destructors_for_temps.cpp:72:34:72:35 | CallTarget | func:r72_20 | +| destructors_for_temps.cpp:72:34:72:35 | ChiPartial | partial:m72_24 | +| destructors_for_temps.cpp:72:34:72:35 | ChiPartial | partial:m72_27 | | destructors_for_temps.cpp:72:34:72:35 | ChiTotal | total:m70_4 | -| destructors_for_temps.cpp:72:34:72:35 | ChiTotal | total:m72_10 | -| destructors_for_temps.cpp:72:34:72:35 | ChiTotal | total:m72_11 | -| destructors_for_temps.cpp:72:34:72:35 | ChiTotal | total:m72_29 | -| destructors_for_temps.cpp:72:34:72:35 | SideEffect | m72_10 | +| destructors_for_temps.cpp:72:34:72:35 | ChiTotal | total:m72_19 | | destructors_for_temps.cpp:72:34:72:35 | SideEffect | ~m70_3 | | destructors_for_temps.cpp:72:34:72:35 | SideEffect | ~m70_4 | -| destructors_for_temps.cpp:72:34:72:35 | SideEffect | ~m72_11 | -| destructors_for_temps.cpp:72:34:72:35 | SideEffect | ~m72_38 | -| destructors_for_temps.cpp:72:34:72:35 | Unary | r72_28 | -| destructors_for_temps.cpp:72:34:72:35 | Unary | r72_28 | -| destructors_for_temps.cpp:72:34:72:35 | Unary | r72_31 | +| destructors_for_temps.cpp:72:34:72:35 | SideEffect | ~m72_28 | +| destructors_for_temps.cpp:72:34:72:35 | Unary | r72_18 | +| destructors_for_temps.cpp:72:34:72:35 | Unary | r72_21 | | file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_1 | 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 3a278aea06c4..356390f9b4ff 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -20,7 +20,6 @@ multipleIRTypes lostReachability backEdgeCountMismatch useNotDominatedByDefinition -| destructors_for_temps.cpp:72:34:72:35 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:70:6:70:37 | bool conditional_temp_via_conjunction(bool) | bool conditional_temp_via_conjunction(bool) | | ir.cpp:1535:8:1535:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1535:8:1535:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | 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 6b3eb801eae7..faf2dbfdd416 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -1273,42 +1273,36 @@ destructors_for_temps.cpp: #-----| Goto -> Block 2 # 72| Block 2 -# 72| r72_8(glval) = VariableAddress[#temp72:12] : -# 72| r72_9(bool) = Load[#temp72:12] : &:r72_8, ~m? -# 72| r72_10(glval) = CopyValue : r72_21 -# 72| r72_11(glval) = FunctionAddress[~string] : -# 72| v72_12(void) = Call[~string] : func:r72_11, this:r72_10 -# 72| mu72_13(unknown) = ^CallSideEffect : ~m? -# 72| v72_14(void) = ^IndirectReadSideEffect[-1] : &:r72_10, ~m? -# 72| mu72_15(string) = ^IndirectMayWriteSideEffect[-1] : &:r72_10 -# 72| mu72_16(bool) = Store[#return] : &:r72_1, r72_9 -# 70| r70_6(glval) = VariableAddress[#return] : -# 70| v70_7(void) = ReturnValue : &:r70_6, ~m? -# 70| v70_8(void) = AliasedUse : ~m? -# 70| v70_9(void) = ExitFunction : +# 72| r72_8(glval) = VariableAddress[#temp72:12] : +# 72| r72_9(bool) = Load[#temp72:12] : &:r72_8, ~m? +# 72| mu72_10(bool) = Store[#return] : &:r72_1, r72_9 +# 70| r70_6(glval) = VariableAddress[#return] : +# 70| v70_7(void) = ReturnValue : &:r70_6, ~m? +# 70| v70_8(void) = AliasedUse : ~m? +# 70| v70_9(void) = ExitFunction : # 72| Block 3 -# 72| r72_17(glval) = VariableAddress[#temp72:12] : -# 72| r72_18(bool) = Constant[1] : -# 72| mu72_19(bool) = Store[#temp72:12] : &:r72_17, r72_18 +# 72| r72_11(glval) = VariableAddress[#temp72:12] : +# 72| r72_12(bool) = Constant[1] : +# 72| mu72_13(bool) = Store[#temp72:12] : &:r72_11, r72_12 #-----| Goto -> Block 2 # 72| Block 4 -# 72| r72_20(glval) = FunctionAddress[const_ref_string] : -# 72| r72_21(glval) = VariableAddress[#temp72:34] : -# 72| mu72_22(string) = Uninitialized[#temp72:34] : &:r72_21 -# 72| r72_23(glval) = FunctionAddress[string] : -# 72| r72_24(glval) = StringConstant[""] : -# 72| r72_25(char *) = Convert : r72_24 -# 72| v72_26(void) = Call[string] : func:r72_23, this:r72_21, 0:r72_25 -# 72| mu72_27(unknown) = ^CallSideEffect : ~m? -# 72| v72_28(void) = ^BufferReadSideEffect[0] : &:r72_25, ~m? -# 72| mu72_29(string) = ^IndirectMayWriteSideEffect[-1] : &:r72_21 -# 72| r72_30(string &) = CopyValue : r72_21 -# 72| r72_31(bool) = Call[const_ref_string] : func:r72_20, 0:r72_30 -# 72| mu72_32(unknown) = ^CallSideEffect : ~m? -# 72| v72_33(void) = ^BufferReadSideEffect[0] : &:r72_30, ~m? -# 72| v72_34(void) = ConditionalBranch : r72_31 +# 72| r72_14(glval) = FunctionAddress[const_ref_string] : +# 72| r72_15(glval) = VariableAddress[#temp72:34] : +# 72| mu72_16(string) = Uninitialized[#temp72:34] : &:r72_15 +# 72| r72_17(glval) = FunctionAddress[string] : +# 72| r72_18(glval) = StringConstant[""] : +# 72| r72_19(char *) = Convert : r72_18 +# 72| v72_20(void) = Call[string] : func:r72_17, this:r72_15, 0:r72_19 +# 72| mu72_21(unknown) = ^CallSideEffect : ~m? +# 72| v72_22(void) = ^BufferReadSideEffect[0] : &:r72_19, ~m? +# 72| mu72_23(string) = ^IndirectMayWriteSideEffect[-1] : &:r72_15 +# 72| r72_24(string &) = CopyValue : r72_15 +# 72| r72_25(bool) = Call[const_ref_string] : func:r72_14, 0:r72_24 +# 72| mu72_26(unknown) = ^CallSideEffect : ~m? +# 72| v72_27(void) = ^BufferReadSideEffect[0] : &:r72_24, ~m? +# 72| v72_28(void) = ConditionalBranch : r72_25 #-----| False -> Block 1 #-----| True -> Block 3 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 a85ba6b93894..b93c7d2649f8 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 @@ -20,7 +20,6 @@ multipleIRTypes lostReachability backEdgeCountMismatch useNotDominatedByDefinition -| destructors_for_temps.cpp:72:34:72:35 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:70:6:70:37 | bool conditional_temp_via_conjunction(bool) | bool conditional_temp_via_conjunction(bool) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 a85ba6b93894..b93c7d2649f8 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 @@ -20,7 +20,6 @@ multipleIRTypes lostReachability backEdgeCountMismatch useNotDominatedByDefinition -| destructors_for_temps.cpp:72:34:72:35 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | destructors_for_temps.cpp:70:6:70:37 | bool conditional_temp_via_conjunction(bool) | bool conditional_temp_via_conjunction(bool) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated From b042366c8ee9e4fc437d1ccd75f12707790c8717 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 5 Apr 2024 14:39:35 +0100 Subject: [PATCH 21/35] C++: Add a failing testcase. --- .../library-tests/ir/ir/PrintAST.expected | 48 ++++++++++++ .../library-tests/ir/ir/aliased_ir.expected | 66 +++++++++++++++++ .../ir/ir/aliased_ssa_consistency.expected | 35 +++++++++ .../aliased_ssa_consistency_unsound.expected | 36 +++++++++ cpp/ql/test/library-tests/ir/ir/ir.cpp | 9 +++ .../ir/ir/operand_locations.expected | 73 +++++++++++++++++++ .../ir/ir/raw_consistency.expected | 26 +++++++ .../test/library-tests/ir/ir/raw_ir.expected | 57 +++++++++++++++ .../ir/ir/unaliased_ssa_consistency.expected | 26 +++++++ ...unaliased_ssa_consistency_unsound.expected | 26 +++++++ 10 files changed, 402 insertions(+) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index e9e58ec9d9b7..500c57f0c494 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -20275,6 +20275,54 @@ ir.cpp: # 2437| getQualifier(): [VariableAccess] c # 2437| Type = [Class] ClassWithDestructor # 2437| ValueCategory = lvalue +# 2439| [CopyAssignmentOperator] ByValueConstructor& ByValueConstructor::operator=(ByValueConstructor const&) +# 2439| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const ByValueConstructor & +# 2439| [MoveAssignmentOperator] ByValueConstructor& ByValueConstructor::operator=(ByValueConstructor&&) +# 2439| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] ByValueConstructor && +# 2439| [CopyConstructor] void ByValueConstructor::ByValueConstructor(ByValueConstructor const&) +# 2439| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const ByValueConstructor & +# 2439| [MoveConstructor] void ByValueConstructor::ByValueConstructor(ByValueConstructor&&) +# 2439| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] ByValueConstructor && +# 2440| [Constructor] void ByValueConstructor::ByValueConstructor(ClassWithDestructor) +# 2440| : +# 2440| getParameter(0): [Parameter] (unnamed parameter 0) +# 2440| Type = [Class] ClassWithDestructor +# 2443| [TopLevelFunction] void new_with_destructor(ClassWithDestructor) +# 2443| : +# 2443| getParameter(0): [Parameter] a +# 2443| Type = [Class] ClassWithDestructor +# 2444| getEntryPoint(): [BlockStmt] { ... } +# 2445| getStmt(0): [DeclStmt] declaration +# 2445| getDeclarationEntry(0): [VariableDeclarationEntry] definition of b +# 2445| Type = [PointerType] ByValueConstructor * +# 2445| getVariable().getInitializer(): [Initializer] initializer for b +# 2445| getExpr(): [NewExpr] new +# 2445| Type = [PointerType] ByValueConstructor * +# 2445| ValueCategory = prvalue +# 2445| getInitializer(): [ConstructorCall] call to ByValueConstructor +# 2445| Type = [VoidType] void +# 2445| ValueCategory = prvalue +# 2445| getArgument(0): [VariableAccess] a +# 2445| Type = [Class] ClassWithDestructor +# 2445| ValueCategory = prvalue(load) +# 2445| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object +# 2445| Type = [Class] ClassWithDestructor +# 2445| ValueCategory = lvalue +# 2445| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor +# 2445| Type = [VoidType] void +# 2445| ValueCategory = prvalue +# 2445| getQualifier(): [ReuseExpr] reuse of temporary object +# 2445| Type = [Class] ClassWithDestructor +# 2445| ValueCategory = xvalue +# 2446| getStmt(1): [ReturnStmt] return ... perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| : 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 acf30c145a11..5cb3629dcd7d 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -16026,6 +16026,72 @@ ir.cpp: # 2434| v2434_8(void) = AliasedUse : ~m2437_5 # 2434| v2434_9(void) = ExitFunction : +# 2443| void new_with_destructor(ClassWithDestructor) +# 2443| Block 0 +# 2443| v2443_1(void) = EnterFunction : +# 2443| m2443_2(unknown) = AliasedDefinition : +# 2443| m2443_3(unknown) = InitializeNonLocal : +# 2443| m2443_4(unknown) = Chi : total:m2443_2, partial:m2443_3 +# 2443| r2443_5(glval) = VariableAddress[a] : +# 2443| m2443_6(ClassWithDestructor) = InitializeParameter[a] : &:r2443_5 +# 2445| r2445_1(glval) = VariableAddress[b] : +# 2445| r2445_2(glval) = FunctionAddress[operator new] : +# 2445| r2445_3(unsigned long) = Constant[1] : +#-----| Goto -> Block 4 +#-----| Goto -> Block 4 + +# 2445| Block 1 +# 2445| m2445_4(ByValueConstructor *) = Store[b] : &:r2445_1, r2445_5 +# 2446| v2446_1(void) = NoOp : +# 2443| v2443_7(void) = ReturnVoid : +# 2443| v2443_8(void) = AliasedUse : ~m2445_31, ~m2445_45 +# 2443| v2443_9(void) = ExitFunction : + +# 2445| Block 2 +# 2445| r2445_5(ByValueConstructor *) = Convert : r2445_17 +# 2445| r2445_6(glval) = FunctionAddress[ByValueConstructor] : +# 2445| r2445_7(glval) = VariableAddress[#temp2445:52] : +# 2445| r2445_8(glval) = VariableAddress[a] : +# 2445| r2445_9(ClassWithDestructor) = Load[a] : &:r2445_8, m2443_6 +# 2445| m2445_10(ClassWithDestructor) = Store[#temp2445:52] : &:r2445_7, r2445_9 +# 2445| r2445_11(ClassWithDestructor) = Load[#temp2445:52] : &:r2445_7, m2445_10 +# 2445| v2445_12(void) = Call[ByValueConstructor] : func:r2445_6, this:r2445_5, 0:r2445_11 +# 2445| m2445_13(unknown) = ^CallSideEffect : ~m2445_31, ~m2445_45 +# 2445| m2445_14(unknown) = Chi : total:m2445_31, total:m2445_45, partial:m2445_13 +# 2445| m2445_15(ByValueConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r2445_5 +# 2445| m2445_16(unknown) = Chi : total:m2445_22, total:m2445_25, total:m2445_36, total:m2445_39, partial:m2445_15 +#-----| Goto (back edge) -> Block 4 +#-----| Goto (back edge) -> Block 4 + +# 2445| Block 3 +# 2445| r2445_17(void *) = Call[operator new] : func:r2445_2, 0:r2445_3 +# 2445| m2445_18(unknown) = ^CallSideEffect : ~m2445_31, ~m2445_45 +# 2445| m2445_19(unknown) = Chi : total:m2445_31, total:m2445_45, partial:m2445_18 +# 2445| m2445_20(unknown) = ^InitializeDynamicAllocation : &:r2445_17 +#-----| Goto (back edge) -> Block 4 +#-----| Goto (back edge) -> Block 4 + +# 2445| Block 4 +# 2445| m2445_39(unknown) = Phi : from 2:m2445_16, from 3:m2445_20 +# 2445| m2445_40(unknown) = Phi : from 0:~m2443_4, from 2:~m2445_14, from 3:~m2445_19 +# 2445| m2445_38(ClassWithDestructor) = Phi : from 2:m2445_10, from 3:m2445_34, from 3:m2445_48 +# 2445| r2445_41(glval) = CopyValue : r2445_7 +# 2445| r2445_42(glval) = FunctionAddress[~ClassWithDestructor] : +# 2445| v2445_43(void) = Call[~ClassWithDestructor] : func:r2445_28, func:r2445_42, this:r2445_27, this:r2445_41 +# 2445| m2445_44(unknown) = ^CallSideEffect : ~m2445_23, ~m2445_26, ~m2445_37, ~m2445_40 +# 2445| m2445_45(unknown) = Chi : total:m2445_23, total:m2445_26, total:m2445_37, total:m2445_40, partial:m2445_30, partial:m2445_44 +# 2445| v2445_46(void) = ^IndirectReadSideEffect[-1] : &:r2445_27, &:r2445_41, m2445_21, m2445_24, m2445_35, m2445_38 +# 2445| m2445_47(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2445_27, &:r2445_41 +# 2445| m2445_48(ClassWithDestructor) = Chi : total:m2445_21, total:m2445_24, total:m2445_35, total:m2445_38, partial:m2445_33, partial:m2445_47 +#-----| Goto (back edge) -> Block 2 +#-----| Goto (back edge) -> Block 3 +#-----| Goto (back edge) -> Block 1 + +# 2445| Block 4 +#-----| Goto (back edge) -> Block 2 +#-----| Goto (back edge) -> Block 3 +#-----| Goto (back edge) -> Block 1 + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 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 b93c7d2649f8..8ba336b67a9e 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 @@ -2,12 +2,41 @@ missingOperand unexpectedOperand duplicateOperand missingPhiOperand +| ir.cpp:2445:52:2445:52 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is missing an operand for predecessor block 'EnterFunction: new_with_destructor' in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors +| ir.cpp:2445:52:2445:52 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 3 successors of kind 'Goto' in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | unexplainedLoop +| ir.cpp:2445:29:2445:53 | Call: call to ByValueConstructor | Instruction 'Call: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Call: new | Instruction 'Call: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | CallSideEffect: call to ByValueConstructor | Instruction 'CallSideEffect: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | CallSideEffect: new | Instruction 'CallSideEffect: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Chi: call to ByValueConstructor | Instruction 'Chi: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Chi: call to ByValueConstructor | Instruction 'Chi: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Chi: new | Instruction 'Chi: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Chi: new | Instruction 'Chi: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Convert: new | Instruction 'Convert: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | FunctionAddress: call to ByValueConstructor | Instruction 'FunctionAddress: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | IndirectMayWriteSideEffect: call to ByValueConstructor | Instruction 'IndirectMayWriteSideEffect: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | InitializeDynamicAllocation: new | Instruction 'InitializeDynamicAllocation: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Call: call to ~ClassWithDestructor | Instruction 'Call: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | CallSideEffect: call to ~ClassWithDestructor | Instruction 'CallSideEffect: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Chi: call to ~ClassWithDestructor | Instruction 'Chi: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | FunctionAddress: call to ~ClassWithDestructor | Instruction 'FunctionAddress: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Load: a | Instruction 'Load: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Load: temporary object | Instruction 'Load: temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Store: a | Instruction 'Store: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | VariableAddress: a | Instruction 'VariableAddress: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | VariableAddress: temporary object | Instruction 'VariableAddress: temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -18,8 +47,14 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability +| ir.cpp:2445:29:2445:53 | Call: new | Block 'Call: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Convert: new | Block 'Convert: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Store: new | Block 'Store: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | backEdgeCountMismatch useNotDominatedByDefinition +| ir.cpp:2445:29:2445:53 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 ef225d8ad6cb..c88ec74f1f00 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 @@ -2,6 +2,8 @@ missingOperand unexpectedOperand duplicateOperand missingPhiOperand +| ir.cpp:2445:52:2445:52 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is missing an operand for predecessor block 'EnterFunction: new_with_destructor' in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is missing an operand for predecessor block 'EnterFunction: new_with_destructor' in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | missingOperandType | destructors_for_temps.cpp:39:3:39:53 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | destructors_for_temps.cpp:38:6:38:15 | void temp_test5(bool) | void temp_test5(bool) | | ir.cpp:1425:5:1425:30 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | ir.cpp:1414:6:1414:21 | void temporary_string() | void temporary_string() | @@ -10,7 +12,35 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors +| ir.cpp:2445:52:2445:52 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 3 successors of kind 'Goto' in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | unexplainedLoop +| ir.cpp:2445:29:2445:53 | Call: call to ByValueConstructor | Instruction 'Call: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Call: new | Instruction 'Call: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | CallSideEffect: call to ByValueConstructor | Instruction 'CallSideEffect: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | CallSideEffect: new | Instruction 'CallSideEffect: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Chi: call to ByValueConstructor | Instruction 'Chi: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Chi: call to ByValueConstructor | Instruction 'Chi: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Chi: new | Instruction 'Chi: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Convert: new | Instruction 'Convert: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | FunctionAddress: call to ByValueConstructor | Instruction 'FunctionAddress: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | IndirectMayWriteSideEffect: call to ByValueConstructor | Instruction 'IndirectMayWriteSideEffect: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | InitializeDynamicAllocation: new | Instruction 'InitializeDynamicAllocation: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Call: call to ~ClassWithDestructor | Instruction 'Call: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | CallSideEffect: call to ~ClassWithDestructor | Instruction 'CallSideEffect: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Chi: call to ~ClassWithDestructor | Instruction 'Chi: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | FunctionAddress: call to ~ClassWithDestructor | Instruction 'FunctionAddress: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Load: a | Instruction 'Load: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Load: temporary object | Instruction 'Load: temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Store: a | Instruction 'Store: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | VariableAddress: a | Instruction 'VariableAddress: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | VariableAddress: temporary object | Instruction 'VariableAddress: temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -21,8 +51,14 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability +| ir.cpp:2445:29:2445:53 | Call: new | Block 'Call: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Convert: new | Block 'Convert: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Store: new | Block 'Store: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | backEdgeCountMismatch useNotDominatedByDefinition +| ir.cpp:2445:29:2445:53 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 3c50a2c2ca33..022e207c7f21 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -2436,4 +2436,13 @@ void rethrow_with_destruction(int x) { throw; } +struct ByValueConstructor { + ByValueConstructor(ClassWithDestructor); +}; + +void new_with_destructor(ClassWithDestructor a) +{ + ByValueConstructor* b = new ByValueConstructor(a); +} + // semmle-extractor-options: -std=c++20 --clang 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 b8eb247e5e84..0fae2cc75dfe 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -13476,6 +13476,79 @@ | ir.cpp:2437:1:2437:1 | ChiTotal | total:m2435_8 | | ir.cpp:2437:1:2437:1 | SideEffect | m2435_8 | | ir.cpp:2437:1:2437:1 | SideEffect | ~m2435_6 | +| ir.cpp:2443:6:2443:24 | ChiPartial | partial:m2443_3 | +| ir.cpp:2443:6:2443:24 | ChiTotal | total:m2443_2 | +| ir.cpp:2443:6:2443:24 | SideEffect | ~m2445_31 | +| ir.cpp:2443:6:2443:24 | SideEffect | ~m2445_45 | +| ir.cpp:2443:46:2443:46 | Address | &:r2443_5 | +| ir.cpp:2445:25:2445:25 | Address | &:r2445_1 | +| ir.cpp:2445:29:2445:53 | Address | &:r2445_5 | +| ir.cpp:2445:29:2445:53 | Address | &:r2445_17 | +| ir.cpp:2445:29:2445:53 | Arg(0) | 0:r2445_3 | +| ir.cpp:2445:29:2445:53 | Arg(this) | this:r2445_5 | +| ir.cpp:2445:29:2445:53 | CallTarget | func:r2445_2 | +| ir.cpp:2445:29:2445:53 | CallTarget | func:r2445_6 | +| ir.cpp:2445:29:2445:53 | ChiPartial | partial:m2445_13 | +| ir.cpp:2445:29:2445:53 | ChiPartial | partial:m2445_15 | +| ir.cpp:2445:29:2445:53 | ChiPartial | partial:m2445_18 | +| ir.cpp:2445:29:2445:53 | ChiTotal | total:m2445_22 | +| ir.cpp:2445:29:2445:53 | ChiTotal | total:m2445_25 | +| ir.cpp:2445:29:2445:53 | ChiTotal | total:m2445_31 | +| ir.cpp:2445:29:2445:53 | ChiTotal | total:m2445_31 | +| ir.cpp:2445:29:2445:53 | ChiTotal | total:m2445_36 | +| ir.cpp:2445:29:2445:53 | ChiTotal | total:m2445_39 | +| ir.cpp:2445:29:2445:53 | ChiTotal | total:m2445_45 | +| ir.cpp:2445:29:2445:53 | ChiTotal | total:m2445_45 | +| ir.cpp:2445:29:2445:53 | SideEffect | ~m2445_31 | +| ir.cpp:2445:29:2445:53 | SideEffect | ~m2445_31 | +| ir.cpp:2445:29:2445:53 | SideEffect | ~m2445_45 | +| ir.cpp:2445:29:2445:53 | SideEffect | ~m2445_45 | +| ir.cpp:2445:29:2445:53 | StoreValue | r2445_5 | +| ir.cpp:2445:29:2445:53 | Unary | r2445_17 | +| ir.cpp:2445:52:2445:52 | Address | &:r2445_7 | +| ir.cpp:2445:52:2445:52 | Address | &:r2445_7 | +| ir.cpp:2445:52:2445:52 | Address | &:r2445_8 | +| ir.cpp:2445:52:2445:52 | Address | &:r2445_27 | +| ir.cpp:2445:52:2445:52 | Address | &:r2445_27 | +| ir.cpp:2445:52:2445:52 | Address | &:r2445_41 | +| ir.cpp:2445:52:2445:52 | Address | &:r2445_41 | +| ir.cpp:2445:52:2445:52 | Arg(0) | 0:r2445_11 | +| ir.cpp:2445:52:2445:52 | Arg(this) | this:r2445_27 | +| ir.cpp:2445:52:2445:52 | Arg(this) | this:r2445_41 | +| ir.cpp:2445:52:2445:52 | CallTarget | func:r2445_28 | +| ir.cpp:2445:52:2445:52 | CallTarget | func:r2445_42 | +| ir.cpp:2445:52:2445:52 | ChiPartial | partial:m2445_30 | +| ir.cpp:2445:52:2445:52 | ChiPartial | partial:m2445_33 | +| ir.cpp:2445:52:2445:52 | ChiPartial | partial:m2445_44 | +| ir.cpp:2445:52:2445:52 | ChiPartial | partial:m2445_47 | +| ir.cpp:2445:52:2445:52 | ChiTotal | total:m2445_21 | +| ir.cpp:2445:52:2445:52 | ChiTotal | total:m2445_23 | +| ir.cpp:2445:52:2445:52 | ChiTotal | total:m2445_24 | +| ir.cpp:2445:52:2445:52 | ChiTotal | total:m2445_26 | +| ir.cpp:2445:52:2445:52 | ChiTotal | total:m2445_35 | +| ir.cpp:2445:52:2445:52 | ChiTotal | total:m2445_37 | +| ir.cpp:2445:52:2445:52 | ChiTotal | total:m2445_38 | +| ir.cpp:2445:52:2445:52 | ChiTotal | total:m2445_40 | +| ir.cpp:2445:52:2445:52 | Load | m2443_6 | +| ir.cpp:2445:52:2445:52 | Load | m2445_10 | +| ir.cpp:2445:52:2445:52 | Phi | from 0:~m2443_4 | +| ir.cpp:2445:52:2445:52 | Phi | from 2:m2445_10 | +| ir.cpp:2445:52:2445:52 | Phi | from 2:m2445_16 | +| ir.cpp:2445:52:2445:52 | Phi | from 2:~m2445_14 | +| ir.cpp:2445:52:2445:52 | Phi | from 3:m2445_20 | +| ir.cpp:2445:52:2445:52 | Phi | from 3:m2445_34 | +| ir.cpp:2445:52:2445:52 | Phi | from 3:m2445_48 | +| ir.cpp:2445:52:2445:52 | Phi | from 3:~m2445_19 | +| ir.cpp:2445:52:2445:52 | SideEffect | m2445_21 | +| ir.cpp:2445:52:2445:52 | SideEffect | m2445_24 | +| ir.cpp:2445:52:2445:52 | SideEffect | m2445_35 | +| ir.cpp:2445:52:2445:52 | SideEffect | m2445_38 | +| ir.cpp:2445:52:2445:52 | SideEffect | ~m2445_23 | +| ir.cpp:2445:52:2445:52 | SideEffect | ~m2445_26 | +| ir.cpp:2445:52:2445:52 | SideEffect | ~m2445_37 | +| ir.cpp:2445:52:2445:52 | SideEffect | ~m2445_40 | +| ir.cpp:2445:52:2445:52 | StoreValue | r2445_9 | +| ir.cpp:2445:52:2445:52 | Unary | r2445_7 | | 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 356390f9b4ff..ba01d7680d2c 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -7,7 +7,27 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors +| ir.cpp:2445:52:2445:52 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 3 successors of kind 'Goto' in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | unexplainedLoop +| ir.cpp:2445:29:2445:53 | Call: call to ByValueConstructor | Instruction 'Call: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Call: new | Instruction 'Call: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | CallSideEffect: call to ByValueConstructor | Instruction 'CallSideEffect: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | CallSideEffect: new | Instruction 'CallSideEffect: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Convert: new | Instruction 'Convert: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | FunctionAddress: call to ByValueConstructor | Instruction 'FunctionAddress: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | IndirectMayWriteSideEffect: call to ByValueConstructor | Instruction 'IndirectMayWriteSideEffect: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | InitializeDynamicAllocation: new | Instruction 'InitializeDynamicAllocation: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Call: call to ~ClassWithDestructor | Instruction 'Call: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | CallSideEffect: call to ~ClassWithDestructor | Instruction 'CallSideEffect: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | FunctionAddress: call to ~ClassWithDestructor | Instruction 'FunctionAddress: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Load: a | Instruction 'Load: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Load: temporary object | Instruction 'Load: temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Store: a | Instruction 'Store: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | VariableAddress: a | Instruction 'VariableAddress: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | VariableAddress: temporary object | Instruction 'VariableAddress: temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -18,9 +38,15 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability +| ir.cpp:2445:29:2445:53 | Call: new | Block 'Call: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Convert: new | Block 'Convert: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Store: new | Block 'Store: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | backEdgeCountMismatch useNotDominatedByDefinition | ir.cpp:1535:8:1535:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1535:8:1535:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | +| ir.cpp:2445:29:2445:53 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | | try_except.c:39:15:39:15 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:32:6:32:6 | void h(int) | void h(int) | 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 faf2dbfdd416..f3540e46c456 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -14720,6 +14720,63 @@ ir.cpp: # 2434| v2434_9(void) = Unwind : #-----| Goto -> Block 1 +# 2443| void new_with_destructor(ClassWithDestructor) +# 2443| Block 0 +# 2443| v2443_1(void) = EnterFunction : +# 2443| mu2443_2(unknown) = AliasedDefinition : +# 2443| mu2443_3(unknown) = InitializeNonLocal : +# 2443| r2443_4(glval) = VariableAddress[a] : +# 2443| mu2443_5(ClassWithDestructor) = InitializeParameter[a] : &:r2443_4 +# 2445| r2445_1(glval) = VariableAddress[b] : +# 2445| r2445_2(glval) = FunctionAddress[operator new] : +# 2445| r2445_3(unsigned long) = Constant[1] : +#-----| Goto -> Block 4 +#-----| Goto -> Block 4 + +# 2445| Block 1 +# 2445| mu2445_4(ByValueConstructor *) = Store[b] : &:r2445_1, r2445_5 +# 2446| v2446_1(void) = NoOp : +# 2443| v2443_6(void) = ReturnVoid : +# 2443| v2443_7(void) = AliasedUse : ~m? +# 2443| v2443_8(void) = ExitFunction : + +# 2445| Block 2 +# 2445| r2445_5(ByValueConstructor *) = Convert : r2445_15 +# 2445| r2445_6(glval) = FunctionAddress[ByValueConstructor] : +# 2445| r2445_7(glval) = VariableAddress[#temp2445:52] : +# 2445| r2445_8(glval) = VariableAddress[a] : +# 2445| r2445_9(ClassWithDestructor) = Load[a] : &:r2445_8, ~m? +# 2445| mu2445_10(ClassWithDestructor) = Store[#temp2445:52] : &:r2445_7, r2445_9 +# 2445| r2445_11(ClassWithDestructor) = Load[#temp2445:52] : &:r2445_7, ~m? +# 2445| v2445_12(void) = Call[ByValueConstructor] : func:r2445_6, this:r2445_5, 0:r2445_11 +# 2445| mu2445_13(unknown) = ^CallSideEffect : ~m? +# 2445| mu2445_14(ByValueConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r2445_5 +#-----| Goto (back edge) -> Block 4 +#-----| Goto (back edge) -> Block 4 + +# 2445| Block 3 +# 2445| r2445_15(void *) = Call[operator new] : func:r2445_2, 0:r2445_3 +# 2445| mu2445_16(unknown) = ^CallSideEffect : ~m? +# 2445| mu2445_17(unknown) = ^InitializeDynamicAllocation : &:r2445_15 +#-----| Goto (back edge) -> Block 4 +#-----| Goto (back edge) -> Block 4 + +# 2445| Block 4 +# 2445| r2445_24(glval) = CopyValue : r2445_7 +# 2445| r2445_25(glval) = FunctionAddress[~ClassWithDestructor] : +# 2445| v2445_26(void) = Call[~ClassWithDestructor] : func:r2445_19, func:r2445_25, this:r2445_18, this:r2445_24 +# 2445| mu2445_27(unknown) = ^CallSideEffect : ~m? +# 2445| v2445_28(void) = ^IndirectReadSideEffect[-1] : &:r2445_18, &:r2445_24, ~m? +# 2445| mu2445_29(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2445_18, &:r2445_24 +#-----| Goto (back edge) -> Block 2 +#-----| Goto (back edge) -> Block 3 +#-----| Goto (back edge) -> Block 1 + +# 2445| Block 4 +#-----| Goto (back edge) -> Block 2 +#-----| Goto (back edge) -> Block 3 +#-----| Goto (back edge) -> Block 1 + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 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 b93c7d2649f8..dc7831d5a20b 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 @@ -7,7 +7,27 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors +| ir.cpp:2445:52:2445:52 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 3 successors of kind 'Goto' in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | unexplainedLoop +| ir.cpp:2445:29:2445:53 | Call: call to ByValueConstructor | Instruction 'Call: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Call: new | Instruction 'Call: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | CallSideEffect: call to ByValueConstructor | Instruction 'CallSideEffect: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | CallSideEffect: new | Instruction 'CallSideEffect: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Convert: new | Instruction 'Convert: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | FunctionAddress: call to ByValueConstructor | Instruction 'FunctionAddress: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | IndirectMayWriteSideEffect: call to ByValueConstructor | Instruction 'IndirectMayWriteSideEffect: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | InitializeDynamicAllocation: new | Instruction 'InitializeDynamicAllocation: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Call: call to ~ClassWithDestructor | Instruction 'Call: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | CallSideEffect: call to ~ClassWithDestructor | Instruction 'CallSideEffect: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | FunctionAddress: call to ~ClassWithDestructor | Instruction 'FunctionAddress: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Load: a | Instruction 'Load: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Load: temporary object | Instruction 'Load: temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Store: a | Instruction 'Store: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | VariableAddress: a | Instruction 'VariableAddress: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | VariableAddress: temporary object | Instruction 'VariableAddress: temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -18,8 +38,14 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability +| ir.cpp:2445:29:2445:53 | Call: new | Block 'Call: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Convert: new | Block 'Convert: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Store: new | Block 'Store: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | backEdgeCountMismatch useNotDominatedByDefinition +| ir.cpp:2445:29:2445:53 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 b93c7d2649f8..dc7831d5a20b 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 @@ -7,7 +7,27 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors +| ir.cpp:2445:52:2445:52 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 3 successors of kind 'Goto' in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | unexplainedLoop +| ir.cpp:2445:29:2445:53 | Call: call to ByValueConstructor | Instruction 'Call: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Call: new | Instruction 'Call: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | CallSideEffect: call to ByValueConstructor | Instruction 'CallSideEffect: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | CallSideEffect: new | Instruction 'CallSideEffect: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Convert: new | Instruction 'Convert: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | FunctionAddress: call to ByValueConstructor | Instruction 'FunctionAddress: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | IndirectMayWriteSideEffect: call to ByValueConstructor | Instruction 'IndirectMayWriteSideEffect: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | InitializeDynamicAllocation: new | Instruction 'InitializeDynamicAllocation: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Call: call to ~ClassWithDestructor | Instruction 'Call: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | CallSideEffect: call to ~ClassWithDestructor | Instruction 'CallSideEffect: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | FunctionAddress: call to ~ClassWithDestructor | Instruction 'FunctionAddress: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Load: a | Instruction 'Load: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Load: temporary object | Instruction 'Load: temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Store: a | Instruction 'Store: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | VariableAddress: a | Instruction 'VariableAddress: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | VariableAddress: temporary object | Instruction 'VariableAddress: temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -18,8 +38,14 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability +| ir.cpp:2445:29:2445:53 | Call: new | Block 'Call: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Convert: new | Block 'Convert: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Store: new | Block 'Store: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | backEdgeCountMismatch useNotDominatedByDefinition +| ir.cpp:2445:29:2445:53 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:29:2445:53 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | +| ir.cpp:2445:52:2445:52 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated From f1d2dac6487747dc77ecf5288892031aa01f1609 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 5 Apr 2024 14:46:27 +0100 Subject: [PATCH 22/35] C++: Fix a bug where the destructor attached to a 'new' expression would have multiple parents (the 'new' expression, the call to 'operator new', and the size expression). This happens because the latter two are 'TranslatedExpr's that return the 'new' expression as their expression even though they don't technically represent the translation of this expression. To prevent this bug we tell the IR construction that the latter two handle their destructors explicitly which means that IR construction doesn't try to synthesize them. --- .../implementation/raw/internal/TranslatedExpr.qll | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll index 61beb1ab147f..93ddf6c3fa13 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll @@ -2015,6 +2015,13 @@ abstract class TranslatedAllocationSize extends TranslatedExpr, TTranslatedAlloc final override predicate producesExprResult() { none() } final override Instruction getResult() { result = this.getInstruction(AllocationSizeTag()) } + + final override predicate handlesDestructorsExplicitly() { + // Since the enclosing `TranslatedNewOrNewArrayExpr` (implicitly) handles the destructors + // we need to disable the implicit handling here as otherwise the destructors will have + // multiple parents + any() + } } TranslatedAllocationSize getTranslatedAllocationSize(NewOrNewArrayExpr newExpr) { @@ -2172,6 +2179,13 @@ class TranslatedAllocatorCall extends TTranslatedAllocatorCall, TranslatedDirect final override predicate producesExprResult() { none() } + final override predicate handlesDestructorsExplicitly() { + // Since the enclosing `TranslatedNewOrNewArrayExpr` (implicitly) handles the destructors + // we need to disable the implicit handling here as otherwise the destructors will have + // multiple parents + any() + } + override Function getInstructionFunction(InstructionTag tag) { tag = CallTargetTag() and result = expr.getAllocator() } From 4c01c06f0c66521c0ef607417d7d5e9bf722ca91 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 5 Apr 2024 14:49:22 +0100 Subject: [PATCH 23/35] C++: Accept test changes. --- .../library-tests/ir/ir/aliased_ir.expected | 101 +++++++----------- .../ir/ir/aliased_ssa_consistency.expected | 35 ------ .../aliased_ssa_consistency_unsound.expected | 36 ------- .../ir/ir/operand_locations.expected | 96 ++++++----------- .../ir/ir/raw_consistency.expected | 26 ----- .../test/library-tests/ir/ir/raw_ir.expected | 86 ++++++--------- .../ir/ir/unaliased_ssa_consistency.expected | 26 ----- ...unaliased_ssa_consistency_unsound.expected | 26 ----- 8 files changed, 101 insertions(+), 331 deletions(-) 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 5cb3629dcd7d..a7d6bb1c2b69 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -16028,69 +16028,44 @@ ir.cpp: # 2443| void new_with_destructor(ClassWithDestructor) # 2443| Block 0 -# 2443| v2443_1(void) = EnterFunction : -# 2443| m2443_2(unknown) = AliasedDefinition : -# 2443| m2443_3(unknown) = InitializeNonLocal : -# 2443| m2443_4(unknown) = Chi : total:m2443_2, partial:m2443_3 -# 2443| r2443_5(glval) = VariableAddress[a] : -# 2443| m2443_6(ClassWithDestructor) = InitializeParameter[a] : &:r2443_5 -# 2445| r2445_1(glval) = VariableAddress[b] : -# 2445| r2445_2(glval) = FunctionAddress[operator new] : -# 2445| r2445_3(unsigned long) = Constant[1] : -#-----| Goto -> Block 4 -#-----| Goto -> Block 4 - -# 2445| Block 1 -# 2445| m2445_4(ByValueConstructor *) = Store[b] : &:r2445_1, r2445_5 -# 2446| v2446_1(void) = NoOp : -# 2443| v2443_7(void) = ReturnVoid : -# 2443| v2443_8(void) = AliasedUse : ~m2445_31, ~m2445_45 -# 2443| v2443_9(void) = ExitFunction : - -# 2445| Block 2 -# 2445| r2445_5(ByValueConstructor *) = Convert : r2445_17 -# 2445| r2445_6(glval) = FunctionAddress[ByValueConstructor] : -# 2445| r2445_7(glval) = VariableAddress[#temp2445:52] : -# 2445| r2445_8(glval) = VariableAddress[a] : -# 2445| r2445_9(ClassWithDestructor) = Load[a] : &:r2445_8, m2443_6 -# 2445| m2445_10(ClassWithDestructor) = Store[#temp2445:52] : &:r2445_7, r2445_9 -# 2445| r2445_11(ClassWithDestructor) = Load[#temp2445:52] : &:r2445_7, m2445_10 -# 2445| v2445_12(void) = Call[ByValueConstructor] : func:r2445_6, this:r2445_5, 0:r2445_11 -# 2445| m2445_13(unknown) = ^CallSideEffect : ~m2445_31, ~m2445_45 -# 2445| m2445_14(unknown) = Chi : total:m2445_31, total:m2445_45, partial:m2445_13 -# 2445| m2445_15(ByValueConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r2445_5 -# 2445| m2445_16(unknown) = Chi : total:m2445_22, total:m2445_25, total:m2445_36, total:m2445_39, partial:m2445_15 -#-----| Goto (back edge) -> Block 4 -#-----| Goto (back edge) -> Block 4 - -# 2445| Block 3 -# 2445| r2445_17(void *) = Call[operator new] : func:r2445_2, 0:r2445_3 -# 2445| m2445_18(unknown) = ^CallSideEffect : ~m2445_31, ~m2445_45 -# 2445| m2445_19(unknown) = Chi : total:m2445_31, total:m2445_45, partial:m2445_18 -# 2445| m2445_20(unknown) = ^InitializeDynamicAllocation : &:r2445_17 -#-----| Goto (back edge) -> Block 4 -#-----| Goto (back edge) -> Block 4 - -# 2445| Block 4 -# 2445| m2445_39(unknown) = Phi : from 2:m2445_16, from 3:m2445_20 -# 2445| m2445_40(unknown) = Phi : from 0:~m2443_4, from 2:~m2445_14, from 3:~m2445_19 -# 2445| m2445_38(ClassWithDestructor) = Phi : from 2:m2445_10, from 3:m2445_34, from 3:m2445_48 -# 2445| r2445_41(glval) = CopyValue : r2445_7 -# 2445| r2445_42(glval) = FunctionAddress[~ClassWithDestructor] : -# 2445| v2445_43(void) = Call[~ClassWithDestructor] : func:r2445_28, func:r2445_42, this:r2445_27, this:r2445_41 -# 2445| m2445_44(unknown) = ^CallSideEffect : ~m2445_23, ~m2445_26, ~m2445_37, ~m2445_40 -# 2445| m2445_45(unknown) = Chi : total:m2445_23, total:m2445_26, total:m2445_37, total:m2445_40, partial:m2445_30, partial:m2445_44 -# 2445| v2445_46(void) = ^IndirectReadSideEffect[-1] : &:r2445_27, &:r2445_41, m2445_21, m2445_24, m2445_35, m2445_38 -# 2445| m2445_47(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2445_27, &:r2445_41 -# 2445| m2445_48(ClassWithDestructor) = Chi : total:m2445_21, total:m2445_24, total:m2445_35, total:m2445_38, partial:m2445_33, partial:m2445_47 -#-----| Goto (back edge) -> Block 2 -#-----| Goto (back edge) -> Block 3 -#-----| Goto (back edge) -> Block 1 - -# 2445| Block 4 -#-----| Goto (back edge) -> Block 2 -#-----| Goto (back edge) -> Block 3 -#-----| Goto (back edge) -> Block 1 +# 2443| v2443_1(void) = EnterFunction : +# 2443| m2443_2(unknown) = AliasedDefinition : +# 2443| m2443_3(unknown) = InitializeNonLocal : +# 2443| m2443_4(unknown) = Chi : total:m2443_2, partial:m2443_3 +# 2443| r2443_5(glval) = VariableAddress[a] : +# 2443| m2443_6(ClassWithDestructor) = InitializeParameter[a] : &:r2443_5 +# 2445| r2445_1(glval) = VariableAddress[b] : +# 2445| r2445_2(glval) = FunctionAddress[operator new] : +# 2445| r2445_3(unsigned long) = Constant[1] : +# 2445| r2445_4(void *) = Call[operator new] : func:r2445_2, 0:r2445_3 +# 2445| m2445_5(unknown) = ^CallSideEffect : ~m2443_4 +# 2445| m2445_6(unknown) = Chi : total:m2443_4, partial:m2445_5 +# 2445| m2445_7(unknown) = ^InitializeDynamicAllocation : &:r2445_4 +# 2445| r2445_8(ByValueConstructor *) = Convert : r2445_4 +# 2445| r2445_9(glval) = FunctionAddress[ByValueConstructor] : +# 2445| r2445_10(glval) = VariableAddress[#temp2445:52] : +# 2445| r2445_11(glval) = VariableAddress[a] : +# 2445| r2445_12(ClassWithDestructor) = Load[a] : &:r2445_11, m2443_6 +# 2445| m2445_13(ClassWithDestructor) = Store[#temp2445:52] : &:r2445_10, r2445_12 +# 2445| r2445_14(ClassWithDestructor) = Load[#temp2445:52] : &:r2445_10, m2445_13 +# 2445| v2445_15(void) = Call[ByValueConstructor] : func:r2445_9, this:r2445_8, 0:r2445_14 +# 2445| m2445_16(unknown) = ^CallSideEffect : ~m2445_6 +# 2445| m2445_17(unknown) = Chi : total:m2445_6, partial:m2445_16 +# 2445| m2445_18(ByValueConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r2445_8 +# 2445| m2445_19(unknown) = Chi : total:m2445_7, partial:m2445_18 +# 2445| r2445_20(glval) = CopyValue : r2445_10 +# 2445| r2445_21(glval) = FunctionAddress[~ClassWithDestructor] : +# 2445| v2445_22(void) = Call[~ClassWithDestructor] : func:r2445_21, this:r2445_20 +# 2445| m2445_23(unknown) = ^CallSideEffect : ~m2445_17 +# 2445| m2445_24(unknown) = Chi : total:m2445_17, partial:m2445_23 +# 2445| v2445_25(void) = ^IndirectReadSideEffect[-1] : &:r2445_20, m2445_13 +# 2445| m2445_26(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2445_20 +# 2445| m2445_27(ClassWithDestructor) = Chi : total:m2445_13, partial:m2445_26 +# 2445| m2445_28(ByValueConstructor *) = Store[b] : &:r2445_1, r2445_8 +# 2446| v2446_1(void) = NoOp : +# 2443| v2443_7(void) = ReturnVoid : +# 2443| v2443_8(void) = AliasedUse : ~m2445_24 +# 2443| v2443_9(void) = ExitFunction : 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 8ba336b67a9e..b93c7d2649f8 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 @@ -2,41 +2,12 @@ missingOperand unexpectedOperand duplicateOperand missingPhiOperand -| ir.cpp:2445:52:2445:52 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is missing an operand for predecessor block 'EnterFunction: new_with_destructor' in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| ir.cpp:2445:52:2445:52 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 3 successors of kind 'Goto' in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | unexplainedLoop -| ir.cpp:2445:29:2445:53 | Call: call to ByValueConstructor | Instruction 'Call: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Call: new | Instruction 'Call: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | CallSideEffect: call to ByValueConstructor | Instruction 'CallSideEffect: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | CallSideEffect: new | Instruction 'CallSideEffect: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Chi: call to ByValueConstructor | Instruction 'Chi: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Chi: call to ByValueConstructor | Instruction 'Chi: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Chi: new | Instruction 'Chi: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Chi: new | Instruction 'Chi: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Convert: new | Instruction 'Convert: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | FunctionAddress: call to ByValueConstructor | Instruction 'FunctionAddress: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | IndirectMayWriteSideEffect: call to ByValueConstructor | Instruction 'IndirectMayWriteSideEffect: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | InitializeDynamicAllocation: new | Instruction 'InitializeDynamicAllocation: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Call: call to ~ClassWithDestructor | Instruction 'Call: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | CallSideEffect: call to ~ClassWithDestructor | Instruction 'CallSideEffect: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Chi: call to ~ClassWithDestructor | Instruction 'Chi: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | FunctionAddress: call to ~ClassWithDestructor | Instruction 'FunctionAddress: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Load: a | Instruction 'Load: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Load: temporary object | Instruction 'Load: temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Store: a | Instruction 'Store: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | VariableAddress: a | Instruction 'VariableAddress: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | VariableAddress: temporary object | Instruction 'VariableAddress: temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -47,14 +18,8 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability -| ir.cpp:2445:29:2445:53 | Call: new | Block 'Call: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Convert: new | Block 'Convert: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Store: new | Block 'Store: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | backEdgeCountMismatch useNotDominatedByDefinition -| ir.cpp:2445:29:2445:53 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 c88ec74f1f00..ef225d8ad6cb 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 @@ -2,8 +2,6 @@ missingOperand unexpectedOperand duplicateOperand missingPhiOperand -| ir.cpp:2445:52:2445:52 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is missing an operand for predecessor block 'EnterFunction: new_with_destructor' in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is missing an operand for predecessor block 'EnterFunction: new_with_destructor' in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | missingOperandType | destructors_for_temps.cpp:39:3:39:53 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | destructors_for_temps.cpp:38:6:38:15 | void temp_test5(bool) | void temp_test5(bool) | | ir.cpp:1425:5:1425:30 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | ir.cpp:1414:6:1414:21 | void temporary_string() | void temporary_string() | @@ -12,35 +10,7 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| ir.cpp:2445:52:2445:52 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 3 successors of kind 'Goto' in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | unexplainedLoop -| ir.cpp:2445:29:2445:53 | Call: call to ByValueConstructor | Instruction 'Call: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Call: new | Instruction 'Call: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | CallSideEffect: call to ByValueConstructor | Instruction 'CallSideEffect: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | CallSideEffect: new | Instruction 'CallSideEffect: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Chi: call to ByValueConstructor | Instruction 'Chi: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Chi: call to ByValueConstructor | Instruction 'Chi: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Chi: new | Instruction 'Chi: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Convert: new | Instruction 'Convert: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | FunctionAddress: call to ByValueConstructor | Instruction 'FunctionAddress: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | IndirectMayWriteSideEffect: call to ByValueConstructor | Instruction 'IndirectMayWriteSideEffect: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | InitializeDynamicAllocation: new | Instruction 'InitializeDynamicAllocation: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Call: call to ~ClassWithDestructor | Instruction 'Call: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | CallSideEffect: call to ~ClassWithDestructor | Instruction 'CallSideEffect: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Chi: call to ~ClassWithDestructor | Instruction 'Chi: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | FunctionAddress: call to ~ClassWithDestructor | Instruction 'FunctionAddress: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Load: a | Instruction 'Load: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Load: temporary object | Instruction 'Load: temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Store: a | Instruction 'Store: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | VariableAddress: a | Instruction 'VariableAddress: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | VariableAddress: temporary object | Instruction 'VariableAddress: temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -51,14 +21,8 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability -| ir.cpp:2445:29:2445:53 | Call: new | Block 'Call: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Convert: new | Block 'Convert: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Store: new | Block 'Store: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | backEdgeCountMismatch useNotDominatedByDefinition -| ir.cpp:2445:29:2445:53 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 0fae2cc75dfe..26453c84241c 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -13478,77 +13478,43 @@ | ir.cpp:2437:1:2437:1 | SideEffect | ~m2435_6 | | ir.cpp:2443:6:2443:24 | ChiPartial | partial:m2443_3 | | ir.cpp:2443:6:2443:24 | ChiTotal | total:m2443_2 | -| ir.cpp:2443:6:2443:24 | SideEffect | ~m2445_31 | -| ir.cpp:2443:6:2443:24 | SideEffect | ~m2445_45 | +| ir.cpp:2443:6:2443:24 | SideEffect | ~m2445_24 | | ir.cpp:2443:46:2443:46 | Address | &:r2443_5 | | ir.cpp:2445:25:2445:25 | Address | &:r2445_1 | -| ir.cpp:2445:29:2445:53 | Address | &:r2445_5 | -| ir.cpp:2445:29:2445:53 | Address | &:r2445_17 | +| ir.cpp:2445:29:2445:53 | Address | &:r2445_4 | +| ir.cpp:2445:29:2445:53 | Address | &:r2445_8 | | ir.cpp:2445:29:2445:53 | Arg(0) | 0:r2445_3 | -| ir.cpp:2445:29:2445:53 | Arg(this) | this:r2445_5 | +| ir.cpp:2445:29:2445:53 | Arg(this) | this:r2445_8 | | ir.cpp:2445:29:2445:53 | CallTarget | func:r2445_2 | -| ir.cpp:2445:29:2445:53 | CallTarget | func:r2445_6 | -| ir.cpp:2445:29:2445:53 | ChiPartial | partial:m2445_13 | -| ir.cpp:2445:29:2445:53 | ChiPartial | partial:m2445_15 | +| ir.cpp:2445:29:2445:53 | CallTarget | func:r2445_9 | +| ir.cpp:2445:29:2445:53 | ChiPartial | partial:m2445_5 | +| ir.cpp:2445:29:2445:53 | ChiPartial | partial:m2445_16 | | ir.cpp:2445:29:2445:53 | ChiPartial | partial:m2445_18 | -| ir.cpp:2445:29:2445:53 | ChiTotal | total:m2445_22 | -| ir.cpp:2445:29:2445:53 | ChiTotal | total:m2445_25 | -| ir.cpp:2445:29:2445:53 | ChiTotal | total:m2445_31 | -| ir.cpp:2445:29:2445:53 | ChiTotal | total:m2445_31 | -| ir.cpp:2445:29:2445:53 | ChiTotal | total:m2445_36 | -| ir.cpp:2445:29:2445:53 | ChiTotal | total:m2445_39 | -| ir.cpp:2445:29:2445:53 | ChiTotal | total:m2445_45 | -| ir.cpp:2445:29:2445:53 | ChiTotal | total:m2445_45 | -| ir.cpp:2445:29:2445:53 | SideEffect | ~m2445_31 | -| ir.cpp:2445:29:2445:53 | SideEffect | ~m2445_31 | -| ir.cpp:2445:29:2445:53 | SideEffect | ~m2445_45 | -| ir.cpp:2445:29:2445:53 | SideEffect | ~m2445_45 | -| ir.cpp:2445:29:2445:53 | StoreValue | r2445_5 | -| ir.cpp:2445:29:2445:53 | Unary | r2445_17 | -| ir.cpp:2445:52:2445:52 | Address | &:r2445_7 | -| ir.cpp:2445:52:2445:52 | Address | &:r2445_7 | -| ir.cpp:2445:52:2445:52 | Address | &:r2445_8 | -| ir.cpp:2445:52:2445:52 | Address | &:r2445_27 | -| ir.cpp:2445:52:2445:52 | Address | &:r2445_27 | -| ir.cpp:2445:52:2445:52 | Address | &:r2445_41 | -| ir.cpp:2445:52:2445:52 | Address | &:r2445_41 | -| ir.cpp:2445:52:2445:52 | Arg(0) | 0:r2445_11 | -| ir.cpp:2445:52:2445:52 | Arg(this) | this:r2445_27 | -| ir.cpp:2445:52:2445:52 | Arg(this) | this:r2445_41 | -| ir.cpp:2445:52:2445:52 | CallTarget | func:r2445_28 | -| ir.cpp:2445:52:2445:52 | CallTarget | func:r2445_42 | -| ir.cpp:2445:52:2445:52 | ChiPartial | partial:m2445_30 | -| ir.cpp:2445:52:2445:52 | ChiPartial | partial:m2445_33 | -| ir.cpp:2445:52:2445:52 | ChiPartial | partial:m2445_44 | -| ir.cpp:2445:52:2445:52 | ChiPartial | partial:m2445_47 | -| ir.cpp:2445:52:2445:52 | ChiTotal | total:m2445_21 | -| ir.cpp:2445:52:2445:52 | ChiTotal | total:m2445_23 | -| ir.cpp:2445:52:2445:52 | ChiTotal | total:m2445_24 | -| ir.cpp:2445:52:2445:52 | ChiTotal | total:m2445_26 | -| ir.cpp:2445:52:2445:52 | ChiTotal | total:m2445_35 | -| ir.cpp:2445:52:2445:52 | ChiTotal | total:m2445_37 | -| ir.cpp:2445:52:2445:52 | ChiTotal | total:m2445_38 | -| ir.cpp:2445:52:2445:52 | ChiTotal | total:m2445_40 | +| ir.cpp:2445:29:2445:53 | ChiTotal | total:m2443_4 | +| ir.cpp:2445:29:2445:53 | ChiTotal | total:m2445_6 | +| ir.cpp:2445:29:2445:53 | ChiTotal | total:m2445_7 | +| ir.cpp:2445:29:2445:53 | SideEffect | ~m2443_4 | +| ir.cpp:2445:29:2445:53 | SideEffect | ~m2445_6 | +| ir.cpp:2445:29:2445:53 | StoreValue | r2445_8 | +| ir.cpp:2445:29:2445:53 | Unary | r2445_4 | +| ir.cpp:2445:52:2445:52 | Address | &:r2445_10 | +| ir.cpp:2445:52:2445:52 | Address | &:r2445_10 | +| ir.cpp:2445:52:2445:52 | Address | &:r2445_11 | +| ir.cpp:2445:52:2445:52 | Address | &:r2445_20 | +| ir.cpp:2445:52:2445:52 | Address | &:r2445_20 | +| ir.cpp:2445:52:2445:52 | Arg(0) | 0:r2445_14 | +| ir.cpp:2445:52:2445:52 | Arg(this) | this:r2445_20 | +| ir.cpp:2445:52:2445:52 | CallTarget | func:r2445_21 | +| ir.cpp:2445:52:2445:52 | ChiPartial | partial:m2445_23 | +| ir.cpp:2445:52:2445:52 | ChiPartial | partial:m2445_26 | +| ir.cpp:2445:52:2445:52 | ChiTotal | total:m2445_13 | +| ir.cpp:2445:52:2445:52 | ChiTotal | total:m2445_17 | | ir.cpp:2445:52:2445:52 | Load | m2443_6 | -| ir.cpp:2445:52:2445:52 | Load | m2445_10 | -| ir.cpp:2445:52:2445:52 | Phi | from 0:~m2443_4 | -| ir.cpp:2445:52:2445:52 | Phi | from 2:m2445_10 | -| ir.cpp:2445:52:2445:52 | Phi | from 2:m2445_16 | -| ir.cpp:2445:52:2445:52 | Phi | from 2:~m2445_14 | -| ir.cpp:2445:52:2445:52 | Phi | from 3:m2445_20 | -| ir.cpp:2445:52:2445:52 | Phi | from 3:m2445_34 | -| ir.cpp:2445:52:2445:52 | Phi | from 3:m2445_48 | -| ir.cpp:2445:52:2445:52 | Phi | from 3:~m2445_19 | -| ir.cpp:2445:52:2445:52 | SideEffect | m2445_21 | -| ir.cpp:2445:52:2445:52 | SideEffect | m2445_24 | -| ir.cpp:2445:52:2445:52 | SideEffect | m2445_35 | -| ir.cpp:2445:52:2445:52 | SideEffect | m2445_38 | -| ir.cpp:2445:52:2445:52 | SideEffect | ~m2445_23 | -| ir.cpp:2445:52:2445:52 | SideEffect | ~m2445_26 | -| ir.cpp:2445:52:2445:52 | SideEffect | ~m2445_37 | -| ir.cpp:2445:52:2445:52 | SideEffect | ~m2445_40 | -| ir.cpp:2445:52:2445:52 | StoreValue | r2445_9 | -| ir.cpp:2445:52:2445:52 | Unary | r2445_7 | +| ir.cpp:2445:52:2445:52 | Load | m2445_13 | +| ir.cpp:2445:52:2445:52 | SideEffect | m2445_13 | +| ir.cpp:2445:52:2445:52 | SideEffect | ~m2445_17 | +| ir.cpp:2445:52:2445:52 | StoreValue | r2445_12 | +| ir.cpp:2445:52:2445:52 | Unary | r2445_10 | | 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 ba01d7680d2c..356390f9b4ff 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -7,27 +7,7 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| ir.cpp:2445:52:2445:52 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 3 successors of kind 'Goto' in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | unexplainedLoop -| ir.cpp:2445:29:2445:53 | Call: call to ByValueConstructor | Instruction 'Call: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Call: new | Instruction 'Call: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | CallSideEffect: call to ByValueConstructor | Instruction 'CallSideEffect: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | CallSideEffect: new | Instruction 'CallSideEffect: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Convert: new | Instruction 'Convert: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | FunctionAddress: call to ByValueConstructor | Instruction 'FunctionAddress: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | IndirectMayWriteSideEffect: call to ByValueConstructor | Instruction 'IndirectMayWriteSideEffect: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | InitializeDynamicAllocation: new | Instruction 'InitializeDynamicAllocation: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Call: call to ~ClassWithDestructor | Instruction 'Call: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | CallSideEffect: call to ~ClassWithDestructor | Instruction 'CallSideEffect: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | FunctionAddress: call to ~ClassWithDestructor | Instruction 'FunctionAddress: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Load: a | Instruction 'Load: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Load: temporary object | Instruction 'Load: temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Store: a | Instruction 'Store: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | VariableAddress: a | Instruction 'VariableAddress: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | VariableAddress: temporary object | Instruction 'VariableAddress: temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -38,15 +18,9 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability -| ir.cpp:2445:29:2445:53 | Call: new | Block 'Call: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Convert: new | Block 'Convert: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Store: new | Block 'Store: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | backEdgeCountMismatch useNotDominatedByDefinition | ir.cpp:1535:8:1535:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1535:8:1535:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | -| ir.cpp:2445:29:2445:53 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | | try_except.c:39:15:39:15 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:32:6:32:6 | void h(int) | void h(int) | 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 f3540e46c456..52625deec7ed 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -14722,60 +14722,38 @@ ir.cpp: # 2443| void new_with_destructor(ClassWithDestructor) # 2443| Block 0 -# 2443| v2443_1(void) = EnterFunction : -# 2443| mu2443_2(unknown) = AliasedDefinition : -# 2443| mu2443_3(unknown) = InitializeNonLocal : -# 2443| r2443_4(glval) = VariableAddress[a] : -# 2443| mu2443_5(ClassWithDestructor) = InitializeParameter[a] : &:r2443_4 -# 2445| r2445_1(glval) = VariableAddress[b] : -# 2445| r2445_2(glval) = FunctionAddress[operator new] : -# 2445| r2445_3(unsigned long) = Constant[1] : -#-----| Goto -> Block 4 -#-----| Goto -> Block 4 - -# 2445| Block 1 -# 2445| mu2445_4(ByValueConstructor *) = Store[b] : &:r2445_1, r2445_5 -# 2446| v2446_1(void) = NoOp : -# 2443| v2443_6(void) = ReturnVoid : -# 2443| v2443_7(void) = AliasedUse : ~m? -# 2443| v2443_8(void) = ExitFunction : - -# 2445| Block 2 -# 2445| r2445_5(ByValueConstructor *) = Convert : r2445_15 -# 2445| r2445_6(glval) = FunctionAddress[ByValueConstructor] : -# 2445| r2445_7(glval) = VariableAddress[#temp2445:52] : -# 2445| r2445_8(glval) = VariableAddress[a] : -# 2445| r2445_9(ClassWithDestructor) = Load[a] : &:r2445_8, ~m? -# 2445| mu2445_10(ClassWithDestructor) = Store[#temp2445:52] : &:r2445_7, r2445_9 -# 2445| r2445_11(ClassWithDestructor) = Load[#temp2445:52] : &:r2445_7, ~m? -# 2445| v2445_12(void) = Call[ByValueConstructor] : func:r2445_6, this:r2445_5, 0:r2445_11 -# 2445| mu2445_13(unknown) = ^CallSideEffect : ~m? -# 2445| mu2445_14(ByValueConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r2445_5 -#-----| Goto (back edge) -> Block 4 -#-----| Goto (back edge) -> Block 4 - -# 2445| Block 3 -# 2445| r2445_15(void *) = Call[operator new] : func:r2445_2, 0:r2445_3 -# 2445| mu2445_16(unknown) = ^CallSideEffect : ~m? -# 2445| mu2445_17(unknown) = ^InitializeDynamicAllocation : &:r2445_15 -#-----| Goto (back edge) -> Block 4 -#-----| Goto (back edge) -> Block 4 - -# 2445| Block 4 -# 2445| r2445_24(glval) = CopyValue : r2445_7 -# 2445| r2445_25(glval) = FunctionAddress[~ClassWithDestructor] : -# 2445| v2445_26(void) = Call[~ClassWithDestructor] : func:r2445_19, func:r2445_25, this:r2445_18, this:r2445_24 -# 2445| mu2445_27(unknown) = ^CallSideEffect : ~m? -# 2445| v2445_28(void) = ^IndirectReadSideEffect[-1] : &:r2445_18, &:r2445_24, ~m? -# 2445| mu2445_29(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2445_18, &:r2445_24 -#-----| Goto (back edge) -> Block 2 -#-----| Goto (back edge) -> Block 3 -#-----| Goto (back edge) -> Block 1 - -# 2445| Block 4 -#-----| Goto (back edge) -> Block 2 -#-----| Goto (back edge) -> Block 3 -#-----| Goto (back edge) -> Block 1 +# 2443| v2443_1(void) = EnterFunction : +# 2443| mu2443_2(unknown) = AliasedDefinition : +# 2443| mu2443_3(unknown) = InitializeNonLocal : +# 2443| r2443_4(glval) = VariableAddress[a] : +# 2443| mu2443_5(ClassWithDestructor) = InitializeParameter[a] : &:r2443_4 +# 2445| r2445_1(glval) = VariableAddress[b] : +# 2445| r2445_2(glval) = FunctionAddress[operator new] : +# 2445| r2445_3(unsigned long) = Constant[1] : +# 2445| r2445_4(void *) = Call[operator new] : func:r2445_2, 0:r2445_3 +# 2445| mu2445_5(unknown) = ^CallSideEffect : ~m? +# 2445| mu2445_6(unknown) = ^InitializeDynamicAllocation : &:r2445_4 +# 2445| r2445_7(ByValueConstructor *) = Convert : r2445_4 +# 2445| r2445_8(glval) = FunctionAddress[ByValueConstructor] : +# 2445| r2445_9(glval) = VariableAddress[#temp2445:52] : +# 2445| r2445_10(glval) = VariableAddress[a] : +# 2445| r2445_11(ClassWithDestructor) = Load[a] : &:r2445_10, ~m? +# 2445| mu2445_12(ClassWithDestructor) = Store[#temp2445:52] : &:r2445_9, r2445_11 +# 2445| r2445_13(ClassWithDestructor) = Load[#temp2445:52] : &:r2445_9, ~m? +# 2445| v2445_14(void) = Call[ByValueConstructor] : func:r2445_8, this:r2445_7, 0:r2445_13 +# 2445| mu2445_15(unknown) = ^CallSideEffect : ~m? +# 2445| mu2445_16(ByValueConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r2445_7 +# 2445| r2445_17(glval) = CopyValue : r2445_9 +# 2445| r2445_18(glval) = FunctionAddress[~ClassWithDestructor] : +# 2445| v2445_19(void) = Call[~ClassWithDestructor] : func:r2445_18, this:r2445_17 +# 2445| mu2445_20(unknown) = ^CallSideEffect : ~m? +# 2445| v2445_21(void) = ^IndirectReadSideEffect[-1] : &:r2445_17, ~m? +# 2445| mu2445_22(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2445_17 +# 2445| mu2445_23(ByValueConstructor *) = Store[b] : &:r2445_1, r2445_7 +# 2446| v2446_1(void) = NoOp : +# 2443| v2443_6(void) = ReturnVoid : +# 2443| v2443_7(void) = AliasedUse : ~m? +# 2443| v2443_8(void) = ExitFunction : perf-regression.cpp: # 6| void Big::Big() 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 dc7831d5a20b..b93c7d2649f8 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 @@ -7,27 +7,7 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| ir.cpp:2445:52:2445:52 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 3 successors of kind 'Goto' in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | unexplainedLoop -| ir.cpp:2445:29:2445:53 | Call: call to ByValueConstructor | Instruction 'Call: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Call: new | Instruction 'Call: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | CallSideEffect: call to ByValueConstructor | Instruction 'CallSideEffect: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | CallSideEffect: new | Instruction 'CallSideEffect: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Convert: new | Instruction 'Convert: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | FunctionAddress: call to ByValueConstructor | Instruction 'FunctionAddress: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | IndirectMayWriteSideEffect: call to ByValueConstructor | Instruction 'IndirectMayWriteSideEffect: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | InitializeDynamicAllocation: new | Instruction 'InitializeDynamicAllocation: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Call: call to ~ClassWithDestructor | Instruction 'Call: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | CallSideEffect: call to ~ClassWithDestructor | Instruction 'CallSideEffect: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | FunctionAddress: call to ~ClassWithDestructor | Instruction 'FunctionAddress: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Load: a | Instruction 'Load: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Load: temporary object | Instruction 'Load: temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Store: a | Instruction 'Store: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | VariableAddress: a | Instruction 'VariableAddress: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | VariableAddress: temporary object | Instruction 'VariableAddress: temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -38,14 +18,8 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability -| ir.cpp:2445:29:2445:53 | Call: new | Block 'Call: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Convert: new | Block 'Convert: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Store: new | Block 'Store: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | backEdgeCountMismatch useNotDominatedByDefinition -| ir.cpp:2445:29:2445:53 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 dc7831d5a20b..b93c7d2649f8 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 @@ -7,27 +7,7 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| ir.cpp:2445:52:2445:52 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 3 successors of kind 'Goto' in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | unexplainedLoop -| ir.cpp:2445:29:2445:53 | Call: call to ByValueConstructor | Instruction 'Call: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Call: new | Instruction 'Call: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | CallSideEffect: call to ByValueConstructor | Instruction 'CallSideEffect: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | CallSideEffect: new | Instruction 'CallSideEffect: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Convert: new | Instruction 'Convert: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | FunctionAddress: call to ByValueConstructor | Instruction 'FunctionAddress: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | IndirectMayWriteSideEffect: call to ByValueConstructor | Instruction 'IndirectMayWriteSideEffect: call to ByValueConstructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | InitializeDynamicAllocation: new | Instruction 'InitializeDynamicAllocation: new' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Call: call to ~ClassWithDestructor | Instruction 'Call: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | CallSideEffect: call to ~ClassWithDestructor | Instruction 'CallSideEffect: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | FunctionAddress: call to ~ClassWithDestructor | Instruction 'FunctionAddress: call to ~ClassWithDestructor' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Load: a | Instruction 'Load: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Load: temporary object | Instruction 'Load: temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Store: a | Instruction 'Store: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | VariableAddress: a | Instruction 'VariableAddress: a' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | VariableAddress: temporary object | Instruction 'VariableAddress: temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -38,14 +18,8 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability -| ir.cpp:2445:29:2445:53 | Call: new | Block 'Call: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Convert: new | Block 'Convert: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Store: new | Block 'Store: new' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | backEdgeCountMismatch useNotDominatedByDefinition -| ir.cpp:2445:29:2445:53 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:29:2445:53 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | -| ir.cpp:2445:52:2445:52 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:2443:6:2443:24 | void new_with_destructor(ClassWithDestructor) | void new_with_destructor(ClassWithDestructor) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated From 955f9c735c3130798aaeed1574a116ed21bf0d1e Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 5 Apr 2024 18:05:30 +0100 Subject: [PATCH 24/35] C++: Add a failing testcase. --- .../library-tests/ir/ir/PrintAST.expected | 50 ++++++++++++++++ .../library-tests/ir/ir/aliased_ir.expected | 53 +++++++++++++++++ .../ir/ir/aliased_ssa_consistency.expected | 14 +++++ .../aliased_ssa_consistency_unsound.expected | 15 +++++ cpp/ql/test/library-tests/ir/ir/ir.cpp | 20 +++++++ .../ir/ir/operand_locations.expected | 59 +++++++++++++++++++ .../ir/ir/raw_consistency.expected | 11 ++++ .../test/library-tests/ir/ir/raw_ir.expected | 46 +++++++++++++++ .../ir/ir/unaliased_ssa_consistency.expected | 11 ++++ ...unaliased_ssa_consistency_unsound.expected | 11 ++++ 10 files changed, 290 insertions(+) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 500c57f0c494..70e5423f5cf8 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -20323,6 +20323,56 @@ ir.cpp: # 2445| Type = [Class] ClassWithDestructor # 2445| ValueCategory = xvalue # 2446| getStmt(1): [ReturnStmt] return ... +# 2449| [CopyAssignmentOperator] rvalue_conversion_with_destructor::A& rvalue_conversion_with_destructor::A::operator=(rvalue_conversion_with_destructor::A const&) +# 2449| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const A & +# 2449| [MoveAssignmentOperator] rvalue_conversion_with_destructor::A& rvalue_conversion_with_destructor::A::operator=(rvalue_conversion_with_destructor::A&&) +# 2449| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [RValueReferenceType] A && +# 2453| [CopyAssignmentOperator] rvalue_conversion_with_destructor::B& rvalue_conversion_with_destructor::B::operator=(rvalue_conversion_with_destructor::B const&) +# 2453| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const B & +# 2453| [Constructor] void rvalue_conversion_with_destructor::B::B() +# 2453| : +# 2455| [Destructor] void rvalue_conversion_with_destructor::B::~B() +# 2455| : +# 2457| [ConstMemberFunction] rvalue_conversion_with_destructor::A* rvalue_conversion_with_destructor::B::operator->() const +# 2457| : +# 2460| [TopLevelFunction] rvalue_conversion_with_destructor::B rvalue_conversion_with_destructor::get() +# 2460| : +# 2462| [TopLevelFunction] void rvalue_conversion_with_destructor::test() +# 2462| : +# 2463| getEntryPoint(): [BlockStmt] { ... } +# 2464| getStmt(0): [DeclStmt] declaration +# 2464| getDeclarationEntry(0): [VariableDeclarationEntry] definition of a +# 2464| Type = [IntType] unsigned int +# 2464| getVariable().getInitializer(): [Initializer] initializer for a +# 2464| getExpr(): [PointerFieldAccess] a +# 2464| Type = [IntType] unsigned int +# 2464| ValueCategory = prvalue(load) +# 2464| getQualifier(): [FunctionCall] call to operator-> +# 2464| Type = [PointerType] A * +# 2464| ValueCategory = prvalue +# 2464| getQualifier(): [FunctionCall] call to get +# 2464| Type = [Struct] B +# 2464| ValueCategory = prvalue +# 2464| getQualifier().getFullyConverted(): [CStyleCast] (const B)... +# 2464| Conversion = [PrvalueAdjustmentConversion] prvalue adjustment conversion +# 2464| Type = [SpecifiedType] const B +# 2464| ValueCategory = prvalue +# 2464| getExpr(): [TemporaryObjectExpr] temporary object +# 2464| Type = [Struct] B +# 2464| ValueCategory = prvalue(load) +# 2464| getImplicitDestructorCall(0): [DestructorCall] call to ~B +# 2464| Type = [VoidType] void +# 2464| ValueCategory = prvalue +# 2464| getQualifier(): [ReuseExpr] reuse of temporary object +# 2464| Type = [Struct] B +# 2464| ValueCategory = xvalue +# 2465| getStmt(1): [ReturnStmt] return ... perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| : 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 a7d6bb1c2b69..07b797ad3d15 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -16067,6 +16067,59 @@ ir.cpp: # 2443| v2443_8(void) = AliasedUse : ~m2445_24 # 2443| v2443_9(void) = ExitFunction : +# 2462| void rvalue_conversion_with_destructor::test() +# 2462| Block 0 +# 2462| v2462_1(void) = EnterFunction : +# 2462| m2462_2(unknown) = AliasedDefinition : +# 2462| m2462_3(unknown) = InitializeNonLocal : +# 2462| m2462_4(unknown) = Chi : total:m2462_2, partial:m2462_3 +# 2464| r2464_1(glval) = VariableAddress[a] : +# 2464| r2464_2(glval) = VariableAddress[#temp2464:18] : +# 2464| r2464_3(glval) = FunctionAddress[get] : +# 2464| r2464_4(B) = Call[get] : func:r2464_3 +# 2464| m2464_5(unknown) = ^CallSideEffect : ~m2462_4 +# 2464| m2464_6(unknown) = Chi : total:m2462_4, partial:m2464_5 +# 2464| m2464_7(B) = Store[#temp2464:18] : &:r2464_2, r2464_4 +# 2464| r2464_8(glval) = Convert : r2464_2 +# 2464| r2464_9(glval) = FunctionAddress[operator->] : +# 2464| r2464_10(A *) = Call[operator->] : func:r2464_9, this:r2464_8 +# 2464| m2464_11(unknown) = ^CallSideEffect : ~m2464_6 +# 2464| m2464_12(unknown) = Chi : total:m2464_6, partial:m2464_11 +# 2464| v2464_13(void) = ^IndirectReadSideEffect[-1] : &:r2464_8, m2464_7 +# 2464| r2464_14(glval) = FieldAddress[a] : r2464_10 +#-----| Goto -> Block 3 +#-----| Goto -> Block 3 + +# 2464| Block 1 +# 2464| m2464_15(unsigned int) = Store[a] : &:r2464_1, r2464_16 +# 2465| v2465_1(void) = NoOp : +# 2462| v2462_5(void) = ReturnVoid : +# 2462| v2462_6(void) = AliasedUse : ~m2464_25, ~m2464_37 +# 2462| v2462_7(void) = ExitFunction : + +# 2464| Block 2 +# 2464| r2464_16(unsigned int) = Load[?] : &:r2464_14, ~m2464_25, ~m2464_37 +#-----| Goto (back edge) -> Block 3 +#-----| Goto (back edge) -> Block 3 + +# 2464| Block 3 +# 2464| m2464_31(B) = Phi : from 0:m2464_7, from 2:m2464_28, from 2:m2464_40 +# 2464| m2464_32(unknown) = Phi : from 0:~m2464_12, from 2:~m2464_25, from 2:~m2464_37 +# 2464| r2464_33(glval) = CopyValue : r2464_2 +# 2464| r2464_34(glval) = FunctionAddress[~B] : +# 2464| v2464_35(void) = Call[~B] : func:r2464_22, func:r2464_34, this:r2464_21, this:r2464_33 +# 2464| m2464_36(unknown) = ^CallSideEffect : ~m2464_18, ~m2464_20, ~m2464_30, ~m2464_32 +# 2464| m2464_37(unknown) = Chi : total:m2464_18, total:m2464_20, total:m2464_30, total:m2464_32, partial:m2464_24, partial:m2464_36 +# 2464| v2464_38(void) = ^IndirectReadSideEffect[-1] : &:r2464_21, &:r2464_33, m2464_17, m2464_19, m2464_29, m2464_31 +# 2464| m2464_39(B) = ^IndirectMayWriteSideEffect[-1] : &:r2464_21, &:r2464_33 +# 2464| m2464_40(B) = Chi : total:m2464_17, total:m2464_19, total:m2464_29, total:m2464_31, partial:m2464_27, partial:m2464_39 +#-----| Goto (back edge) -> Block 1 +#-----| Goto (back edge) -> Block 2 + +# 2464| Block 3 +#-----| Goto (back edge) -> Block 1 +#-----| Goto (back edge) -> Block 2 + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 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 b93c7d2649f8..690b279f0d99 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 @@ -7,7 +7,18 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors +| ir.cpp:2464:18:2464:22 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | unexplainedLoop +| ir.cpp:2464:18:2464:22 | Call: call to ~B | Instruction 'Call: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | CallSideEffect: call to ~B | Instruction 'CallSideEffect: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | Chi: call to ~B | Instruction 'Chi: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | FunctionAddress: call to ~B | Instruction 'FunctionAddress: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:25:2464:25 | Load: a | Instruction 'Load: a' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -18,8 +29,11 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability +| ir.cpp:2464:25:2464:25 | Load: a | Block 'Load: a' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:25:2464:25 | Store: a | Block 'Store: a' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | backEdgeCountMismatch useNotDominatedByDefinition +| ir.cpp:2464:25:2464:25 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 ef225d8ad6cb..0966d7662e7c 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 @@ -10,7 +10,19 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors +| ir.cpp:2464:18:2464:22 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | unexplainedLoop +| ir.cpp:2464:18:2464:22 | Call: call to ~B | Instruction 'Call: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | CallSideEffect: call to ~B | Instruction 'CallSideEffect: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | Chi: call to ~B | Instruction 'Chi: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | FunctionAddress: call to ~B | Instruction 'FunctionAddress: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:25:2464:25 | Load: a | Instruction 'Load: a' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -21,8 +33,11 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability +| ir.cpp:2464:25:2464:25 | Load: a | Block 'Load: a' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:25:2464:25 | Store: a | Block 'Store: a' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | backEdgeCountMismatch useNotDominatedByDefinition +| ir.cpp:2464:25:2464:25 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 022e207c7f21..5e55a31c203f 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -2445,4 +2445,24 @@ void new_with_destructor(ClassWithDestructor a) ByValueConstructor* b = new ByValueConstructor(a); } +namespace rvalue_conversion_with_destructor { + struct A { + unsigned a; + }; + + struct B + { + ~B(); + + inline A *operator->() const; + }; + + B get(); + + void test() + { + auto a = get()->a; + } +} + // semmle-extractor-options: -std=c++20 --clang 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 26453c84241c..27c143038422 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -13515,6 +13515,65 @@ | ir.cpp:2445:52:2445:52 | SideEffect | ~m2445_17 | | ir.cpp:2445:52:2445:52 | StoreValue | r2445_12 | | ir.cpp:2445:52:2445:52 | Unary | r2445_10 | +| ir.cpp:2462:10:2462:13 | ChiPartial | partial:m2462_3 | +| ir.cpp:2462:10:2462:13 | ChiTotal | total:m2462_2 | +| ir.cpp:2462:10:2462:13 | SideEffect | ~m2464_25 | +| ir.cpp:2462:10:2462:13 | SideEffect | ~m2464_37 | +| ir.cpp:2464:14:2464:14 | Address | &:r2464_1 | +| ir.cpp:2464:18:2464:20 | CallTarget | func:r2464_3 | +| ir.cpp:2464:18:2464:20 | ChiPartial | partial:m2464_5 | +| ir.cpp:2464:18:2464:20 | ChiTotal | total:m2462_4 | +| ir.cpp:2464:18:2464:20 | SideEffect | ~m2462_4 | +| ir.cpp:2464:18:2464:20 | StoreValue | r2464_4 | +| ir.cpp:2464:18:2464:22 | Address | &:r2464_2 | +| ir.cpp:2464:18:2464:22 | Address | &:r2464_8 | +| ir.cpp:2464:18:2464:22 | Address | &:r2464_21 | +| ir.cpp:2464:18:2464:22 | Address | &:r2464_21 | +| ir.cpp:2464:18:2464:22 | Address | &:r2464_33 | +| ir.cpp:2464:18:2464:22 | Address | &:r2464_33 | +| ir.cpp:2464:18:2464:22 | Arg(this) | this:r2464_8 | +| ir.cpp:2464:18:2464:22 | Arg(this) | this:r2464_21 | +| ir.cpp:2464:18:2464:22 | Arg(this) | this:r2464_33 | +| ir.cpp:2464:18:2464:22 | CallTarget | func:r2464_22 | +| ir.cpp:2464:18:2464:22 | CallTarget | func:r2464_34 | +| ir.cpp:2464:18:2464:22 | ChiPartial | partial:m2464_24 | +| ir.cpp:2464:18:2464:22 | ChiPartial | partial:m2464_27 | +| ir.cpp:2464:18:2464:22 | ChiPartial | partial:m2464_36 | +| ir.cpp:2464:18:2464:22 | ChiPartial | partial:m2464_39 | +| ir.cpp:2464:18:2464:22 | ChiTotal | total:m2464_17 | +| ir.cpp:2464:18:2464:22 | ChiTotal | total:m2464_18 | +| ir.cpp:2464:18:2464:22 | ChiTotal | total:m2464_19 | +| ir.cpp:2464:18:2464:22 | ChiTotal | total:m2464_20 | +| ir.cpp:2464:18:2464:22 | ChiTotal | total:m2464_29 | +| ir.cpp:2464:18:2464:22 | ChiTotal | total:m2464_30 | +| ir.cpp:2464:18:2464:22 | ChiTotal | total:m2464_31 | +| ir.cpp:2464:18:2464:22 | ChiTotal | total:m2464_32 | +| ir.cpp:2464:18:2464:22 | Phi | from 0:m2464_7 | +| ir.cpp:2464:18:2464:22 | Phi | from 0:~m2464_12 | +| ir.cpp:2464:18:2464:22 | Phi | from 2:m2464_28 | +| ir.cpp:2464:18:2464:22 | Phi | from 2:m2464_40 | +| ir.cpp:2464:18:2464:22 | Phi | from 2:~m2464_25 | +| ir.cpp:2464:18:2464:22 | Phi | from 2:~m2464_37 | +| ir.cpp:2464:18:2464:22 | SideEffect | m2464_7 | +| ir.cpp:2464:18:2464:22 | SideEffect | m2464_17 | +| ir.cpp:2464:18:2464:22 | SideEffect | m2464_19 | +| ir.cpp:2464:18:2464:22 | SideEffect | m2464_29 | +| ir.cpp:2464:18:2464:22 | SideEffect | m2464_31 | +| ir.cpp:2464:18:2464:22 | SideEffect | ~m2464_18 | +| ir.cpp:2464:18:2464:22 | SideEffect | ~m2464_20 | +| ir.cpp:2464:18:2464:22 | SideEffect | ~m2464_30 | +| ir.cpp:2464:18:2464:22 | SideEffect | ~m2464_32 | +| ir.cpp:2464:18:2464:22 | Unary | r2464_2 | +| ir.cpp:2464:18:2464:22 | Unary | r2464_2 | +| ir.cpp:2464:23:2464:23 | CallTarget | func:r2464_9 | +| ir.cpp:2464:23:2464:23 | ChiPartial | partial:m2464_11 | +| ir.cpp:2464:23:2464:23 | ChiTotal | total:m2464_6 | +| ir.cpp:2464:23:2464:23 | SideEffect | ~m2464_6 | +| ir.cpp:2464:23:2464:23 | Unary | r2464_10 | +| ir.cpp:2464:25:2464:25 | Address | &:r2464_14 | +| ir.cpp:2464:25:2464:25 | Load | ~m2464_25 | +| ir.cpp:2464:25:2464:25 | Load | ~m2464_37 | +| ir.cpp:2464:25:2464:25 | StoreValue | r2464_16 | | 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 356390f9b4ff..d0aa865b5041 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -7,7 +7,15 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors +| ir.cpp:2464:18:2464:22 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | unexplainedLoop +| ir.cpp:2464:18:2464:22 | Call: call to ~B | Instruction 'Call: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | CallSideEffect: call to ~B | Instruction 'CallSideEffect: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | FunctionAddress: call to ~B | Instruction 'FunctionAddress: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:25:2464:25 | Load: a | Instruction 'Load: a' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -18,9 +26,12 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability +| ir.cpp:2464:25:2464:25 | Load: a | Block 'Load: a' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:25:2464:25 | Store: a | Block 'Store: a' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | backEdgeCountMismatch useNotDominatedByDefinition | ir.cpp:1535:8:1535:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1535:8:1535:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | +| ir.cpp:2464:25:2464:25 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | | try_except.c:39:15:39:15 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:32:6:32:6 | void h(int) | void h(int) | 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 52625deec7ed..ffae86b61b69 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -14755,6 +14755,52 @@ ir.cpp: # 2443| v2443_7(void) = AliasedUse : ~m? # 2443| v2443_8(void) = ExitFunction : +# 2462| void rvalue_conversion_with_destructor::test() +# 2462| Block 0 +# 2462| v2462_1(void) = EnterFunction : +# 2462| mu2462_2(unknown) = AliasedDefinition : +# 2462| mu2462_3(unknown) = InitializeNonLocal : +# 2464| r2464_1(glval) = VariableAddress[a] : +# 2464| r2464_2(glval) = VariableAddress[#temp2464:18] : +# 2464| r2464_3(glval) = FunctionAddress[get] : +# 2464| r2464_4(B) = Call[get] : func:r2464_3 +# 2464| mu2464_5(unknown) = ^CallSideEffect : ~m? +# 2464| mu2464_6(B) = Store[#temp2464:18] : &:r2464_2, r2464_4 +# 2464| r2464_7(glval) = Convert : r2464_2 +# 2464| r2464_8(glval) = FunctionAddress[operator->] : +# 2464| r2464_9(A *) = Call[operator->] : func:r2464_8, this:r2464_7 +# 2464| mu2464_10(unknown) = ^CallSideEffect : ~m? +# 2464| v2464_11(void) = ^IndirectReadSideEffect[-1] : &:r2464_7, ~m? +# 2464| r2464_12(glval) = FieldAddress[a] : r2464_9 +#-----| Goto -> Block 3 +#-----| Goto -> Block 3 + +# 2464| Block 1 +# 2464| mu2464_13(unsigned int) = Store[a] : &:r2464_1, r2464_14 +# 2465| v2465_1(void) = NoOp : +# 2462| v2462_4(void) = ReturnVoid : +# 2462| v2462_5(void) = AliasedUse : ~m? +# 2462| v2462_6(void) = ExitFunction : + +# 2464| Block 2 +# 2464| r2464_14(unsigned int) = Load[?] : &:r2464_12, ~m? +#-----| Goto (back edge) -> Block 3 +#-----| Goto (back edge) -> Block 3 + +# 2464| Block 3 +# 2464| r2464_21(glval) = CopyValue : r2464_2 +# 2464| r2464_22(glval) = FunctionAddress[~B] : +# 2464| v2464_23(void) = Call[~B] : func:r2464_16, func:r2464_22, this:r2464_15, this:r2464_21 +# 2464| mu2464_24(unknown) = ^CallSideEffect : ~m? +# 2464| v2464_25(void) = ^IndirectReadSideEffect[-1] : &:r2464_15, &:r2464_21, ~m? +# 2464| mu2464_26(B) = ^IndirectMayWriteSideEffect[-1] : &:r2464_15, &:r2464_21 +#-----| Goto (back edge) -> Block 1 +#-----| Goto (back edge) -> Block 2 + +# 2464| Block 3 +#-----| Goto (back edge) -> Block 1 +#-----| Goto (back edge) -> Block 2 + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 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 b93c7d2649f8..8f1859233d1e 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 @@ -7,7 +7,15 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors +| ir.cpp:2464:18:2464:22 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | unexplainedLoop +| ir.cpp:2464:18:2464:22 | Call: call to ~B | Instruction 'Call: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | CallSideEffect: call to ~B | Instruction 'CallSideEffect: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | FunctionAddress: call to ~B | Instruction 'FunctionAddress: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:25:2464:25 | Load: a | Instruction 'Load: a' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -18,8 +26,11 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability +| ir.cpp:2464:25:2464:25 | Load: a | Block 'Load: a' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:25:2464:25 | Store: a | Block 'Store: a' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | backEdgeCountMismatch useNotDominatedByDefinition +| ir.cpp:2464:25:2464:25 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 b93c7d2649f8..8f1859233d1e 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 @@ -7,7 +7,15 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors +| ir.cpp:2464:18:2464:22 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | unexplainedLoop +| ir.cpp:2464:18:2464:22 | Call: call to ~B | Instruction 'Call: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | CallSideEffect: call to ~B | Instruction 'CallSideEffect: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | FunctionAddress: call to ~B | Instruction 'FunctionAddress: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:18:2464:22 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:25:2464:25 | Load: a | Instruction 'Load: a' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -18,8 +26,11 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability +| ir.cpp:2464:25:2464:25 | Load: a | Block 'Load: a' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | +| ir.cpp:2464:25:2464:25 | Store: a | Block 'Store: a' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | backEdgeCountMismatch useNotDominatedByDefinition +| ir.cpp:2464:25:2464:25 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated From 54e4103e71b11caa77d02654848dacbd9055168e Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 5 Apr 2024 18:07:53 +0100 Subject: [PATCH 25/35] C++: Fix another multiple parents problem. --- .../cpp/ir/implementation/raw/internal/TranslatedExpr.qll | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll index 93ddf6c3fa13..86e240b51c3e 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll @@ -411,6 +411,14 @@ class TranslatedLoad extends TranslatedValueCategoryAdjustment, TTranslatedLoad result = this.getOperand().getResult() ) } + + override predicate handlesDestructorsExplicitly() { + // The class that generates IR for `e` will (implicitly or explicitly) + // handle the generation of destructor calls for `e`. Without disabling + // destructor call generation here the destructor will get multiple + // parents. + any() + } } /** From 45e71543b4ee3743ee2699dc506b497809cbde3c Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 5 Apr 2024 18:08:25 +0100 Subject: [PATCH 26/35] C++: Accept test changes. --- .../library-tests/ir/ir/aliased_ir.expected | 82 ++++++++----------- .../ir/ir/aliased_ssa_consistency.expected | 14 ---- .../aliased_ssa_consistency_unsound.expected | 15 ---- .../ir/ir/operand_locations.expected | 52 +++--------- .../ir/ir/raw_consistency.expected | 11 --- .../test/library-tests/ir/ir/raw_ir.expected | 70 ++++++---------- .../ir/ir/unaliased_ssa_consistency.expected | 11 --- ...unaliased_ssa_consistency_unsound.expected | 11 --- 8 files changed, 72 insertions(+), 194 deletions(-) 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 07b797ad3d15..47a2148db2f8 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -16069,56 +16069,38 @@ ir.cpp: # 2462| void rvalue_conversion_with_destructor::test() # 2462| Block 0 -# 2462| v2462_1(void) = EnterFunction : -# 2462| m2462_2(unknown) = AliasedDefinition : -# 2462| m2462_3(unknown) = InitializeNonLocal : -# 2462| m2462_4(unknown) = Chi : total:m2462_2, partial:m2462_3 -# 2464| r2464_1(glval) = VariableAddress[a] : -# 2464| r2464_2(glval) = VariableAddress[#temp2464:18] : -# 2464| r2464_3(glval) = FunctionAddress[get] : -# 2464| r2464_4(B) = Call[get] : func:r2464_3 -# 2464| m2464_5(unknown) = ^CallSideEffect : ~m2462_4 -# 2464| m2464_6(unknown) = Chi : total:m2462_4, partial:m2464_5 -# 2464| m2464_7(B) = Store[#temp2464:18] : &:r2464_2, r2464_4 -# 2464| r2464_8(glval) = Convert : r2464_2 -# 2464| r2464_9(glval) = FunctionAddress[operator->] : -# 2464| r2464_10(A *) = Call[operator->] : func:r2464_9, this:r2464_8 -# 2464| m2464_11(unknown) = ^CallSideEffect : ~m2464_6 -# 2464| m2464_12(unknown) = Chi : total:m2464_6, partial:m2464_11 -# 2464| v2464_13(void) = ^IndirectReadSideEffect[-1] : &:r2464_8, m2464_7 -# 2464| r2464_14(glval) = FieldAddress[a] : r2464_10 -#-----| Goto -> Block 3 -#-----| Goto -> Block 3 - -# 2464| Block 1 -# 2464| m2464_15(unsigned int) = Store[a] : &:r2464_1, r2464_16 -# 2465| v2465_1(void) = NoOp : -# 2462| v2462_5(void) = ReturnVoid : -# 2462| v2462_6(void) = AliasedUse : ~m2464_25, ~m2464_37 -# 2462| v2462_7(void) = ExitFunction : - -# 2464| Block 2 -# 2464| r2464_16(unsigned int) = Load[?] : &:r2464_14, ~m2464_25, ~m2464_37 -#-----| Goto (back edge) -> Block 3 -#-----| Goto (back edge) -> Block 3 - -# 2464| Block 3 -# 2464| m2464_31(B) = Phi : from 0:m2464_7, from 2:m2464_28, from 2:m2464_40 -# 2464| m2464_32(unknown) = Phi : from 0:~m2464_12, from 2:~m2464_25, from 2:~m2464_37 -# 2464| r2464_33(glval) = CopyValue : r2464_2 -# 2464| r2464_34(glval) = FunctionAddress[~B] : -# 2464| v2464_35(void) = Call[~B] : func:r2464_22, func:r2464_34, this:r2464_21, this:r2464_33 -# 2464| m2464_36(unknown) = ^CallSideEffect : ~m2464_18, ~m2464_20, ~m2464_30, ~m2464_32 -# 2464| m2464_37(unknown) = Chi : total:m2464_18, total:m2464_20, total:m2464_30, total:m2464_32, partial:m2464_24, partial:m2464_36 -# 2464| v2464_38(void) = ^IndirectReadSideEffect[-1] : &:r2464_21, &:r2464_33, m2464_17, m2464_19, m2464_29, m2464_31 -# 2464| m2464_39(B) = ^IndirectMayWriteSideEffect[-1] : &:r2464_21, &:r2464_33 -# 2464| m2464_40(B) = Chi : total:m2464_17, total:m2464_19, total:m2464_29, total:m2464_31, partial:m2464_27, partial:m2464_39 -#-----| Goto (back edge) -> Block 1 -#-----| Goto (back edge) -> Block 2 - -# 2464| Block 3 -#-----| Goto (back edge) -> Block 1 -#-----| Goto (back edge) -> Block 2 +# 2462| v2462_1(void) = EnterFunction : +# 2462| m2462_2(unknown) = AliasedDefinition : +# 2462| m2462_3(unknown) = InitializeNonLocal : +# 2462| m2462_4(unknown) = Chi : total:m2462_2, partial:m2462_3 +# 2464| r2464_1(glval) = VariableAddress[a] : +# 2464| r2464_2(glval) = VariableAddress[#temp2464:18] : +# 2464| r2464_3(glval) = FunctionAddress[get] : +# 2464| r2464_4(B) = Call[get] : func:r2464_3 +# 2464| m2464_5(unknown) = ^CallSideEffect : ~m2462_4 +# 2464| m2464_6(unknown) = Chi : total:m2462_4, partial:m2464_5 +# 2464| m2464_7(B) = Store[#temp2464:18] : &:r2464_2, r2464_4 +# 2464| r2464_8(glval) = Convert : r2464_2 +# 2464| r2464_9(glval) = FunctionAddress[operator->] : +# 2464| r2464_10(A *) = Call[operator->] : func:r2464_9, this:r2464_8 +# 2464| m2464_11(unknown) = ^CallSideEffect : ~m2464_6 +# 2464| m2464_12(unknown) = Chi : total:m2464_6, partial:m2464_11 +# 2464| v2464_13(void) = ^IndirectReadSideEffect[-1] : &:r2464_8, m2464_7 +# 2464| r2464_14(glval) = FieldAddress[a] : r2464_10 +# 2464| r2464_15(glval) = CopyValue : r2464_2 +# 2464| r2464_16(glval) = FunctionAddress[~B] : +# 2464| v2464_17(void) = Call[~B] : func:r2464_16, this:r2464_15 +# 2464| m2464_18(unknown) = ^CallSideEffect : ~m2464_12 +# 2464| m2464_19(unknown) = Chi : total:m2464_12, partial:m2464_18 +# 2464| v2464_20(void) = ^IndirectReadSideEffect[-1] : &:r2464_15, m2464_7 +# 2464| m2464_21(B) = ^IndirectMayWriteSideEffect[-1] : &:r2464_15 +# 2464| m2464_22(B) = Chi : total:m2464_7, partial:m2464_21 +# 2464| r2464_23(unsigned int) = Load[?] : &:r2464_14, ~m2464_19 +# 2464| m2464_24(unsigned int) = Store[a] : &:r2464_1, r2464_23 +# 2465| v2465_1(void) = NoOp : +# 2462| v2462_5(void) = ReturnVoid : +# 2462| v2462_6(void) = AliasedUse : ~m2464_19 +# 2462| v2462_7(void) = ExitFunction : 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 690b279f0d99..b93c7d2649f8 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 @@ -7,18 +7,7 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| ir.cpp:2464:18:2464:22 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | unexplainedLoop -| ir.cpp:2464:18:2464:22 | Call: call to ~B | Instruction 'Call: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | CallSideEffect: call to ~B | Instruction 'CallSideEffect: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | Chi: call to ~B | Instruction 'Chi: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | FunctionAddress: call to ~B | Instruction 'FunctionAddress: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:25:2464:25 | Load: a | Instruction 'Load: a' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -29,11 +18,8 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability -| ir.cpp:2464:25:2464:25 | Load: a | Block 'Load: a' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:25:2464:25 | Store: a | Block 'Store: a' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | backEdgeCountMismatch useNotDominatedByDefinition -| ir.cpp:2464:25:2464:25 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 0966d7662e7c..ef225d8ad6cb 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 @@ -10,19 +10,7 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| ir.cpp:2464:18:2464:22 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | unexplainedLoop -| ir.cpp:2464:18:2464:22 | Call: call to ~B | Instruction 'Call: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | CallSideEffect: call to ~B | Instruction 'CallSideEffect: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | Chi: call to ~B | Instruction 'Chi: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | Chi: reuse of temporary object | Instruction 'Chi: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | FunctionAddress: call to ~B | Instruction 'FunctionAddress: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | Phi: reuse of temporary object | Instruction 'Phi: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:25:2464:25 | Load: a | Instruction 'Load: a' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -33,11 +21,8 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability -| ir.cpp:2464:25:2464:25 | Load: a | Block 'Load: a' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:25:2464:25 | Store: a | Block 'Store: a' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | backEdgeCountMismatch useNotDominatedByDefinition -| ir.cpp:2464:25:2464:25 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 27c143038422..ac743c3be751 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -13517,8 +13517,7 @@ | ir.cpp:2445:52:2445:52 | Unary | r2445_10 | | ir.cpp:2462:10:2462:13 | ChiPartial | partial:m2462_3 | | ir.cpp:2462:10:2462:13 | ChiTotal | total:m2462_2 | -| ir.cpp:2462:10:2462:13 | SideEffect | ~m2464_25 | -| ir.cpp:2462:10:2462:13 | SideEffect | ~m2464_37 | +| ir.cpp:2462:10:2462:13 | SideEffect | ~m2464_19 | | ir.cpp:2464:14:2464:14 | Address | &:r2464_1 | | ir.cpp:2464:18:2464:20 | CallTarget | func:r2464_3 | | ir.cpp:2464:18:2464:20 | ChiPartial | partial:m2464_5 | @@ -13527,42 +13526,18 @@ | ir.cpp:2464:18:2464:20 | StoreValue | r2464_4 | | ir.cpp:2464:18:2464:22 | Address | &:r2464_2 | | ir.cpp:2464:18:2464:22 | Address | &:r2464_8 | -| ir.cpp:2464:18:2464:22 | Address | &:r2464_21 | -| ir.cpp:2464:18:2464:22 | Address | &:r2464_21 | -| ir.cpp:2464:18:2464:22 | Address | &:r2464_33 | -| ir.cpp:2464:18:2464:22 | Address | &:r2464_33 | +| ir.cpp:2464:18:2464:22 | Address | &:r2464_15 | +| ir.cpp:2464:18:2464:22 | Address | &:r2464_15 | | ir.cpp:2464:18:2464:22 | Arg(this) | this:r2464_8 | -| ir.cpp:2464:18:2464:22 | Arg(this) | this:r2464_21 | -| ir.cpp:2464:18:2464:22 | Arg(this) | this:r2464_33 | -| ir.cpp:2464:18:2464:22 | CallTarget | func:r2464_22 | -| ir.cpp:2464:18:2464:22 | CallTarget | func:r2464_34 | -| ir.cpp:2464:18:2464:22 | ChiPartial | partial:m2464_24 | -| ir.cpp:2464:18:2464:22 | ChiPartial | partial:m2464_27 | -| ir.cpp:2464:18:2464:22 | ChiPartial | partial:m2464_36 | -| ir.cpp:2464:18:2464:22 | ChiPartial | partial:m2464_39 | -| ir.cpp:2464:18:2464:22 | ChiTotal | total:m2464_17 | -| ir.cpp:2464:18:2464:22 | ChiTotal | total:m2464_18 | -| ir.cpp:2464:18:2464:22 | ChiTotal | total:m2464_19 | -| ir.cpp:2464:18:2464:22 | ChiTotal | total:m2464_20 | -| ir.cpp:2464:18:2464:22 | ChiTotal | total:m2464_29 | -| ir.cpp:2464:18:2464:22 | ChiTotal | total:m2464_30 | -| ir.cpp:2464:18:2464:22 | ChiTotal | total:m2464_31 | -| ir.cpp:2464:18:2464:22 | ChiTotal | total:m2464_32 | -| ir.cpp:2464:18:2464:22 | Phi | from 0:m2464_7 | -| ir.cpp:2464:18:2464:22 | Phi | from 0:~m2464_12 | -| ir.cpp:2464:18:2464:22 | Phi | from 2:m2464_28 | -| ir.cpp:2464:18:2464:22 | Phi | from 2:m2464_40 | -| ir.cpp:2464:18:2464:22 | Phi | from 2:~m2464_25 | -| ir.cpp:2464:18:2464:22 | Phi | from 2:~m2464_37 | +| ir.cpp:2464:18:2464:22 | Arg(this) | this:r2464_15 | +| ir.cpp:2464:18:2464:22 | CallTarget | func:r2464_16 | +| ir.cpp:2464:18:2464:22 | ChiPartial | partial:m2464_18 | +| ir.cpp:2464:18:2464:22 | ChiPartial | partial:m2464_21 | +| ir.cpp:2464:18:2464:22 | ChiTotal | total:m2464_7 | +| ir.cpp:2464:18:2464:22 | ChiTotal | total:m2464_12 | | ir.cpp:2464:18:2464:22 | SideEffect | m2464_7 | -| ir.cpp:2464:18:2464:22 | SideEffect | m2464_17 | -| ir.cpp:2464:18:2464:22 | SideEffect | m2464_19 | -| ir.cpp:2464:18:2464:22 | SideEffect | m2464_29 | -| ir.cpp:2464:18:2464:22 | SideEffect | m2464_31 | -| ir.cpp:2464:18:2464:22 | SideEffect | ~m2464_18 | -| ir.cpp:2464:18:2464:22 | SideEffect | ~m2464_20 | -| ir.cpp:2464:18:2464:22 | SideEffect | ~m2464_30 | -| ir.cpp:2464:18:2464:22 | SideEffect | ~m2464_32 | +| ir.cpp:2464:18:2464:22 | SideEffect | m2464_7 | +| ir.cpp:2464:18:2464:22 | SideEffect | ~m2464_12 | | ir.cpp:2464:18:2464:22 | Unary | r2464_2 | | ir.cpp:2464:18:2464:22 | Unary | r2464_2 | | ir.cpp:2464:23:2464:23 | CallTarget | func:r2464_9 | @@ -13571,9 +13546,8 @@ | ir.cpp:2464:23:2464:23 | SideEffect | ~m2464_6 | | ir.cpp:2464:23:2464:23 | Unary | r2464_10 | | ir.cpp:2464:25:2464:25 | Address | &:r2464_14 | -| ir.cpp:2464:25:2464:25 | Load | ~m2464_25 | -| ir.cpp:2464:25:2464:25 | Load | ~m2464_37 | -| ir.cpp:2464:25:2464:25 | StoreValue | r2464_16 | +| ir.cpp:2464:25:2464:25 | Load | ~m2464_19 | +| ir.cpp:2464:25:2464:25 | StoreValue | r2464_23 | | 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 d0aa865b5041..356390f9b4ff 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -7,15 +7,7 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| ir.cpp:2464:18:2464:22 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | unexplainedLoop -| ir.cpp:2464:18:2464:22 | Call: call to ~B | Instruction 'Call: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | CallSideEffect: call to ~B | Instruction 'CallSideEffect: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | FunctionAddress: call to ~B | Instruction 'FunctionAddress: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:25:2464:25 | Load: a | Instruction 'Load: a' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -26,12 +18,9 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability -| ir.cpp:2464:25:2464:25 | Load: a | Block 'Load: a' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:25:2464:25 | Store: a | Block 'Store: a' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | backEdgeCountMismatch useNotDominatedByDefinition | ir.cpp:1535:8:1535:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1535:8:1535:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | -| ir.cpp:2464:25:2464:25 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | | try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() | | try_except.c:39:15:39:15 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:32:6:32:6 | void h(int) | void h(int) | 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 ffae86b61b69..504da6dc547d 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -14757,49 +14757,33 @@ ir.cpp: # 2462| void rvalue_conversion_with_destructor::test() # 2462| Block 0 -# 2462| v2462_1(void) = EnterFunction : -# 2462| mu2462_2(unknown) = AliasedDefinition : -# 2462| mu2462_3(unknown) = InitializeNonLocal : -# 2464| r2464_1(glval) = VariableAddress[a] : -# 2464| r2464_2(glval) = VariableAddress[#temp2464:18] : -# 2464| r2464_3(glval) = FunctionAddress[get] : -# 2464| r2464_4(B) = Call[get] : func:r2464_3 -# 2464| mu2464_5(unknown) = ^CallSideEffect : ~m? -# 2464| mu2464_6(B) = Store[#temp2464:18] : &:r2464_2, r2464_4 -# 2464| r2464_7(glval) = Convert : r2464_2 -# 2464| r2464_8(glval) = FunctionAddress[operator->] : -# 2464| r2464_9(A *) = Call[operator->] : func:r2464_8, this:r2464_7 -# 2464| mu2464_10(unknown) = ^CallSideEffect : ~m? -# 2464| v2464_11(void) = ^IndirectReadSideEffect[-1] : &:r2464_7, ~m? -# 2464| r2464_12(glval) = FieldAddress[a] : r2464_9 -#-----| Goto -> Block 3 -#-----| Goto -> Block 3 - -# 2464| Block 1 -# 2464| mu2464_13(unsigned int) = Store[a] : &:r2464_1, r2464_14 -# 2465| v2465_1(void) = NoOp : -# 2462| v2462_4(void) = ReturnVoid : -# 2462| v2462_5(void) = AliasedUse : ~m? -# 2462| v2462_6(void) = ExitFunction : - -# 2464| Block 2 -# 2464| r2464_14(unsigned int) = Load[?] : &:r2464_12, ~m? -#-----| Goto (back edge) -> Block 3 -#-----| Goto (back edge) -> Block 3 - -# 2464| Block 3 -# 2464| r2464_21(glval) = CopyValue : r2464_2 -# 2464| r2464_22(glval) = FunctionAddress[~B] : -# 2464| v2464_23(void) = Call[~B] : func:r2464_16, func:r2464_22, this:r2464_15, this:r2464_21 -# 2464| mu2464_24(unknown) = ^CallSideEffect : ~m? -# 2464| v2464_25(void) = ^IndirectReadSideEffect[-1] : &:r2464_15, &:r2464_21, ~m? -# 2464| mu2464_26(B) = ^IndirectMayWriteSideEffect[-1] : &:r2464_15, &:r2464_21 -#-----| Goto (back edge) -> Block 1 -#-----| Goto (back edge) -> Block 2 - -# 2464| Block 3 -#-----| Goto (back edge) -> Block 1 -#-----| Goto (back edge) -> Block 2 +# 2462| v2462_1(void) = EnterFunction : +# 2462| mu2462_2(unknown) = AliasedDefinition : +# 2462| mu2462_3(unknown) = InitializeNonLocal : +# 2464| r2464_1(glval) = VariableAddress[a] : +# 2464| r2464_2(glval) = VariableAddress[#temp2464:18] : +# 2464| r2464_3(glval) = FunctionAddress[get] : +# 2464| r2464_4(B) = Call[get] : func:r2464_3 +# 2464| mu2464_5(unknown) = ^CallSideEffect : ~m? +# 2464| mu2464_6(B) = Store[#temp2464:18] : &:r2464_2, r2464_4 +# 2464| r2464_7(glval) = Convert : r2464_2 +# 2464| r2464_8(glval) = FunctionAddress[operator->] : +# 2464| r2464_9(A *) = Call[operator->] : func:r2464_8, this:r2464_7 +# 2464| mu2464_10(unknown) = ^CallSideEffect : ~m? +# 2464| v2464_11(void) = ^IndirectReadSideEffect[-1] : &:r2464_7, ~m? +# 2464| r2464_12(glval) = FieldAddress[a] : r2464_9 +# 2464| r2464_13(glval) = CopyValue : r2464_2 +# 2464| r2464_14(glval) = FunctionAddress[~B] : +# 2464| v2464_15(void) = Call[~B] : func:r2464_14, this:r2464_13 +# 2464| mu2464_16(unknown) = ^CallSideEffect : ~m? +# 2464| v2464_17(void) = ^IndirectReadSideEffect[-1] : &:r2464_13, ~m? +# 2464| mu2464_18(B) = ^IndirectMayWriteSideEffect[-1] : &:r2464_13 +# 2464| r2464_19(unsigned int) = Load[?] : &:r2464_12, ~m? +# 2464| mu2464_20(unsigned int) = Store[a] : &:r2464_1, r2464_19 +# 2465| v2465_1(void) = NoOp : +# 2462| v2462_4(void) = ReturnVoid : +# 2462| v2462_5(void) = AliasedUse : ~m? +# 2462| v2462_6(void) = ExitFunction : perf-regression.cpp: # 6| void Big::Big() 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 8f1859233d1e..b93c7d2649f8 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 @@ -7,15 +7,7 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| ir.cpp:2464:18:2464:22 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | unexplainedLoop -| ir.cpp:2464:18:2464:22 | Call: call to ~B | Instruction 'Call: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | CallSideEffect: call to ~B | Instruction 'CallSideEffect: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | FunctionAddress: call to ~B | Instruction 'FunctionAddress: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:25:2464:25 | Load: a | Instruction 'Load: a' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -26,11 +18,8 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability -| ir.cpp:2464:25:2464:25 | Load: a | Block 'Load: a' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:25:2464:25 | Store: a | Block 'Store: a' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | backEdgeCountMismatch useNotDominatedByDefinition -| ir.cpp:2464:25:2464:25 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated 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 8f1859233d1e..b93c7d2649f8 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 @@ -7,15 +7,7 @@ duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor ambiguousSuccessors -| ir.cpp:2464:18:2464:22 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' has 2 successors of kind 'Goto' in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | unexplainedLoop -| ir.cpp:2464:18:2464:22 | Call: call to ~B | Instruction 'Call: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | CallSideEffect: call to ~B | Instruction 'CallSideEffect: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | CopyValue: reuse of temporary object | Instruction 'CopyValue: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | FunctionAddress: call to ~B | Instruction 'FunctionAddress: call to ~B' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | IndirectMayWriteSideEffect: reuse of temporary object | Instruction 'IndirectMayWriteSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:18:2464:22 | IndirectReadSideEffect: reuse of temporary object | Instruction 'IndirectReadSideEffect: reuse of temporary object' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:25:2464:25 | Load: a | Instruction 'Load: a' is part of an unexplained loop in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | unnecessaryPhiInstruction memoryOperandDefinitionIsUnmodeled operandAcrossFunctions @@ -26,11 +18,8 @@ containsLoopOfForwardEdges missingIRType multipleIRTypes lostReachability -| ir.cpp:2464:25:2464:25 | Load: a | Block 'Load: a' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | -| ir.cpp:2464:25:2464:25 | Store: a | Block 'Store: a' is not reachable by traversing only forward edges in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | backEdgeCountMismatch useNotDominatedByDefinition -| ir.cpp:2464:25:2464:25 | StoreValue | Operand 'StoreValue' is not dominated by its definition in function '$@'. | ir.cpp:2462:10:2462:13 | void rvalue_conversion_with_destructor::test() | void rvalue_conversion_with_destructor::test() | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated From a0de95dc4428bad6fda8576516f7a0f8274d2d15 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Sat, 6 Apr 2024 23:48:27 +0100 Subject: [PATCH 27/35] C++: Add testcases that produces an 'missingOperandType' and 'missingPhiOperand' consistency errors. --- .../library-tests/ir/ir/PrintAST.expected | 50 ++++++++++++++ .../library-tests/ir/ir/aliased_ir.expected | 69 +++++++++++++++++++ .../aliased_ssa_consistency_unsound.expected | 2 + .../ir/ir/destructors_for_temps.cpp | 12 ++++ .../ir/ir/operand_locations.expected | 49 +++++++++++++ .../test/library-tests/ir/ir/raw_ir.expected | 59 ++++++++++++++++ 6 files changed, 241 insertions(+) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 70e5423f5cf8..1d35bdac5bcc 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -2276,6 +2276,56 @@ destructors_for_temps.cpp: # 72| getQualifier(): [ReuseExpr] reuse of temporary object # 72| Type = [SpecifiedType] const string # 72| ValueCategory = xvalue +# 75| [TopLevelFunction] ClassWithDestructor2 make() +# 75| : +# 77| [TopLevelFunction] void temp_test9() +# 77| : +# 77| getEntryPoint(): [BlockStmt] { ... } +# 78| getStmt(0): [ExprStmt] ExprStmt +# 78| getExpr(): [FunctionCall] call to make +# 78| Type = [Class] ClassWithDestructor2 +# 78| ValueCategory = prvalue +# 78| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor2 +# 78| Type = [VoidType] void +# 78| ValueCategory = prvalue +# 78| getQualifier(): [ReuseExpr] reuse of temporary object +# 78| Type = [Class] ClassWithDestructor2 +# 78| ValueCategory = xvalue +# 78| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 78| Type = [Class] ClassWithDestructor2 +# 78| ValueCategory = prvalue +# 79| getStmt(1): [ReturnStmt] return ... +# 81| [TopLevelFunction] void temp_test10(int) +# 81| : +# 81| getParameter(0): [Parameter] i +# 81| Type = [IntType] int +# 81| getEntryPoint(): [BlockStmt] { ... } +# 82| getStmt(0): [WhileStmt] while (...) ... +# 82| getCondition(): [LTExpr] ... < ... +# 82| Type = [BoolType] bool +# 82| ValueCategory = prvalue +# 82| getLesserOperand(): [VariableAccess] i +# 82| Type = [IntType] int +# 82| ValueCategory = prvalue(load) +# 82| getGreaterOperand(): [Literal] 10 +# 82| Type = [IntType] int +# 82| Value = [Literal] 10 +# 82| ValueCategory = prvalue +# 82| getStmt(): [BlockStmt] { ... } +# 83| getStmt(0): [ExprStmt] ExprStmt +# 83| getExpr(): [FunctionCall] call to make +# 83| Type = [Class] ClassWithDestructor2 +# 83| ValueCategory = prvalue +# 83| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor2 +# 83| Type = [VoidType] void +# 83| ValueCategory = prvalue +# 83| getQualifier(): [ReuseExpr] reuse of temporary object +# 83| Type = [Class] ClassWithDestructor2 +# 83| ValueCategory = xvalue +# 83| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 83| Type = [Class] ClassWithDestructor2 +# 83| ValueCategory = prvalue +# 85| getStmt(1): [ReturnStmt] return ... ir.c: # 5| [TopLevelFunction] int getX(MyCoords*) # 5| : 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 47a2148db2f8..f45c4e3d8d63 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -1434,6 +1434,75 @@ destructors_for_temps.cpp: #-----| False -> Block 1 #-----| True -> Block 3 +# 77| void temp_test9() +# 77| Block 0 +# 77| v77_1(void) = EnterFunction : +# 77| m77_2(unknown) = AliasedDefinition : +# 77| m77_3(unknown) = InitializeNonLocal : +# 77| m77_4(unknown) = Chi : total:m77_2, partial:m77_3 +# 78| r78_1(glval) = VariableAddress[#temp78:5] : +# 78| r78_2(glval) = FunctionAddress[make] : +# 78| r78_3(ClassWithDestructor2) = Call[make] : func:r78_2 +# 78| m78_4(unknown) = ^CallSideEffect : ~m77_4 +# 78| m78_5(unknown) = Chi : total:m77_4, partial:m78_4 +# 78| r78_6(glval) = CopyValue : r78_1 +# 78| r78_7(glval) = FunctionAddress[~ClassWithDestructor2] : +# 78| v78_8(void) = Call[~ClassWithDestructor2] : func:r78_7, this:r78_6 +# 78| m78_9(unknown) = ^CallSideEffect : ~m78_5 +# 78| m78_10(unknown) = Chi : total:m78_5, partial:m78_9 +# 78| v78_11(void) = ^IndirectReadSideEffect[-1] : &:r78_6, ~m? +# 78| m78_12(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r78_6 +# 78| m78_13(ClassWithDestructor2) = Chi : total:~m?, partial:m78_12 +# 78| m78_14(ClassWithDestructor2) = Store[#temp78:5] : &:r78_1, r78_3 +# 79| v79_1(void) = NoOp : +# 77| v77_5(void) = ReturnVoid : +# 77| v77_6(void) = AliasedUse : ~m78_10 +# 77| v77_7(void) = ExitFunction : + +# 81| void temp_test10(int) +# 81| Block 0 +# 81| v81_1(void) = EnterFunction : +# 81| m81_2(unknown) = AliasedDefinition : +# 81| m81_3(unknown) = InitializeNonLocal : +# 81| m81_4(unknown) = Chi : total:m81_2, partial:m81_3 +# 81| r81_5(glval) = VariableAddress[i] : +# 81| m81_6(int) = InitializeParameter[i] : &:r81_5 +#-----| Goto -> Block 1 + +# 82| Block 1 +# 82| m82_1(ClassWithDestructor2) = Phi : from 2:m83_14 +# 82| m82_2(unknown) = Phi : from 0:~m81_4, from 2:~m83_10 +# 82| r82_3(glval) = VariableAddress[i] : +# 82| r82_4(int) = Load[i] : &:r82_3, m81_6 +# 82| r82_5(int) = Constant[10] : +# 82| r82_6(bool) = CompareLT : r82_4, r82_5 +# 82| v82_7(void) = ConditionalBranch : r82_6 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 83| Block 2 +# 83| r83_1(glval) = VariableAddress[#temp83:9] : +# 83| r83_2(glval) = FunctionAddress[make] : +# 83| r83_3(ClassWithDestructor2) = Call[make] : func:r83_2 +# 83| m83_4(unknown) = ^CallSideEffect : ~m82_2 +# 83| m83_5(unknown) = Chi : total:m82_2, partial:m83_4 +# 83| r83_6(glval) = CopyValue : r83_1 +# 83| r83_7(glval) = FunctionAddress[~ClassWithDestructor2] : +# 83| v83_8(void) = Call[~ClassWithDestructor2] : func:r83_7, this:r83_6 +# 83| m83_9(unknown) = ^CallSideEffect : ~m83_5 +# 83| m83_10(unknown) = Chi : total:m83_5, partial:m83_9 +# 83| v83_11(void) = ^IndirectReadSideEffect[-1] : &:r83_6, m82_1 +# 83| m83_12(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r83_6 +# 83| m83_13(ClassWithDestructor2) = Chi : total:m82_1, partial:m83_12 +# 83| m83_14(ClassWithDestructor2) = Store[#temp83:9] : &:r83_1, r83_3 +#-----| Goto (back edge) -> Block 1 + +# 85| Block 3 +# 85| v85_1(void) = NoOp : +# 81| v81_7(void) = ReturnVoid : +# 81| v81_8(void) = AliasedUse : ~m82_2 +# 81| v81_9(void) = ExitFunction : + ir.c: # 7| void MyCoordsTest(int) # 7| Block 0 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 ef225d8ad6cb..aca2afa041d8 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 @@ -2,8 +2,10 @@ missingOperand unexpectedOperand duplicateOperand missingPhiOperand +| destructors_for_temps.cpp:82:11:82:11 | Phi: i | Instruction 'Phi: i' is missing an operand for predecessor block 'EnterFunction: temp_test10' in function '$@'. | destructors_for_temps.cpp:81:6:81:16 | void temp_test10(int) | void temp_test10(int) | missingOperandType | destructors_for_temps.cpp:39:3:39:53 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | destructors_for_temps.cpp:38:6:38:15 | void temp_test5(bool) | void temp_test5(bool) | +| destructors_for_temps.cpp:78:5:78:10 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | destructors_for_temps.cpp:77:6:77:15 | void temp_test9() | void temp_test9() | | ir.cpp:1425:5:1425:30 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | ir.cpp:1414:6:1414:21 | void temporary_string() | void temporary_string() | | ir.cpp:1437:5:1437:39 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | ir.cpp:1428:6:1428:30 | void temporary_destructor_only() | void temporary_destructor_only() | duplicateChiOperand diff --git a/cpp/ql/test/library-tests/ir/ir/destructors_for_temps.cpp b/cpp/ql/test/library-tests/ir/ir/destructors_for_temps.cpp index 86d8d9173ee2..c211e81d10cc 100644 --- a/cpp/ql/test/library-tests/ir/ir/destructors_for_temps.cpp +++ b/cpp/ql/test/library-tests/ir/ir/destructors_for_temps.cpp @@ -70,4 +70,16 @@ bool const_ref_string(const string &); bool conditional_temp_via_conjunction(bool b) { return b && const_ref_string(""); +} + +ClassWithDestructor2 make(); + +void temp_test9() { + make(); +} + +void temp_test10(int i) { + while(i < 10) { + make(); + } } \ No newline at end of file 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 ac743c3be751..7a8431e5abbe 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -1284,6 +1284,55 @@ | destructors_for_temps.cpp:72:34:72:35 | SideEffect | ~m72_28 | | destructors_for_temps.cpp:72:34:72:35 | Unary | r72_18 | | destructors_for_temps.cpp:72:34:72:35 | Unary | r72_21 | +| destructors_for_temps.cpp:77:6:77:15 | ChiPartial | partial:m77_3 | +| destructors_for_temps.cpp:77:6:77:15 | ChiTotal | total:m77_2 | +| destructors_for_temps.cpp:77:6:77:15 | SideEffect | ~m78_10 | +| destructors_for_temps.cpp:78:5:78:8 | CallTarget | func:r78_2 | +| destructors_for_temps.cpp:78:5:78:8 | ChiPartial | partial:m78_4 | +| destructors_for_temps.cpp:78:5:78:8 | ChiTotal | total:m77_4 | +| destructors_for_temps.cpp:78:5:78:8 | SideEffect | ~m77_4 | +| destructors_for_temps.cpp:78:5:78:8 | StoreValue | r78_3 | +| destructors_for_temps.cpp:78:5:78:10 | Address | &:r78_1 | +| destructors_for_temps.cpp:78:5:78:10 | Address | &:r78_6 | +| destructors_for_temps.cpp:78:5:78:10 | Address | &:r78_6 | +| destructors_for_temps.cpp:78:5:78:10 | Arg(this) | this:r78_6 | +| destructors_for_temps.cpp:78:5:78:10 | CallTarget | func:r78_7 | +| destructors_for_temps.cpp:78:5:78:10 | ChiPartial | partial:m78_9 | +| destructors_for_temps.cpp:78:5:78:10 | ChiPartial | partial:m78_12 | +| destructors_for_temps.cpp:78:5:78:10 | ChiTotal | total:m78_5 | +| destructors_for_temps.cpp:78:5:78:10 | ChiTotal | total:~m? | +| destructors_for_temps.cpp:78:5:78:10 | SideEffect | ~m78_5 | +| destructors_for_temps.cpp:78:5:78:10 | SideEffect | ~m? | +| destructors_for_temps.cpp:78:5:78:10 | Unary | r78_1 | +| destructors_for_temps.cpp:81:6:81:16 | ChiPartial | partial:m81_3 | +| destructors_for_temps.cpp:81:6:81:16 | ChiTotal | total:m81_2 | +| destructors_for_temps.cpp:81:6:81:16 | SideEffect | ~m82_2 | +| destructors_for_temps.cpp:81:22:81:22 | Address | &:r81_5 | +| destructors_for_temps.cpp:82:11:82:11 | Address | &:r82_3 | +| destructors_for_temps.cpp:82:11:82:11 | Left | r82_4 | +| destructors_for_temps.cpp:82:11:82:11 | Load | m81_6 | +| destructors_for_temps.cpp:82:11:82:11 | Phi | from 0:~m81_4 | +| destructors_for_temps.cpp:82:11:82:11 | Phi | from 2:m83_14 | +| destructors_for_temps.cpp:82:11:82:11 | Phi | from 2:~m83_10 | +| destructors_for_temps.cpp:82:11:82:16 | Condition | r82_6 | +| destructors_for_temps.cpp:82:15:82:16 | Right | r82_5 | +| destructors_for_temps.cpp:83:9:83:12 | CallTarget | func:r83_2 | +| destructors_for_temps.cpp:83:9:83:12 | ChiPartial | partial:m83_4 | +| destructors_for_temps.cpp:83:9:83:12 | ChiTotal | total:m82_2 | +| destructors_for_temps.cpp:83:9:83:12 | SideEffect | ~m82_2 | +| destructors_for_temps.cpp:83:9:83:12 | StoreValue | r83_3 | +| destructors_for_temps.cpp:83:9:83:14 | Address | &:r83_1 | +| destructors_for_temps.cpp:83:9:83:14 | Address | &:r83_6 | +| destructors_for_temps.cpp:83:9:83:14 | Address | &:r83_6 | +| destructors_for_temps.cpp:83:9:83:14 | Arg(this) | this:r83_6 | +| destructors_for_temps.cpp:83:9:83:14 | CallTarget | func:r83_7 | +| destructors_for_temps.cpp:83:9:83:14 | ChiPartial | partial:m83_9 | +| destructors_for_temps.cpp:83:9:83:14 | ChiPartial | partial:m83_12 | +| destructors_for_temps.cpp:83:9:83:14 | ChiTotal | total:m82_1 | +| destructors_for_temps.cpp:83:9:83:14 | ChiTotal | total:m83_5 | +| destructors_for_temps.cpp:83:9:83:14 | SideEffect | m82_1 | +| destructors_for_temps.cpp:83:9:83:14 | SideEffect | ~m83_5 | +| destructors_for_temps.cpp:83:9:83:14 | Unary | r83_1 | | file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_1 | 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 504da6dc547d..28d18e8fc963 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -1306,6 +1306,65 @@ destructors_for_temps.cpp: #-----| False -> Block 1 #-----| True -> Block 3 +# 77| void temp_test9() +# 77| Block 0 +# 77| v77_1(void) = EnterFunction : +# 77| mu77_2(unknown) = AliasedDefinition : +# 77| mu77_3(unknown) = InitializeNonLocal : +# 78| r78_1(glval) = VariableAddress[#temp78:5] : +# 78| r78_2(glval) = FunctionAddress[make] : +# 78| r78_3(ClassWithDestructor2) = Call[make] : func:r78_2 +# 78| mu78_4(unknown) = ^CallSideEffect : ~m? +# 78| r78_5(glval) = CopyValue : r78_1 +# 78| r78_6(glval) = FunctionAddress[~ClassWithDestructor2] : +# 78| v78_7(void) = Call[~ClassWithDestructor2] : func:r78_6, this:r78_5 +# 78| mu78_8(unknown) = ^CallSideEffect : ~m? +# 78| v78_9(void) = ^IndirectReadSideEffect[-1] : &:r78_5, ~m? +# 78| mu78_10(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r78_5 +# 78| mu78_11(ClassWithDestructor2) = Store[#temp78:5] : &:r78_1, r78_3 +# 79| v79_1(void) = NoOp : +# 77| v77_4(void) = ReturnVoid : +# 77| v77_5(void) = AliasedUse : ~m? +# 77| v77_6(void) = ExitFunction : + +# 81| void temp_test10(int) +# 81| Block 0 +# 81| v81_1(void) = EnterFunction : +# 81| mu81_2(unknown) = AliasedDefinition : +# 81| mu81_3(unknown) = InitializeNonLocal : +# 81| r81_4(glval) = VariableAddress[i] : +# 81| mu81_5(int) = InitializeParameter[i] : &:r81_4 +#-----| Goto -> Block 1 + +# 82| Block 1 +# 82| r82_1(glval) = VariableAddress[i] : +# 82| r82_2(int) = Load[i] : &:r82_1, ~m? +# 82| r82_3(int) = Constant[10] : +# 82| r82_4(bool) = CompareLT : r82_2, r82_3 +# 82| v82_5(void) = ConditionalBranch : r82_4 +#-----| False -> Block 3 +#-----| True -> Block 2 + +# 83| Block 2 +# 83| r83_1(glval) = VariableAddress[#temp83:9] : +# 83| r83_2(glval) = FunctionAddress[make] : +# 83| r83_3(ClassWithDestructor2) = Call[make] : func:r83_2 +# 83| mu83_4(unknown) = ^CallSideEffect : ~m? +# 83| r83_5(glval) = CopyValue : r83_1 +# 83| r83_6(glval) = FunctionAddress[~ClassWithDestructor2] : +# 83| v83_7(void) = Call[~ClassWithDestructor2] : func:r83_6, this:r83_5 +# 83| mu83_8(unknown) = ^CallSideEffect : ~m? +# 83| v83_9(void) = ^IndirectReadSideEffect[-1] : &:r83_5, ~m? +# 83| mu83_10(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r83_5 +# 83| mu83_11(ClassWithDestructor2) = Store[#temp83:9] : &:r83_1, r83_3 +#-----| Goto (back edge) -> Block 1 + +# 85| Block 3 +# 85| v85_1(void) = NoOp : +# 81| v81_6(void) = ReturnVoid : +# 81| v81_7(void) = AliasedUse : ~m? +# 81| v81_8(void) = ExitFunction : + ir.c: # 7| void MyCoordsTest(int) # 7| Block 0 From 89eaadd76fd7170a0292cf5355780d0b6321c804 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Sun, 7 Apr 2024 15:48:38 +0100 Subject: [PATCH 28/35] C++: Move destructor calls from expressions with a temporary object conversion to the temporary object conversion. --- cpp/ql/lib/semmle/code/cpp/exprs/Expr.qll | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cpp/ql/lib/semmle/code/cpp/exprs/Expr.qll b/cpp/ql/lib/semmle/code/cpp/exprs/Expr.qll index 9e12f853ba57..2aff0ebf4701 100644 --- a/cpp/ql/lib/semmle/code/cpp/exprs/Expr.qll +++ b/cpp/ql/lib/semmle/code/cpp/exprs/Expr.qll @@ -63,6 +63,12 @@ class Expr extends StmtParent, @expr { * order of destruction. */ DestructorCall getImplicitDestructorCall(int n) { + exists(Expr e | + e = this.(TemporaryObjectExpr).getExpr() and + synthetic_destructor_call(e, max(int i | synthetic_destructor_call(e, i, _)) - n, result) + ) + or + not this = any(TemporaryObjectExpr temp).getExpr() and synthetic_destructor_call(this, max(int i | synthetic_destructor_call(this, i, _)) - n, result) } From fcd0e9999c1072fadaa2fb855d261c57f4bc2c31 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Sun, 7 Apr 2024 15:49:27 +0100 Subject: [PATCH 29/35] C++: Accept test changes. --- .../library-tests/ir/ir/PrintAST.expected | 72 ---------- .../library-tests/ir/ir/aliased_ir.expected | 135 +++++++++--------- .../aliased_ssa_consistency_unsound.expected | 5 - .../ir/ir/operand_locations.expected | 109 +++++++------- .../test/library-tests/ir/ir/raw_ir.expected | 70 ++++----- 5 files changed, 156 insertions(+), 235 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 1d35bdac5bcc..38bbe26afd32 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -1977,12 +1977,6 @@ destructors_for_temps.cpp: # 39| getElse(): [ConstructorCall] call to ClassWithDestructor2 # 39| Type = [VoidType] void # 39| ValueCategory = prvalue -# 39| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor2 -# 39| Type = [VoidType] void -# 39| ValueCategory = prvalue -# 39| getQualifier(): [ReuseExpr] reuse of temporary object -# 39| Type = [Class] ClassWithDestructor2 -# 39| ValueCategory = xvalue # 39| getThen().getFullyConverted(): [TemporaryObjectExpr] temporary object # 39| Type = [Class] ClassWithDestructor2 # 39| ValueCategory = prvalue(load) @@ -2096,24 +2090,6 @@ destructors_for_temps.cpp: # 51| getElse(): [ConstructorCall] call to ClassWithDestructor2 # 51| Type = [VoidType] void # 51| ValueCategory = prvalue -# 51| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor2 -# 51| Type = [VoidType] void -# 51| ValueCategory = prvalue -# 51| getQualifier(): [ReuseExpr] reuse of temporary object -# 51| Type = [Class] ClassWithDestructor2 -# 51| ValueCategory = xvalue -# 51| getImplicitDestructorCall(1): [DestructorCall] call to ~ClassWithDestructor2 -# 51| Type = [VoidType] void -# 51| ValueCategory = prvalue -# 51| getQualifier(): [ReuseExpr] reuse of temporary object -# 51| Type = [Class] ClassWithDestructor2 -# 51| ValueCategory = xvalue -# 51| getImplicitDestructorCall(2): [DestructorCall] call to ~ClassWithDestructor2 -# 51| Type = [VoidType] void -# 51| ValueCategory = prvalue -# 51| getQualifier(): [ReuseExpr] reuse of temporary object -# 51| Type = [Class] ClassWithDestructor2 -# 51| ValueCategory = xvalue # 51| getElse().getFullyConverted(): [TemporaryObjectExpr] temporary object # 51| Type = [Class] ClassWithDestructor2 # 51| ValueCategory = prvalue(load) @@ -2161,24 +2137,6 @@ destructors_for_temps.cpp: # 55| getElse(): [ConstructorCall] call to ClassWithDestructor2 # 55| Type = [VoidType] void # 55| ValueCategory = prvalue -# 55| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor2 -# 55| Type = [VoidType] void -# 55| ValueCategory = prvalue -# 55| getQualifier(): [ReuseExpr] reuse of temporary object -# 55| Type = [Class] ClassWithDestructor2 -# 55| ValueCategory = xvalue -# 55| getImplicitDestructorCall(1): [DestructorCall] call to ~ClassWithDestructor2 -# 55| Type = [VoidType] void -# 55| ValueCategory = prvalue -# 55| getQualifier(): [ReuseExpr] reuse of temporary object -# 55| Type = [Class] ClassWithDestructor2 -# 55| ValueCategory = xvalue -# 55| getImplicitDestructorCall(2): [DestructorCall] call to ~ClassWithDestructor2 -# 55| Type = [VoidType] void -# 55| ValueCategory = prvalue -# 55| getQualifier(): [ReuseExpr] reuse of temporary object -# 55| Type = [Class] ClassWithDestructor2 -# 55| ValueCategory = xvalue # 55| getElse().getFullyConverted(): [TemporaryObjectExpr] temporary object # 55| Type = [Class] ClassWithDestructor2 # 55| ValueCategory = prvalue(load) @@ -2285,12 +2243,6 @@ destructors_for_temps.cpp: # 78| getExpr(): [FunctionCall] call to make # 78| Type = [Class] ClassWithDestructor2 # 78| ValueCategory = prvalue -# 78| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor2 -# 78| Type = [VoidType] void -# 78| ValueCategory = prvalue -# 78| getQualifier(): [ReuseExpr] reuse of temporary object -# 78| Type = [Class] ClassWithDestructor2 -# 78| ValueCategory = xvalue # 78| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object # 78| Type = [Class] ClassWithDestructor2 # 78| ValueCategory = prvalue @@ -2316,12 +2268,6 @@ destructors_for_temps.cpp: # 83| getExpr(): [FunctionCall] call to make # 83| Type = [Class] ClassWithDestructor2 # 83| ValueCategory = prvalue -# 83| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor2 -# 83| Type = [VoidType] void -# 83| ValueCategory = prvalue -# 83| getQualifier(): [ReuseExpr] reuse of temporary object -# 83| Type = [Class] ClassWithDestructor2 -# 83| ValueCategory = xvalue # 83| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object # 83| Type = [Class] ClassWithDestructor2 # 83| ValueCategory = prvalue @@ -12112,12 +12058,6 @@ ir.cpp: # 1425| getExpr(): [FunctionCall] call to defaultConstruct # 1425| Type = [Struct] String # 1425| ValueCategory = prvalue -# 1425| getImplicitDestructorCall(0): [DestructorCall] call to ~String -# 1425| Type = [VoidType] void -# 1425| ValueCategory = prvalue -# 1425| getQualifier(): [ReuseExpr] reuse of temporary object -# 1425| Type = [Struct] String -# 1425| ValueCategory = xvalue # 1425| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object # 1425| Type = [Struct] String # 1425| ValueCategory = prvalue @@ -12231,12 +12171,6 @@ ir.cpp: # 1437| getExpr(): [FunctionCall] call to defaultConstruct # 1437| Type = [Class] destructor_only # 1437| ValueCategory = prvalue -# 1437| getImplicitDestructorCall(0): [DestructorCall] call to ~destructor_only -# 1437| Type = [VoidType] void -# 1437| ValueCategory = prvalue -# 1437| getQualifier(): [ReuseExpr] reuse of temporary object -# 1437| Type = [Class] destructor_only -# 1437| ValueCategory = xvalue # 1437| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object # 1437| Type = [Class] destructor_only # 1437| ValueCategory = prvalue @@ -18654,12 +18588,6 @@ ir.cpp: # 2307| getArgument(0).getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion # 2307| Type = [PointerType] const char * # 2307| ValueCategory = prvalue -# 2307| getImplicitDestructorCall(0): [DestructorCall] call to ~String -# 2307| Type = [VoidType] void -# 2307| ValueCategory = prvalue -# 2307| getQualifier(): [ReuseExpr] reuse of temporary object -# 2307| Type = [Struct] String -# 2307| ValueCategory = xvalue # 2307| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object # 2307| Type = [Struct] String # 2307| ValueCategory = lvalue 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 f45c4e3d8d63..6340c3fc32f6 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -1019,23 +1019,23 @@ destructors_for_temps.cpp: #-----| True -> Block 2 # 39| Block 1 -# 39| m39_5(unknown) = Phi : from 2:~m39_23, from 3:~m39_34 -# 39| m39_6(ClassWithDestructor2) = Phi : from 2:m39_28, from 3:m39_39 -# 39| r39_7(glval) = VariableAddress[#temp39:3] : -# 39| r39_8(ClassWithDestructor2) = Load[#temp39:3] : &:r39_7, m39_6 -# 39| r39_9(glval) = CopyValue : r39_1 -# 39| r39_10(glval) = FunctionAddress[~ClassWithDestructor2] : -# 39| v39_11(void) = Call[~ClassWithDestructor2] : func:r39_10, this:r39_9 -# 39| m39_12(unknown) = ^CallSideEffect : ~m39_5 -# 39| m39_13(unknown) = Chi : total:m39_5, partial:m39_12 -# 39| v39_14(void) = ^IndirectReadSideEffect[-1] : &:r39_9, ~m? -# 39| m39_15(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r39_9 -# 39| m39_16(ClassWithDestructor2) = Chi : total:~m?, partial:m39_15 -# 39| m39_17(ClassWithDestructor2) = Store[#temp39:3] : &:r39_1, r39_8 -# 40| v40_1(void) = NoOp : -# 38| v38_7(void) = ReturnVoid : -# 38| v38_8(void) = AliasedUse : ~m39_13 -# 38| v38_9(void) = ExitFunction : +# 39| m39_5(unknown) = Phi : from 2:~m39_23, from 3:~m39_34 +# 39| m39_6(ClassWithDestructor2) = Phi : from 2:m39_28, from 3:m39_39 +# 39| r39_7(glval) = VariableAddress[#temp39:3] : +# 39| r39_8(ClassWithDestructor2) = Load[#temp39:3] : &:r39_7, m39_6 +# 39| m39_9(ClassWithDestructor2) = Store[#temp39:3] : &:r39_1, r39_8 +# 39| r39_10(glval) = CopyValue : r39_1 +# 39| r39_11(glval) = FunctionAddress[~ClassWithDestructor2] : +# 39| v39_12(void) = Call[~ClassWithDestructor2] : func:r39_11, this:r39_10 +# 39| m39_13(unknown) = ^CallSideEffect : ~m39_5 +# 39| m39_14(unknown) = Chi : total:m39_5, partial:m39_13 +# 39| v39_15(void) = ^IndirectReadSideEffect[-1] : &:r39_10, m39_9 +# 39| m39_16(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r39_10 +# 39| m39_17(ClassWithDestructor2) = Chi : total:m39_9, partial:m39_16 +# 40| v40_1(void) = NoOp : +# 38| v38_7(void) = ReturnVoid : +# 38| v38_8(void) = AliasedUse : ~m39_14 +# 38| v38_9(void) = ExitFunction : # 39| Block 2 # 39| r39_18(glval) = VariableAddress[#temp39:7] : @@ -1445,18 +1445,18 @@ destructors_for_temps.cpp: # 78| r78_3(ClassWithDestructor2) = Call[make] : func:r78_2 # 78| m78_4(unknown) = ^CallSideEffect : ~m77_4 # 78| m78_5(unknown) = Chi : total:m77_4, partial:m78_4 -# 78| r78_6(glval) = CopyValue : r78_1 -# 78| r78_7(glval) = FunctionAddress[~ClassWithDestructor2] : -# 78| v78_8(void) = Call[~ClassWithDestructor2] : func:r78_7, this:r78_6 -# 78| m78_9(unknown) = ^CallSideEffect : ~m78_5 -# 78| m78_10(unknown) = Chi : total:m78_5, partial:m78_9 -# 78| v78_11(void) = ^IndirectReadSideEffect[-1] : &:r78_6, ~m? -# 78| m78_12(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r78_6 -# 78| m78_13(ClassWithDestructor2) = Chi : total:~m?, partial:m78_12 -# 78| m78_14(ClassWithDestructor2) = Store[#temp78:5] : &:r78_1, r78_3 +# 78| m78_6(ClassWithDestructor2) = Store[#temp78:5] : &:r78_1, r78_3 +# 78| r78_7(glval) = CopyValue : r78_1 +# 78| r78_8(glval) = FunctionAddress[~ClassWithDestructor2] : +# 78| v78_9(void) = Call[~ClassWithDestructor2] : func:r78_8, this:r78_7 +# 78| m78_10(unknown) = ^CallSideEffect : ~m78_5 +# 78| m78_11(unknown) = Chi : total:m78_5, partial:m78_10 +# 78| v78_12(void) = ^IndirectReadSideEffect[-1] : &:r78_7, m78_6 +# 78| m78_13(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r78_7 +# 78| m78_14(ClassWithDestructor2) = Chi : total:m78_6, partial:m78_13 # 79| v79_1(void) = NoOp : # 77| v77_5(void) = ReturnVoid : -# 77| v77_6(void) = AliasedUse : ~m78_10 +# 77| v77_6(void) = AliasedUse : ~m78_11 # 77| v77_7(void) = ExitFunction : # 81| void temp_test10(int) @@ -1470,13 +1470,12 @@ destructors_for_temps.cpp: #-----| Goto -> Block 1 # 82| Block 1 -# 82| m82_1(ClassWithDestructor2) = Phi : from 2:m83_14 -# 82| m82_2(unknown) = Phi : from 0:~m81_4, from 2:~m83_10 -# 82| r82_3(glval) = VariableAddress[i] : -# 82| r82_4(int) = Load[i] : &:r82_3, m81_6 -# 82| r82_5(int) = Constant[10] : -# 82| r82_6(bool) = CompareLT : r82_4, r82_5 -# 82| v82_7(void) = ConditionalBranch : r82_6 +# 82| m82_1(unknown) = Phi : from 0:~m81_4, from 2:~m83_11 +# 82| r82_2(glval) = VariableAddress[i] : +# 82| r82_3(int) = Load[i] : &:r82_2, m81_6 +# 82| r82_4(int) = Constant[10] : +# 82| r82_5(bool) = CompareLT : r82_3, r82_4 +# 82| v82_6(void) = ConditionalBranch : r82_5 #-----| False -> Block 3 #-----| True -> Block 2 @@ -1484,23 +1483,23 @@ destructors_for_temps.cpp: # 83| r83_1(glval) = VariableAddress[#temp83:9] : # 83| r83_2(glval) = FunctionAddress[make] : # 83| r83_3(ClassWithDestructor2) = Call[make] : func:r83_2 -# 83| m83_4(unknown) = ^CallSideEffect : ~m82_2 -# 83| m83_5(unknown) = Chi : total:m82_2, partial:m83_4 -# 83| r83_6(glval) = CopyValue : r83_1 -# 83| r83_7(glval) = FunctionAddress[~ClassWithDestructor2] : -# 83| v83_8(void) = Call[~ClassWithDestructor2] : func:r83_7, this:r83_6 -# 83| m83_9(unknown) = ^CallSideEffect : ~m83_5 -# 83| m83_10(unknown) = Chi : total:m83_5, partial:m83_9 -# 83| v83_11(void) = ^IndirectReadSideEffect[-1] : &:r83_6, m82_1 -# 83| m83_12(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r83_6 -# 83| m83_13(ClassWithDestructor2) = Chi : total:m82_1, partial:m83_12 -# 83| m83_14(ClassWithDestructor2) = Store[#temp83:9] : &:r83_1, r83_3 +# 83| m83_4(unknown) = ^CallSideEffect : ~m82_1 +# 83| m83_5(unknown) = Chi : total:m82_1, partial:m83_4 +# 83| m83_6(ClassWithDestructor2) = Store[#temp83:9] : &:r83_1, r83_3 +# 83| r83_7(glval) = CopyValue : r83_1 +# 83| r83_8(glval) = FunctionAddress[~ClassWithDestructor2] : +# 83| v83_9(void) = Call[~ClassWithDestructor2] : func:r83_8, this:r83_7 +# 83| m83_10(unknown) = ^CallSideEffect : ~m83_5 +# 83| m83_11(unknown) = Chi : total:m83_5, partial:m83_10 +# 83| v83_12(void) = ^IndirectReadSideEffect[-1] : &:r83_7, m83_6 +# 83| m83_13(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r83_7 +# 83| m83_14(ClassWithDestructor2) = Chi : total:m83_6, partial:m83_13 #-----| Goto (back edge) -> Block 1 # 85| Block 3 # 85| v85_1(void) = NoOp : # 81| v81_7(void) = ReturnVoid : -# 81| v81_8(void) = AliasedUse : ~m82_2 +# 81| v81_8(void) = AliasedUse : ~m82_1 # 81| v81_9(void) = ExitFunction : ir.c: @@ -9256,21 +9255,21 @@ ir.cpp: # 1425| r1425_3(String) = Call[defaultConstruct] : func:r1425_2 # 1425| m1425_4(unknown) = ^CallSideEffect : ~m1423_17 # 1425| m1425_5(unknown) = Chi : total:m1423_17, partial:m1425_4 -# 1425| r1425_6(glval) = CopyValue : r1425_1 -# 1425| r1425_7(glval) = FunctionAddress[~String] : -# 1425| v1425_8(void) = Call[~String] : func:r1425_7, this:r1425_6 -# 1425| m1425_9(unknown) = ^CallSideEffect : ~m1425_5 -# 1425| m1425_10(unknown) = Chi : total:m1425_5, partial:m1425_9 -# 1425| v1425_11(void) = ^IndirectReadSideEffect[-1] : &:r1425_6, ~m? -# 1425| m1425_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r1425_6 -# 1425| m1425_13(String) = Chi : total:~m?, partial:m1425_12 -# 1425| m1425_14(String) = Store[#temp1425:5] : &:r1425_1, r1425_3 +# 1425| m1425_6(String) = Store[#temp1425:5] : &:r1425_1, r1425_3 +# 1425| r1425_7(glval) = CopyValue : r1425_1 +# 1425| r1425_8(glval) = FunctionAddress[~String] : +# 1425| v1425_9(void) = Call[~String] : func:r1425_8, this:r1425_7 +# 1425| m1425_10(unknown) = ^CallSideEffect : ~m1425_5 +# 1425| m1425_11(unknown) = Chi : total:m1425_5, partial:m1425_10 +# 1425| v1425_12(void) = ^IndirectReadSideEffect[-1] : &:r1425_7, m1425_6 +# 1425| m1425_13(String) = ^IndirectMayWriteSideEffect[-1] : &:r1425_7 +# 1425| m1425_14(String) = Chi : total:m1425_6, partial:m1425_13 # 1426| v1426_1(void) = NoOp : # 1426| r1426_2(glval) = CopyValue : r1416_2 # 1426| r1426_3(glval) = FunctionAddress[~String] : # 1426| v1426_4(void) = Call[~String] : func:r1426_3, this:r1426_2 -# 1426| m1426_5(unknown) = ^CallSideEffect : ~m1425_10 -# 1426| m1426_6(unknown) = Chi : total:m1425_10, partial:m1426_5 +# 1426| m1426_5(unknown) = ^CallSideEffect : ~m1425_11 +# 1426| m1426_6(unknown) = Chi : total:m1425_11, partial:m1426_5 # 1426| v1426_7(void) = ^IndirectReadSideEffect[-1] : &:r1426_2, m1416_7 # 1426| m1426_8(String) = ^IndirectMayWriteSideEffect[-1] : &:r1426_2 # 1426| m1426_9(String) = Chi : total:m1416_7, partial:m1426_8 @@ -9379,21 +9378,21 @@ ir.cpp: # 1437| r1437_3(destructor_only) = Call[defaultConstruct] : func:r1437_2 # 1437| m1437_4(unknown) = ^CallSideEffect : ~m1435_18 # 1437| m1437_5(unknown) = Chi : total:m1435_18, partial:m1437_4 -# 1437| r1437_6(glval) = CopyValue : r1437_1 -# 1437| r1437_7(glval) = FunctionAddress[~destructor_only] : -# 1437| v1437_8(void) = Call[~destructor_only] : func:r1437_7, this:r1437_6 -# 1437| m1437_9(unknown) = ^CallSideEffect : ~m1437_5 -# 1437| m1437_10(unknown) = Chi : total:m1437_5, partial:m1437_9 -# 1437| v1437_11(void) = ^IndirectReadSideEffect[-1] : &:r1437_6, ~m? -# 1437| m1437_12(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1437_6 -# 1437| m1437_13(destructor_only) = Chi : total:~m?, partial:m1437_12 -# 1437| m1437_14(destructor_only) = Store[#temp1437:5] : &:r1437_1, r1437_3 +# 1437| m1437_6(destructor_only) = Store[#temp1437:5] : &:r1437_1, r1437_3 +# 1437| r1437_7(glval) = CopyValue : r1437_1 +# 1437| r1437_8(glval) = FunctionAddress[~destructor_only] : +# 1437| v1437_9(void) = Call[~destructor_only] : func:r1437_8, this:r1437_7 +# 1437| m1437_10(unknown) = ^CallSideEffect : ~m1437_5 +# 1437| m1437_11(unknown) = Chi : total:m1437_5, partial:m1437_10 +# 1437| v1437_12(void) = ^IndirectReadSideEffect[-1] : &:r1437_7, m1437_6 +# 1437| m1437_13(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1437_7 +# 1437| m1437_14(destructor_only) = Chi : total:m1437_6, partial:m1437_13 # 1438| v1438_1(void) = NoOp : # 1438| r1438_2(glval) = VariableAddress[d2] : # 1438| r1438_3(glval) = FunctionAddress[~destructor_only] : # 1438| v1438_4(void) = Call[~destructor_only] : func:r1438_3, this:r1438_2 -# 1438| m1438_5(unknown) = ^CallSideEffect : ~m1437_10 -# 1438| m1438_6(unknown) = Chi : total:m1437_10, partial:m1438_5 +# 1438| m1438_5(unknown) = ^CallSideEffect : ~m1437_11 +# 1438| m1438_6(unknown) = Chi : total:m1437_11, partial:m1438_5 # 1438| v1438_7(void) = ^IndirectReadSideEffect[-1] : &:r1438_2, m1431_2 # 1438| m1438_8(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1438_2 # 1438| m1438_9(destructor_only) = Chi : total:m1431_2, partial:m1438_8 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 aca2afa041d8..b93c7d2649f8 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 @@ -2,12 +2,7 @@ missingOperand unexpectedOperand duplicateOperand missingPhiOperand -| destructors_for_temps.cpp:82:11:82:11 | Phi: i | Instruction 'Phi: i' is missing an operand for predecessor block 'EnterFunction: temp_test10' in function '$@'. | destructors_for_temps.cpp:81:6:81:16 | void temp_test10(int) | void temp_test10(int) | missingOperandType -| destructors_for_temps.cpp:39:3:39:53 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | destructors_for_temps.cpp:38:6:38:15 | void temp_test5(bool) | void temp_test5(bool) | -| destructors_for_temps.cpp:78:5:78:10 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | destructors_for_temps.cpp:77:6:77:15 | void temp_test9() | void temp_test9() | -| ir.cpp:1425:5:1425:30 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | ir.cpp:1414:6:1414:21 | void temporary_string() | void temporary_string() | -| ir.cpp:1437:5:1437:39 | ChiTotal | Operand 'ChiTotal' of instruction 'Chi' is missing a type in function '$@'. | ir.cpp:1428:6:1428:30 | void temporary_destructor_only() | void temporary_destructor_only() | duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor 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 7a8431e5abbe..361ff9282ad5 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -927,7 +927,7 @@ | destructors_for_temps.cpp:36:1:36:1 | SideEffect | ~m36_6 | | destructors_for_temps.cpp:38:6:38:15 | ChiPartial | partial:m38_3 | | destructors_for_temps.cpp:38:6:38:15 | ChiTotal | total:m38_2 | -| destructors_for_temps.cpp:38:6:38:15 | SideEffect | ~m39_13 | +| destructors_for_temps.cpp:38:6:38:15 | SideEffect | ~m39_14 | | destructors_for_temps.cpp:38:22:38:22 | Address | &:r38_5 | | destructors_for_temps.cpp:39:3:39:3 | Address | &:r39_2 | | destructors_for_temps.cpp:39:3:39:3 | Address | &:r39_7 | @@ -942,16 +942,16 @@ | destructors_for_temps.cpp:39:3:39:3 | Phi | from 3:~m39_34 | | destructors_for_temps.cpp:39:3:39:3 | StoreValue | r39_8 | | destructors_for_temps.cpp:39:3:39:53 | Address | &:r39_1 | -| destructors_for_temps.cpp:39:3:39:53 | Address | &:r39_9 | -| destructors_for_temps.cpp:39:3:39:53 | Address | &:r39_9 | -| destructors_for_temps.cpp:39:3:39:53 | Arg(this) | this:r39_9 | -| destructors_for_temps.cpp:39:3:39:53 | CallTarget | func:r39_10 | -| destructors_for_temps.cpp:39:3:39:53 | ChiPartial | partial:m39_12 | -| destructors_for_temps.cpp:39:3:39:53 | ChiPartial | partial:m39_15 | +| destructors_for_temps.cpp:39:3:39:53 | Address | &:r39_10 | +| destructors_for_temps.cpp:39:3:39:53 | Address | &:r39_10 | +| destructors_for_temps.cpp:39:3:39:53 | Arg(this) | this:r39_10 | +| destructors_for_temps.cpp:39:3:39:53 | CallTarget | func:r39_11 | +| destructors_for_temps.cpp:39:3:39:53 | ChiPartial | partial:m39_13 | +| destructors_for_temps.cpp:39:3:39:53 | ChiPartial | partial:m39_16 | | destructors_for_temps.cpp:39:3:39:53 | ChiTotal | total:m39_5 | -| destructors_for_temps.cpp:39:3:39:53 | ChiTotal | total:~m? | +| destructors_for_temps.cpp:39:3:39:53 | ChiTotal | total:m39_9 | +| destructors_for_temps.cpp:39:3:39:53 | SideEffect | m39_9 | | destructors_for_temps.cpp:39:3:39:53 | SideEffect | ~m39_5 | -| destructors_for_temps.cpp:39:3:39:53 | SideEffect | ~m? | | destructors_for_temps.cpp:39:3:39:53 | Unary | r39_1 | | destructors_for_temps.cpp:39:7:39:28 | Address | &:r39_18 | | destructors_for_temps.cpp:39:7:39:28 | Address | &:r39_18 | @@ -1286,51 +1286,50 @@ | destructors_for_temps.cpp:72:34:72:35 | Unary | r72_21 | | destructors_for_temps.cpp:77:6:77:15 | ChiPartial | partial:m77_3 | | destructors_for_temps.cpp:77:6:77:15 | ChiTotal | total:m77_2 | -| destructors_for_temps.cpp:77:6:77:15 | SideEffect | ~m78_10 | +| destructors_for_temps.cpp:77:6:77:15 | SideEffect | ~m78_11 | | destructors_for_temps.cpp:78:5:78:8 | CallTarget | func:r78_2 | | destructors_for_temps.cpp:78:5:78:8 | ChiPartial | partial:m78_4 | | destructors_for_temps.cpp:78:5:78:8 | ChiTotal | total:m77_4 | | destructors_for_temps.cpp:78:5:78:8 | SideEffect | ~m77_4 | | destructors_for_temps.cpp:78:5:78:8 | StoreValue | r78_3 | | destructors_for_temps.cpp:78:5:78:10 | Address | &:r78_1 | -| destructors_for_temps.cpp:78:5:78:10 | Address | &:r78_6 | -| destructors_for_temps.cpp:78:5:78:10 | Address | &:r78_6 | -| destructors_for_temps.cpp:78:5:78:10 | Arg(this) | this:r78_6 | -| destructors_for_temps.cpp:78:5:78:10 | CallTarget | func:r78_7 | -| destructors_for_temps.cpp:78:5:78:10 | ChiPartial | partial:m78_9 | -| destructors_for_temps.cpp:78:5:78:10 | ChiPartial | partial:m78_12 | +| destructors_for_temps.cpp:78:5:78:10 | Address | &:r78_7 | +| destructors_for_temps.cpp:78:5:78:10 | Address | &:r78_7 | +| destructors_for_temps.cpp:78:5:78:10 | Arg(this) | this:r78_7 | +| destructors_for_temps.cpp:78:5:78:10 | CallTarget | func:r78_8 | +| destructors_for_temps.cpp:78:5:78:10 | ChiPartial | partial:m78_10 | +| destructors_for_temps.cpp:78:5:78:10 | ChiPartial | partial:m78_13 | | destructors_for_temps.cpp:78:5:78:10 | ChiTotal | total:m78_5 | -| destructors_for_temps.cpp:78:5:78:10 | ChiTotal | total:~m? | +| destructors_for_temps.cpp:78:5:78:10 | ChiTotal | total:m78_6 | +| destructors_for_temps.cpp:78:5:78:10 | SideEffect | m78_6 | | destructors_for_temps.cpp:78:5:78:10 | SideEffect | ~m78_5 | -| destructors_for_temps.cpp:78:5:78:10 | SideEffect | ~m? | | destructors_for_temps.cpp:78:5:78:10 | Unary | r78_1 | | destructors_for_temps.cpp:81:6:81:16 | ChiPartial | partial:m81_3 | | destructors_for_temps.cpp:81:6:81:16 | ChiTotal | total:m81_2 | -| destructors_for_temps.cpp:81:6:81:16 | SideEffect | ~m82_2 | +| destructors_for_temps.cpp:81:6:81:16 | SideEffect | ~m82_1 | | destructors_for_temps.cpp:81:22:81:22 | Address | &:r81_5 | -| destructors_for_temps.cpp:82:11:82:11 | Address | &:r82_3 | -| destructors_for_temps.cpp:82:11:82:11 | Left | r82_4 | +| destructors_for_temps.cpp:82:11:82:11 | Address | &:r82_2 | +| destructors_for_temps.cpp:82:11:82:11 | Left | r82_3 | | destructors_for_temps.cpp:82:11:82:11 | Load | m81_6 | | destructors_for_temps.cpp:82:11:82:11 | Phi | from 0:~m81_4 | -| destructors_for_temps.cpp:82:11:82:11 | Phi | from 2:m83_14 | -| destructors_for_temps.cpp:82:11:82:11 | Phi | from 2:~m83_10 | -| destructors_for_temps.cpp:82:11:82:16 | Condition | r82_6 | -| destructors_for_temps.cpp:82:15:82:16 | Right | r82_5 | +| destructors_for_temps.cpp:82:11:82:11 | Phi | from 2:~m83_11 | +| destructors_for_temps.cpp:82:11:82:16 | Condition | r82_5 | +| destructors_for_temps.cpp:82:15:82:16 | Right | r82_4 | | destructors_for_temps.cpp:83:9:83:12 | CallTarget | func:r83_2 | | destructors_for_temps.cpp:83:9:83:12 | ChiPartial | partial:m83_4 | -| destructors_for_temps.cpp:83:9:83:12 | ChiTotal | total:m82_2 | -| destructors_for_temps.cpp:83:9:83:12 | SideEffect | ~m82_2 | +| destructors_for_temps.cpp:83:9:83:12 | ChiTotal | total:m82_1 | +| destructors_for_temps.cpp:83:9:83:12 | SideEffect | ~m82_1 | | destructors_for_temps.cpp:83:9:83:12 | StoreValue | r83_3 | | destructors_for_temps.cpp:83:9:83:14 | Address | &:r83_1 | -| destructors_for_temps.cpp:83:9:83:14 | Address | &:r83_6 | -| destructors_for_temps.cpp:83:9:83:14 | Address | &:r83_6 | -| destructors_for_temps.cpp:83:9:83:14 | Arg(this) | this:r83_6 | -| destructors_for_temps.cpp:83:9:83:14 | CallTarget | func:r83_7 | -| destructors_for_temps.cpp:83:9:83:14 | ChiPartial | partial:m83_9 | -| destructors_for_temps.cpp:83:9:83:14 | ChiPartial | partial:m83_12 | -| destructors_for_temps.cpp:83:9:83:14 | ChiTotal | total:m82_1 | +| destructors_for_temps.cpp:83:9:83:14 | Address | &:r83_7 | +| destructors_for_temps.cpp:83:9:83:14 | Address | &:r83_7 | +| destructors_for_temps.cpp:83:9:83:14 | Arg(this) | this:r83_7 | +| destructors_for_temps.cpp:83:9:83:14 | CallTarget | func:r83_8 | +| destructors_for_temps.cpp:83:9:83:14 | ChiPartial | partial:m83_10 | +| destructors_for_temps.cpp:83:9:83:14 | ChiPartial | partial:m83_13 | | destructors_for_temps.cpp:83:9:83:14 | ChiTotal | total:m83_5 | -| destructors_for_temps.cpp:83:9:83:14 | SideEffect | m82_1 | +| destructors_for_temps.cpp:83:9:83:14 | ChiTotal | total:m83_6 | +| destructors_for_temps.cpp:83:9:83:14 | SideEffect | m83_6 | | destructors_for_temps.cpp:83:9:83:14 | SideEffect | ~m83_5 | | destructors_for_temps.cpp:83:9:83:14 | Unary | r83_1 | | file://:0:0:0:0 | Address | &:r0_1 | @@ -7790,16 +7789,16 @@ | ir.cpp:1425:5:1425:28 | SideEffect | ~m1423_17 | | ir.cpp:1425:5:1425:28 | StoreValue | r1425_3 | | ir.cpp:1425:5:1425:30 | Address | &:r1425_1 | -| ir.cpp:1425:5:1425:30 | Address | &:r1425_6 | -| ir.cpp:1425:5:1425:30 | Address | &:r1425_6 | -| ir.cpp:1425:5:1425:30 | Arg(this) | this:r1425_6 | -| ir.cpp:1425:5:1425:30 | CallTarget | func:r1425_7 | -| ir.cpp:1425:5:1425:30 | ChiPartial | partial:m1425_9 | -| ir.cpp:1425:5:1425:30 | ChiPartial | partial:m1425_12 | +| ir.cpp:1425:5:1425:30 | Address | &:r1425_7 | +| ir.cpp:1425:5:1425:30 | Address | &:r1425_7 | +| ir.cpp:1425:5:1425:30 | Arg(this) | this:r1425_7 | +| ir.cpp:1425:5:1425:30 | CallTarget | func:r1425_8 | +| ir.cpp:1425:5:1425:30 | ChiPartial | partial:m1425_10 | +| ir.cpp:1425:5:1425:30 | ChiPartial | partial:m1425_13 | | ir.cpp:1425:5:1425:30 | ChiTotal | total:m1425_5 | -| ir.cpp:1425:5:1425:30 | ChiTotal | total:~m? | +| ir.cpp:1425:5:1425:30 | ChiTotal | total:m1425_6 | +| ir.cpp:1425:5:1425:30 | SideEffect | m1425_6 | | ir.cpp:1425:5:1425:30 | SideEffect | ~m1425_5 | -| ir.cpp:1425:5:1425:30 | SideEffect | ~m? | | ir.cpp:1425:5:1425:30 | Unary | r1425_1 | | ir.cpp:1426:1:1426:1 | Address | &:r1426_2 | | ir.cpp:1426:1:1426:1 | Address | &:r1426_2 | @@ -7815,11 +7814,11 @@ | ir.cpp:1426:1:1426:1 | ChiPartial | partial:m1426_16 | | ir.cpp:1426:1:1426:1 | ChiTotal | total:m1415_6 | | ir.cpp:1426:1:1426:1 | ChiTotal | total:m1416_7 | -| ir.cpp:1426:1:1426:1 | ChiTotal | total:m1425_10 | +| ir.cpp:1426:1:1426:1 | ChiTotal | total:m1425_11 | | ir.cpp:1426:1:1426:1 | ChiTotal | total:m1426_6 | | ir.cpp:1426:1:1426:1 | SideEffect | m1415_6 | | ir.cpp:1426:1:1426:1 | SideEffect | m1416_7 | -| ir.cpp:1426:1:1426:1 | SideEffect | ~m1425_10 | +| ir.cpp:1426:1:1426:1 | SideEffect | ~m1425_11 | | ir.cpp:1426:1:1426:1 | SideEffect | ~m1426_6 | | ir.cpp:1428:6:1428:30 | ChiPartial | partial:m1428_3 | | ir.cpp:1428:6:1428:30 | ChiTotal | total:m1428_2 | @@ -7929,16 +7928,16 @@ | ir.cpp:1437:5:1437:37 | SideEffect | ~m1435_18 | | ir.cpp:1437:5:1437:37 | StoreValue | r1437_3 | | ir.cpp:1437:5:1437:39 | Address | &:r1437_1 | -| ir.cpp:1437:5:1437:39 | Address | &:r1437_6 | -| ir.cpp:1437:5:1437:39 | Address | &:r1437_6 | -| ir.cpp:1437:5:1437:39 | Arg(this) | this:r1437_6 | -| ir.cpp:1437:5:1437:39 | CallTarget | func:r1437_7 | -| ir.cpp:1437:5:1437:39 | ChiPartial | partial:m1437_9 | -| ir.cpp:1437:5:1437:39 | ChiPartial | partial:m1437_12 | +| ir.cpp:1437:5:1437:39 | Address | &:r1437_7 | +| ir.cpp:1437:5:1437:39 | Address | &:r1437_7 | +| ir.cpp:1437:5:1437:39 | Arg(this) | this:r1437_7 | +| ir.cpp:1437:5:1437:39 | CallTarget | func:r1437_8 | +| ir.cpp:1437:5:1437:39 | ChiPartial | partial:m1437_10 | +| ir.cpp:1437:5:1437:39 | ChiPartial | partial:m1437_13 | | ir.cpp:1437:5:1437:39 | ChiTotal | total:m1437_5 | -| ir.cpp:1437:5:1437:39 | ChiTotal | total:~m? | +| ir.cpp:1437:5:1437:39 | ChiTotal | total:m1437_6 | +| ir.cpp:1437:5:1437:39 | SideEffect | m1437_6 | | ir.cpp:1437:5:1437:39 | SideEffect | ~m1437_5 | -| ir.cpp:1437:5:1437:39 | SideEffect | ~m? | | ir.cpp:1437:5:1437:39 | Unary | r1437_1 | | ir.cpp:1438:1:1438:1 | Address | &:r1438_2 | | ir.cpp:1438:1:1438:1 | Address | &:r1438_2 | @@ -7961,13 +7960,13 @@ | ir.cpp:1438:1:1438:1 | ChiTotal | total:m1429_6 | | ir.cpp:1438:1:1438:1 | ChiTotal | total:m1430_7 | | ir.cpp:1438:1:1438:1 | ChiTotal | total:m1431_2 | -| ir.cpp:1438:1:1438:1 | ChiTotal | total:m1437_10 | +| ir.cpp:1438:1:1438:1 | ChiTotal | total:m1437_11 | | ir.cpp:1438:1:1438:1 | ChiTotal | total:m1438_6 | | ir.cpp:1438:1:1438:1 | ChiTotal | total:m1438_14 | | ir.cpp:1438:1:1438:1 | SideEffect | m1429_6 | | ir.cpp:1438:1:1438:1 | SideEffect | m1430_7 | | ir.cpp:1438:1:1438:1 | SideEffect | m1431_2 | -| ir.cpp:1438:1:1438:1 | SideEffect | ~m1437_10 | +| ir.cpp:1438:1:1438:1 | SideEffect | ~m1437_11 | | ir.cpp:1438:1:1438:1 | SideEffect | ~m1438_6 | | ir.cpp:1438:1:1438:1 | SideEffect | ~m1438_14 | | ir.cpp:1440:6:1440:31 | ChiPartial | partial:m1440_3 | 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 28d18e8fc963..72b2ce556247 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -956,13 +956,13 @@ destructors_for_temps.cpp: # 39| Block 1 # 39| r39_5(glval) = VariableAddress[#temp39:3] : # 39| r39_6(ClassWithDestructor2) = Load[#temp39:3] : &:r39_5, ~m? -# 39| r39_7(glval) = CopyValue : r39_1 -# 39| r39_8(glval) = FunctionAddress[~ClassWithDestructor2] : -# 39| v39_9(void) = Call[~ClassWithDestructor2] : func:r39_8, this:r39_7 -# 39| mu39_10(unknown) = ^CallSideEffect : ~m? -# 39| v39_11(void) = ^IndirectReadSideEffect[-1] : &:r39_7, ~m? -# 39| mu39_12(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r39_7 -# 39| mu39_13(ClassWithDestructor2) = Store[#temp39:3] : &:r39_1, r39_6 +# 39| mu39_7(ClassWithDestructor2) = Store[#temp39:3] : &:r39_1, r39_6 +# 39| r39_8(glval) = CopyValue : r39_1 +# 39| r39_9(glval) = FunctionAddress[~ClassWithDestructor2] : +# 39| v39_10(void) = Call[~ClassWithDestructor2] : func:r39_9, this:r39_8 +# 39| mu39_11(unknown) = ^CallSideEffect : ~m? +# 39| v39_12(void) = ^IndirectReadSideEffect[-1] : &:r39_8, ~m? +# 39| mu39_13(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r39_8 # 40| v40_1(void) = NoOp : # 38| v38_6(void) = ReturnVoid : # 38| v38_7(void) = AliasedUse : ~m? @@ -1315,13 +1315,13 @@ destructors_for_temps.cpp: # 78| r78_2(glval) = FunctionAddress[make] : # 78| r78_3(ClassWithDestructor2) = Call[make] : func:r78_2 # 78| mu78_4(unknown) = ^CallSideEffect : ~m? -# 78| r78_5(glval) = CopyValue : r78_1 -# 78| r78_6(glval) = FunctionAddress[~ClassWithDestructor2] : -# 78| v78_7(void) = Call[~ClassWithDestructor2] : func:r78_6, this:r78_5 -# 78| mu78_8(unknown) = ^CallSideEffect : ~m? -# 78| v78_9(void) = ^IndirectReadSideEffect[-1] : &:r78_5, ~m? -# 78| mu78_10(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r78_5 -# 78| mu78_11(ClassWithDestructor2) = Store[#temp78:5] : &:r78_1, r78_3 +# 78| mu78_5(ClassWithDestructor2) = Store[#temp78:5] : &:r78_1, r78_3 +# 78| r78_6(glval) = CopyValue : r78_1 +# 78| r78_7(glval) = FunctionAddress[~ClassWithDestructor2] : +# 78| v78_8(void) = Call[~ClassWithDestructor2] : func:r78_7, this:r78_6 +# 78| mu78_9(unknown) = ^CallSideEffect : ~m? +# 78| v78_10(void) = ^IndirectReadSideEffect[-1] : &:r78_6, ~m? +# 78| mu78_11(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r78_6 # 79| v79_1(void) = NoOp : # 77| v77_4(void) = ReturnVoid : # 77| v77_5(void) = AliasedUse : ~m? @@ -1350,13 +1350,13 @@ destructors_for_temps.cpp: # 83| r83_2(glval) = FunctionAddress[make] : # 83| r83_3(ClassWithDestructor2) = Call[make] : func:r83_2 # 83| mu83_4(unknown) = ^CallSideEffect : ~m? -# 83| r83_5(glval) = CopyValue : r83_1 -# 83| r83_6(glval) = FunctionAddress[~ClassWithDestructor2] : -# 83| v83_7(void) = Call[~ClassWithDestructor2] : func:r83_6, this:r83_5 -# 83| mu83_8(unknown) = ^CallSideEffect : ~m? -# 83| v83_9(void) = ^IndirectReadSideEffect[-1] : &:r83_5, ~m? -# 83| mu83_10(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r83_5 -# 83| mu83_11(ClassWithDestructor2) = Store[#temp83:9] : &:r83_1, r83_3 +# 83| mu83_5(ClassWithDestructor2) = Store[#temp83:9] : &:r83_1, r83_3 +# 83| r83_6(glval) = CopyValue : r83_1 +# 83| r83_7(glval) = FunctionAddress[~ClassWithDestructor2] : +# 83| v83_8(void) = Call[~ClassWithDestructor2] : func:r83_7, this:r83_6 +# 83| mu83_9(unknown) = ^CallSideEffect : ~m? +# 83| v83_10(void) = ^IndirectReadSideEffect[-1] : &:r83_6, ~m? +# 83| mu83_11(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r83_6 #-----| Goto (back edge) -> Block 1 # 85| Block 3 @@ -8624,13 +8624,13 @@ ir.cpp: # 1425| r1425_2(glval) = FunctionAddress[defaultConstruct] : # 1425| r1425_3(String) = Call[defaultConstruct] : func:r1425_2 # 1425| mu1425_4(unknown) = ^CallSideEffect : ~m? -# 1425| r1425_5(glval) = CopyValue : r1425_1 -# 1425| r1425_6(glval) = FunctionAddress[~String] : -# 1425| v1425_7(void) = Call[~String] : func:r1425_6, this:r1425_5 -# 1425| mu1425_8(unknown) = ^CallSideEffect : ~m? -# 1425| v1425_9(void) = ^IndirectReadSideEffect[-1] : &:r1425_5, ~m? -# 1425| mu1425_10(String) = ^IndirectMayWriteSideEffect[-1] : &:r1425_5 -# 1425| mu1425_11(String) = Store[#temp1425:5] : &:r1425_1, r1425_3 +# 1425| mu1425_5(String) = Store[#temp1425:5] : &:r1425_1, r1425_3 +# 1425| r1425_6(glval) = CopyValue : r1425_1 +# 1425| r1425_7(glval) = FunctionAddress[~String] : +# 1425| v1425_8(void) = Call[~String] : func:r1425_7, this:r1425_6 +# 1425| mu1425_9(unknown) = ^CallSideEffect : ~m? +# 1425| v1425_10(void) = ^IndirectReadSideEffect[-1] : &:r1425_6, ~m? +# 1425| mu1425_11(String) = ^IndirectMayWriteSideEffect[-1] : &:r1425_6 # 1426| v1426_1(void) = NoOp : # 1426| r1426_2(glval) = CopyValue : r1416_2 # 1426| r1426_3(glval) = FunctionAddress[~String] : @@ -8724,13 +8724,13 @@ ir.cpp: # 1437| r1437_2(glval) = FunctionAddress[defaultConstruct] : # 1437| r1437_3(destructor_only) = Call[defaultConstruct] : func:r1437_2 # 1437| mu1437_4(unknown) = ^CallSideEffect : ~m? -# 1437| r1437_5(glval) = CopyValue : r1437_1 -# 1437| r1437_6(glval) = FunctionAddress[~destructor_only] : -# 1437| v1437_7(void) = Call[~destructor_only] : func:r1437_6, this:r1437_5 -# 1437| mu1437_8(unknown) = ^CallSideEffect : ~m? -# 1437| v1437_9(void) = ^IndirectReadSideEffect[-1] : &:r1437_5, ~m? -# 1437| mu1437_10(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1437_5 -# 1437| mu1437_11(destructor_only) = Store[#temp1437:5] : &:r1437_1, r1437_3 +# 1437| mu1437_5(destructor_only) = Store[#temp1437:5] : &:r1437_1, r1437_3 +# 1437| r1437_6(glval) = CopyValue : r1437_1 +# 1437| r1437_7(glval) = FunctionAddress[~destructor_only] : +# 1437| v1437_8(void) = Call[~destructor_only] : func:r1437_7, this:r1437_6 +# 1437| mu1437_9(unknown) = ^CallSideEffect : ~m? +# 1437| v1437_10(void) = ^IndirectReadSideEffect[-1] : &:r1437_6, ~m? +# 1437| mu1437_11(destructor_only) = ^IndirectMayWriteSideEffect[-1] : &:r1437_6 # 1438| v1438_1(void) = NoOp : # 1438| r1438_2(glval) = VariableAddress[d2] : # 1438| r1438_3(glval) = FunctionAddress[~destructor_only] : From 8a6a60e59bf415c177fdc5a524b1feb945c55ad3 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Sun, 7 Apr 2024 15:49:50 +0100 Subject: [PATCH 30/35] C++: Also handle destructor calls on converted expressions in PrintAST. --- cpp/ql/lib/semmle/code/cpp/PrintAST.qll | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cpp/ql/lib/semmle/code/cpp/PrintAST.qll b/cpp/ql/lib/semmle/code/cpp/PrintAST.qll index cfb2632bb8ac..beabef322d20 100644 --- a/cpp/ql/lib/semmle/code/cpp/PrintAST.qll +++ b/cpp/ql/lib/semmle/code/cpp/PrintAST.qll @@ -364,6 +364,8 @@ class ConversionNode extends ExprNode { childIndex = 0 and result.getAst() = conv.getExpr() and conv.getExpr() instanceof Conversion + or + result.getAst() = expr.getImplicitDestructorCall(childIndex - 1) } } From d40fa4cfba0b81b43273e450ddd5714b29c55ead Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Sun, 7 Apr 2024 15:50:16 +0100 Subject: [PATCH 31/35] C++: Accept test changes. --- .../library-tests/ir/ir/PrintAST.expected | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 38bbe26afd32..2f109a4b7aec 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -1986,6 +1986,12 @@ destructors_for_temps.cpp: # 39| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object # 39| Type = [Class] ClassWithDestructor2 # 39| ValueCategory = prvalue +# 39| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor2 +# 39| Type = [VoidType] void +# 39| ValueCategory = prvalue +# 39| getQualifier(): [ReuseExpr] reuse of temporary object +# 39| Type = [Class] ClassWithDestructor2 +# 39| ValueCategory = xvalue # 40| getStmt(1): [ReturnStmt] return ... # 42| [TopLevelFunction] void temp_test6(bool) # 42| : @@ -2096,6 +2102,24 @@ destructors_for_temps.cpp: # 51| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object # 51| Type = [Class] ClassWithDestructor2 # 51| ValueCategory = prvalue +# 51| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor2 +# 51| Type = [VoidType] void +# 51| ValueCategory = prvalue +# 51| getQualifier(): [ReuseExpr] reuse of temporary object +# 51| Type = [Class] ClassWithDestructor2 +# 51| ValueCategory = xvalue +# 51| getImplicitDestructorCall(1): [DestructorCall] call to ~ClassWithDestructor2 +# 51| Type = [VoidType] void +# 51| ValueCategory = prvalue +# 51| getQualifier(): [ReuseExpr] reuse of temporary object +# 51| Type = [Class] ClassWithDestructor2 +# 51| ValueCategory = xvalue +# 51| getImplicitDestructorCall(2): [DestructorCall] call to ~ClassWithDestructor2 +# 51| Type = [VoidType] void +# 51| ValueCategory = prvalue +# 51| getQualifier(): [ReuseExpr] reuse of temporary object +# 51| Type = [Class] ClassWithDestructor2 +# 51| ValueCategory = xvalue # 52| getStmt(2): [ReturnStmt] return ... # 52| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor2 # 52| Type = [VoidType] void @@ -2143,6 +2167,24 @@ destructors_for_temps.cpp: # 55| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object # 55| Type = [Class] ClassWithDestructor2 # 55| ValueCategory = prvalue +# 55| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor2 +# 55| Type = [VoidType] void +# 55| ValueCategory = prvalue +# 55| getQualifier(): [ReuseExpr] reuse of temporary object +# 55| Type = [Class] ClassWithDestructor2 +# 55| ValueCategory = xvalue +# 55| getImplicitDestructorCall(1): [DestructorCall] call to ~ClassWithDestructor2 +# 55| Type = [VoidType] void +# 55| ValueCategory = prvalue +# 55| getQualifier(): [ReuseExpr] reuse of temporary object +# 55| Type = [Class] ClassWithDestructor2 +# 55| ValueCategory = xvalue +# 55| getImplicitDestructorCall(2): [DestructorCall] call to ~ClassWithDestructor2 +# 55| Type = [VoidType] void +# 55| ValueCategory = prvalue +# 55| getQualifier(): [ReuseExpr] reuse of temporary object +# 55| Type = [Class] ClassWithDestructor2 +# 55| ValueCategory = xvalue # 56| getStmt(1): [ReturnStmt] return ... # 58| [TopLevelFunction] void temp_test8_simple(bool) # 58| : @@ -2246,6 +2288,12 @@ destructors_for_temps.cpp: # 78| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object # 78| Type = [Class] ClassWithDestructor2 # 78| ValueCategory = prvalue +# 78| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor2 +# 78| Type = [VoidType] void +# 78| ValueCategory = prvalue +# 78| getQualifier(): [ReuseExpr] reuse of temporary object +# 78| Type = [Class] ClassWithDestructor2 +# 78| ValueCategory = xvalue # 79| getStmt(1): [ReturnStmt] return ... # 81| [TopLevelFunction] void temp_test10(int) # 81| : @@ -2271,6 +2319,12 @@ destructors_for_temps.cpp: # 83| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object # 83| Type = [Class] ClassWithDestructor2 # 83| ValueCategory = prvalue +# 83| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor2 +# 83| Type = [VoidType] void +# 83| ValueCategory = prvalue +# 83| getQualifier(): [ReuseExpr] reuse of temporary object +# 83| Type = [Class] ClassWithDestructor2 +# 83| ValueCategory = xvalue # 85| getStmt(1): [ReturnStmt] return ... ir.c: # 5| [TopLevelFunction] int getX(MyCoords*) @@ -12061,6 +12115,12 @@ ir.cpp: # 1425| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object # 1425| Type = [Struct] String # 1425| ValueCategory = prvalue +# 1425| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 1425| Type = [VoidType] void +# 1425| ValueCategory = prvalue +# 1425| getQualifier(): [ReuseExpr] reuse of temporary object +# 1425| Type = [Struct] String +# 1425| ValueCategory = xvalue # 1426| getStmt(9): [ReturnStmt] return ... # 1426| getImplicitDestructorCall(0): [DestructorCall] call to ~String # 1426| Type = [VoidType] void @@ -12174,6 +12234,12 @@ ir.cpp: # 1437| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object # 1437| Type = [Class] destructor_only # 1437| ValueCategory = prvalue +# 1437| getImplicitDestructorCall(0): [DestructorCall] call to ~destructor_only +# 1437| Type = [VoidType] void +# 1437| ValueCategory = prvalue +# 1437| getQualifier(): [ReuseExpr] reuse of temporary object +# 1437| Type = [Class] destructor_only +# 1437| ValueCategory = xvalue # 1438| getStmt(8): [ReturnStmt] return ... # 1438| getImplicitDestructorCall(0): [DestructorCall] call to ~destructor_only # 1438| Type = [VoidType] void @@ -18597,6 +18663,12 @@ ir.cpp: # 2307| getExpr(): [TemporaryObjectExpr] temporary object # 2307| Type = [ClassTemplateInstantiation,Struct] vector # 2307| ValueCategory = xvalue +# 2307| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2307| Type = [VoidType] void +# 2307| ValueCategory = prvalue +# 2307| getQualifier(): [ReuseExpr] reuse of temporary object +# 2307| Type = [Struct] String +# 2307| ValueCategory = xvalue # 2307| getBeginEndDeclaration(): [DeclStmt] declaration # 2307| getDeclarationEntry(0): [VariableDeclarationEntry] declaration of (__begin) # 2307| Type = [NestedTypedefType,UsingAliasTypedefType] iterator From febd06063aa401cb8790e0363f08c94ff2cb8f7d Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 8 Apr 2024 13:03:51 +0100 Subject: [PATCH 32/35] C++: Add testcase where two destructor calls are remapped to a temporary object expression. --- .../library-tests/ir/ir/PrintAST.expected | 41 ++++++++++++++++++ .../library-tests/ir/ir/aliased_ir.expected | 42 ++++++++++++++++++ .../ir/ir/destructors_for_temps.cpp | 15 +++++++ .../ir/ir/operand_locations.expected | 43 +++++++++++++++++++ .../test/library-tests/ir/ir/raw_ir.expected | 34 +++++++++++++++ 5 files changed, 175 insertions(+) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 2f109a4b7aec..d7bf3e3e1d58 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -2326,6 +2326,47 @@ destructors_for_temps.cpp: # 83| Type = [Class] ClassWithDestructor2 # 83| ValueCategory = xvalue # 85| getStmt(1): [ReturnStmt] return ... +# 87| [CopyAssignmentOperator] ClassWithDestructor3& ClassWithDestructor3::operator=(ClassWithDestructor3 const&) +# 87| : +#-----| getParameter(0): [Parameter] (unnamed parameter 0) +#-----| Type = [LValueReferenceType] const ClassWithDestructor3 & +# 87| [Constructor] void ClassWithDestructor3::ClassWithDestructor3() +# 87| : +# 88| [Destructor] void ClassWithDestructor3::~ClassWithDestructor3() +# 88| : +# 89| [MemberFunction] ClassWithDestructor2 ClassWithDestructor3::getClassWithDestructor2() +# 89| : +# 92| [TopLevelFunction] ClassWithDestructor3 makeClassWithDestructor3() +# 92| : +# 94| [TopLevelFunction] void temp_test11() +# 94| : +# 94| getEntryPoint(): [BlockStmt] { ... } +# 99| getStmt(0): [ExprStmt] ExprStmt +# 99| getExpr(): [FunctionCall] call to getClassWithDestructor2 +# 99| Type = [Class] ClassWithDestructor2 +# 99| ValueCategory = prvalue +# 99| getQualifier(): [FunctionCall] call to makeClassWithDestructor3 +# 99| Type = [Struct] ClassWithDestructor3 +# 99| ValueCategory = prvalue +# 99| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 99| Type = [Struct] ClassWithDestructor3 +# 99| ValueCategory = prvalue(load) +# 99| getExpr().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 99| Type = [Class] ClassWithDestructor2 +# 99| ValueCategory = prvalue +# 99| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor2 +# 99| Type = [VoidType] void +# 99| ValueCategory = prvalue +# 99| getQualifier(): [ReuseExpr] reuse of temporary object +# 99| Type = [Class] ClassWithDestructor2 +# 99| ValueCategory = xvalue +# 99| getImplicitDestructorCall(1): [DestructorCall] call to ~ClassWithDestructor3 +# 99| Type = [VoidType] void +# 99| ValueCategory = prvalue +# 99| getQualifier(): [ReuseExpr] reuse of temporary object +# 99| Type = [Struct] ClassWithDestructor3 +# 99| ValueCategory = xvalue +# 100| getStmt(1): [ReturnStmt] return ... ir.c: # 5| [TopLevelFunction] int getX(MyCoords*) # 5| : 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 6340c3fc32f6..2f536da66ca8 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -1502,6 +1502,48 @@ destructors_for_temps.cpp: # 81| v81_8(void) = AliasedUse : ~m82_1 # 81| v81_9(void) = ExitFunction : +# 94| void temp_test11() +# 94| Block 0 +# 94| v94_1(void) = EnterFunction : +# 94| m94_2(unknown) = AliasedDefinition : +# 94| m94_3(unknown) = InitializeNonLocal : +# 94| m94_4(unknown) = Chi : total:m94_2, partial:m94_3 +# 99| r99_1(glval) = VariableAddress[#temp99:5] : +# 99| r99_2(glval) = VariableAddress[#temp99:5] : +# 99| r99_3(glval) = FunctionAddress[makeClassWithDestructor3] : +# 99| r99_4(ClassWithDestructor3) = Call[makeClassWithDestructor3] : func:r99_3 +# 99| m99_5(unknown) = ^CallSideEffect : ~m94_4 +# 99| m99_6(unknown) = Chi : total:m94_4, partial:m99_5 +# 99| m99_7(ClassWithDestructor3) = Store[#temp99:5] : &:r99_2, r99_4 +# 99| r99_8(glval) = FunctionAddress[getClassWithDestructor2] : +# 99| r99_9(ClassWithDestructor2) = Call[getClassWithDestructor2] : func:r99_8, this:r99_2 +# 99| m99_10(unknown) = ^CallSideEffect : ~m99_6 +# 99| m99_11(unknown) = Chi : total:m99_6, partial:m99_10 +# 99| v99_12(void) = ^IndirectReadSideEffect[-1] : &:r99_2, m99_7 +# 99| m99_13(ClassWithDestructor3) = ^IndirectMayWriteSideEffect[-1] : &:r99_2 +# 99| m99_14(ClassWithDestructor3) = Chi : total:m99_7, partial:m99_13 +# 99| m99_15(ClassWithDestructor2) = Store[#temp99:5] : &:r99_1, r99_9 +# 99| r99_16(glval) = CopyValue : r99_1 +# 99| r99_17(glval) = FunctionAddress[~ClassWithDestructor2] : +# 99| v99_18(void) = Call[~ClassWithDestructor2] : func:r99_17, this:r99_16 +# 99| m99_19(unknown) = ^CallSideEffect : ~m99_11 +# 99| m99_20(unknown) = Chi : total:m99_11, partial:m99_19 +# 99| v99_21(void) = ^IndirectReadSideEffect[-1] : &:r99_16, m99_15 +# 99| m99_22(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r99_16 +# 99| m99_23(ClassWithDestructor2) = Chi : total:m99_15, partial:m99_22 +# 99| r99_24(glval) = CopyValue : r99_2 +# 99| r99_25(glval) = FunctionAddress[~ClassWithDestructor3] : +# 99| v99_26(void) = Call[~ClassWithDestructor3] : func:r99_25, this:r99_24 +# 99| m99_27(unknown) = ^CallSideEffect : ~m99_20 +# 99| m99_28(unknown) = Chi : total:m99_20, partial:m99_27 +# 99| v99_29(void) = ^IndirectReadSideEffect[-1] : &:r99_24, m99_14 +# 99| m99_30(ClassWithDestructor3) = ^IndirectMayWriteSideEffect[-1] : &:r99_24 +# 99| m99_31(ClassWithDestructor3) = Chi : total:m99_14, partial:m99_30 +# 100| v100_1(void) = NoOp : +# 94| v94_5(void) = ReturnVoid : +# 94| v94_6(void) = AliasedUse : ~m99_28 +# 94| v94_7(void) = ExitFunction : + ir.c: # 7| void MyCoordsTest(int) # 7| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/destructors_for_temps.cpp b/cpp/ql/test/library-tests/ir/ir/destructors_for_temps.cpp index c211e81d10cc..56ce52e349e9 100644 --- a/cpp/ql/test/library-tests/ir/ir/destructors_for_temps.cpp +++ b/cpp/ql/test/library-tests/ir/ir/destructors_for_temps.cpp @@ -82,4 +82,19 @@ void temp_test10(int i) { while(i < 10) { make(); } +} + +struct ClassWithDestructor3 { + ~ClassWithDestructor3(); + ClassWithDestructor2 getClassWithDestructor2(); +}; + +ClassWithDestructor3 makeClassWithDestructor3(); + +void temp_test11() { + // Two destructors are called at the semicolon (i.e., they're both attached + // to the call to `getClassWithDestructor2()`): + // First, ~ClassWithDestructor2::ClassWithDestructor2(), and then the call + // to `~ClassWithDestructor3::ClassWithDestructor3()`. + makeClassWithDestructor3().getClassWithDestructor2(); } \ No newline at end of file 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 361ff9282ad5..3cfa57f4e1f5 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -1332,6 +1332,49 @@ | destructors_for_temps.cpp:83:9:83:14 | SideEffect | m83_6 | | destructors_for_temps.cpp:83:9:83:14 | SideEffect | ~m83_5 | | destructors_for_temps.cpp:83:9:83:14 | Unary | r83_1 | +| destructors_for_temps.cpp:94:6:94:16 | ChiPartial | partial:m94_3 | +| destructors_for_temps.cpp:94:6:94:16 | ChiTotal | total:m94_2 | +| destructors_for_temps.cpp:94:6:94:16 | SideEffect | ~m99_28 | +| destructors_for_temps.cpp:99:5:99:28 | CallTarget | func:r99_3 | +| destructors_for_temps.cpp:99:5:99:28 | ChiPartial | partial:m99_5 | +| destructors_for_temps.cpp:99:5:99:28 | ChiTotal | total:m94_4 | +| destructors_for_temps.cpp:99:5:99:28 | SideEffect | ~m94_4 | +| destructors_for_temps.cpp:99:5:99:28 | StoreValue | r99_4 | +| destructors_for_temps.cpp:99:5:99:30 | Address | &:r99_2 | +| destructors_for_temps.cpp:99:5:99:30 | Address | &:r99_2 | +| destructors_for_temps.cpp:99:5:99:30 | Address | &:r99_2 | +| destructors_for_temps.cpp:99:5:99:30 | Address | &:r99_24 | +| destructors_for_temps.cpp:99:5:99:30 | Address | &:r99_24 | +| destructors_for_temps.cpp:99:5:99:30 | Arg(this) | this:r99_2 | +| destructors_for_temps.cpp:99:5:99:30 | Arg(this) | this:r99_24 | +| destructors_for_temps.cpp:99:5:99:30 | CallTarget | func:r99_25 | +| destructors_for_temps.cpp:99:5:99:30 | ChiPartial | partial:m99_13 | +| destructors_for_temps.cpp:99:5:99:30 | ChiPartial | partial:m99_27 | +| destructors_for_temps.cpp:99:5:99:30 | ChiPartial | partial:m99_30 | +| destructors_for_temps.cpp:99:5:99:30 | ChiTotal | total:m99_7 | +| destructors_for_temps.cpp:99:5:99:30 | ChiTotal | total:m99_14 | +| destructors_for_temps.cpp:99:5:99:30 | ChiTotal | total:m99_20 | +| destructors_for_temps.cpp:99:5:99:30 | SideEffect | m99_7 | +| destructors_for_temps.cpp:99:5:99:30 | SideEffect | m99_14 | +| destructors_for_temps.cpp:99:5:99:30 | SideEffect | ~m99_20 | +| destructors_for_temps.cpp:99:5:99:30 | Unary | r99_2 | +| destructors_for_temps.cpp:99:5:99:56 | Address | &:r99_1 | +| destructors_for_temps.cpp:99:5:99:56 | Address | &:r99_16 | +| destructors_for_temps.cpp:99:5:99:56 | Address | &:r99_16 | +| destructors_for_temps.cpp:99:5:99:56 | Arg(this) | this:r99_16 | +| destructors_for_temps.cpp:99:5:99:56 | CallTarget | func:r99_17 | +| destructors_for_temps.cpp:99:5:99:56 | ChiPartial | partial:m99_19 | +| destructors_for_temps.cpp:99:5:99:56 | ChiPartial | partial:m99_22 | +| destructors_for_temps.cpp:99:5:99:56 | ChiTotal | total:m99_11 | +| destructors_for_temps.cpp:99:5:99:56 | ChiTotal | total:m99_15 | +| destructors_for_temps.cpp:99:5:99:56 | SideEffect | m99_15 | +| destructors_for_temps.cpp:99:5:99:56 | SideEffect | ~m99_11 | +| destructors_for_temps.cpp:99:5:99:56 | Unary | r99_1 | +| destructors_for_temps.cpp:99:32:99:54 | CallTarget | func:r99_8 | +| destructors_for_temps.cpp:99:32:99:54 | ChiPartial | partial:m99_10 | +| destructors_for_temps.cpp:99:32:99:54 | ChiTotal | total:m99_6 | +| destructors_for_temps.cpp:99:32:99:54 | SideEffect | ~m99_6 | +| destructors_for_temps.cpp:99:32:99:54 | StoreValue | r99_9 | | file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_1 | 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 72b2ce556247..e0f65fe0d201 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -1365,6 +1365,40 @@ destructors_for_temps.cpp: # 81| v81_7(void) = AliasedUse : ~m? # 81| v81_8(void) = ExitFunction : +# 94| void temp_test11() +# 94| Block 0 +# 94| v94_1(void) = EnterFunction : +# 94| mu94_2(unknown) = AliasedDefinition : +# 94| mu94_3(unknown) = InitializeNonLocal : +# 99| r99_1(glval) = VariableAddress[#temp99:5] : +# 99| r99_2(glval) = VariableAddress[#temp99:5] : +# 99| r99_3(glval) = FunctionAddress[makeClassWithDestructor3] : +# 99| r99_4(ClassWithDestructor3) = Call[makeClassWithDestructor3] : func:r99_3 +# 99| mu99_5(unknown) = ^CallSideEffect : ~m? +# 99| mu99_6(ClassWithDestructor3) = Store[#temp99:5] : &:r99_2, r99_4 +# 99| r99_7(glval) = FunctionAddress[getClassWithDestructor2] : +# 99| r99_8(ClassWithDestructor2) = Call[getClassWithDestructor2] : func:r99_7, this:r99_2 +# 99| mu99_9(unknown) = ^CallSideEffect : ~m? +# 99| v99_10(void) = ^IndirectReadSideEffect[-1] : &:r99_2, ~m? +# 99| mu99_11(ClassWithDestructor3) = ^IndirectMayWriteSideEffect[-1] : &:r99_2 +# 99| mu99_12(ClassWithDestructor2) = Store[#temp99:5] : &:r99_1, r99_8 +# 99| r99_13(glval) = CopyValue : r99_1 +# 99| r99_14(glval) = FunctionAddress[~ClassWithDestructor2] : +# 99| v99_15(void) = Call[~ClassWithDestructor2] : func:r99_14, this:r99_13 +# 99| mu99_16(unknown) = ^CallSideEffect : ~m? +# 99| v99_17(void) = ^IndirectReadSideEffect[-1] : &:r99_13, ~m? +# 99| mu99_18(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r99_13 +# 99| r99_19(glval) = CopyValue : r99_2 +# 99| r99_20(glval) = FunctionAddress[~ClassWithDestructor3] : +# 99| v99_21(void) = Call[~ClassWithDestructor3] : func:r99_20, this:r99_19 +# 99| mu99_22(unknown) = ^CallSideEffect : ~m? +# 99| v99_23(void) = ^IndirectReadSideEffect[-1] : &:r99_19, ~m? +# 99| mu99_24(ClassWithDestructor3) = ^IndirectMayWriteSideEffect[-1] : &:r99_19 +# 100| v100_1(void) = NoOp : +# 94| v94_4(void) = ReturnVoid : +# 94| v94_5(void) = AliasedUse : ~m? +# 94| v94_6(void) = ExitFunction : + ir.c: # 7| void MyCoordsTest(int) # 7| Block 0 From 9c25ce4079cf91d0026b771243eed41fd0781238 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 8 Apr 2024 15:35:33 +0100 Subject: [PATCH 33/35] C++: Add testcase with two destructor calls without a temporary object expression at the top-level. --- .../library-tests/ir/ir/PrintAST.expected | 36 ++++++++++++++++ .../library-tests/ir/ir/aliased_ir.expected | 41 +++++++++++++++++++ .../ir/ir/destructors_for_temps.cpp | 4 ++ .../ir/ir/operand_locations.expected | 40 ++++++++++++++++++ .../test/library-tests/ir/ir/raw_ir.expected | 34 +++++++++++++++ 5 files changed, 155 insertions(+) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index d7bf3e3e1d58..58894ca478e4 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -2367,6 +2367,42 @@ destructors_for_temps.cpp: # 99| Type = [Struct] ClassWithDestructor3 # 99| ValueCategory = xvalue # 100| getStmt(1): [ReturnStmt] return ... +# 102| [TopLevelFunction] void temp_test12(ClassWithDestructor3) +# 102| : +# 102| getParameter(0): [Parameter] x +# 102| Type = [Struct] ClassWithDestructor3 +# 102| getEntryPoint(): [BlockStmt] { ... } +# 103| getStmt(0): [ExprStmt] ExprStmt +# 103| getExpr(): [AddExpr] ... + ... +# 103| Type = [IntType] int +# 103| ValueCategory = prvalue +# 103| getLeftOperand(): [FunctionCall] call to get_x +# 103| Type = [PlainCharType] char +# 103| ValueCategory = prvalue +# 103| getQualifier(): [FunctionCall] call to getClassWithDestructor2 +# 103| Type = [Class] ClassWithDestructor2 +# 103| ValueCategory = prvalue +# 103| getQualifier(): [VariableAccess] x +# 103| Type = [Struct] ClassWithDestructor3 +# 103| ValueCategory = lvalue +# 103| getQualifier().getFullyConverted(): [TemporaryObjectExpr] temporary object +# 103| Type = [Class] ClassWithDestructor2 +# 103| ValueCategory = prvalue(load) +# 103| getRightOperand(): [Literal] 5 +# 103| Type = [IntType] int +# 103| Value = [Literal] 5 +# 103| ValueCategory = prvalue +# 103| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor2 +# 103| Type = [VoidType] void +# 103| ValueCategory = prvalue +# 103| getQualifier(): [ReuseExpr] reuse of temporary object +# 103| Type = [Class] ClassWithDestructor2 +# 103| ValueCategory = xvalue +# 103| getLeftOperand().getFullyConverted(): [CStyleCast] (int)... +# 103| Conversion = [IntegralConversion] integral conversion +# 103| Type = [IntType] int +# 103| ValueCategory = prvalue +# 104| getStmt(1): [ReturnStmt] return ... ir.c: # 5| [TopLevelFunction] int getX(MyCoords*) # 5| : 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 2f536da66ca8..7723984add38 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -1544,6 +1544,47 @@ destructors_for_temps.cpp: # 94| v94_6(void) = AliasedUse : ~m99_28 # 94| v94_7(void) = ExitFunction : +# 102| void temp_test12(ClassWithDestructor3) +# 102| Block 0 +# 102| v102_1(void) = EnterFunction : +# 102| m102_2(unknown) = AliasedDefinition : +# 102| m102_3(unknown) = InitializeNonLocal : +# 102| m102_4(unknown) = Chi : total:m102_2, partial:m102_3 +# 102| r102_5(glval) = VariableAddress[x] : +# 102| m102_6(ClassWithDestructor3) = InitializeParameter[x] : &:r102_5 +# 103| r103_1(glval) = VariableAddress[#temp103:5] : +# 103| r103_2(glval) = VariableAddress[x] : +# 103| r103_3(glval) = FunctionAddress[getClassWithDestructor2] : +# 103| r103_4(ClassWithDestructor2) = Call[getClassWithDestructor2] : func:r103_3, this:r103_2 +# 103| m103_5(unknown) = ^CallSideEffect : ~m102_4 +# 103| m103_6(unknown) = Chi : total:m102_4, partial:m103_5 +# 103| v103_7(void) = ^IndirectReadSideEffect[-1] : &:r103_2, m102_6 +# 103| m103_8(ClassWithDestructor3) = ^IndirectMayWriteSideEffect[-1] : &:r103_2 +# 103| m103_9(ClassWithDestructor3) = Chi : total:m102_6, partial:m103_8 +# 103| m103_10(ClassWithDestructor2) = Store[#temp103:5] : &:r103_1, r103_4 +# 103| r103_11(glval) = FunctionAddress[get_x] : +# 103| r103_12(char) = Call[get_x] : func:r103_11, this:r103_1 +# 103| m103_13(unknown) = ^CallSideEffect : ~m103_6 +# 103| m103_14(unknown) = Chi : total:m103_6, partial:m103_13 +# 103| v103_15(void) = ^IndirectReadSideEffect[-1] : &:r103_1, m103_10 +# 103| m103_16(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r103_1 +# 103| m103_17(ClassWithDestructor2) = Chi : total:m103_10, partial:m103_16 +# 103| r103_18(int) = Convert : r103_12 +# 103| r103_19(int) = Constant[5] : +# 103| r103_20(int) = Add : r103_18, r103_19 +# 103| r103_21(glval) = CopyValue : r103_1 +# 103| r103_22(glval) = FunctionAddress[~ClassWithDestructor2] : +# 103| v103_23(void) = Call[~ClassWithDestructor2] : func:r103_22, this:r103_21 +# 103| m103_24(unknown) = ^CallSideEffect : ~m103_14 +# 103| m103_25(unknown) = Chi : total:m103_14, partial:m103_24 +# 103| v103_26(void) = ^IndirectReadSideEffect[-1] : &:r103_21, m103_17 +# 103| m103_27(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r103_21 +# 103| m103_28(ClassWithDestructor2) = Chi : total:m103_17, partial:m103_27 +# 104| v104_1(void) = NoOp : +# 102| v102_7(void) = ReturnVoid : +# 102| v102_8(void) = AliasedUse : ~m103_25 +# 102| v102_9(void) = ExitFunction : + ir.c: # 7| void MyCoordsTest(int) # 7| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/destructors_for_temps.cpp b/cpp/ql/test/library-tests/ir/ir/destructors_for_temps.cpp index 56ce52e349e9..aefbc27173ac 100644 --- a/cpp/ql/test/library-tests/ir/ir/destructors_for_temps.cpp +++ b/cpp/ql/test/library-tests/ir/ir/destructors_for_temps.cpp @@ -97,4 +97,8 @@ void temp_test11() { // First, ~ClassWithDestructor2::ClassWithDestructor2(), and then the call // to `~ClassWithDestructor3::ClassWithDestructor3()`. makeClassWithDestructor3().getClassWithDestructor2(); +} + +void temp_test12(ClassWithDestructor3 x) { + x.getClassWithDestructor2().get_x() + 5; } \ No newline at end of file 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 3cfa57f4e1f5..ff164adaf043 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -1375,6 +1375,46 @@ | destructors_for_temps.cpp:99:32:99:54 | ChiTotal | total:m99_6 | | destructors_for_temps.cpp:99:32:99:54 | SideEffect | ~m99_6 | | destructors_for_temps.cpp:99:32:99:54 | StoreValue | r99_9 | +| destructors_for_temps.cpp:102:6:102:16 | ChiPartial | partial:m102_3 | +| destructors_for_temps.cpp:102:6:102:16 | ChiTotal | total:m102_2 | +| destructors_for_temps.cpp:102:6:102:16 | SideEffect | ~m103_25 | +| destructors_for_temps.cpp:102:39:102:39 | Address | &:r102_5 | +| destructors_for_temps.cpp:103:5:103:5 | Address | &:r103_2 | +| destructors_for_temps.cpp:103:5:103:5 | Address | &:r103_2 | +| destructors_for_temps.cpp:103:5:103:5 | Arg(this) | this:r103_2 | +| destructors_for_temps.cpp:103:5:103:5 | ChiPartial | partial:m103_8 | +| destructors_for_temps.cpp:103:5:103:5 | ChiTotal | total:m102_6 | +| destructors_for_temps.cpp:103:5:103:5 | SideEffect | m102_6 | +| destructors_for_temps.cpp:103:5:103:31 | Address | &:r103_1 | +| destructors_for_temps.cpp:103:5:103:31 | Address | &:r103_1 | +| destructors_for_temps.cpp:103:5:103:31 | Address | &:r103_1 | +| destructors_for_temps.cpp:103:5:103:31 | Address | &:r103_21 | +| destructors_for_temps.cpp:103:5:103:31 | Address | &:r103_21 | +| destructors_for_temps.cpp:103:5:103:31 | Arg(this) | this:r103_1 | +| destructors_for_temps.cpp:103:5:103:31 | Arg(this) | this:r103_21 | +| destructors_for_temps.cpp:103:5:103:31 | CallTarget | func:r103_22 | +| destructors_for_temps.cpp:103:5:103:31 | ChiPartial | partial:m103_16 | +| destructors_for_temps.cpp:103:5:103:31 | ChiPartial | partial:m103_24 | +| destructors_for_temps.cpp:103:5:103:31 | ChiPartial | partial:m103_27 | +| destructors_for_temps.cpp:103:5:103:31 | ChiTotal | total:m103_10 | +| destructors_for_temps.cpp:103:5:103:31 | ChiTotal | total:m103_14 | +| destructors_for_temps.cpp:103:5:103:31 | ChiTotal | total:m103_17 | +| destructors_for_temps.cpp:103:5:103:31 | SideEffect | m103_10 | +| destructors_for_temps.cpp:103:5:103:31 | SideEffect | m103_17 | +| destructors_for_temps.cpp:103:5:103:31 | SideEffect | ~m103_14 | +| destructors_for_temps.cpp:103:5:103:31 | Unary | r103_1 | +| destructors_for_temps.cpp:103:5:103:39 | Left | r103_18 | +| destructors_for_temps.cpp:103:7:103:29 | CallTarget | func:r103_3 | +| destructors_for_temps.cpp:103:7:103:29 | ChiPartial | partial:m103_5 | +| destructors_for_temps.cpp:103:7:103:29 | ChiTotal | total:m102_4 | +| destructors_for_temps.cpp:103:7:103:29 | SideEffect | ~m102_4 | +| destructors_for_temps.cpp:103:7:103:29 | StoreValue | r103_4 | +| destructors_for_temps.cpp:103:33:103:37 | CallTarget | func:r103_11 | +| destructors_for_temps.cpp:103:33:103:37 | ChiPartial | partial:m103_13 | +| destructors_for_temps.cpp:103:33:103:37 | ChiTotal | total:m103_6 | +| destructors_for_temps.cpp:103:33:103:37 | SideEffect | ~m103_6 | +| destructors_for_temps.cpp:103:33:103:37 | Unary | r103_12 | +| destructors_for_temps.cpp:103:43:103:43 | Right | r103_19 | | file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_1 | | file://:0:0:0:0 | Address | &:r0_1 | 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 e0f65fe0d201..87bbb1e33add 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -1399,6 +1399,40 @@ destructors_for_temps.cpp: # 94| v94_5(void) = AliasedUse : ~m? # 94| v94_6(void) = ExitFunction : +# 102| void temp_test12(ClassWithDestructor3) +# 102| Block 0 +# 102| v102_1(void) = EnterFunction : +# 102| mu102_2(unknown) = AliasedDefinition : +# 102| mu102_3(unknown) = InitializeNonLocal : +# 102| r102_4(glval) = VariableAddress[x] : +# 102| mu102_5(ClassWithDestructor3) = InitializeParameter[x] : &:r102_4 +# 103| r103_1(glval) = VariableAddress[#temp103:5] : +# 103| r103_2(glval) = VariableAddress[x] : +# 103| r103_3(glval) = FunctionAddress[getClassWithDestructor2] : +# 103| r103_4(ClassWithDestructor2) = Call[getClassWithDestructor2] : func:r103_3, this:r103_2 +# 103| mu103_5(unknown) = ^CallSideEffect : ~m? +# 103| v103_6(void) = ^IndirectReadSideEffect[-1] : &:r103_2, ~m? +# 103| mu103_7(ClassWithDestructor3) = ^IndirectMayWriteSideEffect[-1] : &:r103_2 +# 103| mu103_8(ClassWithDestructor2) = Store[#temp103:5] : &:r103_1, r103_4 +# 103| r103_9(glval) = FunctionAddress[get_x] : +# 103| r103_10(char) = Call[get_x] : func:r103_9, this:r103_1 +# 103| mu103_11(unknown) = ^CallSideEffect : ~m? +# 103| v103_12(void) = ^IndirectReadSideEffect[-1] : &:r103_1, ~m? +# 103| mu103_13(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r103_1 +# 103| r103_14(int) = Convert : r103_10 +# 103| r103_15(int) = Constant[5] : +# 103| r103_16(int) = Add : r103_14, r103_15 +# 103| r103_17(glval) = CopyValue : r103_1 +# 103| r103_18(glval) = FunctionAddress[~ClassWithDestructor2] : +# 103| v103_19(void) = Call[~ClassWithDestructor2] : func:r103_18, this:r103_17 +# 103| mu103_20(unknown) = ^CallSideEffect : ~m? +# 103| v103_21(void) = ^IndirectReadSideEffect[-1] : &:r103_17, ~m? +# 103| mu103_22(ClassWithDestructor2) = ^IndirectMayWriteSideEffect[-1] : &:r103_17 +# 104| v104_1(void) = NoOp : +# 102| v102_6(void) = ReturnVoid : +# 102| v102_7(void) = AliasedUse : ~m? +# 102| v102_8(void) = ExitFunction : + ir.c: # 7| void MyCoordsTest(int) # 7| Block 0 From 17c8fa3e8496dc4aec05ef75d4cb820d731bfa7c Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 9 Apr 2024 09:27:44 +0100 Subject: [PATCH 34/35] Update cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll Co-authored-by: Jeroen Ketema <93738568+jketema@users.noreply.github.com> --- .../cpp/ir/implementation/raw/internal/TranslatedElement.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 3f7bfebcab33..2b58c5a25244 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 @@ -821,7 +821,7 @@ newtype TTranslatedElement = // The set of destructors to invoke after a `throw`. These need to be special // cased because the edge kind following a throw is an `ExceptionEdge`, and // we need to make sure that the edge kind is still an `ExceptionEdge` after - // all the destructors has run. + // all the destructors have run. TTranslatedDestructorsAfterThrow(ThrowExpr throw) { exists(DestructorCall dc | dc = throw.getAnImplicitDestructorCall() and From c325a79206db40714bc0aee126cf62e446b9369e Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 9 Apr 2024 09:32:54 +0100 Subject: [PATCH 35/35] C++: Ensure 'isConditionalTemporaryDestructorCall' only holds when the reused expression is a temporary. --- .../cpp/ir/implementation/raw/internal/TranslatedElement.qll | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 2b58c5a25244..55361b6eb123 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 @@ -287,7 +287,10 @@ private predicate isInConditionalEvaluation(Expr e) { } private predicate isConditionalTemporaryDestructorCall(DestructorCall dc) { - isInConditionalEvaluation(dc.getQualifier().(ReuseExpr).getReusedExpr()) + exists(TemporaryObjectExpr temp | + temp = dc.getQualifier().(ReuseExpr).getReusedExpr() and + isInConditionalEvaluation(temp) + ) } /**