C++: Add additional IR tests for init statements

This commit is contained in:
Jeroen Ketema
2024-02-13 10:44:24 +01:00
parent 8aeb75675a
commit fb072a5156
10 changed files with 876 additions and 0 deletions

View File

@@ -9382,14 +9382,30 @@ ir.cpp:
# 1054| getRightOperand().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
# 1054| Type = [IntType] int
# 1054| ValueCategory = prvalue(load)
# 1059| [CopyAssignmentOperator] vector<ClassWithDestructor>& vector<ClassWithDestructor>::operator=(vector<ClassWithDestructor> const&)
# 1059| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const vector<ClassWithDestructor> &
# 1059| [CopyAssignmentOperator] vector<int>& vector<int>::operator=(vector<int> const&)
# 1059| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const vector<int> &
# 1059| [CopyConstructor] void vector<ClassWithDestructor>::vector(vector<ClassWithDestructor> const&)
# 1059| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const vector<ClassWithDestructor> &
# 1059| [CopyConstructor] void vector<int>::vector(vector<int> const&)
# 1059| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const vector<int> &
# 1060| [CopyAssignmentOperator] vector<ClassWithDestructor>::iterator& vector<ClassWithDestructor>::iterator::operator=(vector<ClassWithDestructor>::iterator const public&)
# 1060| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const iterator &
# 1060| [MoveAssignmentOperator] vector<ClassWithDestructor>::iterator& vector<ClassWithDestructor>::iterator::operator=(vector<ClassWithDestructor>::iterator&&)
# 1060| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [RValueReferenceType] iterator &&
# 1060| [CopyAssignmentOperator] vector<int>::iterator& vector<int>::iterator::operator=(vector<int>::iterator const public&)
# 1060| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
@@ -9398,14 +9414,22 @@ ir.cpp:
# 1060| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [RValueReferenceType] iterator &&
# 1062| [MemberFunction] vector<ClassWithDestructor>::iterator& vector<ClassWithDestructor>::iterator::operator++()
# 1062| <params>:
# 1062| [MemberFunction] vector<T>::iterator& vector<T>::iterator::operator++()
# 1062| <params>:
# 1062| [MemberFunction] vector<int>::iterator& vector<int>::iterator::operator++()
# 1062| <params>:
# 1063| [ConstMemberFunction] ClassWithDestructor& vector<ClassWithDestructor>::iterator::operator*() const
# 1063| <params>:
# 1063| [ConstMemberFunction] T& vector<T>::iterator::operator*() const
# 1063| <params>:
# 1063| [ConstMemberFunction] int& vector<int>::iterator::operator*() const
# 1063| <params>:
# 1065| [ConstMemberFunction] bool vector<ClassWithDestructor>::iterator::operator!=(vector<ClassWithDestructor>::iterator) const
# 1065| <params>:
# 1065| getParameter(0): [Parameter] right
# 1065| Type = [NestedStruct] iterator
# 1065| [ConstMemberFunction] bool vector<T>::iterator::operator!=(vector<T>::iterator) const
# 1065| <params>:
# 1065| getParameter(0): [Parameter] right
@@ -9414,16 +9438,24 @@ ir.cpp:
# 1065| <params>:
# 1065| getParameter(0): [Parameter] right
# 1065| Type = [NestedStruct] iterator
# 1068| [Constructor] void vector<ClassWithDestructor>::vector(ClassWithDestructor)
# 1068| <params>:
# 1068| getParameter(0): [Parameter] (unnamed parameter 0)
# 1068| Type = [Class] ClassWithDestructor
# 1068| [Constructor] void vector<T>::vector(T)
# 1068| <params>:
# 1068| getParameter(0): [Parameter] (unnamed parameter 0)
# 1068| Type = [TemplateParameter] T
# 1069| [Destructor] void vector<T>::~vector()
# 1069| <params>:
# 1070| [ConstMemberFunction] vector<ClassWithDestructor>::iterator vector<ClassWithDestructor>::begin() const
# 1070| <params>:
# 1070| [ConstMemberFunction] vector<T>::iterator vector<T>::begin() const
# 1070| <params>:
# 1070| [ConstMemberFunction] vector<int>::iterator vector<int>::begin() const
# 1070| <params>:
# 1071| [ConstMemberFunction] vector<ClassWithDestructor>::iterator vector<ClassWithDestructor>::end() const
# 1071| <params>:
# 1071| [ConstMemberFunction] vector<T>::iterator vector<T>::end() const
# 1071| <params>:
# 1071| [ConstMemberFunction] vector<int>::iterator vector<int>::end() const
@@ -16163,6 +16195,257 @@ ir.cpp:
# 2122| ValueCategory = prvalue(load)
# 2122| getThen(): [BlockStmt] { ... }
# 2123| getStmt(1): [ReturnStmt] return ...
# 2125| [CopyAssignmentOperator] ClassWithDestructor& ClassWithDestructor::operator=(ClassWithDestructor const&)
# 2125| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const ClassWithDestructor &
# 2125| [CopyConstructor] void ClassWithDestructor::ClassWithDestructor(ClassWithDestructor const&)
# 2125| <params>:
#-----| getParameter(0): [Parameter] (unnamed parameter 0)
#-----| Type = [LValueReferenceType] const ClassWithDestructor &
# 2125| <initializations>:
# 2125| getInitializer(0): [ConstructorFieldInit] constructor init of field x
# 2125| Type = [CharPointerType] char *
# 2125| ValueCategory = prvalue
# 2125| getExpr(): [ReferenceFieldAccess] x
# 2125| Type = [CharPointerType] char *
# 2125| ValueCategory = prvalue(load)
# 2125| getQualifier(): [VariableAccess] (unnamed parameter 0)
# 2125| Type = [LValueReferenceType] const ClassWithDestructor &
# 2125| ValueCategory = prvalue(load)
# 2125| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
# 2125| Type = [SpecifiedType] const ClassWithDestructor
# 2125| ValueCategory = lvalue
# 2125| getEntryPoint(): [BlockStmt] { ... }
# 2125| getStmt(0): [ReturnStmt] return ...
# 2128| [Constructor] void ClassWithDestructor::ClassWithDestructor()
# 2128| <params>:
# 2128| <initializations>:
# 2128| getEntryPoint(): [BlockStmt] { ... }
# 2128| getStmt(0): [ExprStmt] ExprStmt
# 2128| getExpr(): [AssignExpr] ... = ...
# 2128| Type = [CharPointerType] char *
# 2128| ValueCategory = lvalue
# 2128| getLValue(): [ImplicitThisFieldAccess,PointerFieldAccess] x
# 2128| Type = [CharPointerType] char *
# 2128| ValueCategory = lvalue
# 2128| getQualifier(): [ThisExpr] this
# 2128| Type = [PointerType] ClassWithDestructor *
# 2128| ValueCategory = prvalue(load)
# 2128| getRValue(): [NewExpr] new
# 2128| Type = [CharPointerType] char *
# 2128| ValueCategory = prvalue
# 2128| getStmt(1): [ReturnStmt] return ...
# 2129| [Destructor] void ClassWithDestructor::~ClassWithDestructor()
# 2129| <params>:
# 2129| getEntryPoint(): [BlockStmt] { ... }
# 2129| getStmt(0): [ExprStmt] ExprStmt
# 2129| getExpr(): [DeleteExpr] delete
# 2129| Type = [VoidType] void
# 2129| ValueCategory = prvalue
# 2129| getExpr(): [ImplicitThisFieldAccess,PointerFieldAccess] x
# 2129| Type = [CharPointerType] char *
# 2129| ValueCategory = prvalue(load)
# 2129| getQualifier(): [ThisExpr] this
# 2129| Type = [PointerType] ClassWithDestructor *
# 2129| ValueCategory = prvalue(load)
# 2129| getStmt(1): [ReturnStmt] return ...
# 2129| <destructions>:
# 2131| [MemberFunction] void ClassWithDestructor::set_x(char)
# 2131| <params>:
# 2131| getParameter(0): [Parameter] y
# 2131| Type = [PlainCharType] char
# 2131| getEntryPoint(): [BlockStmt] { ... }
# 2131| getStmt(0): [ExprStmt] ExprStmt
# 2131| getExpr(): [AssignExpr] ... = ...
# 2131| Type = [PlainCharType] char
# 2131| ValueCategory = lvalue
# 2131| getLValue(): [PointerDereferenceExpr] * ...
# 2131| Type = [PlainCharType] char
# 2131| ValueCategory = lvalue
# 2131| getOperand(): [ImplicitThisFieldAccess,PointerFieldAccess] x
# 2131| Type = [CharPointerType] char *
# 2131| ValueCategory = prvalue(load)
# 2131| getQualifier(): [ThisExpr] this
# 2131| Type = [PointerType] ClassWithDestructor *
# 2131| ValueCategory = prvalue(load)
# 2131| getRValue(): [VariableAccess] y
# 2131| Type = [PlainCharType] char
# 2131| ValueCategory = prvalue(load)
# 2131| getStmt(1): [ReturnStmt] return ...
# 2134| [GlobalVariable] bool initialization_with_destructor_bool
# 2134| getInitializer(): [Initializer] initializer for initialization_with_destructor_bool
# 2134| getExpr(): [Literal] 1
# 2134| Type = [BoolType] bool
# 2134| Value = [Literal] 1
# 2134| ValueCategory = prvalue
# 2136| [TopLevelFunction] void initialization_with_destructor(bool, char)
# 2136| <params>:
# 2136| getParameter(0): [Parameter] b
# 2136| Type = [BoolType] bool
# 2136| getParameter(1): [Parameter] c
# 2136| Type = [PlainCharType] char
# 2136| getEntryPoint(): [BlockStmt] { ... }
# 2137| getStmt(0): [IfStmt] if (...) ...
# 2137| getInitialization(): [DeclStmt] declaration
# 2137| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
# 2137| Type = [Class] ClassWithDestructor
# 2137| getVariable().getInitializer(): [Initializer] initializer for x
# 2137| getExpr(): [ConstructorCall] call to ClassWithDestructor
# 2137| Type = [VoidType] void
# 2137| ValueCategory = prvalue
# 2137| getCondition(): [VariableAccess] b
# 2137| Type = [BoolType] bool
# 2137| ValueCategory = prvalue(load)
# 2138| getThen(): [ExprStmt] ExprStmt
# 2138| getExpr(): [FunctionCall] call to set_x
# 2138| Type = [VoidType] void
# 2138| ValueCategory = prvalue
# 2138| getQualifier(): [VariableAccess] x
# 2138| Type = [Class] ClassWithDestructor
# 2138| ValueCategory = lvalue
# 2138| getArgument(0): [CharLiteral] 97
# 2138| Type = [PlainCharType] char
# 2138| Value = [CharLiteral] 97
# 2138| ValueCategory = prvalue
# 2138| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
# 2138| Type = [VoidType] void
# 2138| ValueCategory = prvalue
# 2138| getQualifier(): [VariableAccess] x
# 2138| Type = [Class] ClassWithDestructor
# 2138| ValueCategory = lvalue
# 2140| getStmt(1): [ConstexprIfStmt] if constexpr (...) ...
# 2140| getInitialization(): [DeclStmt] declaration
# 2140| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
# 2140| Type = [Class] ClassWithDestructor
# 2140| getVariable().getInitializer(): [Initializer] initializer for x
# 2140| getExpr(): [ConstructorCall] call to ClassWithDestructor
# 2140| Type = [VoidType] void
# 2140| ValueCategory = prvalue
# 2140| getCondition(): [VariableAccess] initialization_with_destructor_bool
# 2140| Type = [BoolType] bool
# 2140| Value = [VariableAccess] 1
# 2140| ValueCategory = prvalue(load)
# 2141| getThen(): [ExprStmt] ExprStmt
# 2141| getExpr(): [FunctionCall] call to set_x
# 2141| Type = [VoidType] void
# 2141| ValueCategory = prvalue
# 2141| getQualifier(): [VariableAccess] x
# 2141| Type = [Class] ClassWithDestructor
# 2141| ValueCategory = lvalue
# 2141| getArgument(0): [CharLiteral] 97
# 2141| Type = [PlainCharType] char
# 2141| Value = [CharLiteral] 97
# 2141| ValueCategory = prvalue
# 2143| getStmt(2): [SwitchStmt] switch (...) ...
# 2143| getInitialization(): [DeclStmt] declaration
# 2143| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
# 2143| Type = [Class] ClassWithDestructor
# 2143| getVariable().getInitializer(): [Initializer] initializer for x
# 2143| getExpr(): [ConstructorCall] call to ClassWithDestructor
# 2143| Type = [VoidType] void
# 2143| ValueCategory = prvalue
# 2143| getExpr(): [VariableAccess] c
# 2143| Type = [PlainCharType] char
# 2143| ValueCategory = prvalue(load)
# 2143| getStmt(): [BlockStmt] { ... }
# 2144| getStmt(0): [SwitchCase] case ...:
# 2144| getExpr(): [CharLiteral] 97
# 2144| Type = [PlainCharType] char
# 2144| Value = [CharLiteral] 97
# 2144| ValueCategory = prvalue
# 2144| getExpr().getFullyConverted(): [CStyleCast] (int)...
# 2144| Conversion = [IntegralConversion] integral conversion
# 2144| Type = [IntType] int
# 2144| Value = [CStyleCast] 97
# 2144| ValueCategory = prvalue
# 2145| getStmt(1): [ExprStmt] ExprStmt
# 2145| getExpr(): [FunctionCall] call to set_x
# 2145| Type = [VoidType] void
# 2145| ValueCategory = prvalue
# 2145| getQualifier(): [VariableAccess] x
# 2145| Type = [Class] ClassWithDestructor
# 2145| ValueCategory = lvalue
# 2145| getArgument(0): [CharLiteral] 97
# 2145| Type = [PlainCharType] char
# 2145| Value = [CharLiteral] 97
# 2145| ValueCategory = prvalue
# 2146| getStmt(2): [BreakStmt] break;
# 2147| getStmt(3): [SwitchCase] default:
# 2148| getStmt(4): [ExprStmt] ExprStmt
# 2148| getExpr(): [FunctionCall] call to set_x
# 2148| Type = [VoidType] void
# 2148| ValueCategory = prvalue
# 2148| getQualifier(): [VariableAccess] x
# 2148| Type = [Class] ClassWithDestructor
# 2148| ValueCategory = lvalue
# 2148| getArgument(0): [CharLiteral] 98
# 2148| Type = [PlainCharType] char
# 2148| Value = [CharLiteral] 98
# 2148| ValueCategory = prvalue
# 2149| getStmt(5): [BreakStmt] break;
# 2150| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
# 2150| Type = [VoidType] void
# 2150| ValueCategory = prvalue
# 2150| getQualifier(): [VariableAccess] x
# 2150| Type = [Class] ClassWithDestructor
# 2150| ValueCategory = lvalue
# 2143| getExpr().getFullyConverted(): [CStyleCast] (int)...
# 2143| Conversion = [IntegralConversion] integral conversion
# 2143| Type = [IntType] int
# 2143| ValueCategory = prvalue
# 2150| getStmt(3): [LabelStmt] label ...:
# 2152| getStmt(4): [DeclStmt] declaration
# 2152| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x
# 2152| Type = [Class] ClassWithDestructor
# 2152| getVariable().getInitializer(): [Initializer] initializer for x
# 2152| getExpr(): [ConstructorCall] call to ClassWithDestructor
# 2152| Type = [VoidType] void
# 2152| ValueCategory = prvalue
# 2153| getStmt(5): [RangeBasedForStmt] for(...:...) ...
# 2153| getChild(0): [DeclStmt] declaration
# 2153| getBeginEndDeclaration(): [DeclStmt] declaration
# 2153| getCondition(): [FunctionCall] call to operator!=
# 2153| Type = [BoolType] bool
# 2153| ValueCategory = prvalue
# 2153| getQualifier(): [VariableAccess] (__begin)
# 2153| Type = [NestedStruct] iterator
# 2153| ValueCategory = lvalue
# 2153| getArgument(0): [VariableAccess] (__end)
# 2153| Type = [NestedStruct] iterator
# 2153| ValueCategory = prvalue(load)
#-----| getQualifier().getFullyConverted(): [CStyleCast] (const iterator)...
#-----| Conversion = [GlvalueConversion] glvalue conversion
#-----| Type = [SpecifiedType] const iterator
#-----| ValueCategory = lvalue
# 2153| getUpdate(): [FunctionCall] call to operator++
# 2153| Type = [LValueReferenceType] iterator &
# 2153| ValueCategory = prvalue
# 2153| getQualifier(): [VariableAccess] (__begin)
# 2153| Type = [NestedStruct] iterator
# 2153| ValueCategory = lvalue
# 2153| getChild(4): [DeclStmt] declaration
# 2154| getStmt(): [ExprStmt] ExprStmt
# 2154| getExpr(): [FunctionCall] call to set_x
# 2154| Type = [VoidType] void
# 2154| ValueCategory = prvalue
# 2154| getQualifier(): [VariableAccess] y
# 2154| Type = [Class] ClassWithDestructor
# 2154| ValueCategory = lvalue
# 2154| getArgument(0): [CharLiteral] 97
# 2154| Type = [PlainCharType] char
# 2154| Value = [CharLiteral] 97
# 2154| ValueCategory = prvalue
# 2153| getUpdate().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
# 2153| Type = [NestedStruct] iterator
# 2153| ValueCategory = lvalue
# 2155| getStmt(6): [ReturnStmt] return ...
# 2155| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
# 2155| Type = [VoidType] void
# 2155| ValueCategory = prvalue
# 2155| getQualifier(): [VariableAccess] x
# 2155| Type = [Class] ClassWithDestructor
# 2155| ValueCategory = lvalue
perf-regression.cpp:
# 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&)
# 4| <params>:

