Merge branch 'main' into destructors-for-unconditional-unnamed

This commit is contained in:
Mathias Vorreiter Pedersen
2024-04-08 15:42:35 +01:00
192 changed files with 16852 additions and 1206 deletions

View File

@@ -41,3 +41,4 @@ private import implementations.SqLite3
private import implementations.PostgreSql
private import implementations.System
private import implementations.StructuredExceptionHandling
private import implementations.Fopen

View File

@@ -0,0 +1,50 @@
/**
* Provides implementation classes modeling `fopen` and various similar
* functions. See `semmle.code.cpp.models.Models` for usage information.
*/
import semmle.code.cpp.models.interfaces.Alias
import semmle.code.cpp.models.interfaces.SideEffect
/** The function `fopen` and friends. */
private class Fopen extends Function, AliasFunction, SideEffectFunction {
Fopen() {
this.hasGlobalOrStdName(["fopen", "fopen_s", "freopen"])
or
this.hasGlobalName(["_open", "_wfopen", "_fsopen", "_wfsopen", "_wopen"])
}
override predicate hasOnlySpecificWriteSideEffects() { any() }
override predicate hasOnlySpecificReadSideEffects() { any() }
override predicate parameterEscapesOnlyViaReturn(int i) { none() }
override predicate parameterNeverEscapes(int index) {
// None of the parameters escape
this.getParameter(index).getUnspecifiedType() instanceof PointerType
}
override predicate hasSpecificReadSideEffect(ParameterIndex i, boolean buffer) {
(
this.hasGlobalOrStdName(["fopen", "fopen_s"])
or
this.hasGlobalName(["_wfopen", "_fsopen", "_wfsopen"])
) and
i = [0, 1] and
buffer = true
or
this.hasGlobalOrStdName("freopen") and
(
i = [0, 1] and
buffer = true
or
i = 2 and
buffer = false
)
or
this.hasGlobalName(["_open", "_wopen"]) and
i = 0 and
buffer = true
}
}

View File

