Merge pull request #15612 from jketema/destructors4a

C++: Support `constexpr if` in the IR
This commit is contained in:
Jeroen Ketema
2024-02-15 17:29:56 +01:00
committed by GitHub
10 changed files with 423 additions and 41 deletions

View File

@@ -209,6 +209,8 @@ private predicate usedAsCondition(Expr expr) {
or
exists(IfStmt ifStmt | ifStmt.getCondition().getFullyConverted() = expr)
or
exists(ConstexprIfStmt ifStmt | ifStmt.getCondition().getFullyConverted() = expr)
or
exists(ConditionalExpr condExpr |
// The two-operand form of `ConditionalExpr` treats its condition as a value, since it needs to
// be reused as a value if the condition is true.

View File

@@ -774,6 +774,72 @@ class TranslatedIfStmt extends TranslatedStmt, ConditionContext {
}
}
class TranslatedConstExprIfStmt extends TranslatedStmt, ConditionContext {
override ConstexprIfStmt stmt;
override Instruction getFirstInstruction(EdgeKind kind) {
if this.hasInitialization()
then result = this.getInitialization().getFirstInstruction(kind)
else result = this.getFirstConditionInstruction(kind)
}
override TranslatedElement getChild(int id) {
id = 0 and result = this.getInitialization()
or
id = 1 and result = this.getCondition()
or
id = 2 and result = this.getThen()
or
id = 3 and result = this.getElse()
}
private predicate hasInitialization() { exists(stmt.getInitialization()) }
private TranslatedStmt getInitialization() {
result = getTranslatedStmt(stmt.getInitialization())
}
private TranslatedCondition getCondition() {
result = getTranslatedCondition(stmt.getCondition().getFullyConverted())
}
private Instruction getFirstConditionInstruction(EdgeKind kind) {
result = this.getCondition().getFirstInstruction(kind)
}
private TranslatedStmt getThen() { result = getTranslatedStmt(stmt.getThen()) }
private TranslatedStmt getElse() { result = getTranslatedStmt(stmt.getElse()) }
private predicate hasElse() { exists(stmt.getElse()) }
override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() }
override Instruction getChildTrueSuccessor(TranslatedCondition child, EdgeKind kind) {
child = this.getCondition() and
result = this.getThen().getFirstInstruction(kind)
}
override Instruction getChildFalseSuccessor(TranslatedCondition child, EdgeKind kind) {
child = this.getCondition() and
if this.hasElse()
then result = this.getElse().getFirstInstruction(kind)
else result = this.getParent().getChildSuccessor(this, kind)
}
override Instruction getChildSuccessor(TranslatedElement child, EdgeKind kind) {
child = this.getInitialization() and
result = this.getFirstConditionInstruction(kind)
or
(child = this.getThen() or child = this.getElse()) and
result = this.getParent().getChildSuccessor(this, kind)
}
override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) {
none()
}
}
abstract class TranslatedLoop extends TranslatedStmt, ConditionContext {
override Loop stmt;

View File

@@ -12614,6 +12614,7 @@ ir.cpp:
# 2137| r2137_9(glval<bool>) = VariableAddress[b] :
# 2137| r2137_10(bool) = Load[b] : &:r2137_9, m2136_6
# 2137| v2137_11(void) = ConditionalBranch : r2137_10
#-----| False -> Block 2
#-----| True -> Block 1
# 2138| Block 1
@@ -12626,6 +12627,170 @@ ir.cpp:
# 2138| v2138_7(void) = ^IndirectReadSideEffect[-1] : &:r2138_1, m2137_8
# 2138| m2138_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2138_1
# 2138| m2138_9(ClassWithDestructor) = Chi : total:m2137_8, partial:m2138_8
#-----| Goto -> Block 2
# 2140| Block 2
# 2140| m2140_1(unknown) = Phi : from 0:~m2137_6, from 1:~m2138_6
# 2140| r2140_2(glval<ClassWithDestructor>) = VariableAddress[x] :
# 2140| m2140_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| m2140_6(unknown) = ^CallSideEffect : ~m2140_1
# 2140| m2140_7(unknown) = Chi : total:m2140_1, partial:m2140_6
# 2140| m2140_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2140_2
# 2140| m2140_9(ClassWithDestructor) = Chi : total:m2140_3, partial:m2140_8
# 2140| r2140_10(bool) = Constant[1] :
# 2140| v2140_11(void) = ConditionalBranch : r2140_10
#-----| False -> Block 10
#-----| True -> Block 3
# 2141| Block 3
# 2141| r2141_1(glval<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| m2141_5(unknown) = ^CallSideEffect : ~m2140_7
# 2141| m2141_6(unknown) = Chi : total:m2140_7, partial:m2141_5
# 2141| v2141_7(void) = ^IndirectReadSideEffect[-1] : &:r2141_1, m2140_9
# 2141| m2141_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2141_1
# 2141| m2141_9(ClassWithDestructor) = Chi : total:m2140_9, partial:m2141_8
# 2143| r2143_1(glval<ClassWithDestructor>) = VariableAddress[x] :
# 2143| m2143_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| m2143_5(unknown) = ^CallSideEffect : ~m2141_6
# 2143| m2143_6(unknown) = Chi : total:m2141_6, partial:m2143_5
# 2143| m2143_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2143_1
# 2143| m2143_8(ClassWithDestructor) = Chi : total:m2143_2, partial:m2143_7
# 2143| r2143_9(glval<char>) = VariableAddress[c] :
# 2143| r2143_10(char) = Load[c] : &:r2143_9, m2136_8
# 2143| r2143_11(int) = Convert : r2143_10
# 2143| v2143_12(void) = Switch : r2143_11
#-----| Case[97] -> Block 4
#-----| Default -> Block 5
# 2144| Block 4
# 2144| v2144_1(void) = NoOp :
# 2145| r2145_1(glval<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| m2145_5(unknown) = ^CallSideEffect : ~m2143_6
# 2145| m2145_6(unknown) = Chi : total:m2143_6, partial:m2145_5
# 2145| v2145_7(void) = ^IndirectReadSideEffect[-1] : &:r2145_1, m2143_8
# 2145| m2145_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2145_1
# 2145| m2145_9(ClassWithDestructor) = Chi : total:m2143_8, partial:m2145_8
# 2146| v2146_1(void) = NoOp :
#-----| Goto -> Block 6
# 2147| Block 5
# 2147| v2147_1(void) = NoOp :
# 2148| r2148_1(glval<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| m2148_5(unknown) = ^CallSideEffect : ~m2143_6
# 2148| m2148_6(unknown) = Chi : total:m2143_6, partial:m2148_5
# 2148| v2148_7(void) = ^IndirectReadSideEffect[-1] : &:r2148_1, m2143_8
# 2148| m2148_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2148_1
# 2148| m2148_9(ClassWithDestructor) = Chi : total:m2143_8, partial:m2148_8
# 2149| v2149_1(void) = NoOp :
#-----| Goto -> Block 6
# 2150| Block 6
# 2150| m2150_1(unknown) = Phi : from 4:~m2145_6, from 5:~m2148_6
# 2150| v2150_2(void) = NoOp :
# 2152| r2152_1(glval<ClassWithDestructor>) = VariableAddress[x] :
# 2152| m2152_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| m2152_5(unknown) = ^CallSideEffect : ~m2150_1
# 2152| m2152_6(unknown) = Chi : total:m2150_1, partial:m2152_5
# 2152| m2152_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2152_1
# 2152| m2152_8(ClassWithDestructor) = Chi : total:m2152_2, partial:m2152_7
# 2153| r2153_1(glval<vector<ClassWithDestructor> &>) = VariableAddress[(__range)] :
# 2153| r2153_2(glval<vector<ClassWithDestructor>>) = VariableAddress :
# 2153| r2153_3(vector<ClassWithDestructor> &) = CopyValue : r2153_2
# 2153| m2153_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, m2153_4
#-----| 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| m2153_10(unknown) = ^CallSideEffect : ~m2152_6
# 2153| m2153_11(unknown) = Chi : total:m2152_6, partial:m2153_10
#-----| v0_3(void) = ^IndirectReadSideEffect[-1] : &:r0_2, ~m2153_11
# 2153| m2153_12(iterator) = Store[(__begin)] : &:r2153_5, r2153_9
# 2153| r2153_13(glval<iterator>) = VariableAddress[(__end)] :
# 2153| r2153_14(glval<vector<ClassWithDestructor> &>) = VariableAddress[(__range)] :
# 2153| r2153_15(vector<ClassWithDestructor> &) = Load[(__range)] : &:r2153_14, m2153_4
#-----| r0_4(glval<vector<ClassWithDestructor>>) = CopyValue : r2153_15
#-----| r0_5(glval<vector<ClassWithDestructor>>) = Convert : r0_4
# 2153| r2153_16(glval<unknown>) = FunctionAddress[end] :
# 2153| r2153_17(iterator) = Call[end] : func:r2153_16, this:r0_5
# 2153| m2153_18(unknown) = ^CallSideEffect : ~m2153_11
# 2153| m2153_19(unknown) = Chi : total:m2153_11, partial:m2153_18
#-----| v0_6(void) = ^IndirectReadSideEffect[-1] : &:r0_5, ~m2153_19
# 2153| m2153_20(iterator) = Store[(__end)] : &:r2153_13, r2153_17
#-----| Goto -> Block 7
# 2153| Block 7
# 2153| m2153_21(iterator) = Phi : from 6:m2153_12, from 8:m2153_46
# 2153| m2153_22(unknown) = Phi : from 6:~m2153_19, from 8:~m2153_43
# 2153| r2153_23(glval<iterator>) = VariableAddress[(__begin)] :
#-----| r0_7(glval<iterator>) = Convert : r2153_23
# 2153| r2153_24(glval<unknown>) = FunctionAddress[operator!=] :
# 2153| r2153_25(glval<iterator>) = VariableAddress[(__end)] :
# 2153| r2153_26(iterator) = Load[(__end)] : &:r2153_25, m2153_20
# 2153| r2153_27(bool) = Call[operator!=] : func:r2153_24, this:r0_7, 0:r2153_26
# 2153| m2153_28(unknown) = ^CallSideEffect : ~m2153_22
# 2153| m2153_29(unknown) = Chi : total:m2153_22, partial:m2153_28
#-----| v0_8(void) = ^IndirectReadSideEffect[-1] : &:r0_7, m2153_21
# 2153| v2153_30(void) = ConditionalBranch : r2153_27
#-----| False -> Block 9
#-----| True -> Block 8
# 2153| Block 8
# 2153| r2153_31(glval<ClassWithDestructor>) = VariableAddress[y] :
# 2153| r2153_32(glval<iterator>) = VariableAddress[(__begin)] :
#-----| r0_9(glval<iterator>) = Convert : r2153_32
# 2153| r2153_33(glval<unknown>) = FunctionAddress[operator*] :
# 2153| r2153_34(ClassWithDestructor &) = Call[operator*] : func:r2153_33, this:r0_9
# 2153| m2153_35(unknown) = ^CallSideEffect : ~m2153_29
# 2153| m2153_36(unknown) = Chi : total:m2153_29, partial:m2153_35
#-----| v0_10(void) = ^IndirectReadSideEffect[-1] : &:r0_9, m2153_21
# 2153| r2153_37(ClassWithDestructor) = Load[?] : &:r2153_34, ~m2153_36
# 2153| m2153_38(ClassWithDestructor) = Store[y] : &:r2153_31, r2153_37
# 2154| r2154_1(glval<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| m2154_5(unknown) = ^CallSideEffect : ~m2153_36
# 2154| m2154_6(unknown) = Chi : total:m2153_36, partial:m2154_5
# 2154| v2154_7(void) = ^IndirectReadSideEffect[-1] : &:r2154_1, m2153_38
# 2154| m2154_8(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2154_1
# 2154| m2154_9(ClassWithDestructor) = Chi : total:m2153_38, partial:m2154_8
# 2153| r2153_39(glval<iterator>) = VariableAddress[(__begin)] :
# 2153| r2153_40(glval<unknown>) = FunctionAddress[operator++] :
# 2153| r2153_41(iterator &) = Call[operator++] : func:r2153_40, this:r2153_39
# 2153| m2153_42(unknown) = ^CallSideEffect : ~m2154_6
# 2153| m2153_43(unknown) = Chi : total:m2154_6, partial:m2153_42
# 2153| v2153_44(void) = ^IndirectReadSideEffect[-1] : &:r2153_39, m2153_21
# 2153| m2153_45(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2153_39
# 2153| m2153_46(iterator) = Chi : total:m2153_21, partial:m2153_45
# 2153| r2153_47(glval<iterator>) = CopyValue : r2153_41
#-----| Goto (back edge) -> Block 7
# 2155| Block 9
# 2155| v2155_1(void) = NoOp :
# 2136| v2136_9(void) = ReturnVoid :
# 2136| v2136_10(void) = AliasedUse : ~m2153_29
# 2136| v2136_11(void) = ExitFunction :
# 2136| Block 10
# 2136| v2136_12(void) = Unreached :
perf-regression.cpp:
# 6| void Big::Big()

View File

@@ -6,7 +6,6 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| ir.cpp:2138:9:2138:9 | Chi: x | Instruction 'Chi: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction
@@ -29,4 +28,5 @@ nonUniqueEnclosingIRFunction
fieldAddressOnNonPointer
thisArgumentIsNonPointer
nonUniqueIRVariable
| ir.cpp:2153:68:2153:69 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) |
missingCppType

