NAME=pdct region ast if-else diamond
FILE=malloc://64
ARGS=-a x86 -b 64
CMDS=<<EOF
wx 83ff01 7507 b801000000 eb05 b802000000 c3 @ 0
af @ 0
pdct
EOF
EXPECT=<<EOF
seq 0x00000000
  if-else 0x00000000
    bb 0x0000000c
    bb 0x00000005
  bb 0x00000011
EOF
RUN

NAME=pdct region ast while loop
FILE=malloc://64
ARGS=-a x86 -b 64
CMDS=<<EOF
wx b800000000 83f80a 7d07 83c001 ebf6 0000 c3 @ 0
af @ 0
pdct
EOF
EXPECT=<<EOF
seq 0x00000000
  bb 0x00000000
  while 0x00000005
    bb 0x0000000a
  bb 0x00000011
EOF
RUN

NAME=pdct region ast sequential fall-through blocks
FILE=bins/elf/ppc64v1-more
CMDS=<<EOF
s 0x4bf8
af
pdct
EOF
EXPECT=<<EOF
seq 0x00004bf8
  bb 0x00004bf8
  bb 0x00004c08
  bb 0x00004c18
EOF
RUN

NAME=pdct region ast single-armed if on ppc64
FILE=bins/elf/ppc64v1-more
CMDS=<<EOF
s 0xd500
af
pdct
EOF
EXPECT=<<EOF
seq 0x0000d500
  if 0x0000d500
    bb 0x0000d588
  bb 0x0000d598
EOF
RUN

NAME=pdct region ast switch with case arms
FILE=bins/jmptbl/test_gcc_5.5.0_64.out
CMDS=<<EOF
aa
s main
pdct
EOF
EXPECT=<<EOF
seq 0x00000580
  if-else 0x00000580
    bb 0x00000622
    switch 0x0000058d
      goto 0x00000622
      bb 0x000005b2
      bb 0x000005c0
      bb 0x000005ce
      bb 0x000005dc
      bb 0x000005ea
      bb 0x000005f8
      bb 0x00000606
      bb 0x00000614
      bb 0x0000059f
  bb 0x000005ab
EOF
RUN

NAME=pdct region ast single block
FILE=bins/elf/ls
CMDS=<<EOF
s sym.main
af
pdct
EOF
EXPECT=<<EOF
bb 0x00005ae0
EOF
RUN

NAME=pdct region ast loop behind a fail-only fallthrough block
FILE=malloc://64
ARGS=-a x86 -b 64
CMDS=<<EOF
af+ 0 test
afb+ 0 0 4 0xffffffffffffffff 0x10
afb+ 0 0x10 4 0x20 0x30
afb+ 0 0x20 4 0x10
afb+ 0 0x30 4
pdct
EOF
EXPECT=<<EOF
seq 0x00000000
  bb 0x00000000
  while 0x00000010
    bb 0x00000020
  bb 0x00000030
EOF
RUN

NAME=pdct region ast bottom-tested loop keeps the exit outside
FILE=malloc://64
ARGS=-a x86 -b 64
CMDS=<<EOF
wx 31c0eb0c83c00183f80a7504c390909089c3ebf0
af
pdct
EOF
EXPECT=<<EOF
seq 0x00000000
  bb 0x00000000
  do-while 0x00000010
    seq 0x00000004
      if 0x00000004
        continue 0x00000010
      break 0x0000000c
  bb 0x0000000c
EOF
RUN

NAME=pdct region ast owns a second loop exit target and jumps to it
FILE=bins/elf/ls
CMDS=<<EOF
aaa
pdct @ 0xd350
EOF
EXPECT=<<EOF
seq 0x0000d350
  if-else 0x0000d350
    bb 0x0000d36b
    seq 0x0000d360
      while 0x0000d360
        if-else 0x0000d370
          continue 0x0000d360
          goto 0x0000d379
      goto 0x0000d36b
  bb 0x0000d379
EOF
RUN

NAME=pdct region ast irreducible cycle falls back to gotos
FILE=malloc://64
ARGS=-a x86 -b 64
CMDS=<<EOF
wx 85c0740a83c00183f80075f8c39089c3ebf5
af
pdct
EOF
EXPECT=<<EOF
seq 0x00000000
  if-else 0x00000000
    bb 0x0000000e
    bb 0x00000004
  if 0x00000007
    goto 0x00000004
  bb 0x0000000c
EOF
RUN

NAME=pdct region ast has no arm for an unset switch default
FILE=bins/elf/boa-mips
CMDS=<<EOF
af @ 0x415694
pdct @ 0x415694
EOF
EXPECT=<<EOF
seq 0x00415694
  if 0x00415694
    seq 0x004156b8
      switch 0x004156b8
      bb 0x004156e0
      bb 0x0041573c
  bb 0x00415760
EOF
RUN

NAME=pdct region ast joins a switch through its default edge
FILE=bins/elf/bomb
CMDS=<<EOF
aaa
pdct @ 0x400f43
EOF
EXPECT=<<EOF
seq 0x00400f43
  if 0x00400f43
    bb 0x00400f65
  if-else 0x00400f6a
    bb 0x00400fad
    switch 0x00400f71
      seq 0x00400f7c
        bb 0x00400f7c
        if 0x00400fbe
          bb 0x00400fc4
        bb 0x00400fc9
      seq 0x00400fb9
        bb 0x00400fb9
        goto 0x00400fbe
      seq 0x00400f83
        bb 0x00400f83
        goto 0x00400fbe
      seq 0x00400f8a
        bb 0x00400f8a
        goto 0x00400fbe
      seq 0x00400f91
        bb 0x00400f91
        goto 0x00400fbe
      seq 0x00400f98
        bb 0x00400f98
        goto 0x00400fbe
      seq 0x00400f9f
        bb 0x00400f9f
        goto 0x00400fbe
      seq 0x00400fa6
        bb 0x00400fa6
        goto 0x00400fbe
      goto 0x00400fad
EOF
RUN

NAME=pdct region ast keeps both arms when a loop header branches inside the loop
FILE=malloc://64
ARGS=-a x86 -b 64
CMDS=<<EOF
wx 85c0750583c001ebf783e80183f8057402ebedc3
af
pdct
EOF
EXPECT=<<EOF
seq 0x00000000
  do-while 0x00000000
    if-else 0x00000000
      seq 0x00000009
        if 0x00000009
          seq 0x00000011
            bb 0x00000011
            continue 0x00000000
        break 0x00000013
      bb 0x00000004
  bb 0x00000013
EOF
RUN

NAME=pdct region ast keeps the body of a loop whose header jumps to itself
FILE=malloc://64
ARGS=-a x86 -b 64
CMDS=<<EOF
wx 85c074fc83c00183f80575f4c3
af
pdct
EOF
EXPECT=<<EOF
seq 0x00000000
  do-while 0x00000000
    if 0x00000000
      seq 0x00000004
        if 0x00000004
          continue 0x00000000
        break 0x0000000c
  bb 0x0000000c
EOF
RUN