@@ -20380,126 +20380,150 @@ ir.cpp:
# 2430| Type = [ClassTemplateInstantiation,Struct] iterator<random_access_iterator_tag, char, ptrdiff_t, char *, char &>
# 2430| ValueCategory = lvalue
# 2432| getStmt(6): [ReturnStmt] return ...
# 2434| [TopLevelFunction] void rethrow_with_destruction(int)
# 2434| [TopLevelFunction] void param_with_destructor_by_value(ClassWithDestructor)
# 2434| <params>:
# 2434| getParameter(0): [Parameter] x
# 2434| Type = [IntType] int
# 2434| getParameter(0): [Parameter] c
# 2434| Type = [Class] ClassWithDestructor
# 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
# 2439| [CopyAssignmentOperator] ByValueConstructor& ByValueConstructor::operator=(ByValueConstructor const&)
# 2439| <params>:
# 2436| getStmt(0): [ReturnStmt] return ...
# 2438| [TopLevelFunction] void param_with_destructor_by_pointer(ClassWithDestructor*)
# 2438| <params>:
# 2438| getParameter(0): [Parameter] c
# 2438| Type = [PointerType] ClassWithDestructor *
# 2438| getEntryPoint(): [BlockStmt] { ... }
# 2440| getStmt(0): [ReturnStmt] return ...
# 2442| [TopLevelFunction] void param_with_destructor_by_ref(ClassWithDestructor&)
# 2442| <params>:
# 2442| getParameter(0): [Parameter] c
# 2442| Type = [LValueReferenceType] ClassWithDestructor &
# 2442| getEntryPoint(): [BlockStmt] { ... }
# 2444| getStmt(0): [ReturnStmt] return ...
# 2446| [TopLevelFunction] void param_with_destructor_by_rref(ClassWithDestructor&&)
# 2446| <params>:
# 2446| getParameter(0): [Parameter] c
# 2446| Type = [RValueReferenceType] ClassWithDestructor &&
# 2446| getEntryPoint(): [BlockStmt] { ... }
# 2448| getStmt(0): [ReturnStmt] return ...
# 2450| [TopLevelFunction] void rethrow_with_destruction(int)
# 2450| <params>:
# 2450| getParameter(0): [Parameter] x
# 2450| Type = [IntType] int
# 2450| getEntryPoint(): [BlockStmt] { ... }
# 2451| getStmt(0): [DeclStmt] declaration
# 2451| getDeclarationEntry(0): [VariableDeclarationEntry] definition of c
# 2451| Type = [Class] ClassWithDestructor
# 2451| getVariable().getInitializer(): [Initializer] initializer for c
# 2451| getExpr(): [ConstructorCall] call to ClassWithDestructor
# 2451| Type = [VoidType] void
# 2451| ValueCategory = prvalue
# 2452| getStmt(1): [ExprStmt] ExprStmt
# 2452| getExpr(): [ReThrowExpr] re-throw exception
# 2452| Type = [VoidType] void
# 2452| ValueCategory = prvalue
# 2453| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
# 2453| Type = [VoidType] void
# 2453| ValueCategory = prvalue
# 2453| getQualifier(): [VariableAccess] c
# 2453| Type = [Class] ClassWithDestructor
# 2453| ValueCategory = lvalue
# 2455| [CopyAssignmentOperator] ByValueConstructor& ByValueConstructor::operator=(ByValueConstructor const&)
# 2455| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const ByValueConstructor &
# 2439| [MoveAssignmentOperator] ByValueConstructor& ByValueConstructor::operator=(ByValueConstructor&&)
# 2439| <params>:
# 2455| [MoveAssignmentOperator] ByValueConstructor& ByValueConstructor::operator=(ByValueConstructor&&)
# 2455| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [RValueReferenceType] ByValueConstructor &&
# 2439| [CopyConstructor] void ByValueConstructor::ByValueConstructor(ByValueConstructor const&)
# 2439| <params>:
# 2455| [CopyConstructor] void ByValueConstructor::ByValueConstructor(ByValueConstructor const&)
# 2455| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const ByValueConstructor &
# 2439| [MoveConstructor] void ByValueConstructor::ByValueConstructor(ByValueConstructor&&)
# 2439| <params>:
# 2455| [MoveConstructor] void ByValueConstructor::ByValueConstructor(ByValueConstructor&&)
# 2455| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [RValueReferenceType] ByValueConstructor &&
# 2440| [Constructor] void ByValueConstructor::ByValueConstructor(ClassWithDestructor)
# 2440| <params>:
# 2440| getParameter(0): [Parameter] (unnamed parameter 0)
# 2440| Type = [Class] ClassWithDestructor
# 2443| [TopLevelFunction] void new_with_destructor(ClassWithDestructor)
# 2443| <params>:
# 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 ...
# 2449| [CopyAssignmentOperator] rvalue_conversion_with_destructor::A& rvalue_conversion_with_destructor::A::operator=(rvalue_conversion_with_destructor::A const&)
# 2449| <params>:
# 2456| [Constructor] void ByValueConstructor::ByValueConstructor(ClassWithDestructor)
# 2456| <params>:
# 2456| getParameter(0): [Parameter] (unnamed parameter 0)
# 2456| Type = [Class] ClassWithDestructor
# 2459| [TopLevelFunction] void new_with_destructor(ClassWithDestructor)
# 2459| <params>:
# 2459| getParameter(0): [Parameter] a
# 2459| Type = [Class] ClassWithDestructor
# 2460| getEntryPoint(): [BlockStmt] { ... }
# 2461| getStmt(0): [DeclStmt] declaration
# 2461| getDeclarationEntry(0): [VariableDeclarationEntry] definition of b
# 2461| Type = [PointerType] ByValueConstructor *
# 2461| getVariable().getInitializer(): [Initializer] initializer for b
# 2461| getExpr(): [NewExpr] new
# 2461| Type = [PointerType] ByValueConstructor *
# 2461| ValueCategory = prvalue
# 2461| getInitializer(): [ConstructorCall] call to ByValueConstructor
# 2461| Type = [VoidType] void
# 2461| ValueCategory = prvalue
# 2461| getArgument(0): [VariableAccess] a
# 2461| Type = [Class] ClassWithDestructor
# 2461| ValueCategory = prvalue(load)
# 2461| getArgument(0).getFullyConverted(): [TemporaryObjectExpr] temporary object
# 2461| Type = [Class] ClassWithDestructor
# 2461| ValueCategory = lvalue
# 2461| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
# 2461| Type = [VoidType] void
# 2461| ValueCategory = prvalue
# 2461| getQualifier(): [ReuseExpr] reuse of temporary object
# 2461| Type = [Class] ClassWithDestructor
# 2461| ValueCategory = xvalue
# 2462| getStmt(1): [ReturnStmt] return ...
# 2465| [CopyAssignmentOperator] rvalue_conversion_with_destructor::A& rvalue_conversion_with_destructor::A::operator=(rvalue_conversion_with_destructor::A const&)
# 2465| <params>:
#-----| 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| <params>:
# 2465| [MoveAssignmentOperator] rvalue_conversion_with_destructor::A& rvalue_conversion_with_destructor::A::operator=(rvalue_conversion_with_destructor::A&&)
# 2465| <params>:
#-----| 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| <params>:
# 2469| [CopyAssignmentOperator] rvalue_conversion_with_destructor::B& rvalue_conversion_with_destructor::B::operator=(rvalue_conversion_with_destructor::B const&)
# 2469| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const B &
# 2453| [Constructor] void rvalue_conversion_with_destructor::B::B()
# 2453| <params>:
# 2455| [Destructor] void rvalue_conversion_with_destructor::B::~B()
# 2455| <params>:
# 2457| [ConstMemberFunction] rvalue_conversion_with_destructor::A* rvalue_conversion_with_destructor::B::operator->() const
# 2457| <params>:
# 2460| [TopLevelFunction] rvalue_conversion_with_destructor::B rvalue_conversion_with_destructor::get()
# 2460| <params>:
# 2462| [TopLevelFunction] void rvalue_conversion_with_destructor::test()
# 2462| <params>:
# 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 ...
# 2469| [Constructor] void rvalue_conversion_with_destructor::B::B()
# 2469| <params>:
# 2471| [Destructor] void rvalue_conversion_with_destructor::B::~B()
# 2471| <params>:
# 2473| [ConstMemberFunction] rvalue_conversion_with_destructor::A* rvalue_conversion_with_destructor::B::operator->() const
# 2473| <params>:
# 2476| [TopLevelFunction] rvalue_conversion_with_destructor::B rvalue_conversion_with_destructor::get()
# 2476| <params>:
# 2478| [TopLevelFunction] void rvalue_conversion_with_destructor::test()
# 2478| <params>:
# 2479| getEntryPoint(): [BlockStmt] { ... }
# 2480| getStmt(0): [DeclStmt] declaration
# 2480| getDeclarationEntry(0): [VariableDeclarationEntry] definition of a
# 2480| Type = [IntType] unsigned int
# 2480| getVariable().getInitializer(): [Initializer] initializer for a
# 2480| getExpr(): [PointerFieldAccess] a
# 2480| Type = [IntType] unsigned int
# 2480| ValueCategory = prvalue(load)
# 2480| getQualifier(): [FunctionCall] call to operator->
# 2480| Type = [PointerType] A *
# 2480| ValueCategory = prvalue
# 2480| getQualifier(): [FunctionCall] call to get
# 2480| Type = [Struct] B
# 2480| ValueCategory = prvalue
# 2480| getQualifier().getFullyConverted(): [CStyleCast] (const B)...
# 2480| Conversion = [PrvalueAdjustmentConversion] prvalue adjustment conversion
# 2480| Type = [SpecifiedType] const B
# 2480| ValueCategory = prvalue
# 2480| getExpr(): [TemporaryObjectExpr] temporary object
# 2480| Type = [Struct] B
# 2480| ValueCategory = prvalue(load)
# 2480| getImplicitDestructorCall(0): [DestructorCall] call to ~B
# 2480| Type = [VoidType] void
# 2480| ValueCategory = prvalue
# 2480| getQualifier(): [ReuseExpr] reuse of temporary object
# 2480| Type = [Struct] B
# 2480| ValueCategory = xvalue
# 2481| getStmt(1): [ReturnStmt] return ...
perf-regression.cpp:
# 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&)
# 4| <params>:

View File

