brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.6 KiB · 0f55735 Raw
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