[CFG] what are class 3 edges ?

Sunzir Deepur sunzird@gmail.com
Thu Aug 9 22:45:00 GMT 2007


Hi Emmanuel,

On 8/3/07, Emmanuel Fleury <fleury@labri.fr> wrote:
> Sunzir Deepur wrote:
> > what are class 3 edges ?
> > why make them ?
> > if i understand ok, they do not represent a legit flow of code...
>
> Switches:
>
> switch (c) {
>   case '0':
>        do some stuff;
>        break;
>   case '1':
>        do some other stuff;
>        break;
>   default:
>        exit(1);
> }

thank you for the replying.
i compiled the following simple code:

int main(int argc)
{
        switch(argc) {
                case 0:
                        printf("hi");
                        break;
                default:
                        printf("hihihi");
                        break;
        }
}

and produced the vcg file using -dv -fdump-rtl-stack.

the CFG have 3 of those class 3 edges. one of them link between the case 0
and the default case in the switch. I do not understand why does that edge
exist at all. it clearly links between two basic blocks that will not ever
have a flow of code between them. there is no way the default will be executed
after the case 0 because of the break instruction.

I have removed all class 3 edges from the vcg and then it became a more
loyal description of the legit flow of code. is that right ?

I am attaching the original vcg file, the one i made by removing the
class 3 edges,
and a jpeg picture of them (on the left is the original, the green edges are
the class 3 edges, and they connect between the two cases of the switches.
on the right is my new graph, no green edges. this one seems more right
to me).

so why are those class 3 edges created at all ?

thank you a lot for taking the time to help,
sunzir

