Skip to content

Commit 3f093ae

Browse files
committed
C++: Fix join order problem after stats file update
Tuple counts before the change (terminated early): ``` [2025-01-11 17:49:42] (297s) Tuple counts for AliasedSSA::getResultMemoryLocation/1#eb4efd2d/2@c513392o after 13.5s: 0 ~0% {3} r1 = JOIN `_SSAConstruction::getInstructionOpcode/2#ec2d1f97_10#join_rhs__AliasedSSA::canReuseSsaForOldResult/1__#shared` WITH Opcode::MayWriteOpcode#class#21b7b7f2 ON FIRST 1 OUTPUT Lhs.1, Lhs.2 'instr', _ 0 ~0% {3} | REWRITE WITH Out.2 := true 30500 ~124% {2} r2 = SCAN `_AliasedSSA::canReuseSsaForOldResult/1#280fbda5_Opcode::Opcode.getWriteMemoryAccess/0#dispred#531702__#shared` OUTPUT In.1, In.0 'instr' {2} | AND NOT `_Opcode::MayWriteOpcode#class#21b7b7f2__SSAConstruction::getInstructionOpcode/2#ec2d1f97_10#join_rhs__#antijoin_rhs#1`(FIRST 2) 30500 ~134% {3} | SCAN OUTPUT In.0, In.1 'instr', _ 30500 ~120% {3} | REWRITE WITH Out.2 := false 30500 ~120% {3} r3 = r1 UNION r2 8000 ~738% {2} r4 = JOIN r3 WITH num#MemoryAccessKind::TEscapedMemoryAccess#a0368c86 ON FIRST 1 OUTPUT Lhs.1 'instr', Lhs.2 {2} | AND NOT `AliasedSSA::canReuseSsaForOldResult/1#280fbda5`(FIRST 1) 4000 ~699% {2} | SCAN OUTPUT In.1, In.0 'instr' 1501792000 ~686% {3} | JOIN WITH num#AliasedSSA::TAllAliasedMemory#4bb632db_102#join_rhs ON FIRST 1 OUTPUT Rhs.2 'result', Lhs.1 'instr', Rhs.1 1501788000 ~709% {3} | JOIN WITH AliasedSSA::MemoryLocation#4b9f223c ON FIRST 1 OUTPUT Lhs.1 'instr', Lhs.2, Lhs.0 'result' 0 ~0% {2} | JOIN WITH `SSAConstruction::getInstructionEnclosingIRFunction/1#d26c0476` ON FIRST 2 OUTPUT Lhs.0 'instr', Lhs.2 'result' 8000 ~674% {2} r5 = JOIN r3 WITH num#MemoryAccessKind::TNonLocalMemoryAccess#b2a59f45 ON FIRST 1 OUTPUT Lhs.1 'instr', Lhs.2 {2} | AND NOT `AliasedSSA::canReuseSsaForOldResult/1#280fbda5`(FIRST 1) 4000 ~689% {2} | SCAN OUTPUT In.1, In.0 'instr' 310509500 ~547% {3} | JOIN WITH num#AliasedSSA::TAllNonLocalMemory#7ba9f6c9_102#join_rhs ON FIRST 1 OUTPUT Rhs.2 'result', Lhs.1 'instr', Rhs.1 310504500 ~527% {3} | JOIN WITH AliasedSSA::MemoryLocation#4b9f223c ON FIRST 1 OUTPUT Lhs.1 'instr', Lhs.2, Lhs.0 'result' 0 ~0% {2} | JOIN WITH `SSAConstruction::getInstructionEnclosingIRFunction/1#d26c0476` ON FIRST 2 OUTPUT Lhs.0 'instr', Lhs.2 'result' 5000 ~2% {2} r6 = JOIN r3 WITH `AliasedSSA::isIndirectOrBufferMemoryAccess/1#a6492554` ON FIRST 1 OUTPUT Lhs.1 'instr', Lhs.2 5000 ~2% {2} | AND NOT `AliasedSSA::canReuseSsaForOldResult/1#280fbda5`(FIRST 1) {2} r7 = r6 AND NOT `project#AliasedSSA::hasResultMemoryAccess/9#732473d4#7`(FIRST 1) 0 ~0% {2} | SCAN OUTPUT In.1, In.0 'instr' 0 ~0% {3} | JOIN WITH num#AliasedSSA::TUnknownMemoryLocation#e0c2a990_102#join_rhs ON FIRST 1 OUTPUT Rhs.2 'result', Lhs.1 'instr', Rhs.1 0 ~0% {3} | JOIN WITH AliasedSSA::MemoryLocation#4b9f223c ON FIRST 1 OUTPUT Lhs.1 'instr', Lhs.2, Lhs.0 'result' 0 ~0% {2} | JOIN WITH `SSAConstruction::getInstructionEnclosingIRFunction/1#d26c0476` ON FIRST 2 OUTPUT Lhs.0 'instr', Lhs.2 'result' 5000 ~0% {2} r8 = JOIN r3 WITH num#MemoryAccessKind::TEntireAllocationMemoryAccess#503d0afb ON FIRST 1 OUTPUT Lhs.1 'instr', Lhs.2 5000 ~0% {2} | AND NOT `AliasedSSA::canReuseSsaForOldResult/1#280fbda5`(FIRST 1) 4500 ~2% {4} | JOIN WITH `Instruction::Instruction.getResultAddressOperand/0#dispred#619d4407` ON FIRST 1 OUTPUT Rhs.1, Lhs.0 'instr', _, Lhs.1 4500 ~4% {3} | REWRITE WITH Out.2 := booleanNot(In.3) KEEPING 3 0 ~0% {3} | JOIN WITH `project#AliasAnalysis::addressOperandAllocationAndOffset/3#c64a9862` ON FIRST 1 OUTPUT Rhs.1, Lhs.1 'instr', Lhs.2 0 ~0% {4} | JOIN WITH num#AliasedSSA::TEntireAllocationMemoryLocation#85bb24dd ON FIRST 1 OUTPUT Lhs.1 'instr', Lhs.2, Rhs.1, Rhs.2 'result' {4} | REWRITE WITH TEST InOut.1 != InOut.2 0 ~0% {2} | SCAN OUTPUT In.3 'result', In.0 'instr' 0 ~0% {2} | JOIN WITH AliasedSSA::MemoryLocation#4b9f223c ON FIRST 1 OUTPUT Lhs.1 'instr', Lhs.0 'result' 4500 ~0% {5} r9 = JOIN r6 WITH `project#AliasedSSA::hasResultMemoryAccess/9#732473d4#5_0512346#join_rhs` ON FIRST 2 OUTPUT Lhs.0 'instr', Lhs.1, Rhs.2, Rhs.6, _ {4} | REWRITE WITH Tmp.4 := false, TEST InOut.3 != Tmp.4 KEEPING 4 0 ~0% {5} | SCAN OUTPUT In.2, _, In.0 'instr', _, In.1 0 ~0% {4} | REWRITE WITH Out.1 := false, Out.3 := booleanNot(In.4) KEEPING 4 0 ~0% {4} | JOIN WITH `AliasedSSA::getGroupedMemoryLocation/3#14ef79fc#ffbf_0213#join_rhs` ON FIRST 2 OUTPUT Lhs.2 'instr', Lhs.3, Rhs.2, Rhs.3 'result' {4} | REWRITE WITH TEST InOut.1 != InOut.2 0 ~0% {2} | SCAN OUTPUT In.3 'result', In.0 'instr' 0 ~0% {2} | JOIN WITH AliasedSSA::MemoryLocation#4b9f223c ON FIRST 1 OUTPUT Lhs.1 'instr', Lhs.0 'result' 4500 ~0% {8} r10 = JOIN r6 WITH `project#AliasedSSA::hasResultMemoryAccess/9#732473d4#5_0512346#join_rhs` ON FIRST 2 OUTPUT Lhs.0 'instr', Lhs.1, Rhs.2, Rhs.3, Rhs.4, Rhs.5, Rhs.6, _ {7} | REWRITE WITH Tmp.7 := false, TEST InOut.6 = Tmp.7 KEEPING 7 4000 ~0% {6} | SCAN OUTPUT In.2, In.3, In.4, In.5, In.0 'instr', In.1 3500 ~1% {8} | JOIN WITH num#AliasedSSA::TVariableMemoryLocation#8e8cb20c_013456#join_rhs ON FIRST 4 OUTPUT Rhs.5 'result', Lhs.4 'instr', Lhs.5, Lhs.0, Lhs.1, Lhs.2, Lhs.3, Rhs.4 3000 ~0% {8} | JOIN WITH AliasedSSA::MemoryLocation#4b9f223c ON FIRST 1 OUTPUT Lhs.1 'instr', Lhs.3, Lhs.4, Lhs.5, Lhs.6, Lhs.2, Lhs.7, Lhs.0 'result' 2500 ~2% {5} | JOIN WITH `project#AliasedSSA::hasResultMemoryAccess/9#732473d4#6` ON FIRST 6 OUTPUT Lhs.0 'instr', Lhs.6, Lhs.7 'result', _, Lhs.5 {4} | REWRITE WITH Out.3 := booleanNot(In.4), TEST Out.3 != InOut.1 KEEPING 4 2000 ~0% {2} | SCAN OUTPUT In.0 'instr', In.2 'result' 2000 ~0% {2} r11 = r4 UNION r5 UNION r7 UNION r8 UNION r9 UNION r10 return r11 ``` Tuple counts after: ``` [2025-01-11 17:52:46] (9s) Tuple counts for AliasedSSA::getResultMemoryLocation/1#eb4efd2d/2@6c9e69ae after 6.1s: 1283623 ~5% {3} r1 = JOIN `_SSAConstruction::getInstructionOpcode/2#ec2d1f97_10#join_rhs__AliasedSSA::canReuseSsaForOldResult/1__#shared` WITH Opcode::MayWriteOpcode#class#21b7b7f2 ON FIRST 1 OUTPUT Lhs.1, Lhs.2 'instr', _ 1283623 ~0% {3} | REWRITE WITH Out.2 := true 2965447 ~0% {2} r2 = SCAN `_AliasedSSA::canReuseSsaForOldResult/1#280fbda5_Opcode::Opcode.getWriteMemoryAccess/0#dispred#531702__#shared` OUTPUT In.1, In.0 'instr' {2} | AND NOT `_Opcode::MayWriteOpcode#class#21b7b7f2__SSAConstruction::getInstructionOpcode/2#ec2d1f97_10#join_rhs__#antijoin_rhs#1`(FIRST 2) 1681824 ~1% {3} | SCAN OUTPUT In.0, In.1 'instr', _ 1681824 ~0% {3} | REWRITE WITH Out.2 := false 2965447 ~0% {3} r3 = r1 UNION r2 1334818 ~0% {2} r4 = JOIN r3 WITH num#MemoryAccessKind::TEscapedMemoryAccess#a0368c86 ON FIRST 1 OUTPUT Lhs.1 'instr', Lhs.2 1334818 ~0% {2} | AND NOT `AliasedSSA::canReuseSsaForOldResult/1#280fbda5`(FIRST 1) 1334818 ~6% {3} | JOIN WITH `SSAConstruction::getInstructionEnclosingIRFunction/1#d26c0476` ON FIRST 1 OUTPUT Rhs.1, Lhs.1, Lhs.0 'instr' 1334818 ~4% {2} | JOIN WITH num#AliasedSSA::TAllAliasedMemory#4bb632db ON FIRST 2 OUTPUT Rhs.2 'result', Lhs.2 'instr' 1334818 ~2% {2} | JOIN WITH AliasedSSA::MemoryLocation#4b9f223c ON FIRST 1 OUTPUT Lhs.1 'instr', Lhs.0 'result' 363138 ~1% {2} r5 = JOIN r3 WITH num#MemoryAccessKind::TNonLocalMemoryAccess#b2a59f45 ON FIRST 1 OUTPUT Lhs.1 'instr', Lhs.2 363138 ~1% {2} | AND NOT `AliasedSSA::canReuseSsaForOldResult/1#280fbda5`(FIRST 1) 363138 ~5% {3} | JOIN WITH `SSAConstruction::getInstructionEnclosingIRFunction/1#d26c0476` ON FIRST 1 OUTPUT Rhs.1, Lhs.1, Lhs.0 'instr' 363138 ~0% {2} | JOIN WITH num#AliasedSSA::TAllNonLocalMemory#7ba9f6c9 ON FIRST 2 OUTPUT Rhs.2 'result', Lhs.2 'instr' 363138 ~0% {2} | JOIN WITH AliasedSSA::MemoryLocation#4b9f223c ON FIRST 1 OUTPUT Lhs.1 'instr', Lhs.0 'result' 1086950 ~5% {2} r6 = JOIN r3 WITH `AliasedSSA::isIndirectOrBufferMemoryAccess/1#a6492554` ON FIRST 1 OUTPUT Lhs.1 'instr', Lhs.2 1086950 ~5% {2} | AND NOT `AliasedSSA::canReuseSsaForOldResult/1#280fbda5`(FIRST 1) 141434 ~0% {2} r7 = r6 AND NOT `project#AliasedSSA::hasResultMemoryAccess/9#732473d4#7`(FIRST 1) 141434 ~0% {3} | JOIN WITH `SSAConstruction::getInstructionEnclosingIRFunction/1#d26c0476` ON FIRST 1 OUTPUT Rhs.1, Lhs.1, Lhs.0 'instr' 141434 ~5% {2} | JOIN WITH num#AliasedSSA::TUnknownMemoryLocation#e0c2a990 ON FIRST 2 OUTPUT Rhs.2 'result', Lhs.2 'instr' 141434 ~0% {2} | JOIN WITH AliasedSSA::MemoryLocation#4b9f223c ON FIRST 1 OUTPUT Lhs.1 'instr', Lhs.0 'result' 180541 ~0% {2} r8 = JOIN r3 WITH num#MemoryAccessKind::TEntireAllocationMemoryAccess#503d0afb ON FIRST 1 OUTPUT Lhs.1 'instr', Lhs.2 180541 ~0% {2} | AND NOT `AliasedSSA::canReuseSsaForOldResult/1#280fbda5`(FIRST 1) 180541 ~3% {4} | JOIN WITH `Instruction::Instruction.getResultAddressOperand/0#dispred#619d4407` ON FIRST 1 OUTPUT Rhs.1, Lhs.0 'instr', _, Lhs.1 180541 ~0% {3} | REWRITE WITH Out.2 := booleanNot(In.3) KEEPING 3 175074 ~2% {3} | JOIN WITH `project#AliasAnalysis::addressOperandAllocationAndOffset/3#c64a9862` ON FIRST 1 OUTPUT Rhs.1, Lhs.1 'instr', Lhs.2 349412 ~0% {4} | JOIN WITH num#AliasedSSA::TEntireAllocationMemoryLocation#85bb24dd ON FIRST 1 OUTPUT Lhs.1 'instr', Lhs.2, Rhs.1, Rhs.2 'result' {4} | REWRITE WITH TEST InOut.1 != InOut.2 174706 ~1% {2} | SCAN OUTPUT In.3 'result', In.0 'instr' 174706 ~3% {2} | JOIN WITH AliasedSSA::MemoryLocation#4b9f223c ON FIRST 1 OUTPUT Lhs.1 'instr', Lhs.0 'result' 946577 ~0% {5} r9 = JOIN r6 WITH `project#AliasedSSA::hasResultMemoryAccess/9#732473d4#5_0512346#join_rhs` ON FIRST 2 OUTPUT Lhs.0 'instr', Lhs.1, Rhs.2, Rhs.6, _ {4} | REWRITE WITH Tmp.4 := false, TEST InOut.3 != Tmp.4 KEEPING 4 2122 ~6% {5} | SCAN OUTPUT In.2, _, In.0 'instr', _, In.1 2122 ~0% {4} | REWRITE WITH Out.1 := false, Out.3 := booleanNot(In.4) KEEPING 4 4244 ~104% {4} | JOIN WITH `AliasedSSA::getGroupedMemoryLocation/3#14ef79fc#ffbf_0213#join_rhs` ON FIRST 2 OUTPUT Lhs.2 'instr', Lhs.3, Rhs.2, Rhs.3 'result' {4} | REWRITE WITH TEST InOut.1 != InOut.2 2122 ~98% {2} | SCAN OUTPUT In.3 'result', In.0 'instr' 1061 ~0% {2} | JOIN WITH AliasedSSA::MemoryLocation#4b9f223c ON FIRST 1 OUTPUT Lhs.1 'instr', Lhs.0 'result' 946577 ~0% {8} r10 = JOIN r6 WITH `project#AliasedSSA::hasResultMemoryAccess/9#732473d4#5_0512346#join_rhs` ON FIRST 2 OUTPUT Lhs.0 'instr', Lhs.1, Rhs.2, Rhs.3, Rhs.4, Rhs.5, Rhs.6, _ {7} | REWRITE WITH Tmp.7 := false, TEST InOut.6 = Tmp.7 KEEPING 7 944455 ~0% {6} | SCAN OUTPUT In.2, In.3, In.4, In.5, In.0 'instr', In.1 1183383 ~2% {8} | JOIN WITH num#AliasedSSA::TVariableMemoryLocation#8e8cb20c_013456#join_rhs ON FIRST 4 OUTPUT Rhs.5 'result', Lhs.4 'instr', Lhs.5, Lhs.0, Lhs.1, Lhs.2, Lhs.3, Rhs.4 1183383 ~0% {8} | JOIN WITH AliasedSSA::MemoryLocation#4b9f223c ON FIRST 1 OUTPUT Lhs.1 'instr', Lhs.3, Lhs.4, Lhs.5, Lhs.6, Lhs.2, Lhs.7, Lhs.0 'result' 1183383 ~0% {5} | JOIN WITH `project#AliasedSSA::hasResultMemoryAccess/9#732473d4#6` ON FIRST 6 OUTPUT Lhs.0 'instr', Lhs.6, Lhs.7 'result', _, Lhs.5 {4} | REWRITE WITH Out.3 := booleanNot(In.4), TEST Out.3 != InOut.1 KEEPING 4 944455 ~3% {2} | SCAN OUTPUT In.0 'instr', In.2 'result' 2959612 ~0% {2} r11 = r4 UNION r5 UNION r7 UNION r8 UNION r9 UNION r10 return r11 ```
1 parent fb047a6 commit 3f093ae

