1//===-- SimplifyConstraints.h -----------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_CLANG_ANALYSIS_FLOWSENSITIVE_SIMPLIFYCONSTRAINTS_H
10#define LLVM_CLANG_ANALYSIS_FLOWSENSITIVE_SIMPLIFYCONSTRAINTS_H
11
12#include "clang/Analysis/FlowSensitive/Arena.h"
13#include "clang/Analysis/FlowSensitive/Formula.h"
14#include "llvm/ADT/SetVector.h"
15
16namespace clang {
17namespace dataflow {
18
19/// Information on the way a set of constraints was simplified.
20struct SimplifyConstraintsInfo {
21 /// List of equivalence classes of atoms. For each equivalence class, the
22 /// original constraints imply that all atoms in it must be equivalent.
23 /// Simplification replaces all occurrences of atoms in an equivalence class
24 /// with a single representative atom from the class.
25 /// Does not contain equivalence classes with just one member or atoms
26 /// contained in `TrueAtoms` or `FalseAtoms`.
27 llvm::SmallVector<llvm::SmallVector<Atom>> EquivalentAtoms;
28 /// Atoms that the original constraints imply must be true.
29 /// Simplification replaces all occurrences of these atoms by a true literal
30 /// (which may enable additional simplifications).
31 llvm::SmallVector<Atom> TrueAtoms;
32 /// Atoms that the original constraints imply must be false.
33 /// Simplification replaces all occurrences of these atoms by a false literal
34 /// (which may enable additional simplifications).
35 llvm::SmallVector<Atom> FalseAtoms;
36};
37
38/// Simplifies a set of constraints (implicitly connected by "and") in a way
39/// that does not change satisfiability of the constraints. This does _not_ mean
40/// that the set of solutions is the same before and after simplification.
41/// `Info`, if non-null, will be populated with information about the
42/// simplifications that were made to the formula (e.g. to display to the user).
43void simplifyConstraints(llvm::SetVector<const Formula *> &Constraints,
44 Arena &arena, SimplifyConstraintsInfo *Info = nullptr);
45
46} // namespace dataflow
47} // namespace clang
48
49#endif // LLVM_CLANG_ANALYSIS_FLOWSENSITIVE_SIMPLIFYCONSTRAINTS_H
50

source code of clang/include/clang/Analysis/FlowSensitive/SimplifyConstraints.h