1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -S -loop-unroll -simplifycfg | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; PR12513: Loop unrolling breaks with indirect branches. 3*9880d681SAndroid Build Coastguard Worker; If loop unrolling attempts to transform this loop, it replaces the 4*9880d681SAndroid Build Coastguard Worker; indirectbr successors. SimplifyCFG then considers them to be unreachable. 5*9880d681SAndroid Build Coastguard Workerdeclare void @subtract() nounwind uwtable 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: unreachable 8*9880d681SAndroid Build Coastguard Workerdefine i32 @main(i32 %argc, i8** nocapture %argv) nounwind uwtable { 9*9880d681SAndroid Build Coastguard Workerentry: 10*9880d681SAndroid Build Coastguard Worker %vals19 = alloca [5 x i32], align 16 11*9880d681SAndroid Build Coastguard Worker %x20 = alloca i32, align 4 12*9880d681SAndroid Build Coastguard Worker store i32 135, i32* %x20, align 4 13*9880d681SAndroid Build Coastguard Worker br label %for.body 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = ; %call2_termjoin, %call3_termjoin 16*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 0, %entry ], [ %joinphi15.in.in, %call2_termjoin ] 17*9880d681SAndroid Build Coastguard Worker %a6 = call coldcc i8* @funca(i8* blockaddress(@main, %for.body_code), i8* 18*9880d681SAndroid Build Coastguard Workerblockaddress(@main, %for.body_codeprime)) nounwind 19*9880d681SAndroid Build Coastguard Worker indirectbr i8* %a6, [label %for.body_code, label %for.body_codeprime] 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerfor.body_code: ; preds = %for.body 22*9880d681SAndroid Build Coastguard Worker call void @subtract() 23*9880d681SAndroid Build Coastguard Worker br label %call2_termjoin 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Workercall2_termjoin: ; preds = %for.body_codeprime, %for.body_code 26*9880d681SAndroid Build Coastguard Worker %joinphi15.in.in = add i64 %indvars.iv, 1 27*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i64 %joinphi15.in.in, 5 28*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %call2_termjoin 31*9880d681SAndroid Build Coastguard Worker ret i32 0 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerfor.body_codeprime: ; preds = %for.body 34*9880d681SAndroid Build Coastguard Worker call void @subtract_v2(i64 %indvars.iv) 35*9880d681SAndroid Build Coastguard Worker br label %call2_termjoin 36*9880d681SAndroid Build Coastguard Worker} 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Workerdeclare coldcc i8* @funca(i8*, i8*) readonly 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerdeclare void @subtract_v2(i64) nounwind uwtable 41