brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.9 KiB · fd28e45 Raw
144 lines · plain
1; RUN: opt -mtriple=arm-none-none-eabi -mcpu=cortex-m23 -passes=loop-unroll -unroll-runtime-multi-exit -S %s -o - | FileCheck %s2 3; This loop has too many live outs, and should not be unrolled under v6m.4; CHECK-LABEL: multiple_liveouts5; CHECK: for.body6; CHECK: br i1 %cmp.not, label %for.cond.cleanup.loopexit, label %for.body7define void @multiple_liveouts(ptr %x, ptr %y, ptr %d, i32 %n) {8entry:9  %0 = load i32, ptr %d, align 410  %arrayidx1 = getelementptr inbounds i32, ptr %d, i32 111  %1 = load i32, ptr %arrayidx1, align 412  %arrayidx2 = getelementptr inbounds i32, ptr %d, i32 213  %2 = load i32, ptr %arrayidx2, align 414  %arrayidx3 = getelementptr inbounds i32, ptr %d, i32 315  %3 = load i32, ptr %arrayidx3, align 416  %cmp.not58 = icmp eq i32 %n, 017  br i1 %cmp.not58, label %for.cond.cleanup, label %for.body.preheader18 19for.body.preheader:                               ; preds = %entry20  br label %for.body21 22for.body:                                         ; preds = %for.body.preheader, %for.body23  %x.addr.065 = phi ptr [ %incdec.ptr, %for.body ], [ %x, %for.body.preheader ]24  %y.addr.064 = phi ptr [ %incdec.ptr25, %for.body ], [ %y, %for.body.preheader ]25  %res00.063 = phi i32 [ %add, %for.body ], [ %0, %for.body.preheader ]26  %rhs_cols_idx.062 = phi i32 [ %dec, %for.body ], [ %n, %for.body.preheader ]27  %res11.061 = phi i32 [ %add24, %for.body ], [ %3, %for.body.preheader ]28  %res10.060 = phi i32 [ %add20, %for.body ], [ %2, %for.body.preheader ]29  %res01.059 = phi i32 [ %add14, %for.body ], [ %1, %for.body.preheader ]30  %4 = load i32, ptr %x.addr.065, align 431  %arrayidx5 = getelementptr inbounds i32, ptr %x.addr.065, i32 %n32  %5 = load i32, ptr %arrayidx5, align 433  %6 = load i32, ptr %y.addr.064, align 434  %conv9 = and i32 %6, 25535  %conv10 = and i32 %4, 25536  %mul = mul nuw nsw i32 %conv9, %conv1037  %add = add nsw i32 %mul, %res00.06338  %conv12 = and i32 %5, 25539  %mul13 = mul nuw nsw i32 %conv9, %conv1240  %add14 = add nsw i32 %mul13, %res01.05941  %arrayidx15 = getelementptr inbounds i32, ptr %y.addr.064, i32 %n42  %7 = load i32, ptr %arrayidx15, align 443  %conv17 = and i32 %7, 25544  %mul19 = mul nuw nsw i32 %conv17, %conv1045  %add20 = add nsw i32 %mul19, %res10.06046  %mul23 = mul nuw nsw i32 %conv17, %conv1247  %add24 = add nsw i32 %mul23, %res11.06148  %incdec.ptr = getelementptr inbounds i32, ptr %x.addr.065, i32 149  %incdec.ptr25 = getelementptr inbounds i32, ptr %y.addr.064, i32 150  %dec = add nsw i32 %rhs_cols_idx.062, -151  %cmp.not = icmp eq i32 %dec, 052  br i1 %cmp.not, label %for.cond.cleanup.loopexit, label %for.body53 54for.cond.cleanup.loopexit:                        ; preds = %for.body55  %add.lcssa = phi i32 [ %add, %for.body ]56  %add14.lcssa = phi i32 [ %add14, %for.body ]57  %add20.lcssa = phi i32 [ %add20, %for.body ]58  %add24.lcssa = phi i32 [ %add24, %for.body ]59  br label %for.cond.cleanup60 61for.cond.cleanup:                                 ; preds = %for.cond.cleanup.loopexit, %entry62  %res01.0 = phi i32 [ %1, %entry ], [ %add14.lcssa, %for.cond.cleanup.loopexit ]63  %res10.0 = phi i32 [ %2, %entry ], [ %add20.lcssa, %for.cond.cleanup.loopexit ]64  %res11.0 = phi i32 [ %3, %entry ], [ %add24.lcssa, %for.cond.cleanup.loopexit ]65  %res00.0 = phi i32 [ %0, %entry ], [ %add.lcssa, %for.cond.cleanup.loopexit ]66  store i32 %res00.0, ptr %d, align 467  store i32 %res01.0, ptr %arrayidx1, align 468  store i32 %res10.0, ptr %arrayidx2, align 469  store i32 %res11.0, ptr %arrayidx3, align 470  ret void71}72 73; This loop has both multiple exit blocks and multiple liveouts74; CHECK-LABEL: multiple_liveouts_doubleexit75; CHECK: for.body76; CHECK: br i1 %cmp.not, label %cleanup22.loopexit2, label %for.body77define void @multiple_liveouts_doubleexit(i32 %n, ptr %x, ptr %y, ptr %z) {78entry:79  %cmp.not55 = icmp eq i32 %n, 080  br i1 %cmp.not55, label %cleanup22, label %for.body.preheader81 82for.body.preheader:                               ; preds = %entry83  br label %for.body84 85for.body:                                         ; preds = %for.body.preheader, %for.inc86  %x.addr.062 = phi ptr [ %incdec.ptr, %for.inc ], [ %x, %for.body.preheader ]87  %y.addr.061 = phi ptr [ %incdec.ptr19, %for.inc ], [ %y, %for.body.preheader ]88  %rhs_cols_idx.060 = phi i32 [ %dec, %for.inc ], [ %n, %for.body.preheader ]89  %res11.059 = phi i32 [ %add18, %for.inc ], [ 0, %for.body.preheader ]90  %res10.058 = phi i32 [ %add16, %for.inc ], [ 0, %for.body.preheader ]91  %res01.057 = phi i32 [ %add8, %for.inc ], [ 0, %for.body.preheader ]92  %res00.056 = phi i32 [ %add, %for.inc ], [ 0, %for.body.preheader ]93  %0 = load i32, ptr %x.addr.062, align 494  %1 = load i32, ptr %y.addr.061, align 495  %conv5 = and i32 %1, 25596  %conv6 = and i32 %0, 25597  %mul = mul nuw nsw i32 %conv5, %conv698  %add = add nuw nsw i32 %mul, %res00.05699  %add8 = add nuw nsw i32 %conv5, %res01.057100  %cmp9 = icmp ugt i32 %add8, 100101  br i1 %cmp9, label %cleanup22.loopexit, label %for.inc102 103for.inc:                                          ; preds = %for.body104  %arrayidx11 = getelementptr inbounds i32, ptr %y.addr.061, i32 %n105  %2 = load i32, ptr %arrayidx11, align 4106  %conv13 = and i32 %2, 255107  %mul15 = mul nuw nsw i32 %conv13, %conv6108  %add16 = add nuw nsw i32 %mul15, %res10.058109  %add18 = add nuw nsw i32 %conv13, %res11.059110  %incdec.ptr = getelementptr inbounds i32, ptr %x.addr.062, i32 1111  %incdec.ptr19 = getelementptr inbounds i32, ptr %y.addr.061, i32 1112  %dec = add nsw i32 %rhs_cols_idx.060, -1113  %cmp.not = icmp eq i32 %dec, 0114  br i1 %cmp.not, label %cleanup22.loopexit2, label %for.body115 116cleanup22.loopexit:                               ; preds = %for.body117  %add.lcssa = phi i32 [ %add, %for.body ]118  %add8.lcssa = phi i32 [ %add8, %for.body ]119  %res10.0.lcssa.ph = phi i32 [ %res10.058, %for.body ]120  %res11.0.lcssa.ph = phi i32 [ %res11.059, %for.body ]121  br label %cleanup22122 123cleanup22.loopexit2:                               ; preds = %for.inc124  %add.lcssa2 = phi i32 [ %add, %for.inc ]125  %add8.lcssa2 = phi i32 [ %add8, %for.inc ]126  %res10.0.lcssa.ph2 = phi i32 [ %add16, %for.inc ]127  %res11.0.lcssa.ph2 = phi i32 [ %add18, %for.inc ]128  br label %cleanup22129 130cleanup22:                                        ; preds = %cleanup22.loopexit, %entry131  %res10.0.lcssa = phi i32 [ 0, %entry ], [ %res10.0.lcssa.ph, %cleanup22.loopexit ], [ %res10.0.lcssa.ph2, %cleanup22.loopexit2 ]132  %res11.0.lcssa = phi i32 [ 0, %entry ], [ %res11.0.lcssa.ph, %cleanup22.loopexit ], [ %res11.0.lcssa.ph2, %cleanup22.loopexit2 ]133  %res00.1 = phi i32 [ 0, %entry ], [ %add.lcssa, %cleanup22.loopexit ], [ %add.lcssa2, %cleanup22.loopexit2 ]134  %res01.1 = phi i32 [ 0, %entry ], [ %add8.lcssa, %cleanup22.loopexit ], [ %add8.lcssa2, %cleanup22.loopexit2 ]135  store i32 %res00.1, ptr %z, align 4136  %arrayidx24 = getelementptr inbounds i32, ptr %z, i32 1137  store i32 %res01.1, ptr %arrayidx24, align 4138  %arrayidx25 = getelementptr inbounds i32, ptr %z, i32 2139  store i32 %res10.0.lcssa, ptr %arrayidx25, align 4140  %arrayidx26 = getelementptr inbounds i32, ptr %z, i32 3141  store i32 %res11.0.lcssa, ptr %arrayidx26, align 4142  ret void143}144