1; RUN: opt -passes='break-crit-edges,lower-switch,mergereturn' -S < %s | FileCheck %s 2 3; The pass did previously not report the correct Modified status in the case 4; where a function had at most one return block, and an unified unreachable 5; block was created. This was caught by the pass return status check that is 6; hidden under EXPENSIVE_CHECKS. 7 8; CHECK: for.foo.body2: 9; CHECK-NEXT: br label %UnifiedUnreachableBlock 10 11; CHECK: for.foo.end: 12; CHECK-NEXT: br label %UnifiedUnreachableBlock 13 14; CHECK: UnifiedUnreachableBlock: 15; CHECK-NEXT: unreachable 16 17define i32 @foo() { 18entry: 19 br label %for.foo.cond 20 21for.foo.cond: ; preds = %entry 22 br i1 false, label %for.foo.body, label %for.foo.end3 23 24for.foo.body: ; preds = %for.foo.cond 25 br label %for.foo.cond1 26 27for.foo.cond1: ; preds = %for.foo.body 28 br i1 false, label %for.foo.body2, label %for.foo.end 29 30for.foo.body2: ; preds = %for.foo.cond1 31 unreachable 32 33for.foo.end: ; preds = %for.foo.cond1 34 unreachable 35 36for.foo.end3: ; preds = %for.foo.cond 37 ret i32 undef 38} 39 40; CHECK: for.bar.body2: 41; CHECK-NEXT: br label %UnifiedUnreachableBlock 42 43; CHECK: for.bar.end: 44; CHECK-NEXT: br label %UnifiedUnreachableBlock 45 46; CHECK: UnifiedUnreachableBlock: 47; CHECK-NEXT: unreachable 48 49define void @bar() { 50entry: 51 br label %for.bar.cond 52 53for.bar.cond: ; preds = %entry 54 br i1 false, label %for.bar.body, label %for.bar.end 55 56for.bar.body: ; preds = %for.bar.cond 57 br label %for.bar.cond1 58 59for.bar.cond1: ; preds = %for.bar.body 60 br i1 false, label %for.bar.body2, label %for.bar.end 61 62for.bar.body2: ; preds = %for.bar.cond1 63 unreachable 64 65for.bar.end: ; preds = %for.bar.cond1 66 unreachable 67} 68