@@ -592,37 +592,55 @@ void NullPointerAnalysisModel::join(QualType Type, const Value &Val1,
592
592
auto *LHSVar = cast_or_null<BoolValue>(Val1.getProperty (Name));
593
593
auto *RHSVar = cast_or_null<BoolValue>(Val2.getProperty (Name));
594
594
595
- if (LHSVar == RHSVar)
596
- return LHSVar ? *LHSVar : MergedEnv.makeAtomicBoolValue ();
597
-
598
- SatisfiabilityResult LHSResult = computeSatisfiability (LHSVar, Env1);
599
- SatisfiabilityResult RHSResult = computeSatisfiability (RHSVar, Env2);
600
-
601
- // Handle special cases.
602
- if (LHSResult == SR::Top || RHSResult == SR::Top) {
603
- return MergedEnv.makeTopBoolValue ();
604
- } else if (LHSResult == RHSResult) {
605
- switch (LHSResult) {
595
+ const auto SimplifyVar = [&](BoolValue *VarToSimplify,
596
+ const Environment &Env) -> BoolValue * {
597
+ SatisfiabilityResult SatResult =
598
+ computeSatisfiability (VarToSimplify, Env);
599
+ switch (SatResult) {
606
600
case SR::Nullptr:
607
- return MergedEnv. makeAtomicBoolValue () ;
601
+ return nullptr ;
608
602
case SR::Top:
609
- return *LHSVar ;
603
+ return &MergedEnv. makeTopBoolValue () ;
610
604
case SR::True:
611
- return MergedEnv.getBoolLiteralValue (true );
605
+ return & MergedEnv.getBoolLiteralValue (true );
612
606
case SR::False:
613
- return MergedEnv.getBoolLiteralValue (false );
607
+ return & MergedEnv.getBoolLiteralValue (false );
614
608
case SR::Unknown:
615
- break ;
609
+ return VarToSimplify ;
616
610
}
617
- }
611
+ };
612
+
613
+ LHSVar = SimplifyVar (LHSVar, Env1);
614
+ LHSVar = SimplifyVar (RHSVar, Env2);
618
615
619
- if (LHSVar && RHSVar &&
620
- MergedEnv.proves (MergedEnv.arena ().makeEquals (LHSVar->formula (),
621
- RHSVar->formula ()))) {
616
+ // Handle special cases.
617
+ if (LHSVar == RHSVar)
618
+ return LHSVar ? *LHSVar : MergedEnv.makeAtomicBoolValue ();
619
+ else if (isa<TopBoolValue>(LHSVar) || isa<TopBoolValue>(RHSVar))
620
+ return MergedEnv.makeTopBoolValue ();
621
+
622
+ if (!LHSVar)
623
+ LHSVar = &MergedEnv.makeAtomicBoolValue ();
624
+
625
+ if (!RHSVar)
626
+ RHSVar = &MergedEnv.makeAtomicBoolValue ();
627
+
628
+ assert (LHSVar != nullptr && RHSVar != nullptr );
629
+
630
+ if (MergedEnv.proves (
631
+ MergedEnv.arena ().makeEquals (LHSVar->formula (), RHSVar->formula ())))
622
632
return *LHSVar;
623
- }
624
633
625
- return MergedEnv.makeTopBoolValue ();
634
+ BoolValue &ReturnVar = MergedEnv.makeAtomicBoolValue ();
635
+ Arena &A = MergedEnv.arena ();
636
+
637
+ MergedEnv.assume (A.makeOr (
638
+ A.makeAnd (A.makeAtomRef (Env1.getFlowConditionToken ()),
639
+ A.makeEquals (ReturnVar.formula (), LHSVar->formula ())),
640
+ A.makeAnd (A.makeAtomRef (Env2.getFlowConditionToken ()),
641
+ A.makeEquals (ReturnVar.formula (), RHSVar->formula ()))));
642
+
643
+ return ReturnVar;
626
644
};
627
645
628
646
BoolValue &NonnullValue = MergeValues (kIsNonnull );
0 commit comments