brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.7 KiB · c972467 Raw
242 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=armv6t2-eabi %s -o - | FileCheck %s --check-prefix=CHECK3 4; Checks SSAT is still generated when loop unrolling is on5 6define void @ssat_unroll(ptr %pSrcA, ptr %pSrcB, ptr %pDst, i32 %blockSize) {7; CHECK-LABEL: ssat_unroll:8; CHECK:       @ %bb.0: @ %entry9; CHECK-NEXT:    cmp r3, #010; CHECK-NEXT:    bxeq lr11; CHECK-NEXT:  .LBB0_1: @ %while.body.preheader12; CHECK-NEXT:    .save {r11, lr}13; CHECK-NEXT:    push {r11, lr}14; CHECK-NEXT:    sub r12, r3, #115; CHECK-NEXT:    tst r3, #116; CHECK-NEXT:    beq .LBB0_317; CHECK-NEXT:  @ %bb.2: @ %while.body.prol.preheader18; CHECK-NEXT:    ldrsh lr, [r0], #219; CHECK-NEXT:    ldrsh r3, [r1], #220; CHECK-NEXT:    smulbb r3, r3, lr21; CHECK-NEXT:    ssat r3, #16, r3, asr #1422; CHECK-NEXT:    strh r3, [r2], #223; CHECK-NEXT:    mov r3, r1224; CHECK-NEXT:  .LBB0_3: @ %while.body.prol.loopexit25; CHECK-NEXT:    cmp r12, #026; CHECK-NEXT:    beq .LBB0_527; CHECK-NEXT:  .LBB0_4: @ %while.body28; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=129; CHECK-NEXT:    ldrsh r12, [r0]30; CHECK-NEXT:    subs r3, r3, #231; CHECK-NEXT:    ldrsh lr, [r1]32; CHECK-NEXT:    smulbb r12, lr, r1233; CHECK-NEXT:    ssat r12, #16, r12, asr #1434; CHECK-NEXT:    strh r12, [r2]35; CHECK-NEXT:    ldrsh r12, [r0, #2]36; CHECK-NEXT:    add r0, r0, #437; CHECK-NEXT:    ldrsh lr, [r1, #2]38; CHECK-NEXT:    add r1, r1, #439; CHECK-NEXT:    smulbb r12, lr, r1240; CHECK-NEXT:    ssat r12, #16, r12, asr #1441; CHECK-NEXT:    strh r12, [r2, #2]42; CHECK-NEXT:    add r2, r2, #443; CHECK-NEXT:    bne .LBB0_444; CHECK-NEXT:  .LBB0_5:45; CHECK-NEXT:    pop {r11, lr}46; CHECK-NEXT:    bx lr47entry:48  %cmp.not7 = icmp eq i32 %blockSize, 049  br i1 %cmp.not7, label %while.end, label %while.body.preheader50 51while.body.preheader:                             ; preds = %entry52  %0 = add i32 %blockSize, -153  %xtraiter = and i32 %blockSize, 154  %lcmp.mod.not = icmp eq i32 %xtraiter, 055  br i1 %lcmp.mod.not, label %while.body.prol.loopexit, label %while.body.prol.preheader56 57while.body.prol.preheader:                        ; preds = %while.body.preheader58  %incdec.ptr.prol = getelementptr inbounds i16, ptr %pSrcA, i32 159  %1 = load i16, ptr %pSrcA60  %conv.prol = sext i16 %1 to i3261  %incdec.ptr1.prol = getelementptr inbounds i16, ptr %pSrcB, i32 162  %2 = load i16, ptr %pSrcB63  %conv2.prol = sext i16 %2 to i3264  %mul.prol = mul nsw i32 %conv2.prol, %conv.prol65  %shr.prol = ashr i32 %mul.prol, 1466  %3 = icmp sgt i32 %shr.prol, -3276867  %4 = select i1 %3, i32 %shr.prol, i32 -3276868  %5 = icmp slt i32 %4, 3276769  %spec.select.i.prol = select i1 %5, i32 %4, i32 3276770  %conv3.prol = trunc i32 %spec.select.i.prol to i1671  %incdec.ptr4.prol = getelementptr inbounds i16, ptr %pDst, i32 172  store i16 %conv3.prol, ptr %pDst73  br label %while.body.prol.loopexit74 75while.body.prol.loopexit:                         ; preds = %while.body.prol.preheader, %while.body.preheader76  %blkCnt.011.unr = phi i32 [ %blockSize, %while.body.preheader ], [ %0, %while.body.prol.preheader ]77  %pSrcA.addr.010.unr = phi ptr [ %pSrcA, %while.body.preheader ], [ %incdec.ptr.prol, %while.body.prol.preheader ]78  %pDst.addr.09.unr = phi ptr [ %pDst, %while.body.preheader ], [ %incdec.ptr4.prol, %while.body.prol.preheader ]79  %pSrcB.addr.08.unr = phi ptr [ %pSrcB, %while.body.preheader ], [ %incdec.ptr1.prol, %while.body.prol.preheader ]80  %6 = icmp eq i32 %0, 081  br i1 %6, label %while.end, label %while.body82 83while.body:                                       ; preds = %while.body.prol.loopexit, %while.body84  %blkCnt.011 = phi i32 [ %dec.1, %while.body ], [ %blkCnt.011.unr, %while.body.prol.loopexit ]85  %pSrcA.addr.010 = phi ptr [ %incdec.ptr.1, %while.body ], [ %pSrcA.addr.010.unr, %while.body.prol.loopexit ]86  %pDst.addr.09 = phi ptr [ %incdec.ptr4.1, %while.body ], [ %pDst.addr.09.unr, %while.body.prol.loopexit ]87  %pSrcB.addr.08 = phi ptr [ %incdec.ptr1.1, %while.body ], [ %pSrcB.addr.08.unr, %while.body.prol.loopexit ]88  %incdec.ptr = getelementptr inbounds i16, ptr %pSrcA.addr.010, i32 189  %7 = load i16, ptr %pSrcA.addr.01090  %conv = sext i16 %7 to i3291  %incdec.ptr1 = getelementptr inbounds i16, ptr %pSrcB.addr.08, i32 192  %8 = load i16, ptr %pSrcB.addr.0893  %conv2 = sext i16 %8 to i3294  %mul = mul nsw i32 %conv2, %conv95  %shr = ashr i32 %mul, 1496  %9 = icmp sgt i32 %shr, -3276897  %10 = select i1 %9, i32 %shr, i32 -3276898  %11 = icmp slt i32 %10, 3276799  %spec.select.i = select i1 %11, i32 %10, i32 32767100  %conv3 = trunc i32 %spec.select.i to i16101  %incdec.ptr4 = getelementptr inbounds i16, ptr %pDst.addr.09, i32 1102  store i16 %conv3, ptr %pDst.addr.09103  %incdec.ptr.1 = getelementptr inbounds i16, ptr %pSrcA.addr.010, i32 2104  %12 = load i16, ptr %incdec.ptr105  %conv.1 = sext i16 %12 to i32106  %incdec.ptr1.1 = getelementptr inbounds i16, ptr %pSrcB.addr.08, i32 2107  %13 = load i16, ptr %incdec.ptr1108  %conv2.1 = sext i16 %13 to i32109  %mul.1 = mul nsw i32 %conv2.1, %conv.1110  %shr.1 = ashr i32 %mul.1, 14111  %14 = icmp sgt i32 %shr.1, -32768112  %15 = select i1 %14, i32 %shr.1, i32 -32768113  %16 = icmp slt i32 %15, 32767114  %spec.select.i.1 = select i1 %16, i32 %15, i32 32767115  %conv3.1 = trunc i32 %spec.select.i.1 to i16116  %incdec.ptr4.1 = getelementptr inbounds i16, ptr %pDst.addr.09, i32 2117  store i16 %conv3.1, ptr %incdec.ptr4118  %dec.1 = add i32 %blkCnt.011, -2119  %cmp.not.1 = icmp eq i32 %dec.1, 0120  br i1 %cmp.not.1, label %while.end, label %while.body121 122while.end:                                        ; preds = %while.body, %while.body.prol.loopexit, %entry123  ret void124}125 126define void @ssat_unroll_minmax(ptr nocapture readonly %pSrcA, ptr nocapture readonly %pSrcB, ptr nocapture writeonly %pDst, i32 %blockSize) {127; CHECK-LABEL: ssat_unroll_minmax:128; CHECK:       @ %bb.0: @ %entry129; CHECK-NEXT:    cmp r3, #0130; CHECK-NEXT:    bxeq lr131; CHECK-NEXT:  .LBB1_1: @ %while.body.preheader132; CHECK-NEXT:    .save {r11, lr}133; CHECK-NEXT:    push {r11, lr}134; CHECK-NEXT:    sub r12, r3, #1135; CHECK-NEXT:    tst r3, #1136; CHECK-NEXT:    beq .LBB1_3137; CHECK-NEXT:  @ %bb.2: @ %while.body.prol.preheader138; CHECK-NEXT:    ldrsh lr, [r0], #2139; CHECK-NEXT:    ldrsh r3, [r1], #2140; CHECK-NEXT:    smulbb r3, r3, lr141; CHECK-NEXT:    ssat r3, #16, r3, asr #14142; CHECK-NEXT:    strh r3, [r2], #2143; CHECK-NEXT:    mov r3, r12144; CHECK-NEXT:  .LBB1_3: @ %while.body.prol.loopexit145; CHECK-NEXT:    cmp r12, #0146; CHECK-NEXT:    beq .LBB1_5147; CHECK-NEXT:  .LBB1_4: @ %while.body148; CHECK-NEXT:    @ =>This Inner Loop Header: Depth=1149; CHECK-NEXT:    ldrsh r12, [r0]150; CHECK-NEXT:    subs r3, r3, #2151; CHECK-NEXT:    ldrsh lr, [r1]152; CHECK-NEXT:    smulbb r12, lr, r12153; CHECK-NEXT:    ssat r12, #16, r12, asr #14154; CHECK-NEXT:    strh r12, [r2]155; CHECK-NEXT:    ldrsh r12, [r0, #2]156; CHECK-NEXT:    add r0, r0, #4157; CHECK-NEXT:    ldrsh lr, [r1, #2]158; CHECK-NEXT:    add r1, r1, #4159; CHECK-NEXT:    smulbb r12, lr, r12160; CHECK-NEXT:    ssat r12, #16, r12, asr #14161; CHECK-NEXT:    strh r12, [r2, #2]162; CHECK-NEXT:    add r2, r2, #4163; CHECK-NEXT:    bne .LBB1_4164; CHECK-NEXT:  .LBB1_5:165; CHECK-NEXT:    pop {r11, lr}166; CHECK-NEXT:    bx lr167entry:168  %cmp.not7 = icmp eq i32 %blockSize, 0169  br i1 %cmp.not7, label %while.end, label %while.body.preheader170 171while.body.preheader:                             ; preds = %entry172  %0 = add i32 %blockSize, -1173  %xtraiter = and i32 %blockSize, 1174  %lcmp.mod.not = icmp eq i32 %xtraiter, 0175  br i1 %lcmp.mod.not, label %while.body.prol.loopexit, label %while.body.prol.preheader176 177while.body.prol.preheader:                        ; preds = %while.body.preheader178  %incdec.ptr.prol = getelementptr inbounds i16, ptr %pSrcA, i64 1179  %1 = load i16, ptr %pSrcA, align 2180  %conv.prol = sext i16 %1 to i32181  %incdec.ptr1.prol = getelementptr inbounds i16, ptr %pSrcB, i64 1182  %2 = load i16, ptr %pSrcB, align 2183  %conv2.prol = sext i16 %2 to i32184  %mul.prol = mul nsw i32 %conv2.prol, %conv.prol185  %shr.prol = ashr i32 %mul.prol, 14186  %3 = call i32 @llvm.smax.i32(i32 %shr.prol, i32 -32768)187  %4 = call i32 @llvm.smin.i32(i32 %3, i32 32767)188  %conv3.prol = trunc i32 %4 to i16189  %incdec.ptr4.prol = getelementptr inbounds i16, ptr %pDst, i64 1190  store i16 %conv3.prol, ptr %pDst, align 2191  br label %while.body.prol.loopexit192 193while.body.prol.loopexit:                         ; preds = %while.body.prol.preheader, %while.body.preheader194  %blkCnt.011.unr = phi i32 [ %blockSize, %while.body.preheader ], [ %0, %while.body.prol.preheader ]195  %pSrcA.addr.010.unr = phi ptr [ %pSrcA, %while.body.preheader ], [ %incdec.ptr.prol, %while.body.prol.preheader ]196  %pDst.addr.09.unr = phi ptr [ %pDst, %while.body.preheader ], [ %incdec.ptr4.prol, %while.body.prol.preheader ]197  %pSrcB.addr.08.unr = phi ptr [ %pSrcB, %while.body.preheader ], [ %incdec.ptr1.prol, %while.body.prol.preheader ]198  %5 = icmp eq i32 %0, 0199  br i1 %5, label %while.end, label %while.body200 201while.body:                                       ; preds = %while.body.prol.loopexit, %while.body202  %blkCnt.011 = phi i32 [ %dec.1, %while.body ], [ %blkCnt.011.unr, %while.body.prol.loopexit ]203  %pSrcA.addr.010 = phi ptr [ %incdec.ptr.1, %while.body ], [ %pSrcA.addr.010.unr, %while.body.prol.loopexit ]204  %pDst.addr.09 = phi ptr [ %incdec.ptr4.1, %while.body ], [ %pDst.addr.09.unr, %while.body.prol.loopexit ]205  %pSrcB.addr.08 = phi ptr [ %incdec.ptr1.1, %while.body ], [ %pSrcB.addr.08.unr, %while.body.prol.loopexit ]206  %incdec.ptr = getelementptr inbounds i16, ptr %pSrcA.addr.010, i64 1207  %6 = load i16, ptr %pSrcA.addr.010, align 2208  %conv = sext i16 %6 to i32209  %incdec.ptr1 = getelementptr inbounds i16, ptr %pSrcB.addr.08, i64 1210  %7 = load i16, ptr %pSrcB.addr.08, align 2211  %conv2 = sext i16 %7 to i32212  %mul = mul nsw i32 %conv2, %conv213  %shr = ashr i32 %mul, 14214  %8 = call i32 @llvm.smax.i32(i32 %shr, i32 -32768)215  %9 = call i32 @llvm.smin.i32(i32 %8, i32 32767)216  %conv3 = trunc i32 %9 to i16217  %incdec.ptr4 = getelementptr inbounds i16, ptr %pDst.addr.09, i64 1218  store i16 %conv3, ptr %pDst.addr.09, align 2219  %incdec.ptr.1 = getelementptr inbounds i16, ptr %pSrcA.addr.010, i64 2220  %10 = load i16, ptr %incdec.ptr, align 2221  %conv.1 = sext i16 %10 to i32222  %incdec.ptr1.1 = getelementptr inbounds i16, ptr %pSrcB.addr.08, i64 2223  %11 = load i16, ptr %incdec.ptr1, align 2224  %conv2.1 = sext i16 %11 to i32225  %mul.1 = mul nsw i32 %conv2.1, %conv.1226  %shr.1 = ashr i32 %mul.1, 14227  %12 = call i32 @llvm.smax.i32(i32 %shr.1, i32 -32768)228  %13 = call i32 @llvm.smin.i32(i32 %12, i32 32767)229  %conv3.1 = trunc i32 %13 to i16230  %incdec.ptr4.1 = getelementptr inbounds i16, ptr %pDst.addr.09, i64 2231  store i16 %conv3.1, ptr %incdec.ptr4, align 2232  %dec.1 = add i32 %blkCnt.011, -2233  %cmp.not.1 = icmp eq i32 %dec.1, 0234  br i1 %cmp.not.1, label %while.end, label %while.body235 236while.end:                                        ; preds = %while.body, %while.body.prol.loopexit, %entry237  ret void238}239 240declare i32 @llvm.smax.i32(i32, i32) #1241declare i32 @llvm.smin.i32(i32, i32) #1242