From dd97584eff2c65edcf6579060efd3ec7043eddbf Mon Sep 17 00:00:00 2001 From: Robert Marsh Date: Fri, 23 Feb 2024 16:19:34 +0000 Subject: [PATCH] C++: fix for duplicated parent of ReturnVoid statements --- .../raw/internal/TranslatedElement.qll | 2 +- .../raw/internal/TranslatedStmt.qll | 2 +- .../library-tests/ir/ir/PrintAST.expected | 20 +++ .../library-tests/ir/ir/aliased_ir.expected | 115 +++++++++++------- cpp/ql/test/library-tests/ir/ir/ir.cpp | 5 + .../ir/ir/operand_locations.expected | 55 +++++---- .../test/library-tests/ir/ir/raw_ir.expected | 91 ++++++++------ 7 files changed, 188 insertions(+), 102 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll index 8136ac96908..70dae0cfacf 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll @@ -616,7 +616,7 @@ newtype TTranslatedElement = exists(ArrayOrVectorAggregateLiteral initList | initList.getAnElementExpr(_).getFullyConverted() = expr ) or - exists(ReturnStmt returnStmt | returnStmt.getExpr().getFullyConverted() = expr) or + exists(ReturnStmt returnStmt | returnStmt.getExpr().getFullyConverted() = expr and hasReturnValue(returnStmt.getEnclosingFunction())) or exists(ConstructorFieldInit fieldInit | fieldInit.getExpr().getFullyConverted() = expr) or exists(NewExpr newExpr | newExpr.getInitializer().getFullyConverted() = expr) or exists(ThrowExpr throw | throw.getExpr().getFullyConverted() = expr) or diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll index b825c563850..048e8457c28 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedStmt.qll @@ -474,7 +474,7 @@ class TranslatedReturnVoidExpressionStmt extends TranslatedReturnStmt { override Instruction getALastInstructionInternal() { if this.hasAnImplicitDestructorCall() then - result = this.getChildInternal(max(int id | exists(this.getChild(id)))).getALastInstruction() + result = this.getChild(max(int id | exists(this.getChild(id)))).getALastInstruction() else result = this.getInstruction(OnlyInstructionTag()) } diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 11e6b8cd65b..81190351b3f 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -17895,6 +17895,26 @@ ir.cpp: # 2292| getQualifier(): [VariableAccess] s # 2292| Type = [Struct] String # 2292| ValueCategory = lvalue +# 2294| [TopLevelFunction] void VoidReturnDestructors() +# 2294| : +# 2294| getEntryPoint(): [BlockStmt] { ... } +# 2295| getStmt(0): [DeclStmt] declaration +# 2295| getDeclarationEntry(0): [VariableDeclarationEntry] definition of s +# 2295| Type = [Struct] String +# 2295| getVariable().getInitializer(): [Initializer] initializer for s +# 2295| getExpr(): [ConstructorCall] call to String +# 2295| Type = [VoidType] void +# 2295| ValueCategory = prvalue +# 2296| getStmt(1): [ReturnStmt] return ... +# 2296| getExpr(): [FunctionCall] call to VoidFunc +# 2296| Type = [VoidType] void +# 2296| ValueCategory = prvalue +# 2297| getImplicitDestructorCall(0): [DestructorCall] call to ~String +# 2297| Type = [VoidType] void +# 2297| ValueCategory = prvalue +# 2297| getQualifier(): [VariableAccess] s +# 2297| Type = [Struct] String +# 2297| ValueCategory = lvalue perf-regression.cpp: # 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&) # 4| : diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index b1a82467e47..77f36ffa2e4 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -14268,65 +14268,61 @@ ir.cpp: # 2277| r2277_1(glval) = VariableAddress[b] : # 2277| r2277_2(bool) = Load[b] : &:r2277_1, m2275_6 # 2277| v2277_3(void) = ConditionalBranch : r2277_2 -#-----| False -> Block 4 -#-----| True -> Block 3 +#-----| False -> Block 3 +#-----| True -> Block 2 # 2275| Block 1 -# 2275| m2275_7(unknown) = Phi : from 2:~m2284_21, from 2:~m2284_5, from 5:~m2284_21, from 5:~m2284_5, from 3:~m2284_13, from 2:~m2284_21, from 2:~m2284_5, from 5:~m2284_21, from 5:~m2284_5, from 6:~m2284_30 +# 2275| m2275_7(unknown) = Phi : from 2:~m2284_5, from 4:~m2284_13, from 5:~m2284_22 # 2275| v2275_8(void) = ReturnVoid : # 2275| v2275_9(void) = AliasedUse : ~m2275_7 # 2275| v2275_10(void) = ExitFunction : -# 2278| Block 3 -# 2278| v2278_1(void) = NoOp : +# 2278| Block 2 +# 2278| v2278_1(void) = NoOp : +# 2284| r2284_1(glval) = VariableAddress[s] : +# 2284| r2284_2(glval) = FunctionAddress[~String] : +# 2284| v2284_3(void) = Call[~String] : func:r2284_2, this:r2284_1 +# 2284| m2284_4(unknown) = ^CallSideEffect : ~m2276_6 +# 2284| m2284_5(unknown) = Chi : total:m2276_6, partial:m2284_4 +# 2284| v2284_6(void) = ^IndirectReadSideEffect[-1] : &:r2284_1, m2276_8 +# 2284| m2284_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2284_1 +# 2284| m2284_8(String) = Chi : total:m2276_8, partial:m2284_7 +#-----| Goto -> Block 1 + +# 2280| Block 3 +# 2280| r2280_1(glval) = VariableAddress[b] : +# 2280| r2280_2(bool) = Load[b] : &:r2280_1, m2275_6 +# 2280| v2280_3(void) = ConditionalBranch : r2280_2 +#-----| False -> Block 5 +#-----| True -> Block 4 + +# 2281| Block 4 +# 2281| r2281_1(glval) = FunctionAddress[VoidFunc] : +# 2281| v2281_2(void) = Call[VoidFunc] : func:r2281_1 +# 2281| m2281_3(unknown) = ^CallSideEffect : ~m2276_6 +# 2281| m2281_4(unknown) = Chi : total:m2276_6, partial:m2281_3 +# 2281| v2281_5(void) = NoOp : # 2284| r2284_9(glval) = VariableAddress[s] : # 2284| r2284_10(glval) = FunctionAddress[~String] : # 2284| v2284_11(void) = Call[~String] : func:r2284_10, this:r2284_9 -# 2284| m2284_12(unknown) = ^CallSideEffect : ~m2276_6 -# 2284| m2284_13(unknown) = Chi : total:m2276_6, partial:m2284_12 +# 2284| m2284_12(unknown) = ^CallSideEffect : ~m2281_4 +# 2284| m2284_13(unknown) = Chi : total:m2281_4, partial:m2284_12 # 2284| v2284_14(void) = ^IndirectReadSideEffect[-1] : &:r2284_9, m2276_8 # 2284| m2284_15(String) = ^IndirectMayWriteSideEffect[-1] : &:r2284_9 # 2284| m2284_16(String) = Chi : total:m2276_8, partial:m2284_15 #-----| Goto -> Block 1 -# 2280| Block 4 -# 2280| r2280_1(glval) = VariableAddress[b] : -# 2280| r2280_2(bool) = Load[b] : &:r2280_1, m2275_6 -# 2280| v2280_3(void) = ConditionalBranch : r2280_2 -#-----| False -> Block 6 -#-----| True -> Block 5 -#-----| True -> Block 5 - -# 2281| Block 5 -# 2281| r2281_6(glval) = FunctionAddress[VoidFunc] : -# 2281| v2281_7(void) = Call[VoidFunc] : func:r2281_1, func:r2281_6 -# 2281| m2281_8(unknown) = ^CallSideEffect : ~m2276_6 -# 2281| m2281_9(unknown) = Chi : total:m2276_6, partial:m2281_3, partial:m2281_8 -# 2281| v2281_5(void) = NoOp : -# 2284| r2284_1(glval) = VariableAddress[s] : -# 2284| r2284_2(glval) = FunctionAddress[~String] : -# 2284| v2284_3(void) = Call[~String] : func:r2284_18, func:r2284_2, this:r2284_1, this:r2284_17 -# 2284| m2284_4(unknown) = ^CallSideEffect : ~m2281_4, ~m2281_9 -# 2284| m2284_5(unknown) = Chi : total:m2281_4, total:m2281_9, partial:m2284_20, partial:m2284_4 -# 2284| v2284_6(void) = ^IndirectReadSideEffect[-1] : &:r2284_1, &:r2284_17, m2276_8 -# 2284| m2284_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2284_1, &:r2284_17 -# 2284| m2284_8(String) = Chi : total:m2276_8, partial:m2284_23, partial:m2284_7 -#-----| Goto -> Block 1 - -# 2281| Block 5 -#-----| Goto -> Block 1 - -# 2283| Block 6 +# 2283| Block 5 # 2283| r2283_1(glval) = VariableAddress[s] : -# 2284| v2284_25(void) = NoOp : -# 2284| r2284_26(glval) = VariableAddress[s] : -# 2284| r2284_27(glval) = FunctionAddress[~String] : -# 2284| v2284_28(void) = Call[~String] : func:r2284_27, this:r2284_26 -# 2284| m2284_29(unknown) = ^CallSideEffect : ~m2276_6 -# 2284| m2284_30(unknown) = Chi : total:m2276_6, partial:m2284_29 -# 2284| v2284_31(void) = ^IndirectReadSideEffect[-1] : &:r2284_26, m2276_8 -# 2284| m2284_32(String) = ^IndirectMayWriteSideEffect[-1] : &:r2284_26 -# 2284| m2284_33(String) = Chi : total:m2276_8, partial:m2284_32 +# 2284| v2284_17(void) = NoOp : +# 2284| r2284_18(glval) = VariableAddress[s] : +# 2284| r2284_19(glval) = FunctionAddress[~String] : +# 2284| v2284_20(void) = Call[~String] : func:r2284_19, this:r2284_18 +# 2284| m2284_21(unknown) = ^CallSideEffect : ~m2276_6 +# 2284| m2284_22(unknown) = Chi : total:m2276_6, partial:m2284_21 +# 2284| v2284_23(void) = ^IndirectReadSideEffect[-1] : &:r2284_18, m2276_8 +# 2284| m2284_24(String) = ^IndirectMayWriteSideEffect[-1] : &:r2284_18 +# 2284| m2284_25(String) = Chi : total:m2276_8, partial:m2284_24 #-----| Goto -> Block 1 # 2286| int IfReturnDestructors3(bool) @@ -14387,6 +14383,37 @@ ir.cpp: # 2292| m2292_16(String) = Chi : total:m2287_8, partial:m2292_15 #-----| Goto -> Block 1 +# 2294| void VoidReturnDestructors() +# 2294| Block 0 +# 2294| v2294_1(void) = EnterFunction : +# 2294| m2294_2(unknown) = AliasedDefinition : +# 2294| m2294_3(unknown) = InitializeNonLocal : +# 2294| m2294_4(unknown) = Chi : total:m2294_2, partial:m2294_3 +# 2295| r2295_1(glval) = VariableAddress[s] : +# 2295| m2295_2(String) = Uninitialized[s] : &:r2295_1 +# 2295| r2295_3(glval) = FunctionAddress[String] : +# 2295| v2295_4(void) = Call[String] : func:r2295_3, this:r2295_1 +# 2295| m2295_5(unknown) = ^CallSideEffect : ~m2294_4 +# 2295| m2295_6(unknown) = Chi : total:m2294_4, partial:m2295_5 +# 2295| m2295_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2295_1 +# 2295| m2295_8(String) = Chi : total:m2295_2, partial:m2295_7 +# 2296| r2296_1(glval) = FunctionAddress[VoidFunc] : +# 2296| v2296_2(void) = Call[VoidFunc] : func:r2296_1 +# 2296| m2296_3(unknown) = ^CallSideEffect : ~m2295_6 +# 2296| m2296_4(unknown) = Chi : total:m2295_6, partial:m2296_3 +# 2296| v2296_5(void) = NoOp : +# 2297| r2297_1(glval) = VariableAddress[s] : +# 2297| r2297_2(glval) = FunctionAddress[~String] : +# 2297| v2297_3(void) = Call[~String] : func:r2297_2, this:r2297_1 +# 2297| m2297_4(unknown) = ^CallSideEffect : ~m2296_4 +# 2297| m2297_5(unknown) = Chi : total:m2296_4, partial:m2297_4 +# 2297| v2297_6(void) = ^IndirectReadSideEffect[-1] : &:r2297_1, m2295_8 +# 2297| m2297_7(String) = ^IndirectMayWriteSideEffect[-1] : &:r2297_1 +# 2297| m2297_8(String) = Chi : total:m2295_8, partial:m2297_7 +# 2294| v2294_5(void) = ReturnVoid : +# 2294| v2294_6(void) = AliasedUse : ~m2297_5 +# 2294| v2294_7(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index 95c39eb3b6a..2863fc97919 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -2291,4 +2291,9 @@ int IfReturnDestructors3(bool b) { return 0; } +void VoidReturnDestructors() { + String s; + return VoidFunc(); +} + // semmle-extractor-options: -std=c++20 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected index e4cfcfe6ed1..76a54d828be 100644 --- a/cpp/ql/test/library-tests/ir/ir/operand_locations.expected +++ b/cpp/ql/test/library-tests/ir/ir/operand_locations.expected @@ -11765,11 +11765,8 @@ | ir.cpp:2275:6:2275:24 | ChiPartial | partial:m2275_3 | | ir.cpp:2275:6:2275:24 | ChiTotal | total:m2275_2 | | ir.cpp:2275:6:2275:24 | Phi | from 2:~m2284_5 | -| ir.cpp:2275:6:2275:24 | Phi | from 2:~m2284_21 | -| ir.cpp:2275:6:2275:24 | Phi | from 3:~m2284_13 | -| ir.cpp:2275:6:2275:24 | Phi | from 5:~m2284_5 | -| ir.cpp:2275:6:2275:24 | Phi | from 5:~m2284_21 | -| ir.cpp:2275:6:2275:24 | Phi | from 6:~m2284_30 | +| ir.cpp:2275:6:2275:24 | Phi | from 4:~m2284_13 | +| ir.cpp:2275:6:2275:24 | Phi | from 5:~m2284_22 | | ir.cpp:2275:6:2275:24 | SideEffect | ~m2275_7 | | ir.cpp:2275:31:2275:31 | Address | &:r2275_5 | | ir.cpp:2276:12:2276:12 | Address | &:r2276_1 | @@ -11788,49 +11785,39 @@ | ir.cpp:2280:8:2280:8 | Condition | r2280_2 | | ir.cpp:2280:8:2280:8 | Load | m2275_6 | | ir.cpp:2281:16:2281:23 | CallTarget | func:r2281_1 | -| ir.cpp:2281:16:2281:23 | CallTarget | func:r2281_6 | | ir.cpp:2281:16:2281:23 | ChiPartial | partial:m2281_3 | -| ir.cpp:2281:16:2281:23 | ChiPartial | partial:m2281_8 | | ir.cpp:2281:16:2281:23 | ChiTotal | total:m2276_6 | | ir.cpp:2281:16:2281:23 | SideEffect | ~m2276_6 | | ir.cpp:2284:1:2284:1 | Address | &:r2284_1 | | ir.cpp:2284:1:2284:1 | Address | &:r2284_1 | | ir.cpp:2284:1:2284:1 | Address | &:r2284_9 | | ir.cpp:2284:1:2284:1 | Address | &:r2284_9 | -| ir.cpp:2284:1:2284:1 | Address | &:r2284_17 | -| ir.cpp:2284:1:2284:1 | Address | &:r2284_17 | -| ir.cpp:2284:1:2284:1 | Address | &:r2284_26 | -| ir.cpp:2284:1:2284:1 | Address | &:r2284_26 | +| ir.cpp:2284:1:2284:1 | Address | &:r2284_18 | +| ir.cpp:2284:1:2284:1 | Address | &:r2284_18 | | ir.cpp:2284:1:2284:1 | Arg(this) | this:r2284_1 | | ir.cpp:2284:1:2284:1 | Arg(this) | this:r2284_9 | -| ir.cpp:2284:1:2284:1 | Arg(this) | this:r2284_17 | -| ir.cpp:2284:1:2284:1 | Arg(this) | this:r2284_26 | +| ir.cpp:2284:1:2284:1 | Arg(this) | this:r2284_18 | | ir.cpp:2284:1:2284:1 | CallTarget | func:r2284_2 | | ir.cpp:2284:1:2284:1 | CallTarget | func:r2284_10 | -| ir.cpp:2284:1:2284:1 | CallTarget | func:r2284_18 | -| ir.cpp:2284:1:2284:1 | CallTarget | func:r2284_27 | +| ir.cpp:2284:1:2284:1 | CallTarget | func:r2284_19 | | ir.cpp:2284:1:2284:1 | ChiPartial | partial:m2284_4 | | ir.cpp:2284:1:2284:1 | ChiPartial | partial:m2284_7 | | ir.cpp:2284:1:2284:1 | ChiPartial | partial:m2284_12 | | ir.cpp:2284:1:2284:1 | ChiPartial | partial:m2284_15 | -| ir.cpp:2284:1:2284:1 | ChiPartial | partial:m2284_20 | -| ir.cpp:2284:1:2284:1 | ChiPartial | partial:m2284_23 | -| ir.cpp:2284:1:2284:1 | ChiPartial | partial:m2284_29 | -| ir.cpp:2284:1:2284:1 | ChiPartial | partial:m2284_32 | +| ir.cpp:2284:1:2284:1 | ChiPartial | partial:m2284_21 | +| ir.cpp:2284:1:2284:1 | ChiPartial | partial:m2284_24 | | ir.cpp:2284:1:2284:1 | ChiTotal | total:m2276_6 | | ir.cpp:2284:1:2284:1 | ChiTotal | total:m2276_6 | | ir.cpp:2284:1:2284:1 | ChiTotal | total:m2276_8 | | ir.cpp:2284:1:2284:1 | ChiTotal | total:m2276_8 | | ir.cpp:2284:1:2284:1 | ChiTotal | total:m2276_8 | | ir.cpp:2284:1:2284:1 | ChiTotal | total:m2281_4 | -| ir.cpp:2284:1:2284:1 | ChiTotal | total:m2281_9 | | ir.cpp:2284:1:2284:1 | SideEffect | m2276_8 | | ir.cpp:2284:1:2284:1 | SideEffect | m2276_8 | | ir.cpp:2284:1:2284:1 | SideEffect | m2276_8 | | ir.cpp:2284:1:2284:1 | SideEffect | ~m2276_6 | | ir.cpp:2284:1:2284:1 | SideEffect | ~m2276_6 | | ir.cpp:2284:1:2284:1 | SideEffect | ~m2281_4 | -| ir.cpp:2284:1:2284:1 | SideEffect | ~m2281_9 | | ir.cpp:2286:5:2286:24 | Address | &:r2286_9 | | ir.cpp:2286:5:2286:24 | ChiPartial | partial:m2286_3 | | ir.cpp:2286:5:2286:24 | ChiTotal | total:m2286_2 | @@ -11877,6 +11864,32 @@ | ir.cpp:2292:1:2292:1 | SideEffect | m2287_8 | | ir.cpp:2292:1:2292:1 | SideEffect | ~m2287_6 | | ir.cpp:2292:1:2292:1 | SideEffect | ~m2287_6 | +| ir.cpp:2294:6:2294:26 | ChiPartial | partial:m2294_3 | +| ir.cpp:2294:6:2294:26 | ChiTotal | total:m2294_2 | +| ir.cpp:2294:6:2294:26 | SideEffect | ~m2297_5 | +| ir.cpp:2295:12:2295:12 | Address | &:r2295_1 | +| ir.cpp:2295:12:2295:12 | Address | &:r2295_1 | +| ir.cpp:2295:12:2295:12 | Arg(this) | this:r2295_1 | +| ir.cpp:2295:12:2295:12 | CallTarget | func:r2295_3 | +| ir.cpp:2295:12:2295:12 | ChiPartial | partial:m2295_5 | +| ir.cpp:2295:12:2295:12 | ChiPartial | partial:m2295_7 | +| ir.cpp:2295:12:2295:12 | ChiTotal | total:m2294_4 | +| ir.cpp:2295:12:2295:12 | ChiTotal | total:m2295_2 | +| ir.cpp:2295:12:2295:12 | SideEffect | ~m2294_4 | +| ir.cpp:2296:12:2296:19 | CallTarget | func:r2296_1 | +| ir.cpp:2296:12:2296:19 | ChiPartial | partial:m2296_3 | +| ir.cpp:2296:12:2296:19 | ChiTotal | total:m2295_6 | +| ir.cpp:2296:12:2296:19 | SideEffect | ~m2295_6 | +| ir.cpp:2297:1:2297:1 | Address | &:r2297_1 | +| ir.cpp:2297:1:2297:1 | Address | &:r2297_1 | +| ir.cpp:2297:1:2297:1 | Arg(this) | this:r2297_1 | +| ir.cpp:2297:1:2297:1 | CallTarget | func:r2297_2 | +| ir.cpp:2297:1:2297:1 | ChiPartial | partial:m2297_4 | +| ir.cpp:2297:1:2297:1 | ChiPartial | partial:m2297_7 | +| ir.cpp:2297:1:2297:1 | ChiTotal | total:m2295_8 | +| ir.cpp:2297:1:2297:1 | ChiTotal | total:m2296_4 | +| ir.cpp:2297:1:2297:1 | SideEffect | m2295_8 | +| ir.cpp:2297:1:2297:1 | SideEffect | ~m2296_4 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_5 | | perf-regression.cpp:6:3:6:5 | Address | &:r6_7 | diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 1a0f8e83651..4c5ec0061a5 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -13242,16 +13242,36 @@ ir.cpp: # 2277| r2277_1(glval) = VariableAddress[b] : # 2277| r2277_2(bool) = Load[b] : &:r2277_1, ~m? # 2277| v2277_3(void) = ConditionalBranch : r2277_2 -#-----| False -> Block 4 -#-----| True -> Block 3 +#-----| False -> Block 3 +#-----| True -> Block 2 # 2275| Block 1 # 2275| v2275_6(void) = ReturnVoid : # 2275| v2275_7(void) = AliasedUse : ~m? # 2275| v2275_8(void) = ExitFunction : -# 2278| Block 3 +# 2278| Block 2 # 2278| v2278_1(void) = NoOp : +# 2284| r2284_1(glval) = VariableAddress[s] : +# 2284| r2284_2(glval) = FunctionAddress[~String] : +# 2284| v2284_3(void) = Call[~String] : func:r2284_2, this:r2284_1 +# 2284| mu2284_4(unknown) = ^CallSideEffect : ~m? +# 2284| v2284_5(void) = ^IndirectReadSideEffect[-1] : &:r2284_1, ~m? +# 2284| mu2284_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2284_1 +#-----| Goto -> Block 1 + +# 2280| Block 3 +# 2280| r2280_1(glval) = VariableAddress[b] : +# 2280| r2280_2(bool) = Load[b] : &:r2280_1, ~m? +# 2280| v2280_3(void) = ConditionalBranch : r2280_2 +#-----| False -> Block 5 +#-----| True -> Block 4 + +# 2281| Block 4 +# 2281| r2281_1(glval) = FunctionAddress[VoidFunc] : +# 2281| v2281_2(void) = Call[VoidFunc] : func:r2281_1 +# 2281| mu2281_3(unknown) = ^CallSideEffect : ~m? +# 2281| v2281_4(void) = NoOp : # 2284| r2284_7(glval) = VariableAddress[s] : # 2284| r2284_8(glval) = FunctionAddress[~String] : # 2284| v2284_9(void) = Call[~String] : func:r2284_8, this:r2284_7 @@ -13260,39 +13280,15 @@ ir.cpp: # 2284| mu2284_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r2284_7 #-----| Goto -> Block 1 -# 2280| Block 4 -# 2280| r2280_1(glval) = VariableAddress[b] : -# 2280| r2280_2(bool) = Load[b] : &:r2280_1, ~m? -# 2280| v2280_3(void) = ConditionalBranch : r2280_2 -#-----| False -> Block 6 -#-----| True -> Block 5 -#-----| True -> Block 5 - -# 2281| Block 5 -# 2281| r2281_5(glval) = FunctionAddress[VoidFunc] : -# 2281| v2281_6(void) = Call[VoidFunc] : func:r2281_1, func:r2281_5 -# 2281| mu2281_7(unknown) = ^CallSideEffect : ~m? -# 2281| v2281_8(void) = NoOp : -# 2284| r2284_13(glval) = VariableAddress[s] : -# 2284| r2284_14(glval) = FunctionAddress[~String] : -# 2284| v2284_3(void) = Call[~String] : func:r2284_14, func:r2284_2, this:r2284_1, this:r2284_13 -# 2284| mu2284_4(unknown) = ^CallSideEffect : ~m? -# 2284| v2284_5(void) = ^IndirectReadSideEffect[-1] : &:r2284_1, &:r2284_13, ~m? -# 2284| mu2284_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2284_1, &:r2284_13 -#-----| Goto -> Block 1 - -# 2281| Block 5 -#-----| Goto -> Block 1 - -# 2283| Block 6 +# 2283| Block 5 # 2283| r2283_1(glval) = VariableAddress[s] : -# 2284| v2284_19(void) = NoOp : -# 2284| r2284_20(glval) = VariableAddress[s] : -# 2284| r2284_21(glval) = FunctionAddress[~String] : -# 2284| v2284_22(void) = Call[~String] : func:r2284_21, this:r2284_20 -# 2284| mu2284_23(unknown) = ^CallSideEffect : ~m? -# 2284| v2284_24(void) = ^IndirectReadSideEffect[-1] : &:r2284_20, ~m? -# 2284| mu2284_25(String) = ^IndirectMayWriteSideEffect[-1] : &:r2284_20 +# 2284| v2284_13(void) = NoOp : +# 2284| r2284_14(glval) = VariableAddress[s] : +# 2284| r2284_15(glval) = FunctionAddress[~String] : +# 2284| v2284_16(void) = Call[~String] : func:r2284_15, this:r2284_14 +# 2284| mu2284_17(unknown) = ^CallSideEffect : ~m? +# 2284| v2284_18(void) = ^IndirectReadSideEffect[-1] : &:r2284_14, ~m? +# 2284| mu2284_19(String) = ^IndirectMayWriteSideEffect[-1] : &:r2284_14 #-----| Goto -> Block 1 # 2286| int IfReturnDestructors3(bool) @@ -13344,6 +13340,31 @@ ir.cpp: # 2292| mu2292_12(String) = ^IndirectMayWriteSideEffect[-1] : &:r2292_7 #-----| Goto -> Block 1 +# 2294| void VoidReturnDestructors() +# 2294| Block 0 +# 2294| v2294_1(void) = EnterFunction : +# 2294| mu2294_2(unknown) = AliasedDefinition : +# 2294| mu2294_3(unknown) = InitializeNonLocal : +# 2295| r2295_1(glval) = VariableAddress[s] : +# 2295| mu2295_2(String) = Uninitialized[s] : &:r2295_1 +# 2295| r2295_3(glval) = FunctionAddress[String] : +# 2295| v2295_4(void) = Call[String] : func:r2295_3, this:r2295_1 +# 2295| mu2295_5(unknown) = ^CallSideEffect : ~m? +# 2295| mu2295_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2295_1 +# 2296| r2296_1(glval) = FunctionAddress[VoidFunc] : +# 2296| v2296_2(void) = Call[VoidFunc] : func:r2296_1 +# 2296| mu2296_3(unknown) = ^CallSideEffect : ~m? +# 2296| v2296_4(void) = NoOp : +# 2297| r2297_1(glval) = VariableAddress[s] : +# 2297| r2297_2(glval) = FunctionAddress[~String] : +# 2297| v2297_3(void) = Call[~String] : func:r2297_2, this:r2297_1 +# 2297| mu2297_4(unknown) = ^CallSideEffect : ~m? +# 2297| v2297_5(void) = ^IndirectReadSideEffect[-1] : &:r2297_1, ~m? +# 2297| mu2297_6(String) = ^IndirectMayWriteSideEffect[-1] : &:r2297_1 +# 2294| v2294_4(void) = ReturnVoid : +# 2294| v2294_5(void) = AliasedUse : ~m? +# 2294| v2294_6(void) = ExitFunction : + perf-regression.cpp: # 6| void Big::Big() # 6| Block 0