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/Bitcode/Writer/BitcodeWriter.cpp | |
parent | 5cf3cc624609b420319acef498becf48cc011c9a (diff) | |
download | llvm-00aab1d45e1f67fbc265ed5ea4b2230148181970.zip llvm-00aab1d45e1f67fbc265ed5ea4b2230148181970.tar.gz llvm-00aab1d45e1f67fbc265ed5ea4b2230148181970.tar.bz2 |
[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/Bitcode/Writer/BitcodeWriter.cpp')
0 files changed, 0 insertions, 0 deletions