Skip to content

Commit 79075e0

Browse files
committed
Simplify join logic, add some proper unit tests
1 parent eaaf9c1 commit 79075e0

File tree

2 files changed

+143
-167
lines changed

2 files changed

+143
-167
lines changed

clang/lib/Analysis/FlowSensitive/Models/NullPointerAnalysisModel.cpp

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -592,37 +592,55 @@ void NullPointerAnalysisModel::join(QualType Type, const Value &Val1,
592592
auto *LHSVar = cast_or_null<BoolValue>(Val1.getProperty(Name));
593593
auto *RHSVar = cast_or_null<BoolValue>(Val2.getProperty(Name));
594594

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) {
606600
case SR::Nullptr:
607-
return MergedEnv.makeAtomicBoolValue();
601+
return nullptr;
608602
case SR::Top:
609-
return *LHSVar;
603+
return &MergedEnv.makeTopBoolValue();
610604
case SR::True:
611-
return MergedEnv.getBoolLiteralValue(true);
605+
return &MergedEnv.getBoolLiteralValue(true);
612606
case SR::False:
613-
return MergedEnv.getBoolLiteralValue(false);
607+
return &MergedEnv.getBoolLiteralValue(false);
614608
case SR::Unknown:
615-
break;
609+
return VarToSimplify;
616610
}
617-
}
611+
};
612+
613+
LHSVar = SimplifyVar(LHSVar, Env1);
614+
LHSVar = SimplifyVar(RHSVar, Env2);
618615

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())))
622632
return *LHSVar;
623-
}
624633

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;
626644
};
627645

628646
BoolValue &NonnullValue = MergeValues(kIsNonnull);

0 commit comments

Comments
 (0)