; RUN: llvm-as < %s | opt -predsimplify -instcombine -simplifycfg | llvm-dis | grep -v declare | not grep fail &&
; RUN: llvm-as < %s | opt -predsimplify -instcombine -simplifycfg | llvm-dis | grep -v declare | grep pass | wc -l | grep 3

void %test1(int %x) {
entry:
  %A = seteq int %x, 0
  br bool %A, label %then.1, label %else.1
then.1:
  %B = seteq int %x, 1
  br bool %B, label %then.2, label %else.1
then.2:
  call void (...)* %fail( )
  ret void
else.1:
  ret void
}

void %test2(int %x) {
entry:
  %A = seteq int %x, 0
  %B = seteq int %x, 1
  br bool %A, label %then.1, label %else.1
then.1:
  br bool %B, label %then.2, label %else.1
then.2:
  call void (...)* %fail( )
  ret void
else.1:
  ret void
}

void %test3(int %x) {
entry:
  %A = seteq int %x, 0
  %B = seteq int %x, 1
  br bool %A, label %then.1, label %else.1
then.1:
  br bool %B, label %then.2, label %else.1
then.2:
  call void (...)* %fail( )
  ret void
else.1:
  ret void
}

void %test4(int %x, int %y) {
entry:
  %A = seteq int %x, 0
  %B = seteq int %y, 0
  %C = and bool %A, %B
  br bool %C, label %then.1, label %else.1
then.1:
  %D = seteq int %x, 0
  br bool %D, label %then.2, label %else.2
then.2:
  %E = seteq int %y, 0
  br bool %E, label %else.1, label %else.2
else.1:
  ret void
else.2:
  call void (...)* %fail( )
  ret void
}

void %test5(int %x) {
entry:
  %A = seteq int %x, 0
  br bool %A, label %then.1, label %else.1
then.1:
  ret void
then.2:
  call void (...)* %fail( )
  ret void
else.1:
  %B = seteq int %x, 0
  br bool %B, label %then.2, label %then.1
}

void %test6(int %x, int %y) {
entry:
  %A = seteq int %x, 0
  %B = seteq int %y, 0
  %C = or bool %A, %B
  br bool %C, label %then.1, label %else.1
then.1:
  ret void
then.2:
  call void (...)* %fail( )
  ret void
else.1:
  %D = seteq int %x, 0
  br bool %D, label %then.2, label %else.2
else.2:
  %E = setne int %y, 0
  br bool %E, label %then.1, label %then.2
}

void %test7(int %x) {
entry:
  %A = setne int %x, 0
  %B = xor bool %A, true
  br bool %B, label %then.1, label %else.1
then.1:
  %C = seteq int %x, 1
  br bool %C, label %then.2, label %else.1
then.2:
  call void (...)* %fail( )
  ret void
else.1:
  ret void
}

void %test8(int %x) {
entry:
  %A = add int %x, 1
  %B = seteq int %x, 0
  br bool %B, label %then.1, label %then.2
then.1:
  %C = seteq int %A, 1
  br bool %C, label %then.2, label %else.2
then.2:
  ret void
else.2:
  call void (...)* %fail( )
  ret void
}

void %test9(int %y, int %z) {
entry:
  %x = add int %y, %z
  %A = seteq int %y, 3
  %B = seteq int %z, 5
  %C = and bool %A, %B
  br bool %C, label %cond_true, label %return

cond_true:
  %D = seteq int %x, 8
  br bool %D, label %then, label %oops

then:
  call void (...)* %pass( )
  ret void

oops:
  call void (...)* %fail( )
  ret void

return:
  ret void
}

void %switch1(int %x) {
entry:
  %A = seteq int %x, 10
  br bool %A, label %return, label %cond_false

cond_false:
  switch int %x, label %return [
    int 9, label %then1
    int 10, label %then2
  ]

then1:
  call void (...)* %pass( )
  ret void

then2:
  call void (...)* %fail( )
  ret void

return:
  ret void
}

void %switch2(int %x) {
entry:
  %A = seteq int %x, 10
  br bool %A, label %return, label %cond_false

cond_false:
  switch int %x, label %return [
    int 8, label %then1
    int 9, label %then1
    int 10, label %then1
  ]

then1:
  %B = setne int %x, 8
  br bool %B, label %then2, label %return

then2:
  call void (...)* %pass( )
  ret void

return:
  ret void
}

void %switch3(int %x) {
entry:
  %A = seteq int %x, 10
  br bool %A, label %return, label %cond_false

cond_false:
  switch int %x, label %return [
    int 9, label %then1
    int 10, label %then1
  ]

then1:
  %B = seteq int %x, 9
  br bool %B, label %return, label %oops

oops:
  call void (...)* %fail( )
  ret void

return:
  ret void
}

void %switch4(int %x) {
entry:
  %A = seteq int %x, 10
  br bool %A, label %then1, label %cond_false

cond_false:
  switch int %x, label %default [
    int 9, label %then1
    int 10, label %then2
  ]

then1:
  ret void

then2:
  ret void

default:
  %B = seteq int %x, 9
  br bool %B, label %oops, label %then1

oops:
  call void (...)* %fail( )
  ret void
}

void %select1(int %x) {
entry:
  %A = seteq int %x, 10
  %B = select bool %A, int 1, int 2
  %C = seteq int %B, 1
  br bool %C, label %then, label %else

then:
  br bool %A, label %return, label %oops

else:
  br bool %A, label %oops, label %return

oops:
  call void (...)* %fail( )
  ret void

return:
  ret void
}

void %select2(int %x) {
entry:
  %A = seteq int %x, 10
  %B = select bool %A, int 1, int 2
  %C = seteq int %B, 1
  br bool %A, label %then, label %else

then:
  br bool %C, label %return, label %oops

else:
  br bool %C, label %oops, label %return

oops:
  call void (...)* %fail( )
  ret void

return:
  ret void
}

declare void %fail(...)

declare void %pass(...)
