| ; RUN: llc < %s -verify-machineinstrs -mtriple=aarch64-none-linux-gnu | FileCheck %s |
| |
| ; Verify there is no tiny block having only one mov wzr instruction between for.body.lr.ph and sw.epilog.loopexit |
| define void @unroll_by_2(i32 %trip_count, i32* %p) { |
| ; CHECK-LABEL: unroll_by_2 |
| ; CHECK: // %for.body.lr.ph |
| ; CHECK: mov w{{[0-9]+}}, wzr |
| ; CHECK: b.eq |
| ; CHECK-NOT: mov w{{[0-9]+}}, wzr |
| ; CHECK: // %for.body.lr.ph.new |
| ; CHECK: // %for.body |
| ; CHECK: // %sw.epilog.loopexit |
| ; CHECK: // %for.body.epil |
| ; CHECK: // %exit |
| ; CHECK-NEXT: ret |
| for.body.lr.ph: |
| %xtraiter = and i32 %trip_count, 1 |
| %cmp = icmp eq i32 %trip_count, 1 |
| br i1 %cmp, label %sw.epilog.loopexit, label %for.body.lr.ph.new |
| |
| for.body.lr.ph.new: |
| %unroll_iter = sub nsw i32 %trip_count, %xtraiter |
| br label %for.body |
| |
| for.body: |
| %indvars = phi i32 [ 0, %for.body.lr.ph.new ], [ %indvars.next, %for.body ] |
| %niter = phi i32 [ %unroll_iter, %for.body.lr.ph.new ], [ %niter.nsub, %for.body ] |
| %array = getelementptr inbounds i32, i32 * %p, i32 %indvars |
| store i32 %niter, i32* %array |
| %indvars.next = add i32 %indvars, 2 |
| %niter.nsub = add i32 %niter, -2 |
| %niter.ncmp = icmp eq i32 %niter.nsub, 0 |
| br i1 %niter.ncmp, label %sw.epilog.loopexit, label %for.body |
| |
| sw.epilog.loopexit: |
| %indvars.unr = phi i32 [ 0, %for.body.lr.ph ], [ %indvars.next, %for.body ] |
| %lcmp.mod = icmp eq i32 %xtraiter, 0 |
| br i1 %lcmp.mod, label %exit, label %for.body.epil |
| |
| for.body.epil: |
| %array.epil = getelementptr inbounds i32, i32* %p, i32 %indvars.unr |
| store i32 %indvars.unr, i32* %array.epil |
| br label %exit |
| |
| exit: |
| ret void |
| } |