68 lines · plain
1; RUN: opt -passes='break-crit-edges,lower-switch,mergereturn' -S < %s | FileCheck %s2 3; The pass did previously not report the correct Modified status in the case4; where a function had at most one return block, and an unified unreachable5; block was created. This was caught by the pass return status check that is6; hidden under EXPENSIVE_CHECKS.7 8; CHECK: for.foo.body2:9; CHECK-NEXT: br label %UnifiedUnreachableBlock10 11; CHECK: for.foo.end:12; CHECK-NEXT: br label %UnifiedUnreachableBlock13 14; CHECK: UnifiedUnreachableBlock:15; CHECK-NEXT: unreachable16 17define i32 @foo() {18entry:19 br label %for.foo.cond20 21for.foo.cond: ; preds = %entry22 br i1 false, label %for.foo.body, label %for.foo.end323 24for.foo.body: ; preds = %for.foo.cond25 br label %for.foo.cond126 27for.foo.cond1: ; preds = %for.foo.body28 br i1 false, label %for.foo.body2, label %for.foo.end29 30for.foo.body2: ; preds = %for.foo.cond131 unreachable32 33for.foo.end: ; preds = %for.foo.cond134 unreachable35 36for.foo.end3: ; preds = %for.foo.cond37 ret i32 undef38}39 40; CHECK: for.bar.body2:41; CHECK-NEXT: br label %UnifiedUnreachableBlock42 43; CHECK: for.bar.end:44; CHECK-NEXT: br label %UnifiedUnreachableBlock45 46; CHECK: UnifiedUnreachableBlock:47; CHECK-NEXT: unreachable48 49define void @bar() {50entry:51 br label %for.bar.cond52 53for.bar.cond: ; preds = %entry54 br i1 false, label %for.bar.body, label %for.bar.end55 56for.bar.body: ; preds = %for.bar.cond57 br label %for.bar.cond158 59for.bar.cond1: ; preds = %for.bar.body60 br i1 false, label %for.bar.body2, label %for.bar.end61 62for.bar.body2: ; preds = %for.bar.cond163 unreachable64 65for.bar.end: ; preds = %for.bar.cond166 unreachable67}68