@@ -15,6 +15,20 @@ Author: Peter Schrammel
15
15
#include < util/message.h>
16
16
#include < util/string2int.h>
17
17
18
+ optionalt<unsigned > cover_basic_blockst::continuation_of_block (
19
+ const goto_programt::const_targett &instruction,
20
+ cover_basic_blockst::block_mapt &block_map)
21
+ {
22
+ if (instruction->incoming_edges .size () != 1 )
23
+ return {};
24
+
25
+ const goto_programt::targett in_t = *instruction->incoming_edges .cbegin ();
26
+ if (in_t ->is_goto () && !in_t ->is_backwards_goto () && in_t ->guard .is_true ())
27
+ return block_map[in_t ];
28
+
29
+ return {};
30
+ }
31
+
18
32
cover_basic_blockst::cover_basic_blockst (const goto_programt &_goto_program)
19
33
{
20
34
bool next_is_target = true ;
@@ -25,25 +39,13 @@ cover_basic_blockst::cover_basic_blockst(const goto_programt &_goto_program)
25
39
// Is it a potential beginning of a block?
26
40
if (next_is_target || it->is_target ())
27
41
{
28
- // We keep the block number if this potential block
29
- // is a continuation of a previous block through
30
- // unconditional forward gotos; otherwise we increase the
31
- // block number.
32
- bool increase_block_nr = true ;
33
- if (it->incoming_edges .size () == 1 )
42
+ if (auto block_number = continuation_of_block (it, block_map))
34
43
{
35
- goto_programt::targett in_t = *it->incoming_edges .begin ();
36
- if (
37
- in_t ->is_goto () && !in_t ->is_backwards_goto () &&
38
- in_t ->guard .is_true ())
39
- {
40
- current_block = block_map[in_t ];
41
- increase_block_nr = false ;
42
- }
44
+ current_block = *block_number;
43
45
}
44
- if (increase_block_nr)
46
+ else
45
47
{
46
- block_infos.push_back ( block_infot () );
48
+ block_infos.emplace_back ( );
47
49
block_infos.back ().representative_inst = it;
48
50
block_infos.back ().source_location = source_locationt::nil ();
49
51
current_block = block_infos.size () - 1 ;
0 commit comments