123 lines · plain
1; REQUIRES: asserts2; RUN: opt -mcpu=thunderx2t99 -passes=loop-unroll --debug-only=loop-unroll --debug-only=basicblock-utils -S -unroll-allow-partial < %s 2>&1 | FileCheck %s3 4target triple = "aarch64-unknown-linux-gnu"5 6; CHECK: Loop Unroll: F[foo] Loop %loop.header7; CHECK: Loop Size = 188; CHECK: Exiting block %loop.inc: TripCount=512, TripMultiple=0, BreakoutTrip=09; CHECK: UNROLLING loop %loop.header by 410; CHECK: Merging:11; CHECK: Loop Unroll: F[foo] Loop %loop.2.header12; CHECK: Loop Size = 1913; CHECK: Exiting block %loop.2.inc: TripCount=512, TripMultiple=0, BreakoutTrip=014; CHECK: UNROLLING loop %loop.2.header by 415; CHECK: Merging:16; CHECK: %counter = phi i32 [ 0, %entry ], [ %inc.3, %loop.inc.3 ]17; CHECK: %val = add nuw nsw i32 %counter, 518; CHECK: %val1 = add nuw nsw i32 %counter, 619; CHECK: %val2 = add nuw nsw i32 %counter, 720; CHECK: %val3 = add nuw nsw i32 %counter, 821; CHECK: %val4 = add nuw nsw i32 %counter, 922; CHECK: %val5 = add nuw nsw i32 %counter, 1023; CHECK-NOT: %val = add i32 %counter, 524; CHECK-NOT: %val = add i32 %counter, 625; CHECK-NOT: %val = add i32 %counter, 726; CHECK-NOT: %val = add i32 %counter, 827; CHECK-NOT: %val = add i32 %counter, 928; CHECK-NOT: %val = add i32 %counter, 1029; CHECK: %counter.2 = phi i32 [ 0, %exit.0 ], [ %inc.2.3, %loop.2.inc.3 ]30 31define void @foo(ptr %out) {32entry:33 %0 = alloca [1024 x i32]34 %x0 = alloca [1024 x i32]35 %x01 = alloca [1024 x i32]36 %x02 = alloca [1024 x i32]37 %x03 = alloca [1024 x i32]38 %x04 = alloca [1024 x i32]39 %x05 = alloca [1024 x i32]40 %x06 = alloca [1024 x i32]41 br label %loop.header42 43loop.header:44 %counter = phi i32 [0, %entry], [%inc, %loop.inc]45 br label %loop.body46 47loop.body:48 %ptr = getelementptr [1024 x i32], ptr %0, i32 0, i32 %counter49 store i32 %counter, ptr %ptr50 %val = add i32 %counter, 551 %xptr = getelementptr [1024 x i32], ptr %x0, i32 0, i32 %counter52 store i32 %val, ptr %xptr53 %val1 = add i32 %counter, 654 %xptr1 = getelementptr [1024 x i32], ptr %x01, i32 0, i32 %counter55 store i32 %val1, ptr %xptr156 %val2 = add i32 %counter, 757 %xptr2 = getelementptr [1024 x i32], ptr %x02, i32 0, i32 %counter58 store i32 %val2, ptr %xptr259 %val3 = add i32 %counter, 860 %xptr3 = getelementptr [1024 x i32], ptr %x03, i32 0, i32 %counter61 store i32 %val3, ptr %xptr362 %val4 = add i32 %counter, 963 %xptr4 = getelementptr [1024 x i32], ptr %x04, i32 0, i32 %counter64 store i32 %val4, ptr %xptr465 %val5 = add i32 %counter, 1066 %xptr5 = getelementptr [1024 x i32], ptr %x05, i32 0, i32 %counter67 store i32 %val5, ptr %xptr568 br label %loop.inc69 70loop.inc:71 %inc = add i32 %counter, 272 %1 = icmp sge i32 %inc, 102373 br i1 %1, label %exit.0, label %loop.header74 75exit.0:76 %2 = getelementptr [1024 x i32], ptr %0, i32 0, i32 577 %3 = load i32, ptr %278 store i32 %3, ptr %out79 br label %loop.2.header80 81 82loop.2.header:83 %counter.2 = phi i32 [0, %exit.0], [%inc.2, %loop.2.inc]84 br label %loop.2.body85 86loop.2.body:87 %ptr.2 = getelementptr [1024 x i32], ptr %0, i32 0, i32 %counter.288 store i32 %counter.2, ptr %ptr.289 %val.2 = add i32 %counter.2, 590 %xptr.2 = getelementptr [1024 x i32], ptr %x0, i32 0, i32 %counter.291 store i32 %val.2, ptr %xptr.292 %val1.2 = add i32 %counter.2, 693 %xptr1.2 = getelementptr [1024 x i32], ptr %x01, i32 0, i32 %counter.294 store i32 %val1, ptr %xptr1.295 %val2.2 = add i32 %counter.2, 796 %xptr2.2 = getelementptr [1024 x i32], ptr %x02, i32 0, i32 %counter.297 store i32 %val2, ptr %xptr2.298 %val3.2 = add i32 %counter.2, 899 %xptr3.2 = getelementptr [1024 x i32], ptr %x03, i32 0, i32 %counter.2100 store i32 %val3.2, ptr %xptr3.2101 %val4.2 = add i32 %counter.2, 9102 %xptr4.2 = getelementptr [1024 x i32], ptr %x04, i32 0, i32 %counter.2103 store i32 %val4.2, ptr %xptr4.2104 %val5.2 = add i32 %counter.2, 10105 %xptr5.2 = getelementptr [1024 x i32], ptr %x05, i32 0, i32 %counter.2106 store i32 %val5.2, ptr %xptr5.2107 %xptr6.2 = getelementptr [1024 x i32], ptr %x06, i32 0, i32 %counter.2108 store i32 %val5.2, ptr %xptr6.2109 br label %loop.2.inc110 111loop.2.inc:112 %inc.2 = add i32 %counter.2, 2113 %4 = icmp sge i32 %inc.2, 1023114 br i1 %4, label %exit.2, label %loop.2.header115 116exit.2:117 %x2 = getelementptr [1024 x i32], ptr %0, i32 0, i32 6118 %x3 = load i32, ptr %x2119 %out2 = getelementptr i32, ptr %out, i32 1120 store i32 %3, ptr %out2121 ret void122}123