1; RUN: llc -march=hexagon -mcpu=hexagonv4 -no-phi-elim-live-out-early-exit \ 2; RUN: < %s | FileCheck %s 3; Check that we remove the compare and induction variable instructions 4; after generating hardware loops. 5; Bug 6685. 6 7; CHECK: loop0 8; CHECK-NOT: r{{[0-9]+}}{{.}}={{.}}add(r{{[0-9]+}},{{.}}#-1) 9; CHECK-NOT: cmp.eq 10; CHECK: endloop0 11 12define i32 @test1(i32* nocapture %b, i32 %n) nounwind readonly { 13entry: 14 %cmp1 = icmp sgt i32 %n, 0 15 br i1 %cmp1, label %for.body.preheader, label %for.end 16 17for.body.preheader: 18 br label %for.body 19 20for.body: ; preds = %for.body.preheader, %for.body 21 %sum.03 = phi i32 [ %add, %for.body ], [ 0, %for.body.preheader ] 22 %arrayidx.phi = phi i32* [ %arrayidx.inc, %for.body ], [ %b, %for.body.preheader ] 23 %i.02 = phi i32 [ %inc, %for.body ], [ 0, %for.body.preheader ] 24 %0 = load i32, i32* %arrayidx.phi, align 4 25 %add = add nsw i32 %0, %sum.03 26 %inc = add nsw i32 %i.02, 1 27 %exitcond = icmp eq i32 %inc, %n 28 %arrayidx.inc = getelementptr i32, i32* %arrayidx.phi, i32 1 29 br i1 %exitcond, label %for.end.loopexit, label %for.body 30 31for.end.loopexit: 32 br label %for.end 33 34for.end: 35 %sum.0.lcssa = phi i32 [ 0, %entry ], [ %add, %for.end.loopexit ] 36 ret i32 %sum.0.lcssa 37} 38 39; This test checks that that initial loop count value is removed. 40; CHECK-NOT: ={{.}}#40 41; CHECK: loop0 42; CHECK-NOT: r{{[0-9]+}}{{.}}={{.}}add(r{{[0-9]+}},{{.}}#-1) 43; CHECK-NOT: cmp.eq 44; CHECK: endloop0 45 46define i32 @test2(i32* nocapture %b) nounwind readonly { 47entry: 48 br label %for.body 49 50for.body: 51 %sum.02 = phi i32 [ 0, %entry ], [ %add, %for.body ] 52 %arrayidx.phi = phi i32* [ %b, %entry ], [ %arrayidx.inc, %for.body ] 53 %i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ] 54 %0 = load i32, i32* %arrayidx.phi, align 4 55 %add = add nsw i32 %0, %sum.02 56 %inc = add nsw i32 %i.01, 1 57 %exitcond = icmp eq i32 %inc, 40 58 %arrayidx.inc = getelementptr i32, i32* %arrayidx.phi, i32 1 59 br i1 %exitcond, label %for.end, label %for.body 60 61for.end: 62 ret i32 %add 63} 64 65; This test checks that we don't remove the induction variable since it's used. 66; CHECK: loop0 67; CHECK: r{{[0-9]+}}{{.}}={{.}}add(r{{[0-9]+}},{{.}}#1) 68; CHECK-NOT: cmp.eq 69; CHECK: endloop0 70define i32 @test3(i32* nocapture %b) nounwind { 71entry: 72 br label %for.body 73 74for.body: 75 %arrayidx.phi = phi i32* [ %b, %entry ], [ %arrayidx.inc, %for.body ] 76 %i.01 = phi i32 [ 0, %entry ], [ %inc, %for.body ] 77 store i32 %i.01, i32* %arrayidx.phi, align 4 78 %inc = add nsw i32 %i.01, 1 79 %exitcond = icmp eq i32 %inc, 40 80 %arrayidx.inc = getelementptr i32, i32* %arrayidx.phi, i32 1 81 br i1 %exitcond, label %for.end, label %for.body 82 83for.end: 84 ret i32 0 85} 86 87 88