C++: Add testcase with invalid IR from vacuous destructor call.

This commit is contained in:
Mathias Vorreiter Pedersen
2024-02-27 12:53:46 +00:00
parent 4bb725cbf5
commit fbb0ffcadd
10 changed files with 582 additions and 0 deletions

View File

@@ -17160,6 +17160,167 @@ ir.cpp:
# 2190| getExpr(): [ConstructorCall] call to ClassWithDestructor
# 2190| Type = [VoidType] void
# 2190| ValueCategory = prvalue
# 2194| [FunctionTemplateInstantiation,TopLevelFunction] ClassWithDestructor& vacuous_destructor_call::get<ClassWithDestructor>(ClassWithDestructor&)
# 2194| <params>:
# 2194| getParameter(0): [Parameter] t
# 2194| Type = [LValueReferenceType] ClassWithDestructor &
# 2194| getEntryPoint(): [BlockStmt] { ... }
# 2194| getStmt(0): [ReturnStmt] return ...
# 2194| getExpr(): [VariableAccess] t
# 2194| Type = [LValueReferenceType] ClassWithDestructor &
# 2194| ValueCategory = prvalue(load)
# 2194| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to)
# 2194| Type = [LValueReferenceType] ClassWithDestructor &
# 2194| ValueCategory = prvalue
# 2194| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
# 2194| Type = [Class] ClassWithDestructor
# 2194| ValueCategory = lvalue
# 2194| [TemplateFunction,TopLevelFunction] T& vacuous_destructor_call::get<T>(T&)
# 2194| <params>:
# 2194| getParameter(0): [Parameter] t
# 2194| Type = [LValueReferenceType] T &
# 2194| getEntryPoint(): [BlockStmt] { ... }
# 2194| getStmt(0): [ReturnStmt] return ...
# 2194| getExpr(): [VariableAccess] t
# 2194| Type = [LValueReferenceType] T &
# 2194| ValueCategory = prvalue(load)
# 2194| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
# 2194| Type = [TemplateParameter] T
# 2194| ValueCategory = lvalue
# 2194| [FunctionTemplateInstantiation,TopLevelFunction] int& vacuous_destructor_call::get<int>(int&)
# 2194| <params>:
# 2194| getParameter(0): [Parameter] t
# 2194| Type = [LValueReferenceType] int &
# 2194| getEntryPoint(): [BlockStmt] { ... }
# 2194| getStmt(0): [ReturnStmt] return ...
# 2194| getExpr(): [VariableAccess] t
# 2194| Type = [LValueReferenceType] int &
# 2194| ValueCategory = prvalue(load)
# 2194| getExpr().getFullyConverted(): [ReferenceToExpr] (reference to)
# 2194| Type = [LValueReferenceType] int &
# 2194| ValueCategory = prvalue
# 2194| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
# 2194| Type = [IntType] int
# 2194| ValueCategory = lvalue
# 2197| [FunctionTemplateInstantiation,TopLevelFunction] void vacuous_destructor_call::call_destructor<ClassWithDestructor>(ClassWithDestructor&)
# 2197| <params>:
# 2197| getParameter(0): [Parameter] t
# 2197| Type = [LValueReferenceType] ClassWithDestructor &
# 2197| getEntryPoint(): [BlockStmt] { ... }
# 2198| getStmt(0): [ExprStmt] ExprStmt
# 2198| getExpr(): [DestructorCall] call to ~ClassWithDestructor
# 2198| Type = [VoidType] void
# 2198| ValueCategory = prvalue
# 2198| getQualifier(): [FunctionCall] call to get
# 2198| Type = [LValueReferenceType] ClassWithDestructor &
# 2198| ValueCategory = prvalue
# 2198| getArgument(0): [VariableAccess] t
# 2198| Type = [LValueReferenceType] ClassWithDestructor &
# 2198| ValueCategory = prvalue(load)
# 2198| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
# 2198| Type = [LValueReferenceType] ClassWithDestructor &
# 2198| ValueCategory = prvalue
# 2198| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
# 2198| Type = [Class] ClassWithDestructor
# 2198| ValueCategory = lvalue
# 2198| getQualifier().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
# 2198| Type = [Class] ClassWithDestructor
# 2198| ValueCategory = lvalue
# 2199| getStmt(1): [ReturnStmt] return ...
# 2197| [TemplateFunction,TopLevelFunction] void vacuous_destructor_call::call_destructor<T>(T&)
# 2197| <params>:
# 2197| getParameter(0): [Parameter] t
# 2197| Type = [LValueReferenceType] T &
# 2197| getEntryPoint(): [BlockStmt] { ... }
# 2198| getStmt(0): [ExprStmt] ExprStmt
# 2198| getExpr(): [ExprCall] call to expression
# 2198| Type = [UnknownType] unknown
# 2198| ValueCategory = prvalue
# 2198| getExpr(): [Literal] Unknown literal
# 2198| Type = [UnknownType] unknown
# 2198| ValueCategory = prvalue
# 2198| getChild(-1): [ExprCall] call to expression
# 2198| Type = [UnknownType] unknown
# 2198| ValueCategory = prvalue
# 2198| getExpr(): [Literal] Unknown literal
# 2198| Type = [UnknownType] unknown
# 2198| ValueCategory = prvalue
# 2198| getArgument(0): [VariableAccess] t
# 2198| Type = [LValueReferenceType] T &
# 2198| ValueCategory = prvalue(load)
# 2198| getArgument(0).getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
# 2198| Type = [TemplateParameter] T
# 2198| ValueCategory = lvalue
# 2199| getStmt(1): [ReturnStmt] return ...
# 2197| [FunctionTemplateInstantiation,TopLevelFunction] void vacuous_destructor_call::call_destructor<int>(int&)
# 2197| <params>:
# 2197| getParameter(0): [Parameter] t
# 2197| Type = [LValueReferenceType] int &
# 2197| getEntryPoint(): [BlockStmt] { ... }
# 2198| getStmt(0): [ExprStmt] ExprStmt
# 2198| getExpr(): [VacuousDestructorCall] (vacuous destructor call)
# 2198| Type = [VoidType] void
# 2198| ValueCategory = prvalue
# 2198| getChild(0): [FunctionCall] call to get
# 2198| Type = [LValueReferenceType] int &
# 2198| ValueCategory = prvalue
# 2198| getArgument(0): [VariableAccess] t
# 2198| Type = [LValueReferenceType] int &
# 2198| ValueCategory = prvalue(load)
# 2198| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
# 2198| Type = [LValueReferenceType] int &
# 2198| ValueCategory = prvalue
# 2198| getExpr(): [ReferenceDereferenceExpr] (reference dereference)
# 2198| Type = [IntType] int
# 2198| ValueCategory = lvalue
# 2198| getChild(0).getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
# 2198| Type = [IntType] int
# 2198| ValueCategory = lvalue
# 2199| getStmt(1): [ReturnStmt] return ...
# 2201| [TopLevelFunction] void vacuous_destructor_call::non_vacuous_destructor_call()
# 2201| <params>:
# 2201| getEntryPoint(): [BlockStmt] { ... }
# 2202| getStmt(0): [DeclStmt] declaration
# 2202| getDeclarationEntry(0): [VariableDeclarationEntry] definition of c
# 2202| Type = [Class] ClassWithDestructor
# 2202| getVariable().getInitializer(): [Initializer] initializer for c
# 2202| getExpr(): [ConstructorCall] call to ClassWithDestructor
# 2202| Type = [VoidType] void
# 2202| ValueCategory = prvalue
# 2203| getStmt(1): [ExprStmt] ExprStmt
# 2203| getExpr(): [FunctionCall] call to call_destructor
# 2203| Type = [VoidType] void
# 2203| ValueCategory = prvalue
# 2203| getArgument(0): [VariableAccess] c
# 2203| Type = [Class] ClassWithDestructor
# 2203| ValueCategory = lvalue
# 2203| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
# 2203| Type = [LValueReferenceType] ClassWithDestructor &
# 2203| ValueCategory = prvalue
# 2204| getStmt(2): [ReturnStmt] return ...
# 2204| getImplicitDestructorCall(0): [DestructorCall] call to ~ClassWithDestructor
# 2204| Type = [VoidType] void
# 2204| ValueCategory = prvalue
# 2204| getQualifier(): [VariableAccess] c
# 2204| Type = [Class] ClassWithDestructor
# 2204| ValueCategory = lvalue
# 2206| [TopLevelFunction] void vacuous_destructor_call::vacuous_destructor_call()
# 2206| <params>:
# 2206| getEntryPoint(): [BlockStmt] { ... }
# 2207| getStmt(0): [DeclStmt] declaration
# 2207| getDeclarationEntry(0): [VariableDeclarationEntry] definition of i
# 2207| Type = [IntType] int
# 2208| getStmt(1): [ExprStmt] ExprStmt
# 2208| getExpr(): [FunctionCall] call to call_destructor
# 2208| Type = [VoidType] void
# 2208| ValueCategory = prvalue
# 2208| getArgument(0): [VariableAccess] i
# 2208| Type = [IntType] int
# 2208| ValueCategory = lvalue
# 2208| getArgument(0).getFullyConverted(): [ReferenceToExpr] (reference to)
# 2208| Type = [LValueReferenceType] int &
# 2208| ValueCategory = prvalue
# 2209| getStmt(2): [ReturnStmt] return ...
perf-regression.cpp:
# 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&)
# 4| <params>:

View File

@@ -13269,6 +13269,146 @@ ir.cpp:
# 2190| v2190_11(void) = AliasedUse : ~m2190_9
# 2190| v2190_12(void) = ExitFunction :
# 2194| ClassWithDestructor& vacuous_destructor_call::get<ClassWithDestructor>(ClassWithDestructor&)
# 2194| Block 0
# 2194| v2194_1(void) = EnterFunction :
# 2194| m2194_2(unknown) = AliasedDefinition :
# 2194| m2194_3(unknown) = InitializeNonLocal :
# 2194| m2194_4(unknown) = Chi : total:m2194_2, partial:m2194_3
# 2194| r2194_5(glval<ClassWithDestructor &>) = VariableAddress[t] :
# 2194| m2194_6(ClassWithDestructor &) = InitializeParameter[t] : &:r2194_5
# 2194| r2194_7(ClassWithDestructor &) = Load[t] : &:r2194_5, m2194_6
# 2194| m2194_8(unknown) = InitializeIndirection[t] : &:r2194_7
# 2194| r2194_9(glval<ClassWithDestructor &>) = VariableAddress[#return] :
# 2194| r2194_10(glval<ClassWithDestructor &>) = VariableAddress[t] :
# 2194| r2194_11(ClassWithDestructor &) = Load[t] : &:r2194_10, m2194_6
# 2194| r2194_12(glval<ClassWithDestructor>) = CopyValue : r2194_11
# 2194| r2194_13(ClassWithDestructor &) = CopyValue : r2194_12
# 2194| m2194_14(ClassWithDestructor &) = Store[#return] : &:r2194_9, r2194_13
# 2194| v2194_15(void) = ReturnIndirection[t] : &:r2194_7, m2194_8
# 2194| r2194_16(glval<ClassWithDestructor &>) = VariableAddress[#return] :
# 2194| v2194_17(void) = ReturnValue : &:r2194_16, m2194_14
# 2194| v2194_18(void) = AliasedUse : m2194_3
# 2194| v2194_19(void) = ExitFunction :
# 2194| int& vacuous_destructor_call::get<int>(int&)
# 2194| Block 0
# 2194| v2194_1(void) = EnterFunction :
# 2194| m2194_2(unknown) = AliasedDefinition :
# 2194| m2194_3(unknown) = InitializeNonLocal :
# 2194| m2194_4(unknown) = Chi : total:m2194_2, partial:m2194_3
# 2194| r2194_5(glval<int &>) = VariableAddress[t] :
# 2194| m2194_6(int &) = InitializeParameter[t] : &:r2194_5
# 2194| r2194_7(int &) = Load[t] : &:r2194_5, m2194_6
# 2194| m2194_8(unknown) = InitializeIndirection[t] : &:r2194_7
# 2194| r2194_9(glval<int &>) = VariableAddress[#return] :
# 2194| r2194_10(glval<int &>) = VariableAddress[t] :
# 2194| r2194_11(int &) = Load[t] : &:r2194_10, m2194_6
# 2194| r2194_12(glval<int>) = CopyValue : r2194_11
# 2194| r2194_13(int &) = CopyValue : r2194_12
# 2194| m2194_14(int &) = Store[#return] : &:r2194_9, r2194_13
# 2194| v2194_15(void) = ReturnIndirection[t] : &:r2194_7, m2194_8
# 2194| r2194_16(glval<int &>) = VariableAddress[#return] :
# 2194| v2194_17(void) = ReturnValue : &:r2194_16, m2194_14
# 2194| v2194_18(void) = AliasedUse : m2194_3
# 2194| v2194_19(void) = ExitFunction :
# 2197| void vacuous_destructor_call::call_destructor<ClassWithDestructor>(ClassWithDestructor&)
# 2197| Block 0
# 2197| v2197_1(void) = EnterFunction :
# 2197| m2197_2(unknown) = AliasedDefinition :
# 2197| m2197_3(unknown) = InitializeNonLocal :
# 2197| m2197_4(unknown) = Chi : total:m2197_2, partial:m2197_3
# 2197| r2197_5(glval<ClassWithDestructor &>) = VariableAddress[t] :
# 2197| m2197_6(ClassWithDestructor &) = InitializeParameter[t] : &:r2197_5
# 2197| r2197_7(ClassWithDestructor &) = Load[t] : &:r2197_5, m2197_6
# 2197| m2197_8(unknown) = InitializeIndirection[t] : &:r2197_7
# 2198| r2198_1(glval<unknown>) = FunctionAddress[get] :
# 2198| r2198_2(glval<ClassWithDestructor &>) = VariableAddress[t] :
# 2198| r2198_3(ClassWithDestructor &) = Load[t] : &:r2198_2, m2197_6
# 2198| r2198_4(glval<ClassWithDestructor>) = CopyValue : r2198_3
# 2198| r2198_5(ClassWithDestructor &) = CopyValue : r2198_4
# 2198| r2198_6(ClassWithDestructor &) = Call[get] : func:r2198_1, 0:r2198_5
# 2198| m2198_7(unknown) = ^CallSideEffect : ~m2197_4
# 2198| m2198_8(unknown) = Chi : total:m2197_4, partial:m2198_7
# 2198| v2198_9(void) = ^BufferReadSideEffect[0] : &:r2198_5, ~m2197_8
# 2198| m2198_10(unknown) = ^BufferMayWriteSideEffect[0] : &:r2198_5
# 2198| m2198_11(unknown) = Chi : total:m2197_8, partial:m2198_10
# 2198| r2198_12(glval<ClassWithDestructor>) = CopyValue : r2198_6
# 2198| r2198_13(glval<unknown>) = FunctionAddress[~ClassWithDestructor] :
# 2198| v2198_14(void) = Call[~ClassWithDestructor] : func:r2198_13
# 2198| m2198_15(unknown) = ^CallSideEffect : ~m2198_8
# 2198| m2198_16(unknown) = Chi : total:m2198_8, partial:m2198_15
# 2198| v2198_17(void) = ^IndirectReadSideEffect[-1] : &:r2198_12, ~m2198_11
# 2198| m2198_18(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2198_12
# 2198| m2198_19(unknown) = Chi : total:m2198_11, partial:m2198_18
# 2199| v2199_1(void) = NoOp :
# 2197| v2197_9(void) = ReturnIndirection[t] : &:r2197_7, m2198_19
# 2197| v2197_10(void) = ReturnVoid :
# 2197| v2197_11(void) = AliasedUse : ~m2198_16
# 2197| v2197_12(void) = ExitFunction :
# 2197| void vacuous_destructor_call::call_destructor<int>(int&)
# 2197| Block 0
# 2197| v2197_1(void) = EnterFunction :
# 2197| m2197_2(unknown) = AliasedDefinition :
# 2197| m2197_3(unknown) = InitializeNonLocal :
# 2197| m2197_4(unknown) = Chi : total:m2197_2, partial:m2197_3
# 2197| r2197_5(glval<int &>) = VariableAddress[t] :
# 2197| m2197_6(int &) = InitializeParameter[t] : &:r2197_5
# 2197| r2197_7(int &) = Load[t] : &:r2197_5, m2197_6
# 2197| m2197_8(unknown) = InitializeIndirection[t] : &:r2197_7
# 2201| void vacuous_destructor_call::non_vacuous_destructor_call()
# 2201| Block 0
# 2201| v2201_1(void) = EnterFunction :
# 2201| m2201_2(unknown) = AliasedDefinition :
# 2201| m2201_3(unknown) = InitializeNonLocal :
# 2201| m2201_4(unknown) = Chi : total:m2201_2, partial:m2201_3
# 2202| r2202_1(glval<ClassWithDestructor>) = VariableAddress[c] :
# 2202| m2202_2(ClassWithDestructor) = Uninitialized[c] : &:r2202_1
# 2202| r2202_3(glval<unknown>) = FunctionAddress[ClassWithDestructor] :
# 2202| v2202_4(void) = Call[ClassWithDestructor] : func:r2202_3, this:r2202_1
# 2202| m2202_5(unknown) = ^CallSideEffect : ~m2201_4
# 2202| m2202_6(unknown) = Chi : total:m2201_4, partial:m2202_5
# 2202| m2202_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2202_1
# 2202| m2202_8(ClassWithDestructor) = Chi : total:m2202_2, partial:m2202_7
# 2203| r2203_1(glval<unknown>) = FunctionAddress[call_destructor] :
# 2203| r2203_2(glval<ClassWithDestructor>) = VariableAddress[c] :
# 2203| r2203_3(ClassWithDestructor &) = CopyValue : r2203_2
# 2203| v2203_4(void) = Call[call_destructor] : func:r2203_1, 0:r2203_3
# 2203| m2203_5(unknown) = ^CallSideEffect : ~m2202_6
# 2203| m2203_6(unknown) = Chi : total:m2202_6, partial:m2203_5
# 2203| v2203_7(void) = ^BufferReadSideEffect[0] : &:r2203_3, ~m2202_8
# 2203| m2203_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r2203_3
# 2203| m2203_9(ClassWithDestructor) = Chi : total:m2202_8, partial:m2203_8
# 2204| v2204_1(void) = NoOp :
# 2201| v2201_5(void) = ReturnVoid :
# 2201| v2201_6(void) = AliasedUse : ~m2203_6
# 2201| v2201_7(void) = ExitFunction :
# 2206| void vacuous_destructor_call::vacuous_destructor_call()
# 2206| Block 0
# 2206| v2206_1(void) = EnterFunction :
# 2206| m2206_2(unknown) = AliasedDefinition :
# 2206| m2206_3(unknown) = InitializeNonLocal :
# 2206| m2206_4(unknown) = Chi : total:m2206_2, partial:m2206_3
# 2207| r2207_1(glval<int>) = VariableAddress[i] :
# 2207| m2207_2(int) = Uninitialized[i] : &:r2207_1
# 2208| r2208_1(glval<unknown>) = FunctionAddress[call_destructor] :
# 2208| r2208_2(glval<int>) = VariableAddress[i] :
# 2208| r2208_3(int &) = CopyValue : r2208_2
# 2208| v2208_4(void) = Call[call_destructor] : func:r2208_1, 0:r2208_3
# 2208| m2208_5(unknown) = ^CallSideEffect : ~m2206_4
# 2208| m2208_6(unknown) = Chi : total:m2206_4, partial:m2208_5
# 2208| v2208_7(void) = ^BufferReadSideEffect[0] : &:r2208_3, ~m2207_2
# 2208| m2208_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r2208_3
# 2208| m2208_9(int) = Chi : total:m2207_2, partial:m2208_8
# 2209| v2209_1(void) = NoOp :
# 2206| v2206_5(void) = ReturnVoid :
# 2206| v2206_6(void) = AliasedUse : ~m2208_6
# 2206| v2206_7(void) = ExitFunction :
perf-regression.cpp:
# 6| void Big::Big()
# 6| Block 0

View File

@@ -6,6 +6,7 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| ir.cpp:2197:29:2197:29 | InitializeIndirection: t | Instruction 'InitializeIndirection: t' has no successors in function '$@'. | ir.cpp:2197:10:2197:10 | void vacuous_destructor_call::call_destructor<int>(int&) | void vacuous_destructor_call::call_destructor<int>(int&) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction

View File

@@ -6,6 +6,7 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| ir.cpp:2197:29:2197:29 | InitializeIndirection: t | Instruction 'InitializeIndirection: t' has no successors in function '$@'. | ir.cpp:2197:10:2197:10 | void vacuous_destructor_call::call_destructor<int>(int&) | void vacuous_destructor_call::call_destructor<int>(int&) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction

View File

@@ -2189,4 +2189,24 @@ void static_variable_with_destructor_3() {
static ClassWithDestructor global_class_with_destructor;
namespace vacuous_destructor_call {
template<typename T>
T& get(T& t) { return t; }
template<typename T>
void call_destructor(T& t) {
get(t).~T();
}
void non_vacuous_destructor_call() {
ClassWithDestructor c;
call_destructor(c);
}
void vacuous_destructor_call() {
int i;
call_destructor(i);
}
}
// semmle-extractor-options: -std=c++20 --clang

View File

@@ -10796,6 +10796,117 @@
| ir.cpp:2190:28:2190:55 | ChiTotal | total:m2190_7 |
| ir.cpp:2190:28:2190:55 | SideEffect | ~m2190_2 |
| ir.cpp:2190:28:2190:55 | SideEffect | ~m2190_9 |
| ir.cpp:2194:8:2194:8 | Address | &:r2194_16 |
| ir.cpp:2194:8:2194:8 | Address | &:r2194_16 |
| ir.cpp:2194:8:2194:8 | ChiPartial | partial:m2194_3 |
| ir.cpp:2194:8:2194:8 | ChiPartial | partial:m2194_3 |
| ir.cpp:2194:8:2194:8 | ChiTotal | total:m2194_2 |
| ir.cpp:2194:8:2194:8 | ChiTotal | total:m2194_2 |
| ir.cpp:2194:8:2194:8 | Load | m2194_14 |
| ir.cpp:2194:8:2194:8 | Load | m2194_14 |
| ir.cpp:2194:8:2194:8 | SideEffect | m2194_3 |
| ir.cpp:2194:8:2194:8 | SideEffect | m2194_3 |
| ir.cpp:2194:15:2194:15 | Address | &:r2194_5 |
| ir.cpp:2194:15:2194:15 | Address | &:r2194_5 |
| ir.cpp:2194:15:2194:15 | Address | &:r2194_5 |
| ir.cpp:2194:15:2194:15 | Address | &:r2194_5 |
| ir.cpp:2194:15:2194:15 | Address | &:r2194_7 |
| ir.cpp:2194:15:2194:15 | Address | &:r2194_7 |
| ir.cpp:2194:15:2194:15 | Address | &:r2194_7 |
| ir.cpp:2194:15:2194:15 | Address | &:r2194_7 |
| ir.cpp:2194:15:2194:15 | Load | m2194_6 |
| ir.cpp:2194:15:2194:15 | Load | m2194_6 |
| ir.cpp:2194:15:2194:15 | SideEffect | m2194_8 |
| ir.cpp:2194:15:2194:15 | SideEffect | m2194_8 |
| ir.cpp:2194:20:2194:28 | Address | &:r2194_9 |
| ir.cpp:2194:20:2194:28 | Address | &:r2194_9 |
| ir.cpp:2194:27:2194:27 | Address | &:r2194_10 |
| ir.cpp:2194:27:2194:27 | Address | &:r2194_10 |
| ir.cpp:2194:27:2194:27 | Load | m2194_6 |
| ir.cpp:2194:27:2194:27 | Load | m2194_6 |
| ir.cpp:2194:27:2194:27 | StoreValue | r2194_13 |
| ir.cpp:2194:27:2194:27 | StoreValue | r2194_13 |
| ir.cpp:2194:27:2194:27 | Unary | r2194_11 |
| ir.cpp:2194:27:2194:27 | Unary | r2194_11 |
| ir.cpp:2194:27:2194:27 | Unary | r2194_12 |
| ir.cpp:2194:27:2194:27 | Unary | r2194_12 |
| ir.cpp:2197:10:2197:10 | ChiPartial | partial:m2197_3 |
| ir.cpp:2197:10:2197:10 | ChiPartial | partial:m2197_3 |
| ir.cpp:2197:10:2197:10 | ChiTotal | total:m2197_2 |
| ir.cpp:2197:10:2197:10 | ChiTotal | total:m2197_2 |
| ir.cpp:2197:10:2197:10 | SideEffect | ~m2198_16 |
| ir.cpp:2197:29:2197:29 | Address | &:r2197_5 |
| ir.cpp:2197:29:2197:29 | Address | &:r2197_5 |
| ir.cpp:2197:29:2197:29 | Address | &:r2197_5 |
| ir.cpp:2197:29:2197:29 | Address | &:r2197_5 |
| ir.cpp:2197:29:2197:29 | Address | &:r2197_7 |
| ir.cpp:2197:29:2197:29 | Address | &:r2197_7 |
| ir.cpp:2197:29:2197:29 | Address | &:r2197_7 |
| ir.cpp:2197:29:2197:29 | Load | m2197_6 |
| ir.cpp:2197:29:2197:29 | Load | m2197_6 |
| ir.cpp:2197:29:2197:29 | SideEffect | m2198_19 |
| ir.cpp:2198:9:2198:11 | CallTarget | func:r2198_1 |
| ir.cpp:2198:9:2198:11 | ChiPartial | partial:m2198_7 |
| ir.cpp:2198:9:2198:11 | ChiTotal | total:m2197_4 |
| ir.cpp:2198:9:2198:11 | SideEffect | ~m2197_4 |
| ir.cpp:2198:9:2198:11 | Unary | r2198_6 |
| ir.cpp:2198:12:2198:15 | Address | &:r2198_12 |
| ir.cpp:2198:12:2198:15 | Address | &:r2198_12 |
| ir.cpp:2198:12:2198:15 | ChiPartial | partial:m2198_18 |
| ir.cpp:2198:12:2198:15 | ChiTotal | total:m2198_11 |
| ir.cpp:2198:12:2198:15 | SideEffect | ~m2198_11 |
| ir.cpp:2198:13:2198:13 | Address | &:r2198_2 |
| ir.cpp:2198:13:2198:13 | Address | &:r2198_5 |
| ir.cpp:2198:13:2198:13 | Address | &:r2198_5 |
| ir.cpp:2198:13:2198:13 | Arg(0) | 0:r2198_5 |
| ir.cpp:2198:13:2198:13 | ChiPartial | partial:m2198_10 |
| ir.cpp:2198:13:2198:13 | ChiTotal | total:m2197_8 |
| ir.cpp:2198:13:2198:13 | Load | m2197_6 |
| ir.cpp:2198:13:2198:13 | SideEffect | ~m2197_8 |
| ir.cpp:2198:13:2198:13 | Unary | r2198_3 |
| ir.cpp:2198:13:2198:13 | Unary | r2198_4 |
| ir.cpp:2198:16:2198:17 | CallTarget | func:r2198_13 |
| ir.cpp:2198:16:2198:17 | ChiPartial | partial:m2198_15 |
| ir.cpp:2198:16:2198:17 | ChiTotal | total:m2198_8 |
| ir.cpp:2198:16:2198:17 | SideEffect | ~m2198_8 |
| ir.cpp:2201:10:2201:36 | ChiPartial | partial:m2201_3 |
| ir.cpp:2201:10:2201:36 | ChiTotal | total:m2201_2 |
| ir.cpp:2201:10:2201:36 | SideEffect | ~m2203_6 |
| ir.cpp:2202:29:2202:29 | Address | &:r2202_1 |
| ir.cpp:2202:29:2202:29 | Address | &:r2202_1 |
| ir.cpp:2202:29:2202:29 | Arg(this) | this:r2202_1 |
| ir.cpp:2202:29:2202:29 | CallTarget | func:r2202_3 |
| ir.cpp:2202:29:2202:29 | ChiPartial | partial:m2202_5 |
| ir.cpp:2202:29:2202:29 | ChiPartial | partial:m2202_7 |
| ir.cpp:2202:29:2202:29 | ChiTotal | total:m2201_4 |
| ir.cpp:2202:29:2202:29 | ChiTotal | total:m2202_2 |
| ir.cpp:2202:29:2202:29 | SideEffect | ~m2201_4 |
| ir.cpp:2203:9:2203:23 | CallTarget | func:r2203_1 |
| ir.cpp:2203:9:2203:23 | ChiPartial | partial:m2203_5 |
| ir.cpp:2203:9:2203:23 | ChiTotal | total:m2202_6 |
| ir.cpp:2203:9:2203:23 | SideEffect | ~m2202_6 |
| ir.cpp:2203:25:2203:25 | Address | &:r2203_3 |
| ir.cpp:2203:25:2203:25 | Address | &:r2203_3 |
| ir.cpp:2203:25:2203:25 | Arg(0) | 0:r2203_3 |
| ir.cpp:2203:25:2203:25 | ChiPartial | partial:m2203_8 |
| ir.cpp:2203:25:2203:25 | ChiTotal | total:m2202_8 |
| ir.cpp:2203:25:2203:25 | SideEffect | ~m2202_8 |
| ir.cpp:2203:25:2203:25 | Unary | r2203_2 |
| ir.cpp:2206:10:2206:32 | ChiPartial | partial:m2206_3 |
| ir.cpp:2206:10:2206:32 | ChiTotal | total:m2206_2 |
| ir.cpp:2206:10:2206:32 | SideEffect | ~m2208_6 |
| ir.cpp:2207:13:2207:13 | Address | &:r2207_1 |
| ir.cpp:2208:9:2208:23 | CallTarget | func:r2208_1 |
| ir.cpp:2208:9:2208:23 | ChiPartial | partial:m2208_5 |
| ir.cpp:2208:9:2208:23 | ChiTotal | total:m2206_4 |
| ir.cpp:2208:9:2208:23 | SideEffect | ~m2206_4 |
| ir.cpp:2208:25:2208:25 | Address | &:r2208_3 |
| ir.cpp:2208:25:2208:25 | Address | &:r2208_3 |
| ir.cpp:2208:25:2208:25 | Arg(0) | 0:r2208_3 |
| ir.cpp:2208:25:2208:25 | ChiPartial | partial:m2208_8 |
| ir.cpp:2208:25:2208:25 | ChiTotal | total:m2207_2 |
| ir.cpp:2208:25:2208:25 | SideEffect | ~m2207_2 |
| ir.cpp:2208:25:2208:25 | Unary | r2208_2 |
| 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,8 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| ir.cpp:2197:29:2197:29 | InitializeIndirection: t | Instruction 'InitializeIndirection: t' has no successors in function '$@'. | ir.cpp:2197:10:2197:10 | void vacuous_destructor_call::call_destructor<int>(int&) | void vacuous_destructor_call::call_destructor<int>(int&) |
| ir.cpp:2198:12:2198:15 | CopyValue: (reference dereference) | Instruction 'CopyValue: (reference dereference)' has no successors in function '$@'. | ir.cpp:2197:10:2197:10 | void vacuous_destructor_call::call_destructor<int>(int&) | void vacuous_destructor_call::call_destructor<int>(int&) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction
@@ -21,6 +23,7 @@ lostReachability
backEdgeCountMismatch
useNotDominatedByDefinition
| ir.cpp:1488:8:1488:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1488:8:1488:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() |
| ir.cpp:2197:29:2197:29 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:2197:10:2197:10 | void vacuous_destructor_call::call_destructor<int>(int&) | void vacuous_destructor_call::call_destructor<int>(int&) |
| try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() |
| try_except.c:13:13:13:13 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:6:6:6:6 | void f() | void f() |
| try_except.c:39:15:39:15 | Left | Operand 'Left' is not dominated by its definition in function '$@'. | try_except.c:32:6:32:6 | void h(int) | void h(int) |

View File

@@ -12366,6 +12366,149 @@ ir.cpp:
# 2190| v2190_9(void) = AliasedUse : ~m?
# 2190| v2190_10(void) = ExitFunction :
# 2194| ClassWithDestructor& vacuous_destructor_call::get<ClassWithDestructor>(ClassWithDestructor&)
# 2194| Block 0
# 2194| v2194_1(void) = EnterFunction :
# 2194| mu2194_2(unknown) = AliasedDefinition :
# 2194| mu2194_3(unknown) = InitializeNonLocal :
# 2194| r2194_4(glval<ClassWithDestructor &>) = VariableAddress[t] :
# 2194| mu2194_5(ClassWithDestructor &) = InitializeParameter[t] : &:r2194_4
# 2194| r2194_6(ClassWithDestructor &) = Load[t] : &:r2194_4, ~m?
# 2194| mu2194_7(unknown) = InitializeIndirection[t] : &:r2194_6
# 2194| r2194_8(glval<ClassWithDestructor &>) = VariableAddress[#return] :
# 2194| r2194_9(glval<ClassWithDestructor &>) = VariableAddress[t] :
# 2194| r2194_10(ClassWithDestructor &) = Load[t] : &:r2194_9, ~m?
# 2194| r2194_11(glval<ClassWithDestructor>) = CopyValue : r2194_10
# 2194| r2194_12(ClassWithDestructor &) = CopyValue : r2194_11
# 2194| mu2194_13(ClassWithDestructor &) = Store[#return] : &:r2194_8, r2194_12
# 2194| v2194_14(void) = ReturnIndirection[t] : &:r2194_6, ~m?
# 2194| r2194_15(glval<ClassWithDestructor &>) = VariableAddress[#return] :
# 2194| v2194_16(void) = ReturnValue : &:r2194_15, ~m?
# 2194| v2194_17(void) = AliasedUse : ~m?
# 2194| v2194_18(void) = ExitFunction :
# 2194| int& vacuous_destructor_call::get<int>(int&)
# 2194| Block 0
# 2194| v2194_1(void) = EnterFunction :
# 2194| mu2194_2(unknown) = AliasedDefinition :
# 2194| mu2194_3(unknown) = InitializeNonLocal :
# 2194| r2194_4(glval<int &>) = VariableAddress[t] :
# 2194| mu2194_5(int &) = InitializeParameter[t] : &:r2194_4
# 2194| r2194_6(int &) = Load[t] : &:r2194_4, ~m?
# 2194| mu2194_7(unknown) = InitializeIndirection[t] : &:r2194_6
# 2194| r2194_8(glval<int &>) = VariableAddress[#return] :
# 2194| r2194_9(glval<int &>) = VariableAddress[t] :
# 2194| r2194_10(int &) = Load[t] : &:r2194_9, ~m?
# 2194| r2194_11(glval<int>) = CopyValue : r2194_10
# 2194| r2194_12(int &) = CopyValue : r2194_11
# 2194| mu2194_13(int &) = Store[#return] : &:r2194_8, r2194_12
# 2194| v2194_14(void) = ReturnIndirection[t] : &:r2194_6, ~m?
# 2194| r2194_15(glval<int &>) = VariableAddress[#return] :
# 2194| v2194_16(void) = ReturnValue : &:r2194_15, ~m?
# 2194| v2194_17(void) = AliasedUse : ~m?
# 2194| v2194_18(void) = ExitFunction :
# 2197| void vacuous_destructor_call::call_destructor<ClassWithDestructor>(ClassWithDestructor&)
# 2197| Block 0
# 2197| v2197_1(void) = EnterFunction :
# 2197| mu2197_2(unknown) = AliasedDefinition :
# 2197| mu2197_3(unknown) = InitializeNonLocal :
# 2197| r2197_4(glval<ClassWithDestructor &>) = VariableAddress[t] :
# 2197| mu2197_5(ClassWithDestructor &) = InitializeParameter[t] : &:r2197_4
# 2197| r2197_6(ClassWithDestructor &) = Load[t] : &:r2197_4, ~m?
# 2197| mu2197_7(unknown) = InitializeIndirection[t] : &:r2197_6
# 2198| r2198_1(glval<unknown>) = FunctionAddress[get] :
# 2198| r2198_2(glval<ClassWithDestructor &>) = VariableAddress[t] :
# 2198| r2198_3(ClassWithDestructor &) = Load[t] : &:r2198_2, ~m?
# 2198| r2198_4(glval<ClassWithDestructor>) = CopyValue : r2198_3
# 2198| r2198_5(ClassWithDestructor &) = CopyValue : r2198_4
# 2198| r2198_6(ClassWithDestructor &) = Call[get] : func:r2198_1, 0:r2198_5
# 2198| mu2198_7(unknown) = ^CallSideEffect : ~m?
# 2198| v2198_8(void) = ^BufferReadSideEffect[0] : &:r2198_5, ~m?
# 2198| mu2198_9(unknown) = ^BufferMayWriteSideEffect[0] : &:r2198_5
# 2198| r2198_10(glval<ClassWithDestructor>) = CopyValue : r2198_6
# 2198| r2198_11(glval<unknown>) = FunctionAddress[~ClassWithDestructor] :
# 2198| v2198_12(void) = Call[~ClassWithDestructor] : func:r2198_11
# 2198| mu2198_13(unknown) = ^CallSideEffect : ~m?
# 2198| v2198_14(void) = ^IndirectReadSideEffect[-1] : &:r2198_10, ~m?
# 2198| mu2198_15(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2198_10
# 2199| v2199_1(void) = NoOp :
# 2197| v2197_8(void) = ReturnIndirection[t] : &:r2197_6, ~m?
# 2197| v2197_9(void) = ReturnVoid :
# 2197| v2197_10(void) = AliasedUse : ~m?
# 2197| v2197_11(void) = ExitFunction :
# 2197| void vacuous_destructor_call::call_destructor<int>(int&)
# 2197| Block 0
# 2197| v2197_1(void) = EnterFunction :
# 2197| mu2197_2(unknown) = AliasedDefinition :
# 2197| mu2197_3(unknown) = InitializeNonLocal :
# 2197| r2197_4(glval<int &>) = VariableAddress[t] :
# 2197| mu2197_5(int &) = InitializeParameter[t] : &:r2197_4
# 2197| r2197_6(int &) = Load[t] : &:r2197_4, ~m?
# 2197| mu2197_7(unknown) = InitializeIndirection[t] : &:r2197_6
# 2198| Block 1
# 2198| r2198_1(glval<unknown>) = FunctionAddress[get] :
# 2198| r2198_2(glval<int &>) = VariableAddress[t] :
# 2198| r2198_3(int &) = Load[t] : &:r2198_2, ~m?
# 2198| r2198_4(glval<int>) = CopyValue : r2198_3
# 2198| r2198_5(int &) = CopyValue : r2198_4
# 2198| r2198_6(int &) = Call[get] : func:r2198_1, 0:r2198_5
# 2198| mu2198_7(unknown) = ^CallSideEffect : ~m?
# 2198| v2198_8(void) = ^BufferReadSideEffect[0] : &:r2198_5, ~m?
# 2198| mu2198_9(unknown) = ^BufferMayWriteSideEffect[0] : &:r2198_5
# 2198| r2198_10(glval<int>) = CopyValue : r2198_6
# 2199| Block 2
# 2199| v2199_1(void) = NoOp :
# 2197| v2197_8(void) = ReturnIndirection[t] : &:r2197_6, ~m?
# 2197| v2197_9(void) = ReturnVoid :
# 2197| v2197_10(void) = AliasedUse : ~m?
# 2197| v2197_11(void) = ExitFunction :
# 2201| void vacuous_destructor_call::non_vacuous_destructor_call()
# 2201| Block 0
# 2201| v2201_1(void) = EnterFunction :
# 2201| mu2201_2(unknown) = AliasedDefinition :
# 2201| mu2201_3(unknown) = InitializeNonLocal :
# 2202| r2202_1(glval<ClassWithDestructor>) = VariableAddress[c] :
# 2202| mu2202_2(ClassWithDestructor) = Uninitialized[c] : &:r2202_1
# 2202| r2202_3(glval<unknown>) = FunctionAddress[ClassWithDestructor] :
# 2202| v2202_4(void) = Call[ClassWithDestructor] : func:r2202_3, this:r2202_1
# 2202| mu2202_5(unknown) = ^CallSideEffect : ~m?
# 2202| mu2202_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2202_1
# 2203| r2203_1(glval<unknown>) = FunctionAddress[call_destructor] :
# 2203| r2203_2(glval<ClassWithDestructor>) = VariableAddress[c] :
# 2203| r2203_3(ClassWithDestructor &) = CopyValue : r2203_2
# 2203| v2203_4(void) = Call[call_destructor] : func:r2203_1, 0:r2203_3
# 2203| mu2203_5(unknown) = ^CallSideEffect : ~m?
# 2203| v2203_6(void) = ^BufferReadSideEffect[0] : &:r2203_3, ~m?
# 2203| mu2203_7(unknown) = ^BufferMayWriteSideEffect[0] : &:r2203_3
# 2204| v2204_1(void) = NoOp :
# 2201| v2201_4(void) = ReturnVoid :
# 2201| v2201_5(void) = AliasedUse : ~m?
# 2201| v2201_6(void) = ExitFunction :
# 2206| void vacuous_destructor_call::vacuous_destructor_call()
# 2206| Block 0
# 2206| v2206_1(void) = EnterFunction :
# 2206| mu2206_2(unknown) = AliasedDefinition :
# 2206| mu2206_3(unknown) = InitializeNonLocal :
# 2207| r2207_1(glval<int>) = VariableAddress[i] :
# 2207| mu2207_2(int) = Uninitialized[i] : &:r2207_1
# 2208| r2208_1(glval<unknown>) = FunctionAddress[call_destructor] :
# 2208| r2208_2(glval<int>) = VariableAddress[i] :
# 2208| r2208_3(int &) = CopyValue : r2208_2
# 2208| v2208_4(void) = Call[call_destructor] : func:r2208_1, 0:r2208_3
# 2208| mu2208_5(unknown) = ^CallSideEffect : ~m?
# 2208| v2208_6(void) = ^BufferReadSideEffect[0] : &:r2208_3, ~m?
# 2208| mu2208_7(unknown) = ^BufferMayWriteSideEffect[0] : &:r2208_3
# 2209| v2209_1(void) = NoOp :
# 2206| v2206_4(void) = ReturnVoid :
# 2206| v2206_5(void) = AliasedUse : ~m?
# 2206| v2206_6(void) = ExitFunction :
perf-regression.cpp:
# 6| void Big::Big()
# 6| Block 0

View File

@@ -6,6 +6,7 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| ir.cpp:2197:29:2197:29 | InitializeIndirection: t | Instruction 'InitializeIndirection: t' has no successors in function '$@'. | ir.cpp:2197:10:2197:10 | void vacuous_destructor_call::call_destructor<int>(int&) | void vacuous_destructor_call::call_destructor<int>(int&) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction

View File

@@ -6,6 +6,7 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| ir.cpp:2197:29:2197:29 | InitializeIndirection: t | Instruction 'InitializeIndirection: t' has no successors in function '$@'. | ir.cpp:2197:10:2197:10 | void vacuous_destructor_call::call_destructor<int>(int&) | void vacuous_destructor_call::call_destructor<int>(int&) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction