xref: /freebsd-src/contrib/llvm-project/clang/include/clang/Analysis/FlowSensitive/SimplifyConstraints.h (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
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 
16 namespace clang {
17 namespace dataflow {
18 
19 /// Information on the way a set of constraints was simplified.
20 struct 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).
43 void 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