Skip to content

Commit c99bff9

Browse files
committed
C++: Fix join in IR construction.
Before (on an internal Microsoft repo): [2026-08-28 14:36:46] Evaluated non-recursive predicate TranslatedElement::TranslatedElement.getInstructionSuccessorInternal/2#dispred#a6e054ca@2248725r in 470505ms (size: 136995987). Evaluated relational algebra for predicate TranslatedElement::TranslatedElement.getInstructionSuccessorInternal/2#dispred#a6e054ca@2248725r with tuple counts: 437 ~0% {2} r158 = JOIN EdgeKind::EdgeKindImpl#8ed21aeb WITH num#InstructionTag::CallTargetTag#8c4ab419 CARTESIAN PRODUCT OUTPUT Lhs.0, Rhs.0 437 ~0% {3} | JOIN WITH num#InstructionTag::CallTag#a77d4021 CARTESIAN PRODUCT OUTPUT Rhs.0, Lhs.0, Lhs.1 1070556919 ~0% {4} | JOIN WITH `TranslatedElement::TranslatedElement.getInstruction/1#dispred#f6df9482_102#join_rhs` ON FIRST 1 OUTPUT Rhs.1, Lhs.1, Lhs.2, Rhs.2 316388 ~1% {4} | JOIN WITH TranslatedInitialization::TranslatedDefaultFieldInitialization#d9c761ed ON FIRST 1 OUTPUT Lhs.0, Lhs.2, Lhs.1, Lhs.3 After: [2026-09-03 13:56:28] Evaluated non-recursive predicate TranslatedInitialization::getCallInstruction/1#c88d849b@3e960544 in 40ms (size: 724). Evaluated relational algebra for predicate TranslatedInitialization::getCallInstruction/1#c88d849b@3e960544 with tuple counts: 724 ~3% {2} r1 = JOIN `_TranslatedElement::TranslatedElement.getInstruction/1#dispred#f6df9482_102#join_rhs_num#Instruction__#shared#1` WITH TranslatedInitialization::TranslatedDefaultFieldInitialization#d9c761ed ON FIRST 1 OUTPUT Lhs.0, Lhs.1 return r1 437 ~0% {2} r5 = JOIN EdgeKind::EdgeKindImpl#8ed21aeb WITH num#InstructionTag::CallTargetTag#8c4ab419 CARTESIAN PRODUCT OUTPUT Lhs.0, Rhs.0 316388 ~1% {4} | JOIN WITH `TranslatedInitialization::getCallInstruction/1#c88d849b` CARTESIAN PRODUCT OUTPUT Rhs.0, Lhs.1, Lhs.0, Rhs.1
1 parent 7aa084c commit c99bff9

1 file changed

Lines changed: 6 additions & 1 deletion

File tree

cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,11 @@ class TranslatedExplicitFieldInitialization extends TranslatedNonDefaultFieldIni
618618
override int getPosition() { result = position }
619619
}
620620

621+
pragma[nomagic]
622+
private Instruction getCallInstruction(TranslatedDefaultFieldInitialization tdfi) {
623+
result = tdfi.getInstruction(CallTag())
624+
}
625+
621626
/**
622627
* The IR translation of the initialization of a field from an element of an initializer
623628
* list where default initialization is used.
@@ -642,7 +647,7 @@ class TranslatedDefaultFieldInitialization extends TranslatedFieldInitialization
642647

643648
override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) {
644649
tag = CallTargetTag() and
645-
result = this.getInstruction(CallTag())
650+
result = getCallInstruction(this)
646651
or
647652
tag = CallTag() and
648653
result = this.getSideEffects().getFirstInstruction(kind)

0 commit comments

Comments
 (0)