; RUN: opt -S -loop-fusion -loop-fusion-peel-max-count=3 < %s | FileCheck %s ; Tests that we do not fuse two guarded loops together. ; These loops do not have the same trip count, and the first loop meets the ; requirements for peeling. However, the exit block of the first loop makes the ; loops unsafe to fuse together. ; The expected output of this test is the function as below. ; CHECK-LABEL: void @unsafe_exitblock(i32* noalias %A, i32* noalias %B) ; CHECK: for.first.guard ; CHECK: br i1 %cmp3, label %for.first.preheader, label %for.second.guard ; CHECK: for.first.preheader: ; CHECK-NEXT: br label %for.first ; CHECK: for.first: ; CHECK: br i1 %cmp, label %for.first, label %for.first.exit ; CHECK: for.first.exit: ; CHECK-NEXT: call void @bar() ; CHECK-NEXT: br label %for.second.guard ; CHECK: for.second.guard: ; CHECK: br i1 %cmp21, label %for.second.preheader, label %for.end ; CHECK: for.second.preheader: ; CHECK-NEXT: br label %for.second ; CHECK: for.second: ; CHECK: br i1 %cmp2, label %for.second, label %for.second.exit ; CHECK: for.second.exit: ; CHECK-NEXT: br label %for.end ; CHECK: for.end: ; CHECK-NEXT: ret void define void @unsafe_exitblock(i32* noalias %A, i32* noalias %B) { for.first.guard: %cmp3 = icmp slt i64 0, 45 br i1 %cmp3, label %for.first.preheader, label %for.second.guard for.first.preheader: ; preds = %for.first.guard br label %for.first for.first: ; preds = %for.first.preheader, %for.first %i.04 = phi i64 [ %inc, %for.first ], [ 0, %for.first.preheader ] %arrayidx = getelementptr inbounds i32, i32* %A, i64 %i.04 store i32 0, i32* %arrayidx, align 4 %inc = add nsw i64 %i.04, 1 %cmp = icmp slt i64 %inc, 45 br i1 %cmp, label %for.first, label %for.first.exit for.first.exit: ; preds = %for.first call void @bar() br label %for.second.guard for.second.guard: ; preds = %for.first.exit, %for.first.guard %cmp21 = icmp slt i64 2,45 br i1 %cmp21, label %for.second.preheader, label %for.end for.second.preheader: ; preds = %for.second.guard br label %for.second for.second: ; preds = %for.second.preheader, %for.second %j.02 = phi i64 [ %inc6, %for.second ], [ 2, %for.second.preheader ] %arrayidx4 = getelementptr inbounds i32, i32* %B, i64 %j.02 store i32 0, i32* %arrayidx4, align 4 %inc6 = add nsw i64 %j.02, 1 %cmp2 = icmp slt i64 %inc6, 45 br i1 %cmp2, label %for.second, label %for.second.exit for.second.exit: ; preds = %for.second br label %for.end for.end: ; preds = %for.second.exit, %for.second.guard ret void } declare void @bar()