170 lines · plain
1; RUN: opt < %s -S -passes=loop-unroll -mtriple aarch64 -mcpu=falkor | FileCheck %s2; RUN: opt < %s -S -passes=loop-unroll -mtriple aarch64 -mcpu=falkor -enable-falkor-hwpf-unroll-fix=0 | FileCheck %s --check-prefix=NOHWPF3 4; Check that loop unroller doesn't exhaust HW prefetcher resources.5 6; Partial unroll 2 times for this loop on falkor instead of 4.7; NOHWPF-LABEL: @unroll1(8; NOHWPF-LABEL: loop:9; NOHWPF-NEXT: phi10; NOHWPF-NEXT: getelementptr11; NOHWPF-NEXT: load12; NOHWPF-NEXT: getelementptr13; NOHWPF-NEXT: load14; NOHWPF-NEXT: add15; NOHWPF-NEXT: getelementptr16; NOHWPF-NEXT: load17; NOHWPF-NEXT: getelementptr18; NOHWPF-NEXT: load19; NOHWPF-NEXT: add20; NOHWPF-NEXT: getelementptr21; NOHWPF-NEXT: load22; NOHWPF-NEXT: getelementptr23; NOHWPF-NEXT: load24; NOHWPF-NEXT: add25; NOHWPF-NEXT: getelementptr26; NOHWPF-NEXT: load27; NOHWPF-NEXT: getelementptr28; NOHWPF-NEXT: load29; NOHWPF-NEXT: add30; NOHWPF-NEXT: icmp31; NOHWPF-NEXT: br32; NOHWPF-NEXT-LABEL: exit:33;34; CHECK-LABEL: @unroll1(35; CHECK-LABEL: loop:36; CHECK-NEXT: phi37; CHECK-NEXT: getelementptr38; CHECK-NEXT: load39; CHECK-NEXT: getelementptr40; CHECK-NEXT: load41; CHECK-NEXT: add42; CHECK-NEXT: getelementptr43; CHECK-NEXT: load44; CHECK-NEXT: getelementptr45; CHECK-NEXT: load46; CHECK-NEXT: add47; CHECK-NEXT: icmp48; CHECK-NEXT: br49; CHECK-NEXT-LABEL: exit:50define void @unroll1(ptr %p, ptr %p2) {51entry:52 br label %loop53 54loop:55 %iv = phi i32 [ 0, %entry ], [ %inc, %loop ]56 57 %gep = getelementptr inbounds i32, ptr %p, i32 %iv58 %load = load volatile i32, ptr %gep59 60 %gep2 = getelementptr inbounds i32, ptr %p2, i32 %iv61 %load2 = load volatile i32, ptr %gep262 63 %inc = add i32 %iv, 164 %exitcnd = icmp uge i32 %inc, 102465 br i1 %exitcnd, label %exit, label %loop66 67exit:68 ret void69}70 71; Partial unroll 4 times for this loop on falkor instead of 8.72; NOHWPF-LABEL: @unroll2(73; NOHWPF-LABEL: loop2:74; NOHWPF-NEXT: phi75; NOHWPF-NEXT: phi76; NOHWPF-NEXT: getelementptr77; NOHWPF-NEXT: load78; NOHWPF-NEXT: add79; NOHWPF-NEXT: add80; NOHWPF-NEXT: getelementptr81; NOHWPF-NEXT: load82; NOHWPF-NEXT: add83; NOHWPF-NEXT: add84; NOHWPF-NEXT: getelementptr85; NOHWPF-NEXT: load86; NOHWPF-NEXT: add87; NOHWPF-NEXT: add88; NOHWPF-NEXT: getelementptr89; NOHWPF-NEXT: load90; NOHWPF-NEXT: add91; NOHWPF-NEXT: add92; NOHWPF-NEXT: getelementptr93; NOHWPF-NEXT: load94; NOHWPF-NEXT: add95; NOHWPF-NEXT: add96; NOHWPF-NEXT: getelementptr97; NOHWPF-NEXT: load98; NOHWPF-NEXT: add99; NOHWPF-NEXT: add100; NOHWPF-NEXT: getelementptr101; NOHWPF-NEXT: load102; NOHWPF-NEXT: add103; NOHWPF-NEXT: add104; NOHWPF-NEXT: getelementptr105; NOHWPF-NEXT: load106; NOHWPF-NEXT: add107; NOHWPF-NEXT: add108; NOHWPF-NEXT: icmp109; NOHWPF-NEXT: br110; NOHWPF-NEXT-LABEL: exit2:111;112; CHECK-LABEL: @unroll2(113; CHECK-LABEL: loop2:114; CHECK-NEXT: phi115; CHECK-NEXT: phi116; CHECK-NEXT: getelementptr117; CHECK-NEXT: load118; CHECK-NEXT: add119; CHECK-NEXT: add120; CHECK-NEXT: getelementptr121; CHECK-NEXT: load122; CHECK-NEXT: add123; CHECK-NEXT: add124; CHECK-NEXT: getelementptr125; CHECK-NEXT: load126; CHECK-NEXT: add127; CHECK-NEXT: add128; CHECK-NEXT: getelementptr129; CHECK-NEXT: load130; CHECK-NEXT: add131; CHECK-NEXT: add132; CHECK-NEXT: icmp133; CHECK-NEXT: br134; CHECK-NEXT-LABEL: exit2:135 136define void @unroll2(ptr %p) {137entry:138 br label %loop1139 140loop1:141 %iv1 = phi i32 [ 0, %entry ], [ %inc1, %loop1.latch ]142 %outer.sum = phi i32 [ 0, %entry ], [ %sum, %loop1.latch ]143 br label %loop2.header144 145loop2.header:146 br label %loop2147 148loop2:149 %iv2 = phi i32 [ 0, %loop2.header ], [ %inc2, %loop2 ]150 %sum = phi i32 [ %outer.sum, %loop2.header ], [ %sum.inc, %loop2 ]151 %gep = getelementptr inbounds i32, ptr %p, i32 %iv2152 %load = load i32, ptr %gep153 %sum.inc = add i32 %sum, %load154 %inc2 = add i32 %iv2, 1155 %exitcnd2 = icmp uge i32 %inc2, 1024156 br i1 %exitcnd2, label %exit2, label %loop2157 158exit2:159 br label %loop1.latch160 161loop1.latch:162 %inc1 = add i32 %iv1, 1163 %exitcnd1 = icmp uge i32 %inc1, 1024164 br i1 %exitcnd2, label %exit, label %loop1165 166exit:167 ret void168}169 170