|  | ; 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 | 
|  | } |