File tree

1 file changed

+21
-3
lines changed
  • cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal

1 file changed

+21
-3
lines changed

cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasedSSA.qll

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -899,6 +899,24 @@ class MemoryLocation extends FinalMemoryLocation {
899899
MemoryLocation() { not useOverlapWithBusyDef(this) }
900900
}
901901

902+
bindingset[fun]
903+
pragma[inline_late]
904+
private MemoryLocation getUnknownMemoryLocation(IRFunction fun, boolean isMayAccess) {
905+
result = TUnknownMemoryLocation(fun, isMayAccess)
906+
}
907+
908+
bindingset[fun]
909+
pragma[inline_late]
910+
private MemoryLocation getAllAliasedMemory(IRFunction fun, boolean isMayAccess) {
911+
result = TAllAliasedMemory(fun, isMayAccess)
912+
}
913+
914+
bindingset[fun]
915+
pragma[inline_late]
916+
private MemoryLocation getAllNonLocalMemory(IRFunction fun, boolean isMayAccess) {
917+
result = TAllNonLocalMemory(fun, isMayAccess)
918+
}
919+
902920
MemoryLocation getResultMemoryLocation(Instruction instr) {
903921
not canReuseSsaForOldResult(instr) and
904922
exists(MemoryAccessKind kind, boolean isMayAccess |
@@ -926,7 +944,7 @@ MemoryLocation getResultMemoryLocation(Instruction instr) {
926944
// And otherwise we assign it a memory location that groups all the relevant memory locations into one.
927945
result = getGroupedMemoryLocation(var, unbindBool(isMayAccess), false)
928946
)
929-
else result = TUnknownMemoryLocation(instr.getEnclosingIRFunction(), isMayAccess)
947+
else result = getUnknownMemoryLocation(instr.getEnclosingIRFunction(), isMayAccess)
930948
)
931949
or
932950
kind instanceof EntireAllocationMemoryAccess and
@@ -935,10 +953,10 @@ MemoryLocation getResultMemoryLocation(Instruction instr) {
935953
unbindBool(isMayAccess))
936954
or
937955
kind instanceof EscapedMemoryAccess and
938-
result = TAllAliasedMemory(instr.getEnclosingIRFunction(), isMayAccess)
956+
result = getAllAliasedMemory(instr.getEnclosingIRFunction(), isMayAccess)
939957
or
940958
kind instanceof NonLocalMemoryAccess and
941-
result = TAllNonLocalMemory(instr.getEnclosingIRFunction(), isMayAccess)
959+
result = getAllNonLocalMemory(instr.getEnclosingIRFunction(), isMayAccess)
942960
)
943961
)
944962
}

0 commit comments

Comments
 (0)