@@ -496,8 +496,7 @@ private predicate mk_NonmemberFunctionCall(Function fcn, HC_Args args, FunctionC
496
496
analyzableNonmemberFunctionCall ( fc ) and
497
497
(
498
498
exists ( HashCons head , HC_Args tail |
499
- args = HC_ArgCons ( head , fc .getNumberOfArguments ( ) - 1 , tail ) and
500
- mk_ArgCons ( head , fc .getNumberOfArguments ( ) - 1 , tail , fc )
499
+ mk_ArgConsInner ( head , tail , fc .getNumberOfArguments ( ) - 1 , args , fc )
501
500
)
502
501
or
503
502
fc .getNumberOfArguments ( ) = 0 and
@@ -517,8 +516,7 @@ private predicate mk_ExprCall(HashCons hc, HC_Args args, ExprCall ec) {
517
516
hc .getAnExpr ( ) = ec .getExpr ( ) and
518
517
(
519
518
exists ( HashCons head , HC_Args tail |
520
- args = HC_ArgCons ( head , ec .getNumberOfArguments ( ) - 1 , tail ) and
521
- mk_ArgCons ( head , ec .getNumberOfArguments ( ) - 1 , tail , ec )
519
+ mk_ArgConsInner ( head , tail , ec .getNumberOfArguments ( ) - 1 , args , ec )
522
520
)
523
521
or
524
522
ec .getNumberOfArguments ( ) = 0 and
@@ -547,8 +545,7 @@ private predicate mk_MemberFunctionCall(
547
545
hashCons ( fc .getQualifier ( ) .getFullyConverted ( ) ) = qual and
548
546
(
549
547
exists ( HashCons head , HC_Args tail |
550
- args = HC_ArgCons ( head , fc .getNumberOfArguments ( ) - 1 , tail ) and
551
- mk_ArgCons ( head , fc .getNumberOfArguments ( ) - 1 , tail , fc )
548
+ mk_ArgConsInner ( head , tail , fc .getNumberOfArguments ( ) - 1 , args , fc )
552
549
)
553
550
or
554
551
fc .getNumberOfArguments ( ) = 0 and
@@ -568,13 +565,12 @@ private predicate analyzableCall(Call c) {
568
565
* Holds if `fc` is a call to `fcn`, `fc`'s first `i` arguments have hash-cons
569
566
* `list`, and `fc`'s argument at index `i` has hash-cons `hc`.
570
567
*/
571
- private predicate mk_ArgCons ( HashCons hc , int i , HC_Args list , Call c ) {
568
+ private predicate mk_ArgCons ( HashCons hc , int i , HC_Args list , Call c ) {
572
569
analyzableCall ( c ) and
573
570
hc = hashCons ( c .getArgument ( i ) .getFullyConverted ( ) ) and
574
571
(
575
572
exists ( HashCons head , HC_Args tail |
576
- list = HC_ArgCons ( head , i - 1 , tail ) and
577
- mk_ArgCons ( head , i - 1 , tail , c ) and
573
+ mk_ArgConsInner ( head , tail , i - 1 , list , c ) and
578
574
i > 0
579
575
)
580
576
or
@@ -583,6 +579,12 @@ private predicate mk_ArgCons(HashCons hc, int i, HC_Args list,Call c) {
583
579
)
584
580
}
585
581
582
+ // avoid a join ordering issue
583
+ pragma [ noopt]
584
+ private predicate mk_ArgConsInner ( HashCons head , HC_Args tail , int i , HC_Args list , Call c ) {
585
+ list = HC_ArgCons ( head , i , tail ) and
586
+ mk_ArgCons ( head , i , tail , c )
587
+ }
586
588
587
589
/**
588
590
* Holds if `fc` is a call to `fcn`, `fc`'s first `i` arguments have hash-cons
0 commit comments