View File

@@ -12473,6 +12473,160 @@ ir.cpp:
# 2121| v2121_6(void) = AliasedUse : ~m2122_8
# 2121| v2121_7(void) = ExitFunction :
# 2125| void ClassWithDestructor::ClassWithDestructor(ClassWithDestructor const&)
# 2125| Block 0
# 2125| v2125_1(void) = EnterFunction :
# 2125| m2125_2(unknown) = AliasedDefinition :
# 2125| m2125_3(unknown) = InitializeNonLocal :
# 2125| m2125_4(unknown) = Chi : total:m2125_2, partial:m2125_3
# 2125| r2125_5(glval<unknown>) = VariableAddress[#this] :
# 2125| m2125_6(glval<ClassWithDestructor>) = InitializeParameter[#this] : &:r2125_5
# 2125| r2125_7(glval<ClassWithDestructor>) = Load[#this] : &:r2125_5, m2125_6
# 2125| m2125_8(ClassWithDestructor) = InitializeIndirection[#this] : &:r2125_7
#-----| r0_1(glval<ClassWithDestructor &>) = VariableAddress[(unnamed parameter 0)] :
#-----| m0_2(ClassWithDestructor &) = InitializeParameter[(unnamed parameter 0)] : &:r0_1
#-----| r0_3(ClassWithDestructor &) = Load[(unnamed parameter 0)] : &:r0_1, m0_2
#-----| m0_4(unknown) = InitializeIndirection[(unnamed parameter 0)] : &:r0_3
# 2125| r2125_9(glval<char *>) = FieldAddress[x] : m2125_6
# 2125| r2125_10(glval<ClassWithDestructor &>) = VariableAddress[(unnamed parameter 0)] :
# 2125| r2125_11(ClassWithDestructor &) = Load[(unnamed parameter 0)] : &:r2125_10, m0_2
# 2125| r2125_12(glval<ClassWithDestructor>) = CopyValue : r2125_11
# 2125| r2125_13(glval<char *>) = FieldAddress[x] : r2125_12
# 2125| r2125_14(char *) = Load[?] : &:r2125_13, ~m0_4
# 2125| m2125_15(char *) = Store[?] : &:r2125_9, r2125_14
# 2125| m2125_16(unknown) = Chi : total:m2125_8, partial:m2125_15
# 2125| v2125_17(void) = NoOp :
# 2125| v2125_18(void) = ReturnIndirection[#this] : &:r2125_7, m2125_16
#-----| v0_5(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, m0_4
# 2125| v2125_19(void) = ReturnVoid :
# 2125| v2125_20(void) = AliasedUse : m2125_3
# 2125| v2125_21(void) = ExitFunction :
# 2128| void ClassWithDestructor::ClassWithDestructor()
# 2128| Block 0
# 2128| v2128_1(void) = EnterFunction :
# 2128| m2128_2(unknown) = AliasedDefinition :
# 2128| m2128_3(unknown) = InitializeNonLocal :
# 2128| m2128_4(unknown) = Chi : total:m2128_2, partial:m2128_3
# 2128| r2128_5(glval<unknown>) = VariableAddress[#this] :
# 2128| m2128_6(glval<ClassWithDestructor>) = InitializeParameter[#this] : &:r2128_5
# 2128| r2128_7(glval<ClassWithDestructor>) = Load[#this] : &:r2128_5, m2128_6
# 2128| m2128_8(ClassWithDestructor) = InitializeIndirection[#this] : &:r2128_7
# 2128| r2128_9(glval<unknown>) = FunctionAddress[operator new] :
# 2128| r2128_10(unsigned long) = Constant[1] :
# 2128| r2128_11(void *) = Call[operator new] : func:r2128_9, 0:r2128_10
# 2128| m2128_12(unknown) = ^CallSideEffect : ~m2128_4
# 2128| m2128_13(unknown) = Chi : total:m2128_4, partial:m2128_12
# 2128| m2128_14(unknown) = ^InitializeDynamicAllocation : &:r2128_11
# 2128| r2128_15(char *) = Convert : r2128_11
# 2128| r2128_16(glval<unknown>) = VariableAddress[#this] :
# 2128| r2128_17(ClassWithDestructor *) = Load[#this] : &:r2128_16, m2128_6
# 2128| r2128_18(glval<char *>) = FieldAddress[x] : r2128_17
# 2128| m2128_19(char *) = Store[?] : &:r2128_18, r2128_15
# 2128| m2128_20(unknown) = Chi : total:m2128_8, partial:m2128_19
# 2128| v2128_21(void) = NoOp :
# 2128| v2128_22(void) = ReturnIndirection[#this] : &:r2128_7, m2128_20
# 2128| v2128_23(void) = ReturnVoid :
# 2128| v2128_24(void) = AliasedUse : ~m2128_13
# 2128| v2128_25(void) = ExitFunction :
# 2129| void ClassWithDestructor::~ClassWithDestructor()
# 2129| Block 0
# 2129| v2129_1(void) = EnterFunction :
# 2129| m2129_2(unknown) = AliasedDefinition :
# 2129| m2129_3(unknown) = InitializeNonLocal :
# 2129| m2129_4(unknown) = Chi : total:m2129_2, partial:m2129_3
# 2129| r2129_5(glval<unknown>) = VariableAddress[#this] :
# 2129| m2129_6(glval<ClassWithDestructor>) = InitializeParameter[#this] : &:r2129_5
# 2129| r2129_7(glval<ClassWithDestructor>) = Load[#this] : &:r2129_5, m2129_6
# 2129| m2129_8(ClassWithDestructor) = InitializeIndirection[#this] : &:r2129_7
# 2129| r2129_9(glval<unknown>) = FunctionAddress[operator delete] :
# 2129| r2129_10(glval<unknown>) = VariableAddress[#this] :
# 2129| r2129_11(ClassWithDestructor *) = Load[#this] : &:r2129_10, m2129_6
# 2129| r2129_12(glval<char *>) = FieldAddress[x] : r2129_11
# 2129| r2129_13(char *) = Load[?] : &:r2129_12, ~m2129_8
# 2129| v2129_14(void) = Call[operator delete] : func:r2129_9, 0:r2129_13
# 2129| m2129_15(unknown) = ^CallSideEffect : ~m2129_4
# 2129| m2129_16(unknown) = Chi : total:m2129_4, partial:m2129_15
# 2129| v2129_17(void) = NoOp :
# 2129| v2129_18(void) = ReturnIndirection[#this] : &:r2129_7, m2129_8
# 2129| v2129_19(void) = ReturnVoid :
# 2129| v2129_20(void) = AliasedUse : ~m2129_16
# 2129| v2129_21(void) = ExitFunction :
# 2131| void ClassWithDestructor::set_x(char)
# 2131| Block 0
# 2131| v2131_1(void) = EnterFunction :
# 2131| m2131_2(unknown) = AliasedDefinition :
# 2131| m2131_3(unknown) = InitializeNonLocal :
# 2131| m2131_4(unknown) = Chi : total:m2131_2, partial:m2131_3
# 2131| r2131_5(glval<unknown>) = VariableAddress[#this] :
# 2131| m2131_6(glval<ClassWithDestructor>) = InitializeParameter[#this] : &:r2131_5
# 2131| r2131_7(glval<ClassWithDestructor>) = Load[#this] : &:r2131_5, m2131_6
# 2131| m2131_8(ClassWithDestructor) = InitializeIndirection[#this] : &:r2131_7
# 2131| r2131_9(glval<char>) = VariableAddress[y] :
# 2131| m2131_10(char) = InitializeParameter[y] : &:r2131_9
# 2131| r2131_11(glval<char>) = VariableAddress[y] :
# 2131| r2131_12(char) = Load[y] : &:r2131_11, m2131_10
# 2131| r2131_13(glval<unknown>) = VariableAddress[#this] :
# 2131| r2131_14(ClassWithDestructor *) = Load[#this] : &:r2131_13, m2131_6
# 2131| r2131_15(glval<char *>) = FieldAddress[x] : r2131_14
# 2131| r2131_16(char *) = Load[?] : &:r2131_15, ~m2131_8
# 2131| r2131_17(glval<char>) = CopyValue : r2131_16
# 2131| m2131_18(char) = Store[?] : &:r2131_17, r2131_12
# 2131| m2131_19(unknown) = Chi : total:m2131_4, partial:m2131_18
# 2131| v2131_20(void) = NoOp :
# 2131| v2131_21(void) = ReturnIndirection[#this] : &:r2131_7, m2131_8
# 2131| v2131_22(void) = ReturnVoid :
# 2131| v2131_23(void) = AliasedUse : ~m2131_19
# 2131| v2131_24(void) = ExitFunction :
# 2134| bool initialization_with_destructor_bool
# 2134| Block 0
# 2134| v2134_1(void) = EnterFunction :
# 2134| m2134_2(unknown) = AliasedDefinition :
# 2134| r2134_3(glval<bool>) = VariableAddress[initialization_with_destructor_bool] :
# 2134| r2134_4(bool) = Constant[1] :
# 2134| m2134_5(bool) = Store[initialization_with_destructor_bool] : &:r2134_3, r2134_4
# 2134| m2134_6(unknown) = Chi : total:m2134_2, partial:m2134_5
# 2134| v2134_7(void) = ReturnVoid :
# 2134| v2134_8(void) = AliasedUse : ~m2134_6
# 2134| v2134_9(void) = ExitFunction :
# 2136| void initialization_with_destructor(bool, char)
# 2136| Block 0
# 2136| v2136_1(void) = EnterFunction :
# 2136| m2136_2(unknown) = AliasedDefinition :
# 2136| m2136_3(unknown) = InitializeNonLocal :
# 2136| m2136_4(unknown) = Chi : total:m2136_2, partial:m2136_3
# 2136| r2136_5(glval<bool>) = VariableAddress[b] :
# 2136| m2136_6(bool) = InitializeParameter[b] : &:r2136_5
# 2136| r2136_7(glval<char>) = VariableAddress[c] :
# 2136| m2136_8(char) = InitializeParameter[c] : &:r2136_7
# 2137| r2137_1(glval<ClassWithDestructor>) = VariableAddress[x] :
# 2137| m2137_2(ClassWithDestructor) = Uninitialized[x] : &:r2137_1
# 2137| r2137_3(glval<unknown>) = FunctionAddress[ClassWithDestructor] :
# 2137| v2137_4(void) = Call[ClassWithDestructor] : func:r2137_3, this:r2137_1
# 2137| m2137_5(unknown) = ^CallSideEffect : ~m2136_4
# 2137| m2137_6(unknown) = Chi : total:m2136_4, partial:m2137_5
# 2137| m2137_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2137_1
# 2137| m2137_8(ClassWithDestructor) = Chi : total:m2137_2, partial:m2137_7
# 2137| r2137_9(glval<bool>) = VariableAddress[b] :
# 2137| r2137_10(bool) = Load[b] : &:r2137_9, m2136_6
# 2137| v2137_11(void) = ConditionalBranch : r2137_10
#-----| True -> Block 1
# 2138| Block 1
# 2138| r2138_1(glval<ClassWithDestructor>) = VariableAddress[x] :
# 2138| r2138_2(glval<unknown>) = FunctionAddress[set_x] :
# 2138| r2138_3(char) = Constant[97] :
# 2138| v2138_4(void) = Call[set_x] : func:r2138_2, this:r2138_1, 0:r2138_3
# 2138| m2138_5(unknown) = ^CallSideEffect : ~m2137_6
# 2138| m2138_6(unknown) = Chi : total:m2137_6, partial:m2138_5
# 2138| v2138_7(void) = ^IndirectReadSideEffect[-1] : &:r2138_1, m2137_8
# 2138| m2138_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2138_1
# 2138| m2138_9(ClassWithDestructor) = Chi : total:m2137_8, partial:m2138_8
perf-regression.cpp:
# 6| void Big::Big()
# 6| Block 0

