200 lines · plain
1; RUN: opt < %s -S -passes=loop-unroll -unroll-threshold=30 | FileCheck %s2; RUN: opt < %s -S -passes=loop-unroll -unroll-threshold=30 -unroll-allow-peeling=false | FileCheck %s --check-prefix=DISABLE3 4define i32 @invariant_backedge_1(i32 %a, i32 %b) {5; CHECK-LABEL: @invariant_backedge_16; CHECK-NOT: %plus = phi7; CHECK: loop.peel:8; CHECK: loop:9; CHECK: %i = phi10; CHECK: %sum = phi11; DISABLE-LABEL: @invariant_backedge_112; DISABLE-NOT: loop.peel:13entry:14 br label %loop15 16loop:17 %i = phi i32 [ 0, %entry ], [ %inc, %loop ]18 %sum = phi i32 [ 0, %entry ], [ %incsum, %loop ]19 %plus = phi i32 [ %a, %entry ], [ %b, %loop ]20 21 %incsum = add i32 %sum, %plus22 %inc = add i32 %i, 123 %cmp = icmp slt i32 %i, 100024 25 br i1 %cmp, label %loop, label %exit26 27exit:28 ret i32 %sum29}30 31define i32 @invariant_backedge_2(i32 %a, i32 %b) {32; This loop should be peeled twice because it has a Phi which becomes invariant33; starting from 3rd iteration.34; CHECK-LABEL: @invariant_backedge_235; CHECK: loop.peel{{.*}}:36; CHECK: loop.peel{{.*}}:37; CHECK: %i = phi38; CHECK: %sum = phi39; CHECK-NOT: %half.inv = phi40; CHECK-NOT: %plus = phi41entry:42 br label %loop43 44loop:45 %i = phi i32 [ 0, %entry ], [ %inc, %loop ]46 %sum = phi i32 [ 0, %entry ], [ %incsum, %loop ]47 %half.inv = phi i32 [ %a, %entry ], [ %b, %loop ]48 %plus = phi i32 [ %a, %entry ], [ %half.inv, %loop ]49 50 %incsum = add i32 %sum, %plus51 %inc = add i32 %i, 152 %cmp = icmp slt i32 %i, 100053 54 br i1 %cmp, label %loop, label %exit55 56exit:57 ret i32 %sum58}59 60define i32 @invariant_backedge_3(i32 %a, i32 %b) {61; This loop should be peeled thrice because it has a Phi which becomes invariant62; starting from 4th iteration.63; CHECK-LABEL: @invariant_backedge_364; CHECK: loop.peel{{.*}}:65; CHECK: loop.peel{{.*}}:66; CHECK: loop.peel{{.*}}:67; CHECK: %i = phi68; CHECK: %sum = phi69; CHECK-NOT: %half.inv = phi70; CHECK-NOT: %half.inv.2 = phi71; CHECK-NOT: %plus = phi72entry:73 br label %loop74 75loop:76 %i = phi i32 [ 0, %entry ], [ %inc, %loop ]77 %sum = phi i32 [ 0, %entry ], [ %incsum, %loop ]78 %half.inv = phi i32 [ %a, %entry ], [ %b, %loop ]79 %half.inv.2 = phi i32 [ %a, %entry ], [ %half.inv, %loop ]80 %plus = phi i32 [ %a, %entry ], [ %half.inv.2, %loop ]81 82 %incsum = add i32 %sum, %plus83 %inc = add i32 %i, 184 %cmp = icmp slt i32 %i, 100085 86 br i1 %cmp, label %loop, label %exit87 88exit:89 ret i32 %sum90}91 92define i32 @invariant_backedge_limited_by_size(i32 %a, i32 %b) {93; This loop should normally be peeled thrice because it has a Phi which becomes94; invariant starting from 4th iteration, but the size of the loop only allows95; us to peel twice because we are restricted to 30 instructions in resulting96; code. Thus, %plus Phi node should stay in loop even despite its backedge97; input is an invariant.98; CHECK-LABEL: @invariant_backedge_limited_by_size99; CHECK: loop.peel{{.*}}:100; CHECK: loop.peel{{.*}}:101; CHECK: %i = phi102; CHECK: %sum = phi103; CHECK: %plus = phi i32 [ %a, {{.*}} ], [ %b, %loop ]104; CHECK-NOT: %half.inv = phi105; CHECK-NOT: %half.inv.2 = phi106entry:107 br label %loop108 109loop:110 %i = phi i32 [ 0, %entry ], [ %inc, %loop ]111 %sum = phi i32 [ 0, %entry ], [ %incsum, %loop ]112 %half.inv = phi i32 [ %a, %entry ], [ %b, %loop ]113 %half.inv.2 = phi i32 [ %a, %entry ], [ %half.inv, %loop ]114 %plus = phi i32 [ %a, %entry ], [ %half.inv.2, %loop ]115 116 %incsum = add i32 %sum, %plus117 %inc = add i32 %i, 1118 %cmp = icmp slt i32 %i, 1000119 120 %incsum2 = add i32 %incsum, %plus121 %incsum3 = add i32 %incsum, %plus122 %incsum4 = add i32 %incsum, %plus123 %incsum5 = add i32 %incsum, %plus124 %incsum6 = add i32 %incsum, %plus125 %incsum7 = add i32 %incsum, %plus126 127 br i1 %cmp, label %loop, label %exit128 129exit:130 ret i32 %sum131}132 133; Peeling should fail due to method size.134define i32 @invariant_backedge_negative(i32 %a, i32 %b) {135; CHECK-LABEL: @invariant_backedge_negative136; CHECK-NOT: loop.peel{{.*}}:137; CHECK: loop:138; CHECK: %i = phi139; CHECK: %sum = phi140; CHECK: %plus = phi141entry:142 br label %loop143 144loop:145 %i = phi i32 [ 0, %entry ], [ %inc, %loop ]146 %sum = phi i32 [ 0, %entry ], [ %incsum2, %loop ]147 %plus = phi i32 [ %a, %entry ], [ %b, %loop ]148 149 %incsum = add i32 %sum, %plus150 %incsum2 = add i32 %incsum, %plus151 %incsum3 = add i32 %incsum, %plus152 %incsum4 = add i32 %incsum, %plus153 %incsum5 = add i32 %incsum, %plus154 %incsum6 = add i32 %incsum, %plus155 %incsum7 = add i32 %incsum, %plus156 %incsum8 = add i32 %incsum, %plus157 %incsum9 = add i32 %incsum, %plus158 %incsum10 = add i32 %incsum, %plus159 %incsum11 = add i32 %incsum, %plus160 %incsum12 = add i32 %incsum, %plus161 %incsum13 = add i32 %incsum, %plus162 %incsum14 = add i32 %incsum, %plus163 %incsum15 = add i32 %incsum, %plus164 %inc = add i32 %i, 1165 %cmp = icmp slt i32 %i, 1000166 167 br i1 %cmp, label %loop, label %exit168 169exit:170 ret i32 %sum171}172 173define i32 @cycled_phis(i32 %a, i32 %b) {174; Make sure that we do not crash working with cycled Phis and don't peel it.175; TODO: Actually this loop should be partially unrolled with factor 2.176; CHECK-LABEL: @cycled_phis177; CHECK-NOT: loop.peel{{.*}}:178; CHECK: loop:179; CHECK: %i = phi180; CHECK: %phi.a = phi181; CHECK: %phi.b = phi182; CHECK: %sum = phi183entry:184 br label %loop185 186loop:187 %i = phi i32 [ 0, %entry ], [ %inc, %loop ]188 %phi.a = phi i32 [ %a, %entry ], [ %phi.b, %loop ]189 %phi.b = phi i32 [ %b, %entry ], [ %phi.a, %loop ]190 %sum = phi i32 [ 0, %entry], [ %incsum, %loop ]191 %incsum = add i32 %sum, %phi.a192 %inc = add i32 %i, 1193 %cmp = icmp slt i32 %i, 1000194 195 br i1 %cmp, label %loop, label %exit196 197exit:198 ret i32 %sum199}200