; RUN: llc -mtriple x86_64-- -stop-before peephole-opt -o %t.mir %s ; RUN: llc -mtriple x86_64-- -run-pass none %t.mir -verify-machineinstrs -o - | FileCheck %s ; Unreachable blocks in the machine instr representation are these ; weird empty blocks with no successors. ; The MIR printer used to not print empty lists of successors. However, ; the MIR parser now treats non-printed list of successors as "please ; guess it for me". As a result, the parser tries to guess the list of ; successors and given the block is empty, just assumes it falls through ; the next block. ; ; The following test case used to fail the verifier because the false ; path ended up falling through split.true and now, the definition of ; %v does not dominate all its uses. ; Indeed, we go from the following CFG: ; entry ; / \ ; true (def) false ; | ; split.true (use) ; ; To this one: ; entry ; / \ ; true (def) false ; | / <-- invalid edge ; split.true (use) ; ; Because of the invalid edge, we get the "def does not ; dominate all uses" error. ; ; CHECK-LABEL: name: foo ; CHECK-LABEL: bb.{{[0-9]+}}.false: ; CHECK-NEXT: successors: ; CHECK-NOT: %bb.{{[0-9]+}}.split.true ; CHECK-LABEL: bb.{{[0-9]+}}.split.true: define void @foo(i32* %bar) { br i1 undef, label %true, label %false true: %v = load i32, i32* %bar br label %split.true false: unreachable split.true: %vInc = add i32 %v, 1 store i32 %vInc, i32* %bar ret void }