>
> Regards
> --
> Emmanuel Fleury
>
> A thing is not necessarily true because a man dies for it.
>  -- Oscar Wilde
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: why-class-3-edges.JPG
Type: image/jpeg
Size: 35030 bytes
Desc: not available
URL: <https://gcc.gnu.org/pipermail/gcc/attachments/20070809/468c26b9/attachment.jpe>
-------------- next part --------------
graph: {
port_sharing: no
graph: { title: "main"
folding: 1
hidden: 2
node: { title: "main.0" }
graph: {
title: "main.BB0"
folding: 1
color: lightblue
label: "basic block 0"

edge: { sourcename: "main.0" targetname: "main.6" color: blue }
node: {
  title: "main.6"
  color: lightgrey
  label: "note 6
 NOTE_INSN_BASIC_BLOCK"
}
edge: { sourcename: "main.6" targetname: "main.45" }
node: {
  title: "main.45"
  color: green
  label: "insn 45
(set (reg:SI 2 cx)
    (plus:SI (reg/f:SI 7 sp)
        (const_int 4 [0x4])))
"
}
edge: { sourcename: "main.45" targetname: "main.46" }
node: {
  title: "main.46"
  color: green
  label: "insn 46
(parallel [
        (set (reg/f:SI 7 sp)
            (and:SI (reg/f:SI 7 sp)
                (const_int -16 [0xfffffffffffffff0])))
        (clobber (reg:CC 17 flags))
    ])
"
}
edge: { sourcename: "main.46" targetname: "main.47" }
node: {
  title: "main.47"
  color: green
  label: "insn 47
(set (mem:SI (pre_dec:SI (reg/f:SI 7 sp)) [0 S4 A8])
    (mem/c:SI (plus:SI (reg:SI 2 cx)
            (const_int -4 [0xfffffffffffffffc])) [0 S4 A8]))
"
}
edge: { sourcename: "main.47" targetname: "main.48" }
node: {
  title: "main.48"
  color: green
  label: "insn 48
(set (mem:SI (pre_dec:SI (reg/f:SI 7 sp)) [0 S4 A8])
    (reg/f:SI 6 bp))
"
}
edge: { sourcename: "main.48" targetname: "main.49" }
node: {
  title: "main.49"
  color: green
  label: "insn 49
(set (reg/f:SI 6 bp)
    (reg/f:SI 7 sp))
"
}
edge: { sourcename: "main.49" targetname: "main.50" }
node: {
  title: "main.50"
  color: green
  label: "insn 50
(set (mem:SI (pre_dec:SI (reg/f:SI 7 sp)) [0 S4 A8])
    (reg:SI 2 cx))
"
}
edge: { sourcename: "main.50" targetname: "main.51" }
node: {
  title: "main.51"
  color: green
  label: "insn 51
(parallel [
        (set (reg/f:SI 7 sp)
            (plus:SI (reg/f:SI 7 sp)
                (const_int -4 [0xfffffffffffffffc])))
        (clobber (reg:CC 17 flags))
        (clobber (mem:BLK (scratch) [0 A8]))
    ])
"
}
edge: { sourcename: "main.51" targetname: "main.9" }
node: {
  title: "main.9"
  color: green
  label: "insn 9
(set (reg:SI 0 ax [orig:60 argc ] [60])
    (mem/c/i:SI (reg/f:SI 2 cx [59]) [0 argc+0 S4 A32]))
"
}
edge: { sourcename: "main.9" targetname: "main.10" }
node: {
  title: "main.10"
  color: green
  label: "insn 10
(set (reg:CCZ 17 flags)
    (compare:CCZ (reg:SI 0 ax [orig:60 argc ] [60])
        (const_int 0 [0x0])))
"
}
edge: { sourcename: "main.10" targetname: "main.11" }
node: {
  title: "main.11"
  color: darkgreen
  label: "jump_insn 11
(set (pc)
    (if_then_else (eq (reg:CCZ 17 flags)
            (const_int 0 [0x0]))
        (label_ref 14)
        (pc)))
"
}
}
edge: { sourcename: "main.11" targetname: "main.14" color: blue }
edge: { sourcename: "main.11" targetname: "main.40" color: blue }
edge: { sourcename: "main.11" targetname: "main.12" }
graph: {
title: "main.BB2"
folding: 1
color: lightblue
label: "basic block 2"

node: {
  title: "main.40"
  color: lightgrey
  label: "note 40
 NOTE_INSN_BASIC_BLOCK"
}
edge: { sourcename: "main.40" targetname: "main.12" }
node: {
  title: "main.12"
  color: darkgreen
  label: "jump_insn 12
(set (pc)
    (label_ref 22))
"
}
}
edge: { sourcename: "main.12" targetname: "main.22" color: blue }
edge: { sourcename: "main.12" targetname: "main.14" color: green class: 3 }
graph: {
title: "main.BB3"
folding: 1
color: lightblue
label: "basic block 3"

node: {
  title: "main.14"
  color: darkgrey
  shape: ellipse
  label: "code_label 14
 3 3 \"\" [1 uses]
"
}
edge: { sourcename: "main.14" targetname: "main.17" }
node: {
  title: "main.17"
  color: green
  label: "insn 17
(set (mem:SI (reg/f:SI 7 sp) [0 S4 A32])
    (symbol_ref/f:SI (\"*.LC0\") [flags 0x2] <string_cst 0xb7de7f40>))
"
}
edge: { sourcename: "main.17" targetname: "main.18" }
node: {
  title: "main.18"
  color: darkgreen
  label: "call_insn 18
(set (reg:SI 0 ax)
    (call (mem:QI (symbol_ref:SI (\"printf\") [flags 0x41] <function_decl 0xb7d9fc80 printf>) [0 S1 A8])
        (const_int 4 [0x4])))
"
}
edge: { sourcename: "main.18" targetname: "main.20" }
node: {
  title: "main.20"
  color: darkgreen
  label: "jump_insn 20
(set (pc)
    (label_ref:SI 43))
"
}
}
edge: { sourcename: "main.20" targetname: "main.43" color: blue }
edge: { sourcename: "main.20" targetname: "main.22" color: green class: 3 }
graph: {
title: "main.BB4"
folding: 1
color: lightblue
label: "basic block 4"

node: {
  title: "main.22"
  color: darkgrey
  shape: ellipse
  label: "code_label 22
 4 2 \"\" [1 uses]
"
}
edge: { sourcename: "main.22" targetname: "main.25" }
node: {
  title: "main.25"
  color: green
  label: "insn 25
(set (mem:SI (reg/f:SI 7 sp) [0 S4 A32])
    (symbol_ref/f:SI (\"*.LC1\") [flags 0x2] <string_cst 0xb7de7fa0>))
"
}
edge: { sourcename: "main.25" targetname: "main.26" }
node: {
  title: "main.26"
  color: darkgreen
  label: "call_insn 26
(set (reg:SI 0 ax)
    (call (mem:QI (symbol_ref:SI (\"printf\") [flags 0x41] <function_decl 0xb7d9fc80 printf>) [0 S1 A8])
        (const_int 4 [0x4])))
"
}
}
edge: { sourcename: "main.26" targetname: "main.43" }
graph: {
title: "main.BB6"
folding: 1
color: lightblue
label: "basic block 6"

node: {
  title: "main.43"
  color: darkgrey
  shape: ellipse
  label: "code_label 43
 6 6 \"\" [1 uses]
"
}
edge: { sourcename: "main.43" targetname: "main.33" }
node: {
  title: "main.33"
  color: green
  label: "insn 33
(clobber (reg/i:SI 0 ax))
"
}
edge: { sourcename: "main.33" targetname: "main.38" }
node: {
  title: "main.38"
  color: green
  label: "insn 38
(use (reg/i:SI 0 ax))
"
}
edge: { sourcename: "main.38" targetname: "main.54" }
node: {
  title: "main.54"
  color: green
  label: "insn 54
(parallel [
        (set (reg/f:SI 7 sp)
            (plus:SI (reg/f:SI 7 sp)
                (const_int 4 [0x4])))
        (clobber (reg:CC 17 flags))
        (clobber (mem:BLK (scratch) [0 A8]))
    ])
"
}
edge: { sourcename: "main.54" targetname: "main.55" }
node: {
  title: "main.55"
  color: green
  label: "insn 55
(parallel [
        (set (reg:SI 2 cx)
            (mem:SI (reg/f:SI 7 sp) [0 S4 A8]))
        (set (reg/f:SI 7 sp)
            (plus:SI (reg/f:SI 7 sp)
                (const_int 4 [0x4])))
    ])
"
}
edge: { sourcename: "main.55" targetname: "main.56" }
node: {
  title: "main.56"
  color: green
  label: "insn 56
(parallel [
        (set (reg/f:SI 6 bp)
            (mem:SI (reg/f:SI 7 sp) [0 S4 A8]))
        (set (reg/f:SI 7 sp)
            (plus:SI (reg/f:SI 7 sp)
                (const_int 4 [0x4])))
    ])
"
}
edge: { sourcename: "main.56" targetname: "main.57" }
node: {
  title: "main.57"
  color: green
  label: "insn 57
(parallel [
        (set (reg/f:SI 7 sp)
            (plus:SI (reg:SI 2 cx)
                (const_int -4 [0xfffffffffffffffc])))
        (clobber (reg:CC 17 flags))
    ])
"
}
edge: { sourcename: "main.57" targetname: "main.58" }
node: {
  title: "main.58"
  color: darkgreen
  label: "jump_insn 58
(return)
"
}
}
edge: { sourcename: "main.58" targetname: "main.999999" color: blue }
edge: { sourcename: "main.58" targetname: "main.999999" color: green class: 3 }
node: { title: "main.999999" label: "END" }
}
}
-------------- next part --------------
graph: {
port_sharing: no
graph: { title: "main"
folding: 1
hidden: 2
node: { title: "main.0" }
graph: {
title: "main.BB0"
folding: 1
color: lightblue
label: "basic block 0"

edge: { sourcename: "main.0" targetname: "main.6" color: blue }
node: {
  title: "main.6"
  color: lightgrey
  label: "note 6
 NOTE_INSN_BASIC_BLOCK"
}
edge: { sourcename: "main.6" targetname: "main.45" }
node: {
  title: "main.45"
  color: green
  label: "insn 45
(set (reg:SI 2 cx)
    (plus:SI (reg/f:SI 7 sp)
        (const_int 4 [0x4])))
"
}
edge: { sourcename: "main.45" targetname: "main.46" }
node: {
  title: "main.46"
  color: green
  label: "insn 46
(parallel [
        (set (reg/f:SI 7 sp)
            (and:SI (reg/f:SI 7 sp)
                (const_int -16 [0xfffffffffffffff0])))
        (clobber (reg:CC 17 flags))
    ])
"
}
edge: { sourcename: "main.46" targetname: "main.47" }
node: {
  title: "main.47"
  color: green
  label: "insn 47
(set (mem:SI (pre_dec:SI (reg/f:SI 7 sp)) [0 S4 A8])
    (mem/c:SI (plus:SI (reg:SI 2 cx)
            (const_int -4 [0xfffffffffffffffc])) [0 S4 A8]))
"
}
edge: { sourcename: "main.47" targetname: "main.48" }
node: {
  title: "main.48"
  color: green
  label: "insn 48
(set (mem:SI (pre_dec:SI (reg/f:SI 7 sp)) [0 S4 A8])
    (reg/f:SI 6 bp))
"
}
edge: { sourcename: "main.48" targetname: "main.49" }
node: {
  title: "main.49"
  color: green
  label: "insn 49
(set (reg/f:SI 6 bp)
    (reg/f:SI 7 sp))
"
}
edge: { sourcename: "main.49" targetname: "main.50" }
node: {
  title: "main.50"
  color: green
  label: "insn 50
(set (mem:SI (pre_dec:SI (reg/f:SI 7 sp)) [0 S4 A8])
    (reg:SI 2 cx))
"
}
edge: { sourcename: "main.50" targetname: "main.51" }
node: {
  title: "main.51"
  color: green
  label: "insn 51
(parallel [
        (set (reg/f:SI 7 sp)
            (plus:SI (reg/f:SI 7 sp)
                (const_int -4 [0xfffffffffffffffc])))
        (clobber (reg:CC 17 flags))
        (clobber (mem:BLK (scratch) [0 A8]))
    ])
"
}
edge: { sourcename: "main.51" targetname: "main.9" }
node: {
  title: "main.9"
  color: green
  label: "insn 9
(set (reg:SI 0 ax [orig:60 argc ] [60])
    (mem/c/i:SI (reg/f:SI 2 cx [59]) [0 argc+0 S4 A32]))
"
}
edge: { sourcename: "main.9" targetname: "main.10" }
node: {
  title: "main.10"
  color: green
  label: "insn 10
(set (reg:CCZ 17 flags)
    (compare:CCZ (reg:SI 0 ax [orig:60 argc ] [60])
        (const_int 0 [0x0])))
"
}
edge: { sourcename: "main.10" targetname: "main.11" }
node: {
  title: "main.11"
  color: darkgreen
  label: "jump_insn 11
(set (pc)
    (if_then_else (eq (reg:CCZ 17 flags)
            (const_int 0 [0x0]))
        (label_ref 14)
        (pc)))
"
}
}
edge: { sourcename: "main.11" targetname: "main.14" color: blue }
edge: { sourcename: "main.11" targetname: "main.40" color: blue }
edge: { sourcename: "main.11" targetname: "main.12" }
graph: {
title: "main.BB2"
folding: 1
color: lightblue
label: "basic block 2"

node: {
  title: "main.40"
  color: lightgrey
  label: "note 40
 NOTE_INSN_BASIC_BLOCK"
}
edge: { sourcename: "main.40" targetname: "main.12" }
node: {
  title: "main.12"
  color: darkgreen
  label: "jump_insn 12
(set (pc)
    (label_ref 22))
"
}
}
edge: { sourcename: "main.12" targetname: "main.22" color: blue }
graph: {
title: "main.BB3"
folding: 1
color: lightblue
label: "basic block 3"

node: {
  title: "main.14"
  color: darkgrey
  shape: ellipse
  label: "code_label 14
 3 3 \"\" [1 uses]
"
}
edge: { sourcename: "main.14" targetname: "main.17" }
node: {
  title: "main.17"
  color: green
  label: "insn 17
(set (mem:SI (reg/f:SI 7 sp) [0 S4 A32])
    (symbol_ref/f:SI (\"*.LC0\") [flags 0x2] <string_cst 0xb7de7f40>))
"
}
edge: { sourcename: "main.17" targetname: "main.18" }
node: {
  title: "main.18"
  color: darkgreen
  label: "call_insn 18
(set (reg:SI 0 ax)
    (call (mem:QI (symbol_ref:SI (\"printf\") [flags 0x41] <function_decl 0xb7d9fc80 printf>) [0 S1 A8])
        (const_int 4 [0x4])))
"
}
edge: { sourcename: "main.18" targetname: "main.20" }
node: {
  title: "main.20"
  color: darkgreen
  label: "jump_insn 20
(set (pc)
    (label_ref:SI 43))
"
}
}
edge: { sourcename: "main.20" targetname: "main.43" color: blue }
graph: {
title: "main.BB4"
folding: 1
color: lightblue
label: "basic block 4"

node: {
  title: "main.22"
  color: darkgrey
  shape: ellipse
  label: "code_label 22
 4 2 \"\" [1 uses]
"
}
edge: { sourcename: "main.22" targetname: "main.25" }
node: {
  title: "main.25"
  color: green
  label: "insn 25
(set (mem:SI (reg/f:SI 7 sp) [0 S4 A32])
    (symbol_ref/f:SI (\"*.LC1\") [flags 0x2] <string_cst 0xb7de7fa0>))
"
}
edge: { sourcename: "main.25" targetname: "main.26" }
node: {
  title: "main.26"
  color: darkgreen
  label: "call_insn 26
(set (reg:SI 0 ax)
    (call (mem:QI (symbol_ref:SI (\"printf\") [flags 0x41] <function_decl 0xb7d9fc80 printf>) [0 S1 A8])
        (const_int 4 [0x4])))
"
}
}
edge: { sourcename: "main.26" targetname: "main.43" }
graph: {
title: "main.BB6"
folding: 1
color: lightblue
label: "basic block 6"

node: {
  title: "main.43"
  color: darkgrey
  shape: ellipse
  label: "code_label 43
 6 6 \"\" [1 uses]
"
}
edge: { sourcename: "main.43" targetname: "main.33" }
node: {
  title: "main.33"
  color: green
  label: "insn 33
(clobber (reg/i:SI 0 ax))
"
}
edge: { sourcename: "main.33" targetname: "main.38" }
node: {
  title: "main.38"
  color: green
  label: "insn 38
(use (reg/i:SI 0 ax))
"
}
edge: { sourcename: "main.38" targetname: "main.54" }
node: {
  title: "main.54"
  color: green
  label: "insn 54
(parallel [
        (set (reg/f:SI 7 sp)
            (plus:SI (reg/f:SI 7 sp)
                (const_int 4 [0x4])))
        (clobber (reg:CC 17 flags))
        (clobber (mem:BLK (scratch) [0 A8]))
    ])
"
}
edge: { sourcename: "main.54" targetname: "main.55" }
node: {
  title: "main.55"
  color: green
  label: "insn 55
(parallel [
        (set (reg:SI 2 cx)
            (mem:SI (reg/f:SI 7 sp) [0 S4 A8]))
        (set (reg/f:SI 7 sp)
            (plus:SI (reg/f:SI 7 sp)
                (const_int 4 [0x4])))
    ])
"
}
edge: { sourcename: "main.55" targetname: "main.56" }
node: {
  title: "main.56"
  color: green
  label: "insn 56
(parallel [
        (set (reg/f:SI 6 bp)
            (mem:SI (reg/f:SI 7 sp) [0 S4 A8]))
        (set (reg/f:SI 7 sp)
            (plus:SI (reg/f:SI 7 sp)
                (const_int 4 [0x4])))
    ])
"
}
edge: { sourcename: "main.56" targetname: "main.57" }
node: {
  title: "main.57"
  color: green
  label: "insn 57
(parallel [
        (set (reg/f:SI 7 sp)
            (plus:SI (reg:SI 2 cx)
                (const_int -4 [0xfffffffffffffffc])))
        (clobber (reg:CC 17 flags))
    ])
"
}
edge: { sourcename: "main.57" targetname: "main.58" }
node: {
  title: "main.58"
  color: darkgreen
  label: "jump_insn 58
(return)
"
}
}
edge: { sourcename: "main.58" targetname: "main.999999" color: blue }
node: { title: "main.999999" label: "END" }
}
}


More information about the Gcc mailing list