diff options
| author | Kristof Umann <dkszelethus@gmail.com> | 2019-07-03 12:53:19 +0000 | 
|---|---|---|
| committer | Kristof Umann <dkszelethus@gmail.com> | 2019-07-03 12:53:19 +0000 | 
| commit | 00aab1d45e1f67fbc265ed5ea4b2230148181970 (patch) | |
| tree | e288b807ca296ba4aa8fda363994c8b302fa23c0 /llvm/lib/Analysis/AssumptionCache.cpp | |
| parent | 5cf3cc624609b420319acef498becf48cc011c9a (diff) | |
| download | bcm5719-llvm-00aab1d45e1f67fbc265ed5ea4b2230148181970.tar.gz bcm5719-llvm-00aab1d45e1f67fbc265ed5ea4b2230148181970.zip  | |
[analyzer][CFG] Return the correct terminator condition
For the following terminator statement:
if (A && B && C && D)
The built CFG is the following:
[B5 (ENTRY)]
  Succs (1): B4
[B1]
  1: 10
  2: j
  3: [B1.2] (ImplicitCastExpr, LValueToRValue, int)
  4: [B1.1] / [B1.3]
  5: int x = 10 / j;
  Preds (1): B2
  Succs (1): B0
[B2]
  1: C
  2: [B2.1] (ImplicitCastExpr, LValueToRValue, _Bool)
  T: if [B4.4] && [B3.2] && [B2.2]
  Preds (1): B3
  Succs (2): B1 B0
[B3]
  1: B
  2: [B3.1] (ImplicitCastExpr, LValueToRValue, _Bool)
  T: [B4.4] && [B3.2] && ...
  Preds (1): B4
  Succs (2): B2 B0
[B4]
  1: 0
  2: int j = 0;
  3: A
  4: [B4.3] (ImplicitCastExpr, LValueToRValue, _Bool)
  T: [B4.4] && ...
  Preds (1): B5
  Succs (2): B3 B0
[B0 (EXIT)]
  Preds (4): B1 B2 B3 B4
However, even though the path of execution in B2 only depends on C's value,
CFGBlock::getCondition() would return the entire condition (A && B && C). For
B3, it would return A && B. I changed this the actual condition.
Differential Revision: https://reviews.llvm.org/D63538
llvm-svn: 365036
Diffstat (limited to 'llvm/lib/Analysis/AssumptionCache.cpp')
0 files changed, 0 insertions, 0 deletions