@@ -16145,113 +16145,174 @@ ir.cpp:
# 2410| Block 13
# 2410| v2410_8(void) = Unreached :
# 2434| void rethrow_with_destruction(int)
# 2434| void param_with_destructor_by_value(ClassWithDestructor)
# 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<int>) = VariableAddress[x] :
# 2434| m2434_6(int) = InitializeParameter[x] : &:r2434_5
# 2435| r2435_1(glval<ClassWithDestructor>) = VariableAddress[c] :
# 2435| m2435_2(ClassWithDestructor) = Uninitialized[c] : &:r2435_1
# 2435| r2435_3(glval<unknown>) = 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<ClassWithDestructor>) = VariableAddress[c] :
# 2437| r2437_2(glval<unknown>) = 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_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<ClassWithDestructor>) = VariableAddress[c] :
# 2434| m2434_6(ClassWithDestructor) = InitializeParameter[c] : &:r2434_5
# 2436| v2436_1(void) = NoOp :
# 2434| v2434_7(void) = ReturnVoid :
# 2434| v2434_8(void) = AliasedUse : m2434_3
# 2434| v2434_9(void) = ExitFunction :
# 2438| void param_with_destructor_by_pointer(ClassWithDestructor*)
# 2438| Block 0
# 2438| v2438_1(void) = EnterFunction :
# 2438| m2438_2(unknown) = AliasedDefinition :
# 2438| m2438_3(unknown) = InitializeNonLocal :
# 2438| m2438_4(unknown) = Chi : total:m2438_2, partial:m2438_3
# 2438| r2438_5(glval<ClassWithDestructor *>) = VariableAddress[c] :
# 2438| m2438_6(ClassWithDestructor *) = InitializeParameter[c] : &:r2438_5
# 2438| r2438_7(ClassWithDestructor *) = Load[c] : &:r2438_5, m2438_6
# 2438| m2438_8(unknown) = InitializeIndirection[c] : &:r2438_7
# 2440| v2440_1(void) = NoOp :
# 2438| v2438_9(void) = ReturnIndirection[c] : &:r2438_7, m2438_8
# 2438| v2438_10(void) = ReturnVoid :
# 2438| v2438_11(void) = AliasedUse : m2438_3
# 2438| v2438_12(void) = ExitFunction :
# 2442| void param_with_destructor_by_ref(ClassWithDestructor&)
# 2442| Block 0
# 2442| v2442_1(void) = EnterFunction :
# 2442| m2442_2(unknown) = AliasedDefinition :
# 2442| m2442_3(unknown) = InitializeNonLocal :
# 2442| m2442_4(unknown) = Chi : total:m2442_2, partial:m2442_3
# 2442| r2442_5(glval<ClassWithDestructor &>) = VariableAddress[c] :
# 2442| m2442_6(ClassWithDestructor &) = InitializeParameter[c] : &:r2442_5
# 2442| r2442_7(ClassWithDestructor &) = Load[c] : &:r2442_5, m2442_6
# 2442| m2442_8(unknown) = InitializeIndirection[c] : &:r2442_7
# 2444| v2444_1(void) = NoOp :
# 2442| v2442_9(void) = ReturnIndirection[c] : &:r2442_7, m2442_8
# 2442| v2442_10(void) = ReturnVoid :
# 2442| v2442_11(void) = AliasedUse : m2442_3
# 2442| v2442_12(void) = ExitFunction :
# 2446| void param_with_destructor_by_rref(ClassWithDestructor&&)
# 2446| Block 0
# 2446| v2446_1(void) = EnterFunction :
# 2446| m2446_2(unknown) = AliasedDefinition :
# 2446| m2446_3(unknown) = InitializeNonLocal :
# 2446| m2446_4(unknown) = Chi : total:m2446_2, partial:m2446_3
# 2446| r2446_5(glval<ClassWithDestructor &&>) = VariableAddress[c] :
# 2446| m2446_6(ClassWithDestructor &&) = InitializeParameter[c] : &:r2446_5
# 2446| r2446_7(ClassWithDestructor &&) = Load[c] : &:r2446_5, m2446_6
# 2446| m2446_8(unknown) = InitializeIndirection[c] : &:r2446_7
# 2448| v2448_1(void) = NoOp :
# 2446| v2446_9(void) = ReturnIndirection[c] : &:r2446_7, m2446_8
# 2446| v2446_10(void) = ReturnVoid :
# 2446| v2446_11(void) = AliasedUse : m2446_3
# 2446| v2446_12(void) = ExitFunction :
# 2450| void rethrow_with_destruction(int)
# 2450| Block 0
# 2450| v2450_1(void) = EnterFunction :
# 2450| m2450_2(unknown) = AliasedDefinition :
# 2450| m2450_3(unknown) = InitializeNonLocal :
# 2450| m2450_4(unknown) = Chi : total:m2450_2, partial:m2450_3
# 2450| r2450_5(glval<int>) = VariableAddress[x] :
# 2450| m2450_6(int) = InitializeParameter[x] : &:r2450_5
# 2451| r2451_1(glval<ClassWithDestructor>) = VariableAddress[c] :
# 2451| m2451_2(ClassWithDestructor) = Uninitialized[c] : &:r2451_1
# 2451| r2451_3(glval<unknown>) = FunctionAddress[ClassWithDestructor] :
# 2451| v2451_4(void) = Call[ClassWithDestructor] : func:r2451_3, this:r2451_1
# 2451| m2451_5(unknown) = ^CallSideEffect : ~m2450_4
# 2451| m2451_6(unknown) = Chi : total:m2450_4, partial:m2451_5
# 2451| m2451_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2451_1
# 2451| m2451_8(ClassWithDestructor) = Chi : total:m2451_2, partial:m2451_7
# 2452| v2452_1(void) = ReThrow :
# 2453| r2453_1(glval<ClassWithDestructor>) = VariableAddress[c] :
# 2453| r2453_2(glval<unknown>) = FunctionAddress[~ClassWithDestructor] :
# 2453| v2453_3(void) = Call[~ClassWithDestructor] : func:r2453_2, this:r2453_1
# 2453| m2453_4(unknown) = ^CallSideEffect : ~m2451_6
# 2453| m2453_5(unknown) = Chi : total:m2451_6, partial:m2453_4
# 2453| v2453_6(void) = ^IndirectReadSideEffect[-1] : &:r2453_1, m2451_8
# 2453| m2453_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2453_1
# 2453| m2453_8(ClassWithDestructor) = Chi : total:m2451_8, partial:m2453_7
#-----| Exception -> Block 1
# 2434| Block 1
# 2434| v2434_7(void) = Unwind :
# 2434| v2434_8(void) = AliasedUse : ~m2437_5
# 2434| v2434_9(void) = ExitFunction :
# 2450| Block 1
# 2450| v2450_7(void) = Unwind :
# 2450| v2450_8(void) = AliasedUse : ~m2453_5
# 2450| v2450_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<ClassWithDestructor>) = VariableAddress[a] :
# 2443| m2443_6(ClassWithDestructor) = InitializeParameter[a] : &:r2443_5
# 2445| r2445_1(glval<ByValueConstructor *>) = VariableAddress[b] :
# 2445| r2445_2(glval<unknown>) = 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<unknown>) = FunctionAddress[ByValueConstructor] :
# 2445| r2445_10(glval<ClassWithDestructor>) = VariableAddress[#temp2445:52] :
# 2445| r2445_11(glval<ClassWithDestructor>) = 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<ClassWithDestructor>) = CopyValue : r2445_10
# 2445| r2445_21(glval<unknown>) = 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 :
# 2459| void new_with_destructor(ClassWithDestructor)
# 2459| Block 0
# 2459| v2459_1(void) = EnterFunction :
# 2459| m2459_2(unknown) = AliasedDefinition :
# 2459| m2459_3(unknown) = InitializeNonLocal :
# 2459| m2459_4(unknown) = Chi : total:m2459_2, partial:m2459_3
# 2459| r2459_5(glval<ClassWithDestructor>) = VariableAddress[a] :
# 2459| m2459_6(ClassWithDestructor) = InitializeParameter[a] : &:r2459_5
# 2461| r2461_1(glval<ByValueConstructor *>) = VariableAddress[b] :
# 2461| r2461_2(glval<unknown>) = FunctionAddress[operator new] :
# 2461| r2461_3(unsigned long) = Constant[1] :
# 2461| r2461_4(void *) = Call[operator new] : func:r2461_2, 0:r2461_3
# 2461| m2461_5(unknown) = ^CallSideEffect : ~m2459_4
# 2461| m2461_6(unknown) = Chi : total:m2459_4, partial:m2461_5
# 2461| m2461_7(unknown) = ^InitializeDynamicAllocation : &:r2461_4
# 2461| r2461_8(ByValueConstructor *) = Convert : r2461_4
# 2461| r2461_9(glval<unknown>) = FunctionAddress[ByValueConstructor] :
# 2461| r2461_10(glval<ClassWithDestructor>) = VariableAddress[#temp2461:52] :
# 2461| r2461_11(glval<ClassWithDestructor>) = VariableAddress[a] :
# 2461| r2461_12(ClassWithDestructor) = Load[a] : &:r2461_11, m2459_6
# 2461| m2461_13(ClassWithDestructor) = Store[#temp2461:52] : &:r2461_10, r2461_12
# 2461| r2461_14(ClassWithDestructor) = Load[#temp2461:52] : &:r2461_10, m2461_13
# 2461| v2461_15(void) = Call[ByValueConstructor] : func:r2461_9, this:r2461_8, 0:r2461_14
# 2461| m2461_16(unknown) = ^CallSideEffect : ~m2461_6
# 2461| m2461_17(unknown) = Chi : total:m2461_6, partial:m2461_16
# 2461| m2461_18(ByValueConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r2461_8
# 2461| m2461_19(unknown) = Chi : total:m2461_7, partial:m2461_18
# 2461| r2461_20(glval<ClassWithDestructor>) = CopyValue : r2461_10
# 2461| r2461_21(glval<unknown>) = FunctionAddress[~ClassWithDestructor] :
# 2461| v2461_22(void) = Call[~ClassWithDestructor] : func:r2461_21, this:r2461_20
# 2461| m2461_23(unknown) = ^CallSideEffect : ~m2461_17
# 2461| m2461_24(unknown) = Chi : total:m2461_17, partial:m2461_23
# 2461| v2461_25(void) = ^IndirectReadSideEffect[-1] : &:r2461_20, m2461_13
# 2461| m2461_26(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2461_20
# 2461| m2461_27(ClassWithDestructor) = Chi : total:m2461_13, partial:m2461_26
# 2461| m2461_28(ByValueConstructor *) = Store[b] : &:r2461_1, r2461_8
# 2462| v2462_1(void) = NoOp :
# 2459| v2459_7(void) = ReturnVoid :
# 2459| v2459_8(void) = AliasedUse : ~m2461_24
# 2459| v2459_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<unsigned int>) = VariableAddress[a] :
# 2464| r2464_2(glval<B>) = VariableAddress[#temp2464:18] :
# 2464| r2464_3(glval<unknown>) = 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<B>) = Convert : r2464_2
# 2464| r2464_9(glval<unknown>) = 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<unsigned int>) = FieldAddress[a] : r2464_10
# 2464| r2464_15(glval<B>) = CopyValue : r2464_2
# 2464| r2464_16(glval<unknown>) = 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 :
# 2478| void rvalue_conversion_with_destructor::test()
# 2478| Block 0
# 2478| v2478_1(void) = EnterFunction :
# 2478| m2478_2(unknown) = AliasedDefinition :
# 2478| m2478_3(unknown) = InitializeNonLocal :
# 2478| m2478_4(unknown) = Chi : total:m2478_2, partial:m2478_3
# 2480| r2480_1(glval<unsigned int>) = VariableAddress[a] :
# 2480| r2480_2(glval<B>) = VariableAddress[#temp2480:18] :
# 2480| r2480_3(glval<unknown>) = FunctionAddress[get] :
# 2480| r2480_4(B) = Call[get] : func:r2480_3
# 2480| m2480_5(unknown) = ^CallSideEffect : ~m2478_4
# 2480| m2480_6(unknown) = Chi : total:m2478_4, partial:m2480_5
# 2480| m2480_7(B) = Store[#temp2480:18] : &:r2480_2, r2480_4
# 2480| r2480_8(glval<B>) = Convert : r2480_2
# 2480| r2480_9(glval<unknown>) = FunctionAddress[operator->] :
# 2480| r2480_10(A *) = Call[operator->] : func:r2480_9, this:r2480_8
# 2480| m2480_11(unknown) = ^CallSideEffect : ~m2480_6
# 2480| m2480_12(unknown) = Chi : total:m2480_6, partial:m2480_11
# 2480| v2480_13(void) = ^IndirectReadSideEffect[-1] : &:r2480_8, m2480_7
# 2480| r2480_14(glval<unsigned int>) = FieldAddress[a] : r2480_10
# 2480| r2480_15(glval<B>) = CopyValue : r2480_2
# 2480| r2480_16(glval<unknown>) = FunctionAddress[~B] :
# 2480| v2480_17(void) = Call[~B] : func:r2480_16, this:r2480_15
# 2480| m2480_18(unknown) = ^CallSideEffect : ~m2480_12
# 2480| m2480_19(unknown) = Chi : total:m2480_12, partial:m2480_18
# 2480| v2480_20(void) = ^IndirectReadSideEffect[-1] : &:r2480_15, m2480_7
# 2480| m2480_21(B) = ^IndirectMayWriteSideEffect[-1] : &:r2480_15
# 2480| m2480_22(B) = Chi : total:m2480_7, partial:m2480_21
# 2480| r2480_23(unsigned int) = Load[?] : &:r2480_14, ~m2480_19
# 2480| m2480_24(unsigned int) = Store[a] : &:r2480_1, r2480_23
# 2481| v2481_1(void) = NoOp :
# 2478| v2478_5(void) = ReturnVoid :
# 2478| v2478_6(void) = AliasedUse : ~m2480_19
# 2478| v2478_7(void) = ExitFunction :
perf-regression.cpp:
# 6| void Big::Big()