View File

@@ -6,6 +6,7 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| ir.cpp:2138:9:2138:9 | Chi: x | Instruction 'Chi: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction

View File

@@ -6,6 +6,7 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| ir.cpp:2138:9:2138:9 | Chi: x | Instruction 'Chi: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction

View File

@@ -2122,4 +2122,36 @@ void call_as_child_of_ConditionDeclExpr() {
if(HasOperatorBool b = HasOperatorBool()) {}
}
class ClassWithDestructor {
char *x;
public:
ClassWithDestructor() { x = new char; }
~ClassWithDestructor() { delete x; }
void set_x(char y) { *x = y; }
};
constexpr bool initialization_with_destructor_bool = true;
void initialization_with_destructor(bool b, char c) {
if (ClassWithDestructor x; b)
x.set_x('a');
if constexpr (ClassWithDestructor x; initialization_with_destructor_bool)
x.set_x('a');
switch(ClassWithDestructor x; c) {
case 'a':
x.set_x('a');
break;
default:
x.set_x('b');
break;
}
ClassWithDestructor x;
for(vector<ClassWithDestructor> ys(x); ClassWithDestructor y : ys)
y.set_x('a');
}
// semmle-extractor-options: -std=c++20 --clang

View File

@@ -688,6 +688,8 @@
| file://:0:0:0:0 | Address | &:r0_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 |
| file://:0:0:0:0 | Address | &:r0_1 |
| file://:0:0:0:0 | Address | &:r0_2 |
| file://:0:0:0:0 | Address | &:r0_3 |
| file://:0:0:0:0 | Address | &:r0_3 |
@@ -720,6 +722,8 @@
| file://:0:0:0:0 | Address | &:r0_3 |
| file://:0:0:0:0 | Address | &:r0_3 |
| file://:0:0:0:0 | Address | &:r0_3 |
| file://:0:0:0:0 | Address | &:r0_3 |
| file://:0:0:0:0 | Address | &:r0_3 |
| file://:0:0:0:0 | Address | &:r0_4 |
| file://:0:0:0:0 | Address | &:r0_4 |
| file://:0:0:0:0 | Address | &:r0_5 |
@@ -821,6 +825,7 @@
| file://:0:0:0:0 | Load | m0_2 |
| file://:0:0:0:0 | Load | m0_2 |
| file://:0:0:0:0 | Load | m0_2 |
| file://:0:0:0:0 | Load | m0_2 |
| file://:0:0:0:0 | Load | m0_5 |
| file://:0:0:0:0 | Load | m0_8 |
| file://:0:0:0:0 | Load | m0_11 |
@@ -859,6 +864,7 @@
| file://:0:0:0:0 | SideEffect | m0_4 |
| file://:0:0:0:0 | SideEffect | m0_4 |
| file://:0:0:0:0 | SideEffect | m0_4 |
| file://:0:0:0:0 | SideEffect | m0_4 |
| file://:0:0:0:0 | SideEffect | m0_14 |
| file://:0:0:0:0 | SideEffect | m1080_23 |
| file://:0:0:0:0 | SideEffect | m1080_23 |
@@ -10087,6 +10093,122 @@
| ir.cpp:2122:22:2122:22 | SideEffect | ~m2121_4 |
| ir.cpp:2122:22:2122:22 | Unary | r2122_6 |
| ir.cpp:2122:25:2122:42 | StoreValue | r2122_2 |
| ir.cpp:2125:7:2125:7 | Address | &:r2125_5 |
| ir.cpp:2125:7:2125:7 | Address | &:r2125_5 |
| ir.cpp:2125:7:2125:7 | Address | &:r2125_7 |
| ir.cpp:2125:7:2125:7 | Address | &:r2125_7 |
| ir.cpp:2125:7:2125:7 | Address | &:r2125_9 |
| ir.cpp:2125:7:2125:7 | Address | &:r2125_10 |
| ir.cpp:2125:7:2125:7 | Address | &:r2125_13 |
| ir.cpp:2125:7:2125:7 | ChiPartial | partial:m2125_3 |
| ir.cpp:2125:7:2125:7 | ChiPartial | partial:m2125_15 |
| ir.cpp:2125:7:2125:7 | ChiTotal | total:m2125_2 |
| ir.cpp:2125:7:2125:7 | ChiTotal | total:m2125_8 |
| ir.cpp:2125:7:2125:7 | Load | m0_2 |
| ir.cpp:2125:7:2125:7 | Load | m2125_6 |
| ir.cpp:2125:7:2125:7 | Load | ~m0_4 |
| ir.cpp:2125:7:2125:7 | SideEffect | m2125_3 |
| ir.cpp:2125:7:2125:7 | SideEffect | m2125_16 |
| ir.cpp:2125:7:2125:7 | StoreValue | r2125_14 |
| ir.cpp:2125:7:2125:7 | Unary | m2125_6 |
| ir.cpp:2125:7:2125:7 | Unary | r2125_11 |
| ir.cpp:2125:7:2125:7 | Unary | r2125_12 |
| ir.cpp:2128:5:2128:23 | Address | &:r2128_5 |
| ir.cpp:2128:5:2128:23 | Address | &:r2128_5 |
| ir.cpp:2128:5:2128:23 | Address | &:r2128_7 |
| ir.cpp:2128:5:2128:23 | Address | &:r2128_7 |
| ir.cpp:2128:5:2128:23 | ChiPartial | partial:m2128_3 |
| ir.cpp:2128:5:2128:23 | ChiTotal | total:m2128_2 |
| ir.cpp:2128:5:2128:23 | Load | m2128_6 |
| ir.cpp:2128:5:2128:23 | SideEffect | m2128_20 |
| ir.cpp:2128:5:2128:23 | SideEffect | ~m2128_13 |
| ir.cpp:2128:29:2128:29 | Address | &:r2128_16 |
| ir.cpp:2128:29:2128:29 | Address | &:r2128_18 |
| ir.cpp:2128:29:2128:29 | Load | m2128_6 |
| ir.cpp:2128:29:2128:29 | Unary | r2128_17 |
| ir.cpp:2128:29:2128:40 | ChiPartial | partial:m2128_19 |
| ir.cpp:2128:29:2128:40 | ChiTotal | total:m2128_8 |
| ir.cpp:2128:33:2128:40 | Address | &:r2128_11 |
| ir.cpp:2128:33:2128:40 | Arg(0) | 0:r2128_10 |
| ir.cpp:2128:33:2128:40 | CallTarget | func:r2128_9 |
| ir.cpp:2128:33:2128:40 | ChiPartial | partial:m2128_12 |
| ir.cpp:2128:33:2128:40 | ChiTotal | total:m2128_4 |
| ir.cpp:2128:33:2128:40 | SideEffect | ~m2128_4 |
| ir.cpp:2128:33:2128:40 | StoreValue | r2128_15 |
| ir.cpp:2128:33:2128:40 | Unary | r2128_11 |
| ir.cpp:2129:5:2129:24 | Address | &:r2129_5 |
| ir.cpp:2129:5:2129:24 | Address | &:r2129_5 |
| ir.cpp:2129:5:2129:24 | Address | &:r2129_7 |
| ir.cpp:2129:5:2129:24 | Address | &:r2129_7 |
| ir.cpp:2129:5:2129:24 | ChiPartial | partial:m2129_3 |
| ir.cpp:2129:5:2129:24 | ChiTotal | total:m2129_2 |
| ir.cpp:2129:5:2129:24 | Load | m2129_6 |
| ir.cpp:2129:5:2129:24 | SideEffect | m2129_8 |
| ir.cpp:2129:5:2129:24 | SideEffect | ~m2129_16 |
| ir.cpp:2129:30:2129:37 | CallTarget | func:r2129_9 |
| ir.cpp:2129:30:2129:37 | ChiPartial | partial:m2129_15 |
| ir.cpp:2129:30:2129:37 | ChiTotal | total:m2129_4 |
| ir.cpp:2129:30:2129:37 | SideEffect | ~m2129_4 |
| ir.cpp:2129:37:2129:37 | Address | &:r2129_10 |
| ir.cpp:2129:37:2129:37 | Address | &:r2129_12 |
| ir.cpp:2129:37:2129:37 | Arg(0) | 0:r2129_13 |
| ir.cpp:2129:37:2129:37 | Load | m2129_6 |
| ir.cpp:2129:37:2129:37 | Load | ~m2129_8 |
| ir.cpp:2129:37:2129:37 | Unary | r2129_11 |
| ir.cpp:2131:10:2131:14 | Address | &:r2131_5 |
| ir.cpp:2131:10:2131:14 | Address | &:r2131_5 |
| ir.cpp:2131:10:2131:14 | Address | &:r2131_7 |
| ir.cpp:2131:10:2131:14 | Address | &:r2131_7 |
| ir.cpp:2131:10:2131:14 | ChiPartial | partial:m2131_3 |
| ir.cpp:2131:10:2131:14 | ChiTotal | total:m2131_2 |
| ir.cpp:2131:10:2131:14 | Load | m2131_6 |
| ir.cpp:2131:10:2131:14 | SideEffect | m2131_8 |
| ir.cpp:2131:10:2131:14 | SideEffect | ~m2131_19 |
| ir.cpp:2131:21:2131:21 | Address | &:r2131_9 |
| ir.cpp:2131:26:2131:27 | Address | &:r2131_17 |
| ir.cpp:2131:26:2131:31 | ChiPartial | partial:m2131_18 |
| ir.cpp:2131:26:2131:31 | ChiTotal | total:m2131_4 |
| ir.cpp:2131:27:2131:27 | Address | &:r2131_13 |
| ir.cpp:2131:27:2131:27 | Address | &:r2131_15 |
| ir.cpp:2131:27:2131:27 | Load | m2131_6 |
| ir.cpp:2131:27:2131:27 | Load | ~m2131_8 |
| ir.cpp:2131:27:2131:27 | Unary | r2131_14 |
| ir.cpp:2131:27:2131:27 | Unary | r2131_16 |
| ir.cpp:2131:31:2131:31 | Address | &:r2131_11 |
| ir.cpp:2131:31:2131:31 | Load | m2131_10 |
| ir.cpp:2131:31:2131:31 | StoreValue | r2131_12 |
| ir.cpp:2134:16:2134:50 | Address | &:r2134_3 |
| ir.cpp:2134:16:2134:50 | SideEffect | ~m2134_6 |
| ir.cpp:2134:54:2134:57 | ChiPartial | partial:m2134_5 |
| ir.cpp:2134:54:2134:57 | ChiTotal | total:m2134_2 |
| ir.cpp:2134:54:2134:57 | StoreValue | r2134_4 |
| ir.cpp:2136:6:2136:35 | ChiPartial | partial:m2136_3 |
| ir.cpp:2136:6:2136:35 | ChiTotal | total:m2136_2 |
| ir.cpp:2136:42:2136:42 | Address | &:r2136_5 |
| ir.cpp:2136:50:2136:50 | Address | &:r2136_7 |
| ir.cpp:2137:29:2137:29 | Address | &:r2137_1 |
| ir.cpp:2137:29:2137:29 | Address | &:r2137_1 |
| ir.cpp:2137:29:2137:29 | Arg(this) | this:r2137_1 |
| ir.cpp:2137:29:2137:29 | CallTarget | func:r2137_3 |
| ir.cpp:2137:29:2137:29 | ChiPartial | partial:m2137_5 |
| ir.cpp:2137:29:2137:29 | ChiPartial | partial:m2137_7 |
| ir.cpp:2137:29:2137:29 | ChiTotal | total:m2136_4 |
| ir.cpp:2137:29:2137:29 | ChiTotal | total:m2137_2 |
| ir.cpp:2137:29:2137:29 | SideEffect | ~m2136_4 |
| ir.cpp:2137:32:2137:32 | Address | &:r2137_9 |
| ir.cpp:2137:32:2137:32 | Condition | r2137_10 |
| ir.cpp:2137:32:2137:32 | Load | m2136_6 |
| ir.cpp:2138:9:2138:9 | Address | &:r2138_1 |
| ir.cpp:2138:9:2138:9 | Address | &:r2138_1 |
| ir.cpp:2138:9:2138:9 | Arg(this) | this:r2138_1 |
| ir.cpp:2138:9:2138:9 | ChiPartial | partial:m2138_8 |
| ir.cpp:2138:9:2138:9 | ChiTotal | total:m2137_8 |
| ir.cpp:2138:9:2138:9 | SideEffect | m2137_8 |
| ir.cpp:2138:11:2138:15 | CallTarget | func:r2138_2 |
| ir.cpp:2138:11:2138:15 | ChiPartial | partial:m2138_5 |
| ir.cpp:2138:11:2138:15 | ChiTotal | total:m2137_6 |
| ir.cpp:2138:11:2138:15 | SideEffect | ~m2137_6 |
| ir.cpp:2138:17:2138:19 | Arg(0) | 0:r2138_3 |
| 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