View File

@@ -6,7 +6,6 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| ir.cpp:2138:9:2138:9 | Chi: x | Instruction 'Chi: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction
@@ -29,4 +28,5 @@ nonUniqueEnclosingIRFunction
fieldAddressOnNonPointer
thisArgumentIsNonPointer
nonUniqueIRVariable
| ir.cpp:2153:68:2153:69 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) |
missingCppType

View File

@@ -691,6 +691,7 @@
| file://:0:0:0:0 | Address | &:r0_1 |
| file://:0:0:0:0 | Address | &:r0_1 |
| file://:0:0:0:0 | Address | &:r0_2 |
| file://:0:0:0:0 | Address | &:r0_2 |
| file://:0:0:0:0 | Address | &:r0_3 |
| file://:0:0:0:0 | Address | &:r0_3 |
| file://:0:0:0:0 | Address | &:r0_3 |
@@ -736,12 +737,14 @@
| file://:0:0:0:0 | Address | &:r0_5 |
| file://:0:0:0:0 | Address | &:r0_5 |
| file://:0:0:0:0 | Address | &:r0_5 |
| file://:0:0:0:0 | Address | &:r0_5 |
| file://:0:0:0:0 | Address | &:r0_6 |
| file://:0:0:0:0 | Address | &:r0_6 |
| file://:0:0:0:0 | Address | &:r0_7 |
| file://:0:0:0:0 | Address | &:r0_7 |
| file://:0:0:0:0 | Address | &:r0_7 |
| file://:0:0:0:0 | Address | &:r0_7 |
| file://:0:0:0:0 | Address | &:r0_7 |
| file://:0:0:0:0 | Address | &:r0_8 |
| file://:0:0:0:0 | Address | &:r0_8 |
| file://:0:0:0:0 | Address | &:r0_8 |
@@ -751,6 +754,7 @@
| file://:0:0:0:0 | Address | &:r0_8 |
| file://:0:0:0:0 | Address | &:r0_9 |
| file://:0:0:0:0 | Address | &:r0_9 |
| file://:0:0:0:0 | Address | &:r0_9 |
| file://:0:0:0:0 | Address | &:r0_10 |
| file://:0:0:0:0 | Address | &:r0_10 |
| file://:0:0:0:0 | Address | &:r0_10 |
@@ -870,6 +874,8 @@
| file://:0:0:0:0 | SideEffect | m1080_23 |
| file://:0:0:0:0 | SideEffect | m1086_23 |
| file://:0:0:0:0 | SideEffect | m1086_23 |
| file://:0:0:0:0 | SideEffect | m2153_21 |
| file://:0:0:0:0 | SideEffect | m2153_21 |
| file://:0:0:0:0 | SideEffect | ~m0_4 |
| file://:0:0:0:0 | SideEffect | ~m0_4 |
| file://:0:0:0:0 | SideEffect | ~m0_4 |
@@ -886,6 +892,8 @@
| file://:0:0:0:0 | SideEffect | ~m1242_4 |
| file://:0:0:0:0 | SideEffect | ~m1449_6 |
| file://:0:0:0:0 | SideEffect | ~m1841_8 |
| file://:0:0:0:0 | SideEffect | ~m2153_11 |
| file://:0:0:0:0 | SideEffect | ~m2153_19 |
| file://:0:0:0:0 | StoreValue | r0_1 |
| file://:0:0:0:0 | StoreValue | r0_1 |
| file://:0:0:0:0 | StoreValue | r0_1 |
@@ -915,8 +923,10 @@
| file://:0:0:0:0 | StoreValue | r0_22 |
| file://:0:0:0:0 | Unary | r0_1 |
| file://:0:0:0:0 | Unary | r0_1 |
| file://:0:0:0:0 | Unary | r0_1 |
| file://:0:0:0:0 | Unary | r0_2 |
| file://:0:0:0:0 | Unary | r0_3 |
| file://:0:0:0:0 | Unary | r0_4 |
| file://:0:0:0:0 | Unary | r0_5 |
| file://:0:0:0:0 | Unary | r0_5 |
| file://:0:0:0:0 | Unary | r0_6 |
@@ -10184,6 +10194,7 @@
| ir.cpp:2134:54:2134:57 | StoreValue | r2134_4 |
| ir.cpp:2136:6:2136:35 | ChiPartial | partial:m2136_3 |
| ir.cpp:2136:6:2136:35 | ChiTotal | total:m2136_2 |
| ir.cpp:2136:6:2136:35 | SideEffect | ~m2153_29 |
| ir.cpp:2136:42:2136:42 | Address | &:r2136_5 |
| ir.cpp:2136:50:2136:50 | Address | &:r2136_7 |
| ir.cpp:2137:29:2137:29 | Address | &:r2137_1 |
@@ -10209,6 +10220,144 @@
| ir.cpp:2138:11:2138:15 | ChiTotal | total:m2137_6 |
| ir.cpp:2138:11:2138:15 | SideEffect | ~m2137_6 |
| ir.cpp:2138:17:2138:19 | Arg(0) | 0:r2138_3 |
| ir.cpp:2140:39:2140:39 | Address | &:r2140_2 |
| ir.cpp:2140:39:2140:39 | Address | &:r2140_2 |
| ir.cpp:2140:39:2140:39 | Arg(this) | this:r2140_2 |
| ir.cpp:2140:39:2140:39 | CallTarget | func:r2140_4 |
| ir.cpp:2140:39:2140:39 | ChiPartial | partial:m2140_6 |
| ir.cpp:2140:39:2140:39 | ChiPartial | partial:m2140_8 |
| ir.cpp:2140:39:2140:39 | ChiTotal | total:m2140_1 |
| ir.cpp:2140:39:2140:39 | ChiTotal | total:m2140_3 |
| ir.cpp:2140:39:2140:39 | Phi | from 0:~m2137_6 |
| ir.cpp:2140:39:2140:39 | Phi | from 1:~m2138_6 |
| ir.cpp:2140:39:2140:39 | SideEffect | ~m2140_1 |
| ir.cpp:2140:42:2140:76 | Condition | r2140_10 |
| ir.cpp:2141:9:2141:9 | Address | &:r2141_1 |
| ir.cpp:2141:9:2141:9 | Address | &:r2141_1 |
| ir.cpp:2141:9:2141:9 | Arg(this) | this:r2141_1 |
| ir.cpp:2141:9:2141:9 | ChiPartial | partial:m2141_8 |
| ir.cpp:2141:9:2141:9 | ChiTotal | total:m2140_9 |
| ir.cpp:2141:9:2141:9 | SideEffect | m2140_9 |
| ir.cpp:2141:11:2141:15 | CallTarget | func:r2141_2 |
| ir.cpp:2141:11:2141:15 | ChiPartial | partial:m2141_5 |
| ir.cpp:2141:11:2141:15 | ChiTotal | total:m2140_7 |
| ir.cpp:2141:11:2141:15 | SideEffect | ~m2140_7 |
| ir.cpp:2141:17:2141:19 | Arg(0) | 0:r2141_3 |
| ir.cpp:2143:32:2143:32 | Address | &:r2143_1 |
| ir.cpp:2143:32:2143:32 | Address | &:r2143_1 |
| ir.cpp:2143:32:2143:32 | Arg(this) | this:r2143_1 |
| ir.cpp:2143:32:2143:32 | CallTarget | func:r2143_3 |
| ir.cpp:2143:32:2143:32 | ChiPartial | partial:m2143_5 |
| ir.cpp:2143:32:2143:32 | ChiPartial | partial:m2143_7 |
| ir.cpp:2143:32:2143:32 | ChiTotal | total:m2141_6 |
| ir.cpp:2143:32:2143:32 | ChiTotal | total:m2143_2 |
| ir.cpp:2143:32:2143:32 | SideEffect | ~m2141_6 |
| ir.cpp:2143:35:2143:35 | Address | &:r2143_9 |
| ir.cpp:2143:35:2143:35 | Condition | r2143_11 |
| ir.cpp:2143:35:2143:35 | Load | m2136_8 |
| ir.cpp:2143:35:2143:35 | Unary | r2143_10 |
| ir.cpp:2145:11:2145:11 | Address | &:r2145_1 |
| ir.cpp:2145:11:2145:11 | Address | &:r2145_1 |
| ir.cpp:2145:11:2145:11 | Arg(this) | this:r2145_1 |
| ir.cpp:2145:11:2145:11 | ChiPartial | partial:m2145_8 |
| ir.cpp:2145:11:2145:11 | ChiTotal | total:m2143_8 |
| ir.cpp:2145:11:2145:11 | SideEffect | m2143_8 |
| ir.cpp:2145:13:2145:17 | CallTarget | func:r2145_2 |
| ir.cpp:2145:13:2145:17 | ChiPartial | partial:m2145_5 |
| ir.cpp:2145:13:2145:17 | ChiTotal | total:m2143_6 |
| ir.cpp:2145:13:2145:17 | SideEffect | ~m2143_6 |
| ir.cpp:2145:19:2145:21 | Arg(0) | 0:r2145_3 |
| ir.cpp:2148:11:2148:11 | Address | &:r2148_1 |
| ir.cpp:2148:11:2148:11 | Address | &:r2148_1 |
| ir.cpp:2148:11:2148:11 | Arg(this) | this:r2148_1 |
| ir.cpp:2148:11:2148:11 | ChiPartial | partial:m2148_8 |
| ir.cpp:2148:11:2148:11 | ChiTotal | total:m2143_8 |
| ir.cpp:2148:11:2148:11 | SideEffect | m2143_8 |
| ir.cpp:2148:13:2148:17 | CallTarget | func:r2148_2 |
| ir.cpp:2148:13:2148:17 | ChiPartial | partial:m2148_5 |
| ir.cpp:2148:13:2148:17 | ChiTotal | total:m2143_6 |
| ir.cpp:2148:13:2148:17 | SideEffect | ~m2143_6 |
| ir.cpp:2148:19:2148:21 | Arg(0) | 0:r2148_3 |
| ir.cpp:2150:5:2150:5 | Phi | from 4:~m2145_6 |
| ir.cpp:2150:5:2150:5 | Phi | from 5:~m2148_6 |
| ir.cpp:2152:25:2152:25 | Address | &:r2152_1 |
| ir.cpp:2152:25:2152:25 | Address | &:r2152_1 |
| ir.cpp:2152:25:2152:25 | Arg(this) | this:r2152_1 |
| ir.cpp:2152:25:2152:25 | CallTarget | func:r2152_3 |
| ir.cpp:2152:25:2152:25 | ChiPartial | partial:m2152_5 |
| ir.cpp:2152:25:2152:25 | ChiPartial | partial:m2152_7 |
| ir.cpp:2152:25:2152:25 | ChiTotal | total:m2150_1 |
| ir.cpp:2152:25:2152:25 | ChiTotal | total:m2152_2 |
| ir.cpp:2152:25:2152:25 | SideEffect | ~m2150_1 |
| ir.cpp:2153:5:2153:5 | Address | &:r2153_1 |
| ir.cpp:2153:5:2153:5 | Address | &:r2153_5 |
| ir.cpp:2153:5:2153:5 | Address | &:r2153_13 |
| ir.cpp:2153:64:2153:64 | Address | &:r2153_31 |
| ir.cpp:2153:68:2153:68 | Address | &:r2153_6 |
| ir.cpp:2153:68:2153:68 | Address | &:r2153_14 |
| ir.cpp:2153:68:2153:68 | Address | &:r2153_25 |
| ir.cpp:2153:68:2153:68 | Address | &:r2153_34 |
| ir.cpp:2153:68:2153:68 | Address | &:r2153_39 |
| ir.cpp:2153:68:2153:68 | Address | &:r2153_39 |
| ir.cpp:2153:68:2153:68 | Arg(0) | 0:r2153_26 |
| ir.cpp:2153:68:2153:68 | Arg(this) | this:r0_2 |
| ir.cpp:2153:68:2153:68 | Arg(this) | this:r0_5 |
| ir.cpp:2153:68:2153:68 | Arg(this) | this:r0_7 |
| ir.cpp:2153:68:2153:68 | Arg(this) | this:r0_9 |
| ir.cpp:2153:68:2153:68 | Arg(this) | this:r2153_39 |
| ir.cpp:2153:68:2153:68 | CallTarget | func:r2153_8 |
| ir.cpp:2153:68:2153:68 | CallTarget | func:r2153_16 |
| ir.cpp:2153:68:2153:68 | CallTarget | func:r2153_24 |
| ir.cpp:2153:68:2153:68 | CallTarget | func:r2153_33 |
| ir.cpp:2153:68:2153:68 | CallTarget | func:r2153_40 |
| ir.cpp:2153:68:2153:68 | ChiPartial | partial:m2153_10 |
| ir.cpp:2153:68:2153:68 | ChiPartial | partial:m2153_18 |
| ir.cpp:2153:68:2153:68 | ChiPartial | partial:m2153_28 |
| ir.cpp:2153:68:2153:68 | ChiPartial | partial:m2153_35 |
| ir.cpp:2153:68:2153:68 | ChiPartial | partial:m2153_42 |
| ir.cpp:2153:68:2153:68 | ChiPartial | partial:m2153_45 |
| ir.cpp:2153:68:2153:68 | ChiTotal | total:m2152_6 |
| ir.cpp:2153:68:2153:68 | ChiTotal | total:m2153_11 |
| ir.cpp:2153:68:2153:68 | ChiTotal | total:m2153_21 |
| ir.cpp:2153:68:2153:68 | ChiTotal | total:m2153_22 |
| ir.cpp:2153:68:2153:68 | ChiTotal | total:m2153_29 |
| ir.cpp:2153:68:2153:68 | ChiTotal | total:m2154_6 |
| ir.cpp:2153:68:2153:68 | Condition | r2153_27 |
| ir.cpp:2153:68:2153:68 | Load | m2153_4 |
| ir.cpp:2153:68:2153:68 | Load | m2153_4 |
| ir.cpp:2153:68:2153:68 | Load | m2153_20 |
| ir.cpp:2153:68:2153:68 | Phi | from 6:m2153_12 |
| ir.cpp:2153:68:2153:68 | Phi | from 6:~m2153_19 |
| ir.cpp:2153:68:2153:68 | Phi | from 8:m2153_46 |
| ir.cpp:2153:68:2153:68 | Phi | from 8:~m2153_43 |
| ir.cpp:2153:68:2153:68 | SideEffect | m2153_21 |
| ir.cpp:2153:68:2153:68 | SideEffect | ~m2152_6 |
| ir.cpp:2153:68:2153:68 | SideEffect | ~m2153_11 |
| ir.cpp:2153:68:2153:68 | SideEffect | ~m2153_22 |
| ir.cpp:2153:68:2153:68 | SideEffect | ~m2153_29 |
| ir.cpp:2153:68:2153:68 | SideEffect | ~m2154_6 |
| ir.cpp:2153:68:2153:68 | StoreValue | r2153_9 |
| ir.cpp:2153:68:2153:68 | StoreValue | r2153_17 |
| ir.cpp:2153:68:2153:68 | Unary | r2153_7 |
| ir.cpp:2153:68:2153:68 | Unary | r2153_15 |
| ir.cpp:2153:68:2153:68 | Unary | r2153_23 |
| ir.cpp:2153:68:2153:68 | Unary | r2153_32 |
| ir.cpp:2153:68:2153:68 | Unary | r2153_41 |
| ir.cpp:2153:68:2153:69 | StoreValue | r2153_3 |
| ir.cpp:2153:68:2153:69 | Unary | r2153_2 |
| ir.cpp:2153:68:2153:70 | Load | ~m2153_36 |
| ir.cpp:2153:68:2153:70 | StoreValue | r2153_37 |
| ir.cpp:2154:7:2154:7 | Address | &:r2154_1 |
| ir.cpp:2154:7:2154:7 | Address | &:r2154_1 |
| ir.cpp:2154:7:2154:7 | Arg(this) | this:r2154_1 |
| ir.cpp:2154:7:2154:7 | ChiPartial | partial:m2154_8 |
| ir.cpp:2154:7:2154:7 | ChiTotal | total:m2153_38 |
| ir.cpp:2154:7:2154:7 | SideEffect | m2153_38 |
| ir.cpp:2154:9:2154:13 | CallTarget | func:r2154_2 |
| ir.cpp:2154:9:2154:13 | ChiPartial | partial:m2154_5 |
| ir.cpp:2154:9:2154:13 | ChiTotal | total:m2153_36 |
| ir.cpp:2154:9:2154:13 | SideEffect | ~m2153_36 |
| ir.cpp:2154:15:2154:17 | Arg(0) | 0:r2154_3 |
| perf-regression.cpp:6:3:6:5 | Address | &:r6_5 |
| perf-regression.cpp:6:3:6:5 | Address | &:r6_5 |
| perf-regression.cpp:6:3:6:5 | Address | &:r6_7 |