View File

@@ -2431,6 +2431,22 @@ void initialization_with_temp_destructor() {
y += x;
}
void param_with_destructor_by_value(ClassWithDestructor c) {
// The call to ~ClassWithDestructor::ClassWithDestructor() seems to be missing here.
}
void param_with_destructor_by_pointer(ClassWithDestructor* c) {
// No destructor call should be here
}
void param_with_destructor_by_ref(ClassWithDestructor& c) {
// No destructor call should be here
}
void param_with_destructor_by_rref(ClassWithDestructor&& c) {
// No destructor call should be here
}
void rethrow_with_destruction(int x) {
ClassWithDestructor c;
throw;

View File

@@ -13584,101 +13584,132 @@
| 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: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 |
| 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 |
| 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 |
| 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_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_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_8 |
| ir.cpp:2445:29:2445:53 | CallTarget | func:r2445_2 |
| 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: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_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 |
| 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_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 |
| 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_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_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_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 |
| 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_19 |
| ir.cpp:2464:25:2464:25 | StoreValue | r2464_23 |
| ir.cpp:2434:6:2434:35 | ChiPartial | partial:m2434_3 |
| ir.cpp:2434:6:2434:35 | ChiTotal | total:m2434_2 |
| ir.cpp:2434:6:2434:35 | SideEffect | m2434_3 |
| ir.cpp:2434:57:2434:57 | Address | &:r2434_5 |
| ir.cpp:2438:6:2438:37 | ChiPartial | partial:m2438_3 |
| ir.cpp:2438:6:2438:37 | ChiTotal | total:m2438_2 |
| ir.cpp:2438:6:2438:37 | SideEffect | m2438_3 |
| ir.cpp:2438:60:2438:60 | Address | &:r2438_5 |
| ir.cpp:2438:60:2438:60 | Address | &:r2438_5 |
| ir.cpp:2438:60:2438:60 | Address | &:r2438_7 |
| ir.cpp:2438:60:2438:60 | Address | &:r2438_7 |
| ir.cpp:2438:60:2438:60 | Load | m2438_6 |
| ir.cpp:2438:60:2438:60 | SideEffect | m2438_8 |
| ir.cpp:2442:6:2442:33 | ChiPartial | partial:m2442_3 |
| ir.cpp:2442:6:2442:33 | ChiTotal | total:m2442_2 |
| ir.cpp:2442:6:2442:33 | SideEffect | m2442_3 |
| ir.cpp:2442:56:2442:56 | Address | &:r2442_5 |
| ir.cpp:2442:56:2442:56 | Address | &:r2442_5 |
| ir.cpp:2442:56:2442:56 | Address | &:r2442_7 |
| ir.cpp:2442:56:2442:56 | Address | &:r2442_7 |
| ir.cpp:2442:56:2442:56 | Load | m2442_6 |
| ir.cpp:2442:56:2442:56 | SideEffect | m2442_8 |
| ir.cpp:2446:6:2446:34 | ChiPartial | partial:m2446_3 |
| ir.cpp:2446:6:2446:34 | ChiTotal | total:m2446_2 |
| ir.cpp:2446:6:2446:34 | SideEffect | m2446_3 |
| ir.cpp:2446:58:2446:58 | Address | &:r2446_5 |
| ir.cpp:2446:58:2446:58 | Address | &:r2446_5 |
| ir.cpp:2446:58:2446:58 | Address | &:r2446_7 |
| ir.cpp:2446:58:2446:58 | Address | &:r2446_7 |
| ir.cpp:2446:58:2446:58 | Load | m2446_6 |
| ir.cpp:2446:58:2446:58 | SideEffect | m2446_8 |
| ir.cpp:2450:6:2450:29 | ChiPartial | partial:m2450_3 |
| ir.cpp:2450:6:2450:29 | ChiTotal | total:m2450_2 |
| ir.cpp:2450:6:2450:29 | SideEffect | ~m2453_5 |
| ir.cpp:2450:35:2450:35 | Address | &:r2450_5 |
| ir.cpp:2451:25:2451:25 | Address | &:r2451_1 |
| ir.cpp:2451:25:2451:25 | Address | &:r2451_1 |
| ir.cpp:2451:25:2451:25 | Arg(this) | this:r2451_1 |
| ir.cpp:2451:25:2451:25 | CallTarget | func:r2451_3 |
| ir.cpp:2451:25:2451:25 | ChiPartial | partial:m2451_5 |
| ir.cpp:2451:25:2451:25 | ChiPartial | partial:m2451_7 |
| ir.cpp:2451:25:2451:25 | ChiTotal | total:m2450_4 |
| ir.cpp:2451:25:2451:25 | ChiTotal | total:m2451_2 |
| ir.cpp:2451:25:2451:25 | SideEffect | ~m2450_4 |
| ir.cpp:2453:1:2453:1 | Address | &:r2453_1 |
| ir.cpp:2453:1:2453:1 | Address | &:r2453_1 |
| ir.cpp:2453:1:2453:1 | Arg(this) | this:r2453_1 |
| ir.cpp:2453:1:2453:1 | CallTarget | func:r2453_2 |
| ir.cpp:2453:1:2453:1 | ChiPartial | partial:m2453_4 |
| ir.cpp:2453:1:2453:1 | ChiPartial | partial:m2453_7 |
| ir.cpp:2453:1:2453:1 | ChiTotal | total:m2451_6 |
| ir.cpp:2453:1:2453:1 | ChiTotal | total:m2451_8 |
| ir.cpp:2453:1:2453:1 | SideEffect | m2451_8 |
| ir.cpp:2453:1:2453:1 | SideEffect | ~m2451_6 |
| ir.cpp:2459:6:2459:24 | ChiPartial | partial:m2459_3 |
| ir.cpp:2459:6:2459:24 | ChiTotal | total:m2459_2 |
| ir.cpp:2459:6:2459:24 | SideEffect | ~m2461_24 |
| ir.cpp:2459:46:2459:46 | Address | &:r2459_5 |
| ir.cpp:2461:25:2461:25 | Address | &:r2461_1 |
| ir.cpp:2461:29:2461:53 | Address | &:r2461_4 |
| ir.cpp:2461:29:2461:53 | Address | &:r2461_8 |
| ir.cpp:2461:29:2461:53 | Arg(0) | 0:r2461_3 |
| ir.cpp:2461:29:2461:53 | Arg(this) | this:r2461_8 |
| ir.cpp:2461:29:2461:53 | CallTarget | func:r2461_2 |
| ir.cpp:2461:29:2461:53 | CallTarget | func:r2461_9 |
| ir.cpp:2461:29:2461:53 | ChiPartial | partial:m2461_5 |
| ir.cpp:2461:29:2461:53 | ChiPartial | partial:m2461_16 |
| ir.cpp:2461:29:2461:53 | ChiPartial | partial:m2461_18 |
| ir.cpp:2461:29:2461:53 | ChiTotal | total:m2459_4 |
| ir.cpp:2461:29:2461:53 | ChiTotal | total:m2461_6 |
| ir.cpp:2461:29:2461:53 | ChiTotal | total:m2461_7 |
| ir.cpp:2461:29:2461:53 | SideEffect | ~m2459_4 |
| ir.cpp:2461:29:2461:53 | SideEffect | ~m2461_6 |
| ir.cpp:2461:29:2461:53 | StoreValue | r2461_8 |
| ir.cpp:2461:29:2461:53 | Unary | r2461_4 |
| ir.cpp:2461:52:2461:52 | Address | &:r2461_10 |
| ir.cpp:2461:52:2461:52 | Address | &:r2461_10 |
| ir.cpp:2461:52:2461:52 | Address | &:r2461_11 |
| ir.cpp:2461:52:2461:52 | Address | &:r2461_20 |
| ir.cpp:2461:52:2461:52 | Address | &:r2461_20 |
| ir.cpp:2461:52:2461:52 | Arg(0) | 0:r2461_14 |
| ir.cpp:2461:52:2461:52 | Arg(this) | this:r2461_20 |
| ir.cpp:2461:52:2461:52 | CallTarget | func:r2461_21 |
| ir.cpp:2461:52:2461:52 | ChiPartial | partial:m2461_23 |
| ir.cpp:2461:52:2461:52 | ChiPartial | partial:m2461_26 |
| ir.cpp:2461:52:2461:52 | ChiTotal | total:m2461_13 |
| ir.cpp:2461:52:2461:52 | ChiTotal | total:m2461_17 |
| ir.cpp:2461:52:2461:52 | Load | m2459_6 |
| ir.cpp:2461:52:2461:52 | Load | m2461_13 |
| ir.cpp:2461:52:2461:52 | SideEffect | m2461_13 |
| ir.cpp:2461:52:2461:52 | SideEffect | ~m2461_17 |
| ir.cpp:2461:52:2461:52 | StoreValue | r2461_12 |
| ir.cpp:2461:52:2461:52 | Unary | r2461_10 |
| ir.cpp:2478:10:2478:13 | ChiPartial | partial:m2478_3 |
| ir.cpp:2478:10:2478:13 | ChiTotal | total:m2478_2 |
| ir.cpp:2478:10:2478:13 | SideEffect | ~m2480_19 |
| ir.cpp:2480:14:2480:14 | Address | &:r2480_1 |
| ir.cpp:2480:18:2480:20 | CallTarget | func:r2480_3 |
| ir.cpp:2480:18:2480:20 | ChiPartial | partial:m2480_5 |
| ir.cpp:2480:18:2480:20 | ChiTotal | total:m2478_4 |
| ir.cpp:2480:18:2480:20 | SideEffect | ~m2478_4 |
| ir.cpp:2480:18:2480:20 | StoreValue | r2480_4 |
| ir.cpp:2480:18:2480:22 | Address | &:r2480_2 |
| ir.cpp:2480:18:2480:22 | Address | &:r2480_8 |
| ir.cpp:2480:18:2480:22 | Address | &:r2480_15 |
| ir.cpp:2480:18:2480:22 | Address | &:r2480_15 |
| ir.cpp:2480:18:2480:22 | Arg(this) | this:r2480_8 |
| ir.cpp:2480:18:2480:22 | Arg(this) | this:r2480_15 |
| ir.cpp:2480:18:2480:22 | CallTarget | func:r2480_16 |
| ir.cpp:2480:18:2480:22 | ChiPartial | partial:m2480_18 |
| ir.cpp:2480:18:2480:22 | ChiPartial | partial:m2480_21 |
| ir.cpp:2480:18:2480:22 | ChiTotal | total:m2480_7 |
| ir.cpp:2480:18:2480:22 | ChiTotal | total:m2480_12 |
| ir.cpp:2480:18:2480:22 | SideEffect | m2480_7 |
| ir.cpp:2480:18:2480:22 | SideEffect | m2480_7 |
| ir.cpp:2480:18:2480:22 | SideEffect | ~m2480_12 |
| ir.cpp:2480:18:2480:22 | Unary | r2480_2 |
| ir.cpp:2480:18:2480:22 | Unary | r2480_2 |
| ir.cpp:2480:23:2480:23 | CallTarget | func:r2480_9 |
| ir.cpp:2480:23:2480:23 | ChiPartial | partial:m2480_11 |
| ir.cpp:2480:23:2480:23 | ChiTotal | total:m2480_6 |
| ir.cpp:2480:23:2480:23 | SideEffect | ~m2480_6 |
| ir.cpp:2480:23:2480:23 | Unary | r2480_10 |
| ir.cpp:2480:25:2480:25 | Address | &:r2480_14 |
| ir.cpp:2480:25:2480:25 | Load | ~m2480_19 |
| ir.cpp:2480:25:2480:25 | StoreValue | r2480_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 |

View File

@@ -14813,104 +14813,161 @@ ir.cpp:
# 2410| v2410_5(void) = AliasedUse : ~m?
# 2410| v2410_6(void) = ExitFunction :
# 2434| void rethrow_with_destruction(int)
# 2434| void param_with_destructor_by_value(ClassWithDestructor)
# 2434| Block 0
# 2434| v2434_1(void) = EnterFunction :
# 2434| mu2434_2(unknown) = AliasedDefinition :
# 2434| mu2434_3(unknown) = InitializeNonLocal :
# 2434| r2434_4(glval<int>) = VariableAddress[x] :
# 2434| mu2434_5(int) = InitializeParameter[x] : &:r2434_4
# 2435| r2435_1(glval<ClassWithDestructor>) = VariableAddress[c] :
# 2435| mu2435_2(ClassWithDestructor) = Uninitialized[c] : &:r2435_1
# 2435| r2435_3(glval<unknown>) = 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<ClassWithDestructor>) = VariableAddress[c] :
# 2437| r2437_2(glval<unknown>) = 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_1(void) = EnterFunction :
# 2434| mu2434_2(unknown) = AliasedDefinition :
# 2434| mu2434_3(unknown) = InitializeNonLocal :
# 2434| r2434_4(glval<ClassWithDestructor>) = VariableAddress[c] :
# 2434| mu2434_5(ClassWithDestructor) = InitializeParameter[c] : &:r2434_4
# 2436| v2436_1(void) = NoOp :
# 2434| v2434_6(void) = ReturnVoid :
# 2434| v2434_7(void) = AliasedUse : ~m?
# 2434| v2434_8(void) = ExitFunction :
# 2438| void param_with_destructor_by_pointer(ClassWithDestructor*)
# 2438| Block 0
# 2438| v2438_1(void) = EnterFunction :
# 2438| mu2438_2(unknown) = AliasedDefinition :
# 2438| mu2438_3(unknown) = InitializeNonLocal :
# 2438| r2438_4(glval<ClassWithDestructor *>) = VariableAddress[c] :
# 2438| mu2438_5(ClassWithDestructor *) = InitializeParameter[c] : &:r2438_4
# 2438| r2438_6(ClassWithDestructor *) = Load[c] : &:r2438_4, ~m?
# 2438| mu2438_7(unknown) = InitializeIndirection[c] : &:r2438_6
# 2440| v2440_1(void) = NoOp :
# 2438| v2438_8(void) = ReturnIndirection[c] : &:r2438_6, ~m?
# 2438| v2438_9(void) = ReturnVoid :
# 2438| v2438_10(void) = AliasedUse : ~m?
# 2438| v2438_11(void) = ExitFunction :
# 2442| void param_with_destructor_by_ref(ClassWithDestructor&)
# 2442| Block 0
# 2442| v2442_1(void) = EnterFunction :
# 2442| mu2442_2(unknown) = AliasedDefinition :
# 2442| mu2442_3(unknown) = InitializeNonLocal :
# 2442| r2442_4(glval<ClassWithDestructor &>) = VariableAddress[c] :
# 2442| mu2442_5(ClassWithDestructor &) = InitializeParameter[c] : &:r2442_4
# 2442| r2442_6(ClassWithDestructor &) = Load[c] : &:r2442_4, ~m?
# 2442| mu2442_7(unknown) = InitializeIndirection[c] : &:r2442_6
# 2444| v2444_1(void) = NoOp :
# 2442| v2442_8(void) = ReturnIndirection[c] : &:r2442_6, ~m?
# 2442| v2442_9(void) = ReturnVoid :
# 2442| v2442_10(void) = AliasedUse : ~m?
# 2442| v2442_11(void) = ExitFunction :
# 2446| void param_with_destructor_by_rref(ClassWithDestructor&&)
# 2446| Block 0
# 2446| v2446_1(void) = EnterFunction :
# 2446| mu2446_2(unknown) = AliasedDefinition :
# 2446| mu2446_3(unknown) = InitializeNonLocal :
# 2446| r2446_4(glval<ClassWithDestructor &&>) = VariableAddress[c] :
# 2446| mu2446_5(ClassWithDestructor &&) = InitializeParameter[c] : &:r2446_4
# 2446| r2446_6(ClassWithDestructor &&) = Load[c] : &:r2446_4, ~m?
# 2446| mu2446_7(unknown) = InitializeIndirection[c] : &:r2446_6
# 2448| v2448_1(void) = NoOp :
# 2446| v2446_8(void) = ReturnIndirection[c] : &:r2446_6, ~m?
# 2446| v2446_9(void) = ReturnVoid :
# 2446| v2446_10(void) = AliasedUse : ~m?
# 2446| v2446_11(void) = ExitFunction :
# 2450| void rethrow_with_destruction(int)
# 2450| Block 0
# 2450| v2450_1(void) = EnterFunction :
# 2450| mu2450_2(unknown) = AliasedDefinition :
# 2450| mu2450_3(unknown) = InitializeNonLocal :
# 2450| r2450_4(glval<int>) = VariableAddress[x] :
# 2450| mu2450_5(int) = InitializeParameter[x] : &:r2450_4
# 2451| r2451_1(glval<ClassWithDestructor>) = VariableAddress[c] :
# 2451| mu2451_2(ClassWithDestructor) = Uninitialized[c] : &:r2451_1
# 2451| r2451_3(glval<unknown>) = FunctionAddress[ClassWithDestructor] :
# 2451| v2451_4(void) = Call[ClassWithDestructor] : func:r2451_3, this:r2451_1
# 2451| mu2451_5(unknown) = ^CallSideEffect : ~m?
# 2451| mu2451_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2451_1
# 2452| v2452_1(void) = ReThrow :
# 2453| r2453_1(glval<ClassWithDestructor>) = VariableAddress[c] :
# 2453| r2453_2(glval<unknown>) = FunctionAddress[~ClassWithDestructor] :
# 2453| v2453_3(void) = Call[~ClassWithDestructor] : func:r2453_2, this:r2453_1
# 2453| mu2453_4(unknown) = ^CallSideEffect : ~m?
# 2453| v2453_5(void) = ^IndirectReadSideEffect[-1] : &:r2453_1, ~m?
# 2453| mu2453_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2453_1
#-----| Exception -> Block 3
# 2434| Block 1
# 2434| v2434_6(void) = AliasedUse : ~m?
# 2434| v2434_7(void) = ExitFunction :
# 2450| Block 1
# 2450| v2450_6(void) = AliasedUse : ~m?
# 2450| v2450_7(void) = ExitFunction :
# 2434| Block 2
# 2434| v2434_8(void) = ReturnVoid :
# 2450| Block 2
# 2450| v2450_8(void) = ReturnVoid :
#-----| Goto -> Block 1
# 2434| Block 3
# 2434| v2434_9(void) = Unwind :
# 2450| Block 3
# 2450| v2450_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<ClassWithDestructor>) = VariableAddress[a] :
# 2443| mu2443_5(ClassWithDestructor) = InitializeParameter[a] : &:r2443_4
# 2445| r2445_1(glval<ByValueConstructor *>) = VariableAddress[b] :
# 2445| r2445_2(glval<unknown>) = 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<unknown>) = FunctionAddress[ByValueConstructor] :
# 2445| r2445_9(glval<ClassWithDestructor>) = VariableAddress[#temp2445:52] :
# 2445| r2445_10(glval<ClassWithDestructor>) = 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<ClassWithDestructor>) = CopyValue : r2445_9
# 2445| r2445_18(glval<unknown>) = 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 :
# 2459| void new_with_destructor(ClassWithDestructor)
# 2459| Block 0
# 2459| v2459_1(void) = EnterFunction :
# 2459| mu2459_2(unknown) = AliasedDefinition :
# 2459| mu2459_3(unknown) = InitializeNonLocal :
# 2459| r2459_4(glval<ClassWithDestructor>) = VariableAddress[a] :
# 2459| mu2459_5(ClassWithDestructor) = InitializeParameter[a] : &:r2459_4
# 2461| r2461_1(glval<ByValueConstructor *>) = VariableAddress[b] :
# 2461| r2461_2(glval<unknown>) = FunctionAddress[operator new] :
# 2461| r2461_3(unsigned long) = Constant[1] :
# 2461| r2461_4(void *) = Call[operator new] : func:r2461_2, 0:r2461_3
# 2461| mu2461_5(unknown) = ^CallSideEffect : ~m?
# 2461| mu2461_6(unknown) = ^InitializeDynamicAllocation : &:r2461_4
# 2461| r2461_7(ByValueConstructor *) = Convert : r2461_4
# 2461| r2461_8(glval<unknown>) = FunctionAddress[ByValueConstructor] :
# 2461| r2461_9(glval<ClassWithDestructor>) = VariableAddress[#temp2461:52] :
# 2461| r2461_10(glval<ClassWithDestructor>) = VariableAddress[a] :
# 2461| r2461_11(ClassWithDestructor) = Load[a] : &:r2461_10, ~m?
# 2461| mu2461_12(ClassWithDestructor) = Store[#temp2461:52] : &:r2461_9, r2461_11
# 2461| r2461_13(ClassWithDestructor) = Load[#temp2461:52] : &:r2461_9, ~m?
# 2461| v2461_14(void) = Call[ByValueConstructor] : func:r2461_8, this:r2461_7, 0:r2461_13
# 2461| mu2461_15(unknown) = ^CallSideEffect : ~m?
# 2461| mu2461_16(ByValueConstructor) = ^IndirectMayWriteSideEffect[-1] : &:r2461_7
# 2461| r2461_17(glval<ClassWithDestructor>) = CopyValue : r2461_9
# 2461| r2461_18(glval<unknown>) = FunctionAddress[~ClassWithDestructor] :
# 2461| v2461_19(void) = Call[~ClassWithDestructor] : func:r2461_18, this:r2461_17
# 2461| mu2461_20(unknown) = ^CallSideEffect : ~m?
# 2461| v2461_21(void) = ^IndirectReadSideEffect[-1] : &:r2461_17, ~m?
# 2461| mu2461_22(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2461_17
# 2461| mu2461_23(ByValueConstructor *) = Store[b] : &:r2461_1, r2461_7
# 2462| v2462_1(void) = NoOp :
# 2459| v2459_6(void) = ReturnVoid :
# 2459| v2459_7(void) = AliasedUse : ~m?
# 2459| v2459_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<unsigned int>) = VariableAddress[a] :
# 2464| r2464_2(glval<B>) = VariableAddress[#temp2464:18] :
# 2464| r2464_3(glval<unknown>) = 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<B>) = Convert : r2464_2
# 2464| r2464_8(glval<unknown>) = 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<unsigned int>) = FieldAddress[a] : r2464_9
# 2464| r2464_13(glval<B>) = CopyValue : r2464_2
# 2464| r2464_14(glval<unknown>) = 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 :
# 2478| void rvalue_conversion_with_destructor::test()
# 2478| Block 0
# 2478| v2478_1(void) = EnterFunction :
# 2478| mu2478_2(unknown) = AliasedDefinition :
# 2478| mu2478_3(unknown) = InitializeNonLocal :
# 2480| r2480_1(glval<unsigned int>) = VariableAddress[a] :
# 2480| r2480_2(glval<B>) = VariableAddress[#temp2480:18] :
# 2480| r2480_3(glval<unknown>) = FunctionAddress[get] :
# 2480| r2480_4(B) = Call[get] : func:r2480_3
# 2480| mu2480_5(unknown) = ^CallSideEffect : ~m?
# 2480| mu2480_6(B) = Store[#temp2480:18] : &:r2480_2, r2480_4
# 2480| r2480_7(glval<B>) = Convert : r2480_2
# 2480| r2480_8(glval<unknown>) = FunctionAddress[operator->] :
# 2480| r2480_9(A *) = Call[operator->] : func:r2480_8, this:r2480_7
# 2480| mu2480_10(unknown) = ^CallSideEffect : ~m?
# 2480| v2480_11(void) = ^IndirectReadSideEffect[-1] : &:r2480_7, ~m?
# 2480| r2480_12(glval<unsigned int>) = FieldAddress[a] : r2480_9
# 2480| r2480_13(glval<B>) = CopyValue : r2480_2
# 2480| r2480_14(glval<unknown>) = FunctionAddress[~B] :
# 2480| v2480_15(void) = Call[~B] : func:r2480_14, this:r2480_13
# 2480| mu2480_16(unknown) = ^CallSideEffect : ~m?
# 2480| v2480_17(void) = ^IndirectReadSideEffect[-1] : &:r2480_13, ~m?
# 2480| mu2480_18(B) = ^IndirectMayWriteSideEffect[-1] : &:r2480_13
# 2480| r2480_19(unsigned int) = Load[?] : &:r2480_12, ~m?
# 2480| mu2480_20(unsigned int) = Store[a] : &:r2480_1, r2480_19
# 2481| v2481_1(void) = NoOp :
# 2478| v2478_4(void) = ReturnVoid :
# 2478| v2478_5(void) = AliasedUse : ~m?
# 2478| v2478_6(void) = ExitFunction :
perf-regression.cpp:
# 6| void Big::Big()