@@ -6,6 +6,10 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| ir.cpp:2138:9:2138:9 | IndirectMayWriteSideEffect: x | Instruction 'IndirectMayWriteSideEffect: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) |
| ir.cpp:2140:39:2140:39 | IndirectMayWriteSideEffect: call to ClassWithDestructor | Instruction 'IndirectMayWriteSideEffect: call to ClassWithDestructor' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) |
| ir.cpp:2140:42:2140:76 | Constant: initialization_with_destructor_bool | Instruction 'Constant: initialization_with_destructor_bool' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) |
| ir.cpp:2141:9:2141:9 | IndirectMayWriteSideEffect: x | Instruction 'IndirectMayWriteSideEffect: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction
@@ -37,4 +41,5 @@ nonUniqueEnclosingIRFunction
fieldAddressOnNonPointer
thisArgumentIsNonPointer
nonUniqueIRVariable
| ir.cpp:2153:68:2153:69 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) |
missingCppType

View File

@@ -11676,6 +11676,282 @@ ir.cpp:
# 2121| v2121_5(void) = AliasedUse : ~m?
# 2121| v2121_6(void) = ExitFunction :
# 2125| void ClassWithDestructor::ClassWithDestructor(ClassWithDestructor const&)
# 2125| Block 0
# 2125| v2125_1(void) = EnterFunction :
# 2125| mu2125_2(unknown) = AliasedDefinition :
# 2125| mu2125_3(unknown) = InitializeNonLocal :
# 2125| r2125_4(glval<unknown>) = VariableAddress[#this] :
# 2125| mu2125_5(glval<ClassWithDestructor>) = InitializeParameter[#this] : &:r2125_4
# 2125| r2125_6(glval<ClassWithDestructor>) = Load[#this] : &:r2125_4, ~m?
# 2125| mu2125_7(ClassWithDestructor) = InitializeIndirection[#this] : &:r2125_6
#-----| r0_1(glval<ClassWithDestructor &>) = VariableAddress[(unnamed parameter 0)] :
#-----| mu0_2(ClassWithDestructor &) = InitializeParameter[(unnamed parameter 0)] : &:r0_1
#-----| r0_3(ClassWithDestructor &) = Load[(unnamed parameter 0)] : &:r0_1, ~m?
#-----| mu0_4(unknown) = InitializeIndirection[(unnamed parameter 0)] : &:r0_3
# 2125| r2125_8(glval<char *>) = FieldAddress[x] : mu2125_5
# 2125| r2125_9(glval<ClassWithDestructor &>) = VariableAddress[(unnamed parameter 0)] :
# 2125| r2125_10(ClassWithDestructor &) = Load[(unnamed parameter 0)] : &:r2125_9, ~m?
# 2125| r2125_11(glval<ClassWithDestructor>) = CopyValue : r2125_10
# 2125| r2125_12(glval<char *>) = FieldAddress[x] : r2125_11
# 2125| r2125_13(char *) = Load[?] : &:r2125_12, ~m?
# 2125| mu2125_14(char *) = Store[?] : &:r2125_8, r2125_13
# 2125| v2125_15(void) = NoOp :
# 2125| v2125_16(void) = ReturnIndirection[#this] : &:r2125_6, ~m?
#-----| v0_5(void) = ReturnIndirection[(unnamed parameter 0)] : &:r0_3, ~m?
# 2125| v2125_17(void) = ReturnVoid :
# 2125| v2125_18(void) = AliasedUse : ~m?
# 2125| v2125_19(void) = ExitFunction :
# 2128| void ClassWithDestructor::ClassWithDestructor()
# 2128| Block 0
# 2128| v2128_1(void) = EnterFunction :
# 2128| mu2128_2(unknown) = AliasedDefinition :
# 2128| mu2128_3(unknown) = InitializeNonLocal :
# 2128| r2128_4(glval<unknown>) = VariableAddress[#this] :
# 2128| mu2128_5(glval<ClassWithDestructor>) = InitializeParameter[#this] : &:r2128_4
# 2128| r2128_6(glval<ClassWithDestructor>) = Load[#this] : &:r2128_4, ~m?
# 2128| mu2128_7(ClassWithDestructor) = InitializeIndirection[#this] : &:r2128_6
# 2128| r2128_8(glval<unknown>) = FunctionAddress[operator new] :
# 2128| r2128_9(unsigned long) = Constant[1] :
# 2128| r2128_10(void *) = Call[operator new] : func:r2128_8, 0:r2128_9
# 2128| mu2128_11(unknown) = ^CallSideEffect : ~m?
# 2128| mu2128_12(unknown) = ^InitializeDynamicAllocation : &:r2128_10
# 2128| r2128_13(char *) = Convert : r2128_10
# 2128| r2128_14(glval<unknown>) = VariableAddress[#this] :
# 2128| r2128_15(ClassWithDestructor *) = Load[#this] : &:r2128_14, ~m?
# 2128| r2128_16(glval<char *>) = FieldAddress[x] : r2128_15
# 2128| mu2128_17(char *) = Store[?] : &:r2128_16, r2128_13
# 2128| v2128_18(void) = NoOp :
# 2128| v2128_19(void) = ReturnIndirection[#this] : &:r2128_6, ~m?
# 2128| v2128_20(void) = ReturnVoid :
# 2128| v2128_21(void) = AliasedUse : ~m?
# 2128| v2128_22(void) = ExitFunction :
# 2129| void ClassWithDestructor::~ClassWithDestructor()
# 2129| Block 0
# 2129| v2129_1(void) = EnterFunction :
# 2129| mu2129_2(unknown) = AliasedDefinition :
# 2129| mu2129_3(unknown) = InitializeNonLocal :
# 2129| r2129_4(glval<unknown>) = VariableAddress[#this] :
# 2129| mu2129_5(glval<ClassWithDestructor>) = InitializeParameter[#this] : &:r2129_4
# 2129| r2129_6(glval<ClassWithDestructor>) = Load[#this] : &:r2129_4, ~m?
# 2129| mu2129_7(ClassWithDestructor) = InitializeIndirection[#this] : &:r2129_6
# 2129| r2129_8(glval<unknown>) = FunctionAddress[operator delete] :
# 2129| r2129_9(glval<unknown>) = VariableAddress[#this] :
# 2129| r2129_10(ClassWithDestructor *) = Load[#this] : &:r2129_9, ~m?
# 2129| r2129_11(glval<char *>) = FieldAddress[x] : r2129_10
# 2129| r2129_12(char *) = Load[?] : &:r2129_11, ~m?
# 2129| v2129_13(void) = Call[operator delete] : func:r2129_8, 0:r2129_12
# 2129| mu2129_14(unknown) = ^CallSideEffect : ~m?
# 2129| v2129_15(void) = NoOp :
# 2129| v2129_16(void) = ReturnIndirection[#this] : &:r2129_6, ~m?
# 2129| v2129_17(void) = ReturnVoid :
# 2129| v2129_18(void) = AliasedUse : ~m?
# 2129| v2129_19(void) = ExitFunction :
# 2131| void ClassWithDestructor::set_x(char)
# 2131| Block 0
# 2131| v2131_1(void) = EnterFunction :
# 2131| mu2131_2(unknown) = AliasedDefinition :
# 2131| mu2131_3(unknown) = InitializeNonLocal :
# 2131| r2131_4(glval<unknown>) = VariableAddress[#this] :
# 2131| mu2131_5(glval<ClassWithDestructor>) = InitializeParameter[#this] : &:r2131_4
# 2131| r2131_6(glval<ClassWithDestructor>) = Load[#this] : &:r2131_4, ~m?
# 2131| mu2131_7(ClassWithDestructor) = InitializeIndirection[#this] : &:r2131_6
# 2131| r2131_8(glval<char>) = VariableAddress[y] :
# 2131| mu2131_9(char) = InitializeParameter[y] : &:r2131_8
# 2131| r2131_10(glval<char>) = VariableAddress[y] :
# 2131| r2131_11(char) = Load[y] : &:r2131_10, ~m?
# 2131| r2131_12(glval<unknown>) = VariableAddress[#this] :
# 2131| r2131_13(ClassWithDestructor *) = Load[#this] : &:r2131_12, ~m?
# 2131| r2131_14(glval<char *>) = FieldAddress[x] : r2131_13
# 2131| r2131_15(char *) = Load[?] : &:r2131_14, ~m?
# 2131| r2131_16(glval<char>) = CopyValue : r2131_15
# 2131| mu2131_17(char) = Store[?] : &:r2131_16, r2131_11
# 2131| v2131_18(void) = NoOp :
# 2131| v2131_19(void) = ReturnIndirection[#this] : &:r2131_6, ~m?
# 2131| v2131_20(void) = ReturnVoid :
# 2131| v2131_21(void) = AliasedUse : ~m?
# 2131| v2131_22(void) = ExitFunction :
# 2134| bool initialization_with_destructor_bool
# 2134| Block 0
# 2134| v2134_1(void) = EnterFunction :
# 2134| mu2134_2(unknown) = AliasedDefinition :
# 2134| r2134_3(glval<bool>) = VariableAddress[initialization_with_destructor_bool] :
# 2134| r2134_4(bool) = Constant[1] :
# 2134| mu2134_5(bool) = Store[initialization_with_destructor_bool] : &:r2134_3, r2134_4
# 2134| v2134_6(void) = ReturnVoid :
# 2134| v2134_7(void) = AliasedUse : ~m?
# 2134| v2134_8(void) = ExitFunction :
# 2136| void initialization_with_destructor(bool, char)
# 2136| Block 0
# 2136| v2136_1(void) = EnterFunction :
# 2136| mu2136_2(unknown) = AliasedDefinition :
# 2136| mu2136_3(unknown) = InitializeNonLocal :
# 2136| r2136_4(glval<bool>) = VariableAddress[b] :
# 2136| mu2136_5(bool) = InitializeParameter[b] : &:r2136_4
# 2136| r2136_6(glval<char>) = VariableAddress[c] :
# 2136| mu2136_7(char) = InitializeParameter[c] : &:r2136_6
# 2137| r2137_1(glval<ClassWithDestructor>) = VariableAddress[x] :
# 2137| mu2137_2(ClassWithDestructor) = Uninitialized[x] : &:r2137_1
# 2137| r2137_3(glval<unknown>) = FunctionAddress[ClassWithDestructor] :
# 2137| v2137_4(void) = Call[ClassWithDestructor] : func:r2137_3, this:r2137_1
# 2137| mu2137_5(unknown) = ^CallSideEffect : ~m?
# 2137| mu2137_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2137_1
# 2137| r2137_7(glval<bool>) = VariableAddress[b] :
# 2137| r2137_8(bool) = Load[b] : &:r2137_7, ~m?
# 2137| v2137_9(void) = ConditionalBranch : r2137_8
#-----| True -> Block 4
# 2140| Block 1
# 2140| r2140_1(bool) = Constant[1] :
# 2140| Block 2
# 2140| r2140_2(glval<ClassWithDestructor>) = VariableAddress[x] :
# 2140| mu2140_3(ClassWithDestructor) = Uninitialized[x] : &:r2140_2
# 2140| r2140_4(glval<unknown>) = FunctionAddress[ClassWithDestructor] :
# 2140| v2140_5(void) = Call[ClassWithDestructor] : func:r2140_4, this:r2140_2
# 2140| mu2140_6(unknown) = ^CallSideEffect : ~m?
# 2140| mu2140_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2140_2
# 2141| Block 3
# 2141| r2141_1(glval<ClassWithDestructor>) = VariableAddress[x] :
# 2141| r2141_2(glval<unknown>) = FunctionAddress[set_x] :
# 2141| r2141_3(char) = Constant[97] :
# 2141| v2141_4(void) = Call[set_x] : func:r2141_2, this:r2141_1, 0:r2141_3
# 2141| mu2141_5(unknown) = ^CallSideEffect : ~m?
# 2141| v2141_6(void) = ^IndirectReadSideEffect[-1] : &:r2141_1, ~m?
# 2141| mu2141_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2141_1
# 2138| Block 4
# 2138| r2138_1(glval<ClassWithDestructor>) = VariableAddress[x] :
# 2138| r2138_2(glval<unknown>) = FunctionAddress[set_x] :
# 2138| r2138_3(char) = Constant[97] :
# 2138| v2138_4(void) = Call[set_x] : func:r2138_2, this:r2138_1, 0:r2138_3
# 2138| mu2138_5(unknown) = ^CallSideEffect : ~m?
# 2138| v2138_6(void) = ^IndirectReadSideEffect[-1] : &:r2138_1, ~m?
# 2138| mu2138_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2138_1
# 2143| Block 5
# 2143| r2143_1(glval<ClassWithDestructor>) = VariableAddress[x] :
# 2143| mu2143_2(ClassWithDestructor) = Uninitialized[x] : &:r2143_1
# 2143| r2143_3(glval<unknown>) = FunctionAddress[ClassWithDestructor] :
# 2143| v2143_4(void) = Call[ClassWithDestructor] : func:r2143_3, this:r2143_1
# 2143| mu2143_5(unknown) = ^CallSideEffect : ~m?
# 2143| mu2143_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2143_1
# 2143| r2143_7(glval<char>) = VariableAddress[c] :
# 2143| r2143_8(char) = Load[c] : &:r2143_7, ~m?
# 2143| r2143_9(int) = Convert : r2143_8
# 2143| v2143_10(void) = Switch : r2143_9
#-----| Case[97] -> Block 6
#-----| Default -> Block 7
# 2144| Block 6
# 2144| v2144_1(void) = NoOp :
# 2145| r2145_1(glval<ClassWithDestructor>) = VariableAddress[x] :
# 2145| r2145_2(glval<unknown>) = FunctionAddress[set_x] :
# 2145| r2145_3(char) = Constant[97] :
# 2145| v2145_4(void) = Call[set_x] : func:r2145_2, this:r2145_1, 0:r2145_3
# 2145| mu2145_5(unknown) = ^CallSideEffect : ~m?
# 2145| v2145_6(void) = ^IndirectReadSideEffect[-1] : &:r2145_1, ~m?
# 2145| mu2145_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2145_1
# 2146| v2146_1(void) = NoOp :
#-----| Goto -> Block 8
# 2147| Block 7
# 2147| v2147_1(void) = NoOp :
# 2148| r2148_1(glval<ClassWithDestructor>) = VariableAddress[x] :
# 2148| r2148_2(glval<unknown>) = FunctionAddress[set_x] :
# 2148| r2148_3(char) = Constant[98] :
# 2148| v2148_4(void) = Call[set_x] : func:r2148_2, this:r2148_1, 0:r2148_3
# 2148| mu2148_5(unknown) = ^CallSideEffect : ~m?
# 2148| v2148_6(void) = ^IndirectReadSideEffect[-1] : &:r2148_1, ~m?
# 2148| mu2148_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2148_1
# 2149| v2149_1(void) = NoOp :
#-----| Goto -> Block 8
# 2150| Block 8
# 2150| v2150_1(void) = NoOp :
# 2152| r2152_1(glval<ClassWithDestructor>) = VariableAddress[x] :
# 2152| mu2152_2(ClassWithDestructor) = Uninitialized[x] : &:r2152_1
# 2152| r2152_3(glval<unknown>) = FunctionAddress[ClassWithDestructor] :
# 2152| v2152_4(void) = Call[ClassWithDestructor] : func:r2152_3, this:r2152_1
# 2152| mu2152_5(unknown) = ^CallSideEffect : ~m?
# 2152| mu2152_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2152_1
# 2153| r2153_1(glval<vector<ClassWithDestructor> &>) = VariableAddress[(__range)] :
# 2153| r2153_2(glval<vector<ClassWithDestructor>>) = VariableAddress :
# 2153| r2153_3(vector<ClassWithDestructor> &) = CopyValue : r2153_2
# 2153| mu2153_4(vector<ClassWithDestructor> &) = Store[(__range)] : &:r2153_1, r2153_3
# 2153| r2153_5(glval<iterator>) = VariableAddress[(__begin)] :
# 2153| r2153_6(glval<vector<ClassWithDestructor> &>) = VariableAddress[(__range)] :
# 2153| r2153_7(vector<ClassWithDestructor> &) = Load[(__range)] : &:r2153_6, ~m?
#-----| r0_1(glval<vector<ClassWithDestructor>>) = CopyValue : r2153_7
#-----| r0_2(glval<vector<ClassWithDestructor>>) = Convert : r0_1
# 2153| r2153_8(glval<unknown>) = FunctionAddress[begin] :
# 2153| r2153_9(iterator) = Call[begin] : func:r2153_8, this:r0_2
# 2153| mu2153_10(unknown) = ^CallSideEffect : ~m?
#-----| v0_3(void) = ^IndirectReadSideEffect[-1] : &:r0_2, ~m?
# 2153| mu2153_11(iterator) = Store[(__begin)] : &:r2153_5, r2153_9
# 2153| r2153_12(glval<iterator>) = VariableAddress[(__end)] :
# 2153| r2153_13(glval<vector<ClassWithDestructor> &>) = VariableAddress[(__range)] :
# 2153| r2153_14(vector<ClassWithDestructor> &) = Load[(__range)] : &:r2153_13, ~m?
#-----| r0_4(glval<vector<ClassWithDestructor>>) = CopyValue : r2153_14
#-----| r0_5(glval<vector<ClassWithDestructor>>) = Convert : r0_4
# 2153| r2153_15(glval<unknown>) = FunctionAddress[end] :
# 2153| r2153_16(iterator) = Call[end] : func:r2153_15, this:r0_5
# 2153| mu2153_17(unknown) = ^CallSideEffect : ~m?
#-----| v0_6(void) = ^IndirectReadSideEffect[-1] : &:r0_5, ~m?
# 2153| mu2153_18(iterator) = Store[(__end)] : &:r2153_12, r2153_16
#-----| Goto -> Block 9
# 2153| Block 9
# 2153| r2153_19(glval<iterator>) = VariableAddress[(__begin)] :
#-----| r0_7(glval<iterator>) = Convert : r2153_19
# 2153| r2153_20(glval<unknown>) = FunctionAddress[operator!=] :
# 2153| r2153_21(glval<iterator>) = VariableAddress[(__end)] :
# 2153| r2153_22(iterator) = Load[(__end)] : &:r2153_21, ~m?
# 2153| r2153_23(bool) = Call[operator!=] : func:r2153_20, this:r0_7, 0:r2153_22
# 2153| mu2153_24(unknown) = ^CallSideEffect : ~m?
#-----| v0_8(void) = ^IndirectReadSideEffect[-1] : &:r0_7, ~m?
# 2153| v2153_25(void) = ConditionalBranch : r2153_23
#-----| False -> Block 11
#-----| True -> Block 10
# 2153| Block 10
# 2153| r2153_26(glval<ClassWithDestructor>) = VariableAddress[y] :
# 2153| r2153_27(glval<iterator>) = VariableAddress[(__begin)] :
#-----| r0_9(glval<iterator>) = Convert : r2153_27
# 2153| r2153_28(glval<unknown>) = FunctionAddress[operator*] :
# 2153| r2153_29(ClassWithDestructor &) = Call[operator*] : func:r2153_28, this:r0_9
# 2153| mu2153_30(unknown) = ^CallSideEffect : ~m?
#-----| v0_10(void) = ^IndirectReadSideEffect[-1] : &:r0_9, ~m?
# 2153| r2153_31(ClassWithDestructor) = Load[?] : &:r2153_29, ~m?
# 2153| mu2153_32(ClassWithDestructor) = Store[y] : &:r2153_26, r2153_31
# 2154| r2154_1(glval<ClassWithDestructor>) = VariableAddress[y] :
# 2154| r2154_2(glval<unknown>) = FunctionAddress[set_x] :
# 2154| r2154_3(char) = Constant[97] :
# 2154| v2154_4(void) = Call[set_x] : func:r2154_2, this:r2154_1, 0:r2154_3
# 2154| mu2154_5(unknown) = ^CallSideEffect : ~m?
# 2154| v2154_6(void) = ^IndirectReadSideEffect[-1] : &:r2154_1, ~m?
# 2154| mu2154_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2154_1
# 2153| r2153_33(glval<iterator>) = VariableAddress[(__begin)] :
# 2153| r2153_34(glval<unknown>) = FunctionAddress[operator++] :
# 2153| r2153_35(iterator &) = Call[operator++] : func:r2153_34, this:r2153_33
# 2153| mu2153_36(unknown) = ^CallSideEffect : ~m?
# 2153| v2153_37(void) = ^IndirectReadSideEffect[-1] : &:r2153_33, ~m?
# 2153| mu2153_38(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2153_33
# 2153| r2153_39(glval<iterator>) = CopyValue : r2153_35
#-----| Goto (back edge) -> Block 9
# 2155| Block 11
# 2155| v2155_1(void) = NoOp :
# 2136| v2136_8(void) = ReturnVoid :
# 2136| v2136_9(void) = AliasedUse : ~m?
# 2136| v2136_10(void) = ExitFunction :
perf-regression.cpp:
# 6| void Big::Big()
# 6| Block 0

View File

@@ -6,6 +6,7 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| ir.cpp:2138:9:2138:9 | IndirectMayWriteSideEffect: x | Instruction 'IndirectMayWriteSideEffect: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction

View File

@@ -6,6 +6,7 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| ir.cpp:2138:9:2138:9 | IndirectMayWriteSideEffect: x | Instruction 'IndirectMayWriteSideEffect: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction