Index: llvm/lib/CodeGen/AggressiveAntiDepBreaker.cpp =================================================================== --- llvm/lib/CodeGen/AggressiveAntiDepBreaker.cpp +++ llvm/lib/CodeGen/AggressiveAntiDepBreaker.cpp @@ -161,17 +161,25 @@ // Mark live-out callee-saved registers. In a return block this is // all callee-saved registers. In non-return this is any // callee-saved register that is not saved in the prolog. - const MachineFrameInfo &MFI = MF.getFrameInfo(); - BitVector Pristine = MFI.getPristineRegs(MF); + const auto &MFI = MF.getFrameInfo(); + const auto HasSlot = [this, &MFI](unsigned Reg) { + assert(MF.getFrameInfo().isCalleeSavedInfoValid()); + const auto &CSI = MFI.getCalleeSavedInfo(); + return find_if(CSI.begin(), CSI.end(), [Reg](const CalleeSavedInfo &C) { + return C.getReg() == Reg; + }) != CSI.end(); + }; for (const MCPhysReg *I = MF.getRegInfo().getCalleeSavedRegs(); *I; ++I) { unsigned Reg = *I; - if (!IsReturnBlock && !Pristine.test(Reg)) continue; - for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI) { - unsigned AliasReg = *AI; - State->UnionGroups(AliasReg, 0); - KillIndices[AliasReg] = BB->size(); - DefIndices[AliasReg] = ~0u; + if (MFI.isCalleeSavedInfoValid() && + (IsReturnBlock || BB->isLiveIn(Reg) || !HasSlot(Reg))) { + for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI) { + unsigned AliasReg = *AI; + State->UnionGroups(AliasReg, 0); + KillIndices[AliasReg] = BB->size(); + DefIndices[AliasReg] = ~0u; + } } } } Index: llvm/lib/CodeGen/CriticalAntiDepBreaker.cpp =================================================================== --- llvm/lib/CodeGen/CriticalAntiDepBreaker.cpp +++ llvm/lib/CodeGen/CriticalAntiDepBreaker.cpp @@ -70,15 +70,24 @@ // all callee-saved registers. In non-return this is any // callee-saved register that is not saved in the prolog. const MachineFrameInfo &MFI = MF.getFrameInfo(); - BitVector Pristine = MFI.getPristineRegs(MF); + const auto HasSlot = [this, &MFI](unsigned Reg) { + const auto &CSI = MFI.getCalleeSavedInfo(); + assert(MF.getFrameInfo().isCalleeSavedInfoValid()); + return find_if(CSI.begin(), CSI.end(), [Reg](const CalleeSavedInfo &C) { + return C.getReg() == Reg; + }) != CSI.end(); + }; for (const MCPhysReg *I = MF.getRegInfo().getCalleeSavedRegs(); *I; ++I) { - if (!IsReturnBlock && !Pristine.test(*I)) continue; - for (MCRegAliasIterator AI(*I, TRI, true); AI.isValid(); ++AI) { - unsigned Reg = *AI; - Classes[Reg] = reinterpret_cast(-1); - KillIndices[Reg] = BBSize; - DefIndices[Reg] = ~0u; + unsigned Reg = *I; + if (MFI.isCalleeSavedInfoValid() && + (IsReturnBlock || BB->isLiveIn(Reg) || !HasSlot(Reg))) { + for (MCRegAliasIterator AI(Reg, TRI, true); AI.isValid(); ++AI) { + unsigned Reg = *AI; + Classes[Reg] = reinterpret_cast(-1); + KillIndices[Reg] = BBSize; + DefIndices[Reg] = ~0u; + } } } } Index: llvm/test/CodeGen/PowerPC/pr32292.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/PowerPC/pr32292.ll @@ -0,0 +1,513 @@ +; RUN: llc < %s | FileCheck %s +target datalayout = "e-m:e-i64:64-n32:64" +target triple = "powerpc64le--linux-gnu" + +; REG, which is clobbered by an li instruction, shouldn't be a callee-saved +; register. +; CHECK-LABEL: adler32_z +; CHECK: li [[REG:[0-9]+]], 0 +; CHECK: li {{[0-9]+}}, 0 +; CHECK-NOT: std [[REG]] +define i64 @adler32_z(i64 %adler, i8* readonly %buf, i64 %len) local_unnamed_addr #0 { +entry: + %shr = lshr i64 %adler, 16 + %and = and i64 %shr, 65535 + %and1 = and i64 %adler, 65535 + %cmp = icmp eq i64 %len, 1 + br i1 %cmp, label %if.then, label %if.end11 + +if.then: ; preds = %entry + %0 = load i8, i8* %buf, align 1, !tbaa !2 + %conv = zext i8 %0 to i64 + %add = add nuw nsw i64 %and1, %conv + %cmp2 = icmp ugt i64 %add, 65520 + %sub = add nsw i64 %add, -65521 + %sub.add = select i1 %cmp2, i64 %sub, i64 %add + %add5 = add nsw i64 %sub.add, %and + %cmp6 = icmp ugt i64 %add5, 65520 + %sub9 = add nsw i64 %add5, 281474976645135 + %sum2.0 = select i1 %cmp6, i64 %sub9, i64 %add5 + %shl = shl i64 %sum2.0, 16 + %or = or i64 %shl, %sub.add + br label %cleanup + +if.end11: ; preds = %entry + %cmp12 = icmp eq i8* %buf, null + br i1 %cmp12, label %cleanup, label %if.end15 + +if.end15: ; preds = %if.end11 + %cmp16 = icmp ult i64 %len, 16 + br i1 %cmp16, label %while.cond.preheader, label %while.cond30.preheader + +while.cond30.preheader: ; preds = %if.end15 + %cmp31381 = icmp ugt i64 %len, 5551 + br i1 %cmp31381, label %while.body33.preheader, label %while.body109.preheader + +while.body33.preheader: ; preds = %while.cond30.preheader + br label %while.body33 + +while.cond.preheader: ; preds = %if.end15 + %tobool359 = icmp eq i64 %len, 0 + br i1 %tobool359, label %while.end, label %while.body.preheader + +while.body.preheader: ; preds = %while.cond.preheader + %1 = add i64 %len, -1 + %xtraiter = and i64 %len, 7 + %lcmp.mod = icmp eq i64 %xtraiter, 0 + br i1 %lcmp.mod, label %while.body.prol.loopexit, label %while.body.prol.preheader + +while.body.prol.preheader: ; preds = %while.body.preheader + br label %while.body.prol + +while.body.prol: ; preds = %while.body.prol, %while.body.prol.preheader + %sum2.1363.prol = phi i64 [ %add21.prol, %while.body.prol ], [ %and, %while.body.prol.preheader ] + %len.addr.0362.prol = phi i64 [ %dec.prol, %while.body.prol ], [ %len, %while.body.prol.preheader ] + %buf.addr.0361.prol = phi i8* [ %incdec.ptr.prol, %while.body.prol ], [ %buf, %while.body.prol.preheader ] + %adler.addr.1360.prol = phi i64 [ %add20.prol, %while.body.prol ], [ %and1, %while.body.prol.preheader ] + %prol.iter = phi i64 [ %prol.iter.sub, %while.body.prol ], [ %xtraiter, %while.body.prol.preheader ] + %dec.prol = add i64 %len.addr.0362.prol, -1 + %incdec.ptr.prol = getelementptr inbounds i8, i8* %buf.addr.0361.prol, i64 1 + %2 = load i8, i8* %buf.addr.0361.prol, align 1, !tbaa !2 + %conv19.prol = zext i8 %2 to i64 + %add20.prol = add i64 %adler.addr.1360.prol, %conv19.prol + %add21.prol = add i64 %add20.prol, %sum2.1363.prol + %prol.iter.sub = add i64 %prol.iter, -1 + %prol.iter.cmp = icmp eq i64 %prol.iter.sub, 0 + br i1 %prol.iter.cmp, label %while.body.prol.loopexit.unr-lcssa, label %while.body.prol, !llvm.loop !5 + +while.body.prol.loopexit.unr-lcssa: ; preds = %while.body.prol + br label %while.body.prol.loopexit + +while.body.prol.loopexit: ; preds = %while.body.preheader, %while.body.prol.loopexit.unr-lcssa + %add20.lcssa.unr = phi i64 [ undef, %while.body.preheader ], [ %add20.prol, %while.body.prol.loopexit.unr-lcssa ] + %add21.lcssa.unr = phi i64 [ undef, %while.body.preheader ], [ %add21.prol, %while.body.prol.loopexit.unr-lcssa ] + %sum2.1363.unr = phi i64 [ %and, %while.body.preheader ], [ %add21.prol, %while.body.prol.loopexit.unr-lcssa ] + %len.addr.0362.unr = phi i64 [ %len, %while.body.preheader ], [ %dec.prol, %while.body.prol.loopexit.unr-lcssa ] + %buf.addr.0361.unr = phi i8* [ %buf, %while.body.preheader ], [ %incdec.ptr.prol, %while.body.prol.loopexit.unr-lcssa ] + %adler.addr.1360.unr = phi i64 [ %and1, %while.body.preheader ], [ %add20.prol, %while.body.prol.loopexit.unr-lcssa ] + %3 = icmp ult i64 %1, 7 + br i1 %3, label %while.end.loopexit, label %while.body.preheader.new + +while.body.preheader.new: ; preds = %while.body.prol.loopexit + br label %while.body + +while.body: ; preds = %while.body, %while.body.preheader.new + %sum2.1363 = phi i64 [ %sum2.1363.unr, %while.body.preheader.new ], [ %add21.7, %while.body ] + %len.addr.0362 = phi i64 [ %len.addr.0362.unr, %while.body.preheader.new ], [ %dec.7, %while.body ] + %buf.addr.0361 = phi i8* [ %buf.addr.0361.unr, %while.body.preheader.new ], [ %incdec.ptr.7, %while.body ] + %adler.addr.1360 = phi i64 [ %adler.addr.1360.unr, %while.body.preheader.new ], [ %add20.7, %while.body ] + %incdec.ptr = getelementptr inbounds i8, i8* %buf.addr.0361, i64 1 + %4 = load i8, i8* %buf.addr.0361, align 1, !tbaa !2 + %conv19 = zext i8 %4 to i64 + %add20 = add i64 %adler.addr.1360, %conv19 + %add21 = add i64 %add20, %sum2.1363 + %incdec.ptr.1 = getelementptr inbounds i8, i8* %buf.addr.0361, i64 2 + %5 = load i8, i8* %incdec.ptr, align 1, !tbaa !2 + %conv19.1 = zext i8 %5 to i64 + %add20.1 = add i64 %add20, %conv19.1 + %add21.1 = add i64 %add20.1, %add21 + %incdec.ptr.2 = getelementptr inbounds i8, i8* %buf.addr.0361, i64 3 + %6 = load i8, i8* %incdec.ptr.1, align 1, !tbaa !2 + %conv19.2 = zext i8 %6 to i64 + %add20.2 = add i64 %add20.1, %conv19.2 + %add21.2 = add i64 %add20.2, %add21.1 + %incdec.ptr.3 = getelementptr inbounds i8, i8* %buf.addr.0361, i64 4 + %7 = load i8, i8* %incdec.ptr.2, align 1, !tbaa !2 + %conv19.3 = zext i8 %7 to i64 + %add20.3 = add i64 %add20.2, %conv19.3 + %add21.3 = add i64 %add20.3, %add21.2 + %incdec.ptr.4 = getelementptr inbounds i8, i8* %buf.addr.0361, i64 5 + %8 = load i8, i8* %incdec.ptr.3, align 1, !tbaa !2 + %conv19.4 = zext i8 %8 to i64 + %add20.4 = add i64 %add20.3, %conv19.4 + %add21.4 = add i64 %add20.4, %add21.3 + %incdec.ptr.5 = getelementptr inbounds i8, i8* %buf.addr.0361, i64 6 + %9 = load i8, i8* %incdec.ptr.4, align 1, !tbaa !2 + %conv19.5 = zext i8 %9 to i64 + %add20.5 = add i64 %add20.4, %conv19.5 + %add21.5 = add i64 %add20.5, %add21.4 + %incdec.ptr.6 = getelementptr inbounds i8, i8* %buf.addr.0361, i64 7 + %10 = load i8, i8* %incdec.ptr.5, align 1, !tbaa !2 + %conv19.6 = zext i8 %10 to i64 + %add20.6 = add i64 %add20.5, %conv19.6 + %add21.6 = add i64 %add20.6, %add21.5 + %dec.7 = add i64 %len.addr.0362, -8 + %incdec.ptr.7 = getelementptr inbounds i8, i8* %buf.addr.0361, i64 8 + %11 = load i8, i8* %incdec.ptr.6, align 1, !tbaa !2 + %conv19.7 = zext i8 %11 to i64 + %add20.7 = add i64 %add20.6, %conv19.7 + %add21.7 = add i64 %add20.7, %add21.6 + %tobool.7 = icmp eq i64 %dec.7, 0 + br i1 %tobool.7, label %while.end.loopexit.unr-lcssa, label %while.body + +while.end.loopexit.unr-lcssa: ; preds = %while.body + br label %while.end.loopexit + +while.end.loopexit: ; preds = %while.body.prol.loopexit, %while.end.loopexit.unr-lcssa + %add20.lcssa = phi i64 [ %add20.lcssa.unr, %while.body.prol.loopexit ], [ %add20.7, %while.end.loopexit.unr-lcssa ] + %add21.lcssa = phi i64 [ %add21.lcssa.unr, %while.body.prol.loopexit ], [ %add21.7, %while.end.loopexit.unr-lcssa ] + br label %while.end + +while.end: ; preds = %while.end.loopexit, %while.cond.preheader + %adler.addr.1.lcssa = phi i64 [ %and1, %while.cond.preheader ], [ %add20.lcssa, %while.end.loopexit ] + %sum2.1.lcssa = phi i64 [ %and, %while.cond.preheader ], [ %add21.lcssa, %while.end.loopexit ] + %cmp22 = icmp ugt i64 %adler.addr.1.lcssa, 65520 + %sub25 = add i64 %adler.addr.1.lcssa, -65521 + %sub25.adler.addr.1 = select i1 %cmp22, i64 %sub25, i64 %adler.addr.1.lcssa + %rem = urem i64 %sum2.1.lcssa, 65521 + %shl27 = shl nuw nsw i64 %rem, 16 + %or28 = or i64 %shl27, %sub25.adler.addr.1 + br label %cleanup + +while.body33: ; preds = %while.body33.preheader, %do.end + %sum2.2385 = phi i64 [ %rem102, %do.end ], [ %and, %while.body33.preheader ] + %len.addr.1384 = phi i64 [ %sub34, %do.end ], [ %len, %while.body33.preheader ] + %buf.addr.1383 = phi i8* [ %scevgep390, %do.end ], [ %buf, %while.body33.preheader ] + %adler.addr.3382 = phi i64 [ %rem101, %do.end ], [ %and1, %while.body33.preheader ] + %sub34 = add i64 %len.addr.1384, -5552 + br label %do.body + +do.body: ; preds = %do.body, %while.body33 + %adler.addr.4 = phi i64 [ %adler.addr.3382, %while.body33 ], [ %add97, %do.body ] + %buf.addr.2 = phi i8* [ %buf.addr.1383, %while.body33 ], [ %add.ptr, %do.body ] + %sum2.3 = phi i64 [ %sum2.2385, %while.body33 ], [ %add98, %do.body ] + %n.0 = phi i32 [ 347, %while.body33 ], [ %dec99, %do.body ] + %12 = load i8, i8* %buf.addr.2, align 1, !tbaa !2 + %conv36 = zext i8 %12 to i64 + %add37 = add i64 %adler.addr.4, %conv36 + %add38 = add i64 %add37, %sum2.3 + %arrayidx39 = getelementptr inbounds i8, i8* %buf.addr.2, i64 1 + %13 = load i8, i8* %arrayidx39, align 1, !tbaa !2 + %conv40 = zext i8 %13 to i64 + %add41 = add i64 %add37, %conv40 + %add42 = add i64 %add38, %add41 + %arrayidx43 = getelementptr inbounds i8, i8* %buf.addr.2, i64 2 + %14 = load i8, i8* %arrayidx43, align 1, !tbaa !2 + %conv44 = zext i8 %14 to i64 + %add45 = add i64 %add41, %conv44 + %add46 = add i64 %add42, %add45 + %arrayidx47 = getelementptr inbounds i8, i8* %buf.addr.2, i64 3 + %15 = load i8, i8* %arrayidx47, align 1, !tbaa !2 + %conv48 = zext i8 %15 to i64 + %add49 = add i64 %add45, %conv48 + %add50 = add i64 %add46, %add49 + %arrayidx51 = getelementptr inbounds i8, i8* %buf.addr.2, i64 4 + %16 = load i8, i8* %arrayidx51, align 1, !tbaa !2 + %conv52 = zext i8 %16 to i64 + %add53 = add i64 %add49, %conv52 + %add54 = add i64 %add50, %add53 + %arrayidx55 = getelementptr inbounds i8, i8* %buf.addr.2, i64 5 + %17 = load i8, i8* %arrayidx55, align 1, !tbaa !2 + %conv56 = zext i8 %17 to i64 + %add57 = add i64 %add53, %conv56 + %add58 = add i64 %add54, %add57 + %arrayidx59 = getelementptr inbounds i8, i8* %buf.addr.2, i64 6 + %18 = load i8, i8* %arrayidx59, align 1, !tbaa !2 + %conv60 = zext i8 %18 to i64 + %add61 = add i64 %add57, %conv60 + %add62 = add i64 %add58, %add61 + %arrayidx63 = getelementptr inbounds i8, i8* %buf.addr.2, i64 7 + %19 = load i8, i8* %arrayidx63, align 1, !tbaa !2 + %conv64 = zext i8 %19 to i64 + %add65 = add i64 %add61, %conv64 + %add66 = add i64 %add62, %add65 + %arrayidx67 = getelementptr inbounds i8, i8* %buf.addr.2, i64 8 + %20 = load i8, i8* %arrayidx67, align 1, !tbaa !2 + %conv68 = zext i8 %20 to i64 + %add69 = add i64 %add65, %conv68 + %add70 = add i64 %add66, %add69 + %arrayidx71 = getelementptr inbounds i8, i8* %buf.addr.2, i64 9 + %21 = load i8, i8* %arrayidx71, align 1, !tbaa !2 + %conv72 = zext i8 %21 to i64 + %add73 = add i64 %add69, %conv72 + %add74 = add i64 %add70, %add73 + %arrayidx75 = getelementptr inbounds i8, i8* %buf.addr.2, i64 10 + %22 = load i8, i8* %arrayidx75, align 1, !tbaa !2 + %conv76 = zext i8 %22 to i64 + %add77 = add i64 %add73, %conv76 + %add78 = add i64 %add74, %add77 + %arrayidx79 = getelementptr inbounds i8, i8* %buf.addr.2, i64 11 + %23 = load i8, i8* %arrayidx79, align 1, !tbaa !2 + %conv80 = zext i8 %23 to i64 + %add81 = add i64 %add77, %conv80 + %add82 = add i64 %add78, %add81 + %arrayidx83 = getelementptr inbounds i8, i8* %buf.addr.2, i64 12 + %24 = load i8, i8* %arrayidx83, align 1, !tbaa !2 + %conv84 = zext i8 %24 to i64 + %add85 = add i64 %add81, %conv84 + %add86 = add i64 %add82, %add85 + %arrayidx87 = getelementptr inbounds i8, i8* %buf.addr.2, i64 13 + %25 = load i8, i8* %arrayidx87, align 1, !tbaa !2 + %conv88 = zext i8 %25 to i64 + %add89 = add i64 %add85, %conv88 + %add90 = add i64 %add86, %add89 + %arrayidx91 = getelementptr inbounds i8, i8* %buf.addr.2, i64 14 + %26 = load i8, i8* %arrayidx91, align 1, !tbaa !2 + %conv92 = zext i8 %26 to i64 + %add93 = add i64 %add89, %conv92 + %add94 = add i64 %add90, %add93 + %arrayidx95 = getelementptr inbounds i8, i8* %buf.addr.2, i64 15 + %27 = load i8, i8* %arrayidx95, align 1, !tbaa !2 + %conv96 = zext i8 %27 to i64 + %add97 = add i64 %add93, %conv96 + %add98 = add i64 %add94, %add97 + %add.ptr = getelementptr inbounds i8, i8* %buf.addr.2, i64 16 + %dec99 = add nsw i32 %n.0, -1 + %tobool100 = icmp eq i32 %dec99, 0 + br i1 %tobool100, label %do.end, label %do.body + +do.end: ; preds = %do.body + %scevgep390 = getelementptr i8, i8* %buf.addr.1383, i64 5552 + %rem101 = urem i64 %add97, 65521 + %rem102 = urem i64 %add98, 65521 + %cmp31 = icmp ugt i64 %sub34, 5551 + br i1 %cmp31, label %while.body33, label %while.end103 + +while.end103: ; preds = %do.end + %tobool104 = icmp eq i64 %sub34, 0 + br i1 %tobool104, label %if.end188, label %while.cond106.preheader + +while.cond106.preheader: ; preds = %while.end103 + %cmp107372 = icmp ugt i64 %sub34, 15 + br i1 %cmp107372, label %while.body109.preheader, label %while.body180.preheader + +while.body180.preheader: ; preds = %while.cond177.preheader, %while.cond106.preheader + %sum2.5369.ph = phi i64 [ %rem102, %while.cond106.preheader ], [ %add174, %while.cond177.preheader ] + %len.addr.3368.ph = phi i64 [ %sub34, %while.cond106.preheader ], [ %34, %while.cond177.preheader ] + %buf.addr.4367.ph = phi i8* [ %scevgep390, %while.cond106.preheader ], [ %scevgep, %while.cond177.preheader ] + %adler.addr.6366.ph = phi i64 [ %rem101, %while.cond106.preheader ], [ %add173, %while.cond177.preheader ] + %28 = add i64 %len.addr.3368.ph, -1 + %xtraiter407 = and i64 %len.addr.3368.ph, 7 + %lcmp.mod408 = icmp eq i64 %xtraiter407, 0 + br i1 %lcmp.mod408, label %while.body180.prol.loopexit, label %while.body180.prol.preheader + +while.body180.prol.preheader: ; preds = %while.body180.preheader + br label %while.body180.prol + +while.body180.prol: ; preds = %while.body180.prol, %while.body180.prol.preheader + %sum2.5369.prol = phi i64 [ %add184.prol, %while.body180.prol ], [ %sum2.5369.ph, %while.body180.prol.preheader ] + %len.addr.3368.prol = phi i64 [ %dec178.prol, %while.body180.prol ], [ %len.addr.3368.ph, %while.body180.prol.preheader ] + %buf.addr.4367.prol = phi i8* [ %incdec.ptr181.prol, %while.body180.prol ], [ %buf.addr.4367.ph, %while.body180.prol.preheader ] + %adler.addr.6366.prol = phi i64 [ %add183.prol, %while.body180.prol ], [ %adler.addr.6366.ph, %while.body180.prol.preheader ] + %prol.iter409 = phi i64 [ %prol.iter409.sub, %while.body180.prol ], [ %xtraiter407, %while.body180.prol.preheader ] + %dec178.prol = add i64 %len.addr.3368.prol, -1 + %incdec.ptr181.prol = getelementptr inbounds i8, i8* %buf.addr.4367.prol, i64 1 + %29 = load i8, i8* %buf.addr.4367.prol, align 1, !tbaa !2 + %conv182.prol = zext i8 %29 to i64 + %add183.prol = add i64 %adler.addr.6366.prol, %conv182.prol + %add184.prol = add i64 %add183.prol, %sum2.5369.prol + %prol.iter409.sub = add i64 %prol.iter409, -1 + %prol.iter409.cmp = icmp eq i64 %prol.iter409.sub, 0 + br i1 %prol.iter409.cmp, label %while.body180.prol.loopexit.unr-lcssa, label %while.body180.prol, !llvm.loop !7 + +while.body180.prol.loopexit.unr-lcssa: ; preds = %while.body180.prol + br label %while.body180.prol.loopexit + +while.body180.prol.loopexit: ; preds = %while.body180.preheader, %while.body180.prol.loopexit.unr-lcssa + %add183.lcssa.unr = phi i64 [ undef, %while.body180.preheader ], [ %add183.prol, %while.body180.prol.loopexit.unr-lcssa ] + %add184.lcssa.unr = phi i64 [ undef, %while.body180.preheader ], [ %add184.prol, %while.body180.prol.loopexit.unr-lcssa ] + %sum2.5369.unr = phi i64 [ %sum2.5369.ph, %while.body180.preheader ], [ %add184.prol, %while.body180.prol.loopexit.unr-lcssa ] + %len.addr.3368.unr = phi i64 [ %len.addr.3368.ph, %while.body180.preheader ], [ %dec178.prol, %while.body180.prol.loopexit.unr-lcssa ] + %buf.addr.4367.unr = phi i8* [ %buf.addr.4367.ph, %while.body180.preheader ], [ %incdec.ptr181.prol, %while.body180.prol.loopexit.unr-lcssa ] + %adler.addr.6366.unr = phi i64 [ %adler.addr.6366.ph, %while.body180.preheader ], [ %add183.prol, %while.body180.prol.loopexit.unr-lcssa ] + %30 = icmp ult i64 %28, 7 + br i1 %30, label %while.end185.loopexit, label %while.body180.preheader.new + +while.body180.preheader.new: ; preds = %while.body180.prol.loopexit + br label %while.body180 + +while.body109.preheader: ; preds = %while.cond30.preheader, %while.cond106.preheader + %adler.addr.3.lcssa393401 = phi i64 [ %rem101, %while.cond106.preheader ], [ %and1, %while.cond30.preheader ] + %buf.addr.1.lcssa394400 = phi i8* [ %scevgep390, %while.cond106.preheader ], [ %buf, %while.cond30.preheader ] + %len.addr.1.lcssa395399 = phi i64 [ %sub34, %while.cond106.preheader ], [ %len, %while.cond30.preheader ] + %sum2.2.lcssa396398 = phi i64 [ %rem102, %while.cond106.preheader ], [ %and, %while.cond30.preheader ] + %31 = add i64 %len.addr.1.lcssa395399, -16 + %32 = and i64 %31, -16 + %33 = add i64 %32, 16 + br label %while.body109 + +while.cond177.preheader: ; preds = %while.body109 + %34 = sub i64 %31, %32 + %scevgep = getelementptr i8, i8* %buf.addr.1.lcssa394400, i64 %33 + %tobool179365 = icmp eq i64 %34, 0 + br i1 %tobool179365, label %while.end185, label %while.body180.preheader + +while.body109: ; preds = %while.body109.preheader, %while.body109 + %sum2.4376 = phi i64 [ %add174, %while.body109 ], [ %sum2.2.lcssa396398, %while.body109.preheader ] + %len.addr.2375 = phi i64 [ %sub110, %while.body109 ], [ %len.addr.1.lcssa395399, %while.body109.preheader ] + %buf.addr.3374 = phi i8* [ %add.ptr175, %while.body109 ], [ %buf.addr.1.lcssa394400, %while.body109.preheader ] + %adler.addr.5373 = phi i64 [ %add173, %while.body109 ], [ %adler.addr.3.lcssa393401, %while.body109.preheader ] + %sub110 = add i64 %len.addr.2375, -16 + %35 = load i8, i8* %buf.addr.3374, align 1, !tbaa !2 + %conv112 = zext i8 %35 to i64 + %add113 = add i64 %adler.addr.5373, %conv112 + %add114 = add i64 %add113, %sum2.4376 + %arrayidx115 = getelementptr inbounds i8, i8* %buf.addr.3374, i64 1 + %36 = load i8, i8* %arrayidx115, align 1, !tbaa !2 + %conv116 = zext i8 %36 to i64 + %add117 = add i64 %add113, %conv116 + %add118 = add i64 %add114, %add117 + %arrayidx119 = getelementptr inbounds i8, i8* %buf.addr.3374, i64 2 + %37 = load i8, i8* %arrayidx119, align 1, !tbaa !2 + %conv120 = zext i8 %37 to i64 + %add121 = add i64 %add117, %conv120 + %add122 = add i64 %add118, %add121 + %arrayidx123 = getelementptr inbounds i8, i8* %buf.addr.3374, i64 3 + %38 = load i8, i8* %arrayidx123, align 1, !tbaa !2 + %conv124 = zext i8 %38 to i64 + %add125 = add i64 %add121, %conv124 + %add126 = add i64 %add122, %add125 + %arrayidx127 = getelementptr inbounds i8, i8* %buf.addr.3374, i64 4 + %39 = load i8, i8* %arrayidx127, align 1, !tbaa !2 + %conv128 = zext i8 %39 to i64 + %add129 = add i64 %add125, %conv128 + %add130 = add i64 %add126, %add129 + %arrayidx131 = getelementptr inbounds i8, i8* %buf.addr.3374, i64 5 + %40 = load i8, i8* %arrayidx131, align 1, !tbaa !2 + %conv132 = zext i8 %40 to i64 + %add133 = add i64 %add129, %conv132 + %add134 = add i64 %add130, %add133 + %arrayidx135 = getelementptr inbounds i8, i8* %buf.addr.3374, i64 6 + %41 = load i8, i8* %arrayidx135, align 1, !tbaa !2 + %conv136 = zext i8 %41 to i64 + %add137 = add i64 %add133, %conv136 + %add138 = add i64 %add134, %add137 + %arrayidx139 = getelementptr inbounds i8, i8* %buf.addr.3374, i64 7 + %42 = load i8, i8* %arrayidx139, align 1, !tbaa !2 + %conv140 = zext i8 %42 to i64 + %add141 = add i64 %add137, %conv140 + %add142 = add i64 %add138, %add141 + %arrayidx143 = getelementptr inbounds i8, i8* %buf.addr.3374, i64 8 + %43 = load i8, i8* %arrayidx143, align 1, !tbaa !2 + %conv144 = zext i8 %43 to i64 + %add145 = add i64 %add141, %conv144 + %add146 = add i64 %add142, %add145 + %arrayidx147 = getelementptr inbounds i8, i8* %buf.addr.3374, i64 9 + %44 = load i8, i8* %arrayidx147, align 1, !tbaa !2 + %conv148 = zext i8 %44 to i64 + %add149 = add i64 %add145, %conv148 + %add150 = add i64 %add146, %add149 + %arrayidx151 = getelementptr inbounds i8, i8* %buf.addr.3374, i64 10 + %45 = load i8, i8* %arrayidx151, align 1, !tbaa !2 + %conv152 = zext i8 %45 to i64 + %add153 = add i64 %add149, %conv152 + %add154 = add i64 %add150, %add153 + %arrayidx155 = getelementptr inbounds i8, i8* %buf.addr.3374, i64 11 + %46 = load i8, i8* %arrayidx155, align 1, !tbaa !2 + %conv156 = zext i8 %46 to i64 + %add157 = add i64 %add153, %conv156 + %add158 = add i64 %add154, %add157 + %arrayidx159 = getelementptr inbounds i8, i8* %buf.addr.3374, i64 12 + %47 = load i8, i8* %arrayidx159, align 1, !tbaa !2 + %conv160 = zext i8 %47 to i64 + %add161 = add i64 %add157, %conv160 + %add162 = add i64 %add158, %add161 + %arrayidx163 = getelementptr inbounds i8, i8* %buf.addr.3374, i64 13 + %48 = load i8, i8* %arrayidx163, align 1, !tbaa !2 + %conv164 = zext i8 %48 to i64 + %add165 = add i64 %add161, %conv164 + %add166 = add i64 %add162, %add165 + %arrayidx167 = getelementptr inbounds i8, i8* %buf.addr.3374, i64 14 + %49 = load i8, i8* %arrayidx167, align 1, !tbaa !2 + %conv168 = zext i8 %49 to i64 + %add169 = add i64 %add165, %conv168 + %add170 = add i64 %add166, %add169 + %arrayidx171 = getelementptr inbounds i8, i8* %buf.addr.3374, i64 15 + %50 = load i8, i8* %arrayidx171, align 1, !tbaa !2 + %conv172 = zext i8 %50 to i64 + %add173 = add i64 %add169, %conv172 + %add174 = add i64 %add170, %add173 + %add.ptr175 = getelementptr inbounds i8, i8* %buf.addr.3374, i64 16 + %cmp107 = icmp ugt i64 %sub110, 15 + br i1 %cmp107, label %while.body109, label %while.cond177.preheader + +while.body180: ; preds = %while.body180, %while.body180.preheader.new + %sum2.5369 = phi i64 [ %sum2.5369.unr, %while.body180.preheader.new ], [ %add184.7, %while.body180 ] + %len.addr.3368 = phi i64 [ %len.addr.3368.unr, %while.body180.preheader.new ], [ %dec178.7, %while.body180 ] + %buf.addr.4367 = phi i8* [ %buf.addr.4367.unr, %while.body180.preheader.new ], [ %incdec.ptr181.7, %while.body180 ] + %adler.addr.6366 = phi i64 [ %adler.addr.6366.unr, %while.body180.preheader.new ], [ %add183.7, %while.body180 ] + %incdec.ptr181 = getelementptr inbounds i8, i8* %buf.addr.4367, i64 1 + %51 = load i8, i8* %buf.addr.4367, align 1, !tbaa !2 + %conv182 = zext i8 %51 to i64 + %add183 = add i64 %adler.addr.6366, %conv182 + %add184 = add i64 %add183, %sum2.5369 + %incdec.ptr181.1 = getelementptr inbounds i8, i8* %buf.addr.4367, i64 2 + %52 = load i8, i8* %incdec.ptr181, align 1, !tbaa !2 + %conv182.1 = zext i8 %52 to i64 + %add183.1 = add i64 %add183, %conv182.1 + %add184.1 = add i64 %add183.1, %add184 + %incdec.ptr181.2 = getelementptr inbounds i8, i8* %buf.addr.4367, i64 3 + %53 = load i8, i8* %incdec.ptr181.1, align 1, !tbaa !2 + %conv182.2 = zext i8 %53 to i64 + %add183.2 = add i64 %add183.1, %conv182.2 + %add184.2 = add i64 %add183.2, %add184.1 + %incdec.ptr181.3 = getelementptr inbounds i8, i8* %buf.addr.4367, i64 4 + %54 = load i8, i8* %incdec.ptr181.2, align 1, !tbaa !2 + %conv182.3 = zext i8 %54 to i64 + %add183.3 = add i64 %add183.2, %conv182.3 + %add184.3 = add i64 %add183.3, %add184.2 + %incdec.ptr181.4 = getelementptr inbounds i8, i8* %buf.addr.4367, i64 5 + %55 = load i8, i8* %incdec.ptr181.3, align 1, !tbaa !2 + %conv182.4 = zext i8 %55 to i64 + %add183.4 = add i64 %add183.3, %conv182.4 + %add184.4 = add i64 %add183.4, %add184.3 + %incdec.ptr181.5 = getelementptr inbounds i8, i8* %buf.addr.4367, i64 6 + %56 = load i8, i8* %incdec.ptr181.4, align 1, !tbaa !2 + %conv182.5 = zext i8 %56 to i64 + %add183.5 = add i64 %add183.4, %conv182.5 + %add184.5 = add i64 %add183.5, %add184.4 + %incdec.ptr181.6 = getelementptr inbounds i8, i8* %buf.addr.4367, i64 7 + %57 = load i8, i8* %incdec.ptr181.5, align 1, !tbaa !2 + %conv182.6 = zext i8 %57 to i64 + %add183.6 = add i64 %add183.5, %conv182.6 + %add184.6 = add i64 %add183.6, %add184.5 + %dec178.7 = add i64 %len.addr.3368, -8 + %incdec.ptr181.7 = getelementptr inbounds i8, i8* %buf.addr.4367, i64 8 + %58 = load i8, i8* %incdec.ptr181.6, align 1, !tbaa !2 + %conv182.7 = zext i8 %58 to i64 + %add183.7 = add i64 %add183.6, %conv182.7 + %add184.7 = add i64 %add183.7, %add184.6 + %tobool179.7 = icmp eq i64 %dec178.7, 0 + br i1 %tobool179.7, label %while.end185.loopexit.unr-lcssa, label %while.body180 + +while.end185.loopexit.unr-lcssa: ; preds = %while.body180 + br label %while.end185.loopexit + +while.end185.loopexit: ; preds = %while.body180.prol.loopexit, %while.end185.loopexit.unr-lcssa + %add183.lcssa = phi i64 [ %add183.lcssa.unr, %while.body180.prol.loopexit ], [ %add183.7, %while.end185.loopexit.unr-lcssa ] + %add184.lcssa = phi i64 [ %add184.lcssa.unr, %while.body180.prol.loopexit ], [ %add184.7, %while.end185.loopexit.unr-lcssa ] + br label %while.end185 + +while.end185: ; preds = %while.end185.loopexit, %while.cond177.preheader + %adler.addr.6.lcssa = phi i64 [ %add173, %while.cond177.preheader ], [ %add183.lcssa, %while.end185.loopexit ] + %sum2.5.lcssa = phi i64 [ %add174, %while.cond177.preheader ], [ %add184.lcssa, %while.end185.loopexit ] + %rem186 = urem i64 %adler.addr.6.lcssa, 65521 + %rem187 = urem i64 %sum2.5.lcssa, 65521 + br label %if.end188 + +if.end188: ; preds = %while.end103, %while.end185 + %adler.addr.7 = phi i64 [ %rem186, %while.end185 ], [ %rem101, %while.end103 ] + %sum2.6 = phi i64 [ %rem187, %while.end185 ], [ %rem102, %while.end103 ] + %shl189 = shl nuw nsw i64 %sum2.6, 16 + %or190 = or i64 %shl189, %adler.addr.7 + br label %cleanup + +cleanup: ; preds = %if.end11, %if.end188, %while.end, %if.then + %retval.0 = phi i64 [ %or, %if.then ], [ %or28, %while.end ], [ %or190, %if.end188 ], [ 1, %if.end11 ] + ret i64 %retval.0 +} + +attributes #0 = { norecurse nounwind readonly "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="ppc64le" "target-features"="+altivec,+bpermd,+crypto,+direct-move,+extdiv,+power8-vector,+vsx,-power9-vector,-qpx" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { norecurse nounwind readnone "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="ppc64le" "target-features"="+altivec,+bpermd,+crypto,+direct-move,+extdiv,+power8-vector,+vsx,-power9-vector,-qpx" "unsafe-fp-math"="false" "use-soft-float"="false" } + +!llvm.module.flags = !{!0} +!llvm.ident = !{!1} + +!0 = !{i32 1, !"PIC Level", i32 2} +!1 = !{!"clang version 5.0.0 "} +!2 = !{!3, !3, i64 0} +!3 = !{!"omnipotent char", !4, i64 0} +!4 = !{!"Simple C/C++ TBAA"} +!5 = distinct !{!5, !6} +!6 = !{!"llvm.loop.unroll.disable"} +!7 = distinct !{!7, !6}