View File

@@ -6,10 +6,6 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| ir.cpp:2138:9:2138:9 | IndirectMayWriteSideEffect: x | Instruction 'IndirectMayWriteSideEffect: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) |
| ir.cpp:2140:39:2140:39 | IndirectMayWriteSideEffect: call to ClassWithDestructor | Instruction 'IndirectMayWriteSideEffect: call to ClassWithDestructor' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) |
| ir.cpp:2140:42:2140:76 | Constant: initialization_with_destructor_bool | Instruction 'Constant: initialization_with_destructor_bool' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) |
| ir.cpp:2141:9:2141:9 | IndirectMayWriteSideEffect: x | Instruction 'IndirectMayWriteSideEffect: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction

View File

@@ -11804,18 +11804,30 @@ ir.cpp:
# 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
#-----| False -> Block 2
#-----| True -> Block 1
# 2140| Block 1
# 2140| r2140_1(bool) = Constant[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| mu2138_5(unknown) = ^CallSideEffect : ~m?
# 2138| v2138_6(void) = ^IndirectReadSideEffect[-1] : &:r2138_1, ~m?
# 2138| mu2138_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2138_1
#-----| Goto -> Block 2
# 2140| Block 2
# 2140| r2140_2(glval<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
# 2140| r2140_1(glval<ClassWithDestructor>) = VariableAddress[x] :
# 2140| mu2140_2(ClassWithDestructor) = Uninitialized[x] : &:r2140_1
# 2140| r2140_3(glval<unknown>) = FunctionAddress[ClassWithDestructor] :
# 2140| v2140_4(void) = Call[ClassWithDestructor] : func:r2140_3, this:r2140_1
# 2140| mu2140_5(unknown) = ^CallSideEffect : ~m?
# 2140| mu2140_6(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2140_1
# 2140| r2140_7(bool) = Constant[1] :
# 2140| v2140_8(void) = ConditionalBranch : r2140_7
#-----| False -> Block 4
#-----| True -> Block 3
# 2141| Block 3
# 2141| r2141_1(glval<ClassWithDestructor>) = VariableAddress[x] :
@@ -11825,17 +11837,9 @@ ir.cpp:
# 2141| mu2141_5(unknown) = ^CallSideEffect : ~m?
# 2141| v2141_6(void) = ^IndirectReadSideEffect[-1] : &:r2141_1, ~m?
# 2141| mu2141_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2141_1
#-----| Goto -> Block 4
# 2138| Block 4
# 2138| r2138_1(glval<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| Block 4
# 2143| r2143_1(glval<ClassWithDestructor>) = VariableAddress[x] :
# 2143| mu2143_2(ClassWithDestructor) = Uninitialized[x] : &:r2143_1
# 2143| r2143_3(glval<unknown>) = FunctionAddress[ClassWithDestructor] :
@@ -11846,10 +11850,10 @@ ir.cpp:
# 2143| r2143_8(char) = Load[c] : &:r2143_7, ~m?
# 2143| r2143_9(int) = Convert : r2143_8
# 2143| v2143_10(void) = Switch : r2143_9
#-----| Case[97] -> Block 6
#-----| Default -> Block 7
#-----| Case[97] -> Block 5
#-----| Default -> Block 6
# 2144| Block 6
# 2144| Block 5
# 2144| v2144_1(void) = NoOp :
# 2145| r2145_1(glval<ClassWithDestructor>) = VariableAddress[x] :
# 2145| r2145_2(glval<unknown>) = FunctionAddress[set_x] :
@@ -11859,9 +11863,9 @@ ir.cpp:
# 2145| v2145_6(void) = ^IndirectReadSideEffect[-1] : &:r2145_1, ~m?
# 2145| mu2145_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2145_1
# 2146| v2146_1(void) = NoOp :
#-----| Goto -> Block 8
#-----| Goto -> Block 7
# 2147| Block 7
# 2147| Block 6
# 2147| v2147_1(void) = NoOp :
# 2148| r2148_1(glval<ClassWithDestructor>) = VariableAddress[x] :
# 2148| r2148_2(glval<unknown>) = FunctionAddress[set_x] :
@@ -11871,9 +11875,9 @@ ir.cpp:
# 2148| v2148_6(void) = ^IndirectReadSideEffect[-1] : &:r2148_1, ~m?
# 2148| mu2148_7(ClassWithDestructor) = ^IndirectMayWriteSideEffect[-1] : &:r2148_1
# 2149| v2149_1(void) = NoOp :
#-----| Goto -> Block 8
#-----| Goto -> Block 7
# 2150| Block 8
# 2150| Block 7
# 2150| v2150_1(void) = NoOp :
# 2152| r2152_1(glval<ClassWithDestructor>) = VariableAddress[x] :
# 2152| mu2152_2(ClassWithDestructor) = Uninitialized[x] : &:r2152_1
@@ -11905,9 +11909,9 @@ ir.cpp:
# 2153| mu2153_17(unknown) = ^CallSideEffect : ~m?
#-----| v0_6(void) = ^IndirectReadSideEffect[-1] : &:r0_5, ~m?
# 2153| mu2153_18(iterator) = Store[(__end)] : &:r2153_12, r2153_16
#-----| Goto -> Block 9
#-----| Goto -> Block 8
# 2153| Block 9
# 2153| Block 8
# 2153| r2153_19(glval<iterator>) = VariableAddress[(__begin)] :
#-----| r0_7(glval<iterator>) = Convert : r2153_19
# 2153| r2153_20(glval<unknown>) = FunctionAddress[operator!=] :
@@ -11917,10 +11921,10 @@ ir.cpp:
# 2153| mu2153_24(unknown) = ^CallSideEffect : ~m?
#-----| v0_8(void) = ^IndirectReadSideEffect[-1] : &:r0_7, ~m?
# 2153| v2153_25(void) = ConditionalBranch : r2153_23
#-----| False -> Block 11
#-----| True -> Block 10
#-----| False -> Block 10
#-----| True -> Block 9
# 2153| Block 10
# 2153| Block 9
# 2153| r2153_26(glval<ClassWithDestructor>) = VariableAddress[y] :
# 2153| r2153_27(glval<iterator>) = VariableAddress[(__begin)] :
#-----| r0_9(glval<iterator>) = Convert : r2153_27
@@ -11944,9 +11948,9 @@ ir.cpp:
# 2153| v2153_37(void) = ^IndirectReadSideEffect[-1] : &:r2153_33, ~m?
# 2153| mu2153_38(iterator) = ^IndirectMayWriteSideEffect[-1] : &:r2153_33
# 2153| r2153_39(glval<iterator>) = CopyValue : r2153_35
#-----| Goto (back edge) -> Block 9
#-----| Goto (back edge) -> Block 8
# 2155| Block 11
# 2155| Block 10
# 2155| v2155_1(void) = NoOp :
# 2136| v2136_8(void) = ReturnVoid :
# 2136| v2136_9(void) = AliasedUse : ~m?

View File

@@ -6,7 +6,6 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| ir.cpp:2138:9:2138:9 | IndirectMayWriteSideEffect: x | Instruction 'IndirectMayWriteSideEffect: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction
@@ -29,4 +28,5 @@ nonUniqueEnclosingIRFunction
fieldAddressOnNonPointer
thisArgumentIsNonPointer
nonUniqueIRVariable
| ir.cpp:2153:68:2153:69 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) |
missingCppType

View File

@@ -6,7 +6,6 @@ missingOperandType
duplicateChiOperand
sideEffectWithoutPrimary
instructionWithoutSuccessor
| ir.cpp:2138:9:2138:9 | IndirectMayWriteSideEffect: x | Instruction 'IndirectMayWriteSideEffect: x' has no successors in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) |
ambiguousSuccessors
unexplainedLoop
unnecessaryPhiInstruction
@@ -29,4 +28,5 @@ nonUniqueEnclosingIRFunction
fieldAddressOnNonPointer
thisArgumentIsNonPointer
nonUniqueIRVariable
| ir.cpp:2153:68:2153:69 | VariableAddress: ys | Variable address instruction 'VariableAddress: ys' has no associated variable, in function '$@'. | ir.cpp:2136:6:2136:35 | void initialization_with_destructor(bool, char) | void initialization_with_destructor(bool, char) |
missingCppType