diff options
Diffstat (limited to 'lib/CodeGen')
| -rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp | 5 | ||||
| -rw-r--r-- | lib/CodeGen/CodeGenPrepare.cpp | 81 | ||||
| -rw-r--r-- | lib/CodeGen/GlobalISel/LegalizerHelper.cpp | 3 | ||||
| -rw-r--r-- | lib/CodeGen/MachineCombiner.cpp | 4 | ||||
| -rw-r--r-- | lib/CodeGen/MachineDominanceFrontier.cpp | 3 | ||||
| -rw-r--r-- | lib/CodeGen/MachineDominators.cpp | 6 | ||||
| -rw-r--r-- | lib/CodeGen/MachinePostDominators.cpp | 7 | ||||
| -rw-r--r-- | lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 161 | ||||
| -rw-r--r-- | lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp | 21 | ||||
| -rw-r--r-- | lib/CodeGen/XRayInstrumentation.cpp | 6 | 
10 files changed, 172 insertions, 125 deletions
| diff --git a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp index d4a90eeabe155..676c48fe5c678 100644 --- a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -664,8 +664,9 @@ DIE *DwarfCompileUnit::constructImportedEntityDIE(    else      EntityDie = getDIE(Entity);    assert(EntityDie); -  addSourceLine(*IMDie, Module->getLine(), Module->getScope()->getFilename(), -                Module->getScope()->getDirectory()); +  auto *File = Module->getFile(); +  addSourceLine(*IMDie, Module->getLine(), File ? File->getFilename() : "", +                File ? File->getDirectory() : "");    addDIEEntry(*IMDie, dwarf::DW_AT_import, *EntityDie);    StringRef Name = Module->getName();    if (!Name.empty()) diff --git a/lib/CodeGen/CodeGenPrepare.cpp b/lib/CodeGen/CodeGenPrepare.cpp index b7155ac2480a7..45dc13d58de70 100644 --- a/lib/CodeGen/CodeGenPrepare.cpp +++ b/lib/CodeGen/CodeGenPrepare.cpp @@ -4267,9 +4267,7 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr,    // Use a worklist to iteratively look through PHI nodes, and ensure that    // the addressing mode obtained from the non-PHI roots of the graph    // are equivalent. -  Value *Consensus = nullptr; -  unsigned NumUsesConsensus = 0; -  bool IsNumUsesConsensusValid = false; +  bool AddrModeFound = false;    bool PhiSeen = false;    SmallVector<Instruction*, 16> AddrModeInsts;    ExtAddrMode AddrMode; @@ -4280,11 +4278,17 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr,      Value *V = worklist.back();      worklist.pop_back(); -    // Break use-def graph loops. -    if (!Visited.insert(V).second) { -      Consensus = nullptr; -      break; -    } +    // We allow traversing cyclic Phi nodes. +    // In case of success after this loop we ensure that traversing through +    // Phi nodes ends up with all cases to compute address of the form +    //    BaseGV + Base + Scale * Index + Offset +    // where Scale and Offset are constans and BaseGV, Base and Index +    // are exactly the same Values in all cases. +    // It means that BaseGV, Scale and Offset dominate our memory instruction +    // and have the same value as they had in address computation represented +    // as Phi. So we can safely sink address computation to memory instruction. +    if (!Visited.insert(V).second) +      continue;      // For a PHI node, push all of its incoming values.      if (PHINode *P = dyn_cast<PHINode>(V)) { @@ -4297,47 +4301,26 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr,      // For non-PHIs, determine the addressing mode being computed.  Note that      // the result may differ depending on what other uses our candidate      // addressing instructions might have. -    SmallVector<Instruction*, 16> NewAddrModeInsts; +    AddrModeInsts.clear();      ExtAddrMode NewAddrMode = AddressingModeMatcher::Match( -      V, AccessTy, AddrSpace, MemoryInst, NewAddrModeInsts, *TLI, *TRI, -      InsertedInsts, PromotedInsts, TPT); - -    // This check is broken into two cases with very similar code to avoid using -    // getNumUses() as much as possible. Some values have a lot of uses, so -    // calling getNumUses() unconditionally caused a significant compile-time -    // regression. -    if (!Consensus) { -      Consensus = V; -      AddrMode = NewAddrMode; -      AddrModeInsts = NewAddrModeInsts; -      continue; -    } else if (NewAddrMode == AddrMode) { -      if (!IsNumUsesConsensusValid) { -        NumUsesConsensus = Consensus->getNumUses(); -        IsNumUsesConsensusValid = true; -      } +        V, AccessTy, AddrSpace, MemoryInst, AddrModeInsts, *TLI, *TRI, +        InsertedInsts, PromotedInsts, TPT); -      // Ensure that the obtained addressing mode is equivalent to that obtained -      // for all other roots of the PHI traversal.  Also, when choosing one -      // such root as representative, select the one with the most uses in order -      // to keep the cost modeling heuristics in AddressingModeMatcher -      // applicable. -      unsigned NumUses = V->getNumUses(); -      if (NumUses > NumUsesConsensus) { -        Consensus = V; -        NumUsesConsensus = NumUses; -        AddrModeInsts = NewAddrModeInsts; -      } +    if (!AddrModeFound) { +      AddrModeFound = true; +      AddrMode = NewAddrMode;        continue;      } +    if (NewAddrMode == AddrMode) +      continue; -    Consensus = nullptr; +    AddrModeFound = false;      break;    }    // If the addressing mode couldn't be determined, or if multiple different    // ones were determined, bail out now. -  if (!Consensus) { +  if (!AddrModeFound) {      TPT.rollback(LastKnownGood);      return false;    } @@ -4847,25 +4830,7 @@ bool CodeGenPrepare::canFormExtLd(    if (!HasPromoted && LI->getParent() == Inst->getParent())      return false; -  EVT VT = TLI->getValueType(*DL, Inst->getType()); -  EVT LoadVT = TLI->getValueType(*DL, LI->getType()); - -  // If the load has other users and the truncate is not free, this probably -  // isn't worthwhile. -  if (!LI->hasOneUse() && (TLI->isTypeLegal(LoadVT) || !TLI->isTypeLegal(VT)) && -      !TLI->isTruncateFree(Inst->getType(), LI->getType())) -    return false; - -  // Check whether the target supports casts folded into loads. -  unsigned LType; -  if (isa<ZExtInst>(Inst)) -    LType = ISD::ZEXTLOAD; -  else { -    assert(isa<SExtInst>(Inst) && "Unexpected ext type!"); -    LType = ISD::SEXTLOAD; -  } - -  return TLI->isLoadExtLegal(LType, VT, LoadVT); +  return TLI->isExtLoad(LI, Inst, *DL);  }  /// Move a zext or sext fed by a load into the same basic block as the load, diff --git a/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/lib/CodeGen/GlobalISel/LegalizerHelper.cpp index 49fb5e8f075b8..5258370e6680b 100644 --- a/lib/CodeGen/GlobalISel/LegalizerHelper.cpp +++ b/lib/CodeGen/GlobalISel/LegalizerHelper.cpp @@ -433,9 +433,12 @@ LegalizerHelper::widenScalar(MachineInstr &MI, unsigned TypeIdx, LLT WideTy) {    }    case TargetOpcode::G_SDIV:    case TargetOpcode::G_UDIV: +  case TargetOpcode::G_SREM: +  case TargetOpcode::G_UREM:    case TargetOpcode::G_ASHR:    case TargetOpcode::G_LSHR: {      unsigned ExtOp = MI.getOpcode() == TargetOpcode::G_SDIV || +                             MI.getOpcode() == TargetOpcode::G_SREM ||                               MI.getOpcode() == TargetOpcode::G_ASHR                           ? TargetOpcode::G_SEXT                           : TargetOpcode::G_ZEXT; diff --git a/lib/CodeGen/MachineCombiner.cpp b/lib/CodeGen/MachineCombiner.cpp index c176de16b5931..e6f80dbb86302 100644 --- a/lib/CodeGen/MachineCombiner.cpp +++ b/lib/CodeGen/MachineCombiner.cpp @@ -11,8 +11,6 @@  // instructions do not lengthen the critical path or the resource depth.  //===----------------------------------------------------------------------===// -#define DEBUG_TYPE "machine-combiner" -  #include "llvm/ADT/DenseMap.h"  #include "llvm/ADT/Statistic.h"  #include "llvm/CodeGen/MachineDominators.h" @@ -32,6 +30,8 @@  using namespace llvm; +#define DEBUG_TYPE "machine-combiner" +  STATISTIC(NumInstCombined, "Number of machineinst combined");  namespace { diff --git a/lib/CodeGen/MachineDominanceFrontier.cpp b/lib/CodeGen/MachineDominanceFrontier.cpp index 28ecc8f96805a..b559e4e513a6f 100644 --- a/lib/CodeGen/MachineDominanceFrontier.cpp +++ b/lib/CodeGen/MachineDominanceFrontier.cpp @@ -15,7 +15,8 @@  using namespace llvm;  namespace llvm { -template class DominanceFrontierBase<MachineBasicBlock>; +template class DominanceFrontierBase<MachineBasicBlock, false>; +template class DominanceFrontierBase<MachineBasicBlock, true>;  template class ForwardDominanceFrontierBase<MachineBasicBlock>;  } diff --git a/lib/CodeGen/MachineDominators.cpp b/lib/CodeGen/MachineDominators.cpp index 65e9e5d195a46..845e8232477c5 100644 --- a/lib/CodeGen/MachineDominators.cpp +++ b/lib/CodeGen/MachineDominators.cpp @@ -31,7 +31,7 @@ static cl::opt<bool, true> VerifyMachineDomInfoX(  namespace llvm {  template class DomTreeNodeBase<MachineBasicBlock>; -template class DominatorTreeBase<MachineBasicBlock>; +template class DominatorTreeBase<MachineBasicBlock, false>; // DomTreeBase  }  char MachineDominatorTree::ID = 0; @@ -49,7 +49,7 @@ void MachineDominatorTree::getAnalysisUsage(AnalysisUsage &AU) const {  bool MachineDominatorTree::runOnMachineFunction(MachineFunction &F) {    CriticalEdgesToSplit.clear();    NewBBs.clear(); -  DT.reset(new DominatorTreeBase<MachineBasicBlock>(false)); +  DT.reset(new DomTreeBase<MachineBasicBlock>());    DT->recalculate(F);    return false;  } @@ -144,7 +144,7 @@ void MachineDominatorTree::verifyDomTree() const {      return;    MachineFunction &F = *getRoot()->getParent(); -  DominatorTreeBase<MachineBasicBlock> OtherDT(false); +  DomTreeBase<MachineBasicBlock> OtherDT;    OtherDT.recalculate(F);    if (getRootNode()->getBlock() != OtherDT.getRootNode()->getBlock() ||        DT->compare(OtherDT)) { diff --git a/lib/CodeGen/MachinePostDominators.cpp b/lib/CodeGen/MachinePostDominators.cpp index c3f6e9249e7da..488377998cb31 100644 --- a/lib/CodeGen/MachinePostDominators.cpp +++ b/lib/CodeGen/MachinePostDominators.cpp @@ -16,6 +16,10 @@  using namespace llvm; +namespace llvm { +template class DominatorTreeBase<MachineBasicBlock, true>; // PostDomTreeBase +} +  char MachinePostDominatorTree::ID = 0;  //declare initializeMachinePostDominatorTreePass @@ -24,8 +28,7 @@ INITIALIZE_PASS(MachinePostDominatorTree, "machinepostdomtree",  MachinePostDominatorTree::MachinePostDominatorTree() : MachineFunctionPass(ID) {    initializeMachinePostDominatorTreePass(*PassRegistry::getPassRegistry()); -  DT = new DominatorTreeBase<MachineBasicBlock>(true); //true indicate -                                                       // postdominator +  DT = new PostDomTreeBase<MachineBasicBlock>();  }  FunctionPass * diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 71382c18fdf9d..d5d3f7a61a9f9 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -3889,9 +3889,8 @@ SDValue DAGCombiner::visitAND(SDNode *N) {    // Note: the SimplifyDemandedBits fold below can make an information-losing    // transform, and then we have no way to find this better fold.    if (N1C && N1C->isOne() && N0.getOpcode() == ISD::SUB) { -    ConstantSDNode *SubLHS = isConstOrConstSplat(N0.getOperand(0)); -    SDValue SubRHS = N0.getOperand(1); -    if (SubLHS && SubLHS->isNullValue()) { +    if (isNullConstantOrNullSplatConstant(N0.getOperand(0))) { +      SDValue SubRHS = N0.getOperand(1);        if (SubRHS.getOpcode() == ISD::ZERO_EXTEND &&            SubRHS.getOperand(0).getScalarValueSizeInBits() == 1)          return SubRHS; @@ -4586,6 +4585,20 @@ SDNode *DAGCombiner::MatchRotatePosNeg(SDValue Shifted, SDValue Pos,    return nullptr;  } +// if Left + Right == Sum (constant or constant splat vector) +static bool sumMatchConstant(SDValue Left, SDValue Right, unsigned Sum, +                             SelectionDAG &DAG, const SDLoc &DL) { +  EVT ShiftVT = Left.getValueType(); +  if (ShiftVT != Right.getValueType()) return false; + +  SDValue ShiftSum = DAG.FoldConstantArithmetic(ISD::ADD, DL, ShiftVT, +                         Left.getNode(), Right.getNode()); +  if (!ShiftSum) return false; + +  ConstantSDNode *CSum = isConstOrConstSplat(ShiftSum); +  return CSum && CSum->getZExtValue() == Sum; +} +  // MatchRotate - Handle an 'or' of two operands.  If this is one of the many  // idioms for rotate, and if the target supports rotation instructions, generate  // a rot[lr]. @@ -4631,30 +4644,24 @@ SDNode *DAGCombiner::MatchRotate(SDValue LHS, SDValue RHS, const SDLoc &DL) {    // fold (or (shl x, C1), (srl x, C2)) -> (rotl x, C1)    // fold (or (shl x, C1), (srl x, C2)) -> (rotr x, C2) -  if (isConstOrConstSplat(LHSShiftAmt) && isConstOrConstSplat(RHSShiftAmt)) { -    uint64_t LShVal = isConstOrConstSplat(LHSShiftAmt)->getZExtValue(); -    uint64_t RShVal = isConstOrConstSplat(RHSShiftAmt)->getZExtValue(); -    if ((LShVal + RShVal) != EltSizeInBits) -      return nullptr; - +  if (sumMatchConstant(LHSShiftAmt, RHSShiftAmt, EltSizeInBits, DAG, DL)) {      SDValue Rot = DAG.getNode(HasROTL ? ISD::ROTL : ISD::ROTR, DL, VT,                                LHSShiftArg, HasROTL ? LHSShiftAmt : RHSShiftAmt);      // If there is an AND of either shifted operand, apply it to the result.      if (LHSMask.getNode() || RHSMask.getNode()) { -      SDValue Mask = DAG.getAllOnesConstant(DL, VT); +      SDValue AllOnes = DAG.getAllOnesConstant(DL, VT); +      SDValue Mask = AllOnes;        if (LHSMask.getNode()) { -        APInt RHSBits = APInt::getLowBitsSet(EltSizeInBits, LShVal); +        SDValue RHSBits = DAG.getNode(ISD::SRL, DL, VT, AllOnes, RHSShiftAmt);          Mask = DAG.getNode(ISD::AND, DL, VT, Mask, -                           DAG.getNode(ISD::OR, DL, VT, LHSMask, -                                       DAG.getConstant(RHSBits, DL, VT))); +                           DAG.getNode(ISD::OR, DL, VT, LHSMask, RHSBits));        }        if (RHSMask.getNode()) { -        APInt LHSBits = APInt::getHighBitsSet(EltSizeInBits, RShVal); +        SDValue LHSBits = DAG.getNode(ISD::SHL, DL, VT, AllOnes, LHSShiftAmt);          Mask = DAG.getNode(ISD::AND, DL, VT, Mask, -                           DAG.getNode(ISD::OR, DL, VT, RHSMask, -                                       DAG.getConstant(LHSBits, DL, VT))); +                           DAG.getNode(ISD::OR, DL, VT, RHSMask, LHSBits));        }        Rot = DAG.getNode(ISD::AND, DL, VT, Rot, Mask); @@ -5272,11 +5279,21 @@ SDValue DAGCombiner::visitRotate(SDNode *N) {    SDValue N0 = N->getOperand(0);    SDValue N1 = N->getOperand(1);    EVT VT = N->getValueType(0); +  unsigned Bitsize = VT.getScalarSizeInBits();    // fold (rot x, 0) -> x    if (isNullConstantOrNullSplatConstant(N1))      return N0; +  // fold (rot x, c) -> (rot x, c % BitSize) +  if (ConstantSDNode *Cst = isConstOrConstSplat(N1)) { +    if (Cst->getAPIntValue().uge(Bitsize)) { +      uint64_t RotAmt = Cst->getAPIntValue().urem(Bitsize); +      return DAG.getNode(N->getOpcode(), dl, VT, N0, +                         DAG.getConstant(RotAmt, dl, N1.getValueType())); +    } +  } +    // fold (rot* x, (trunc (and y, c))) -> (rot* x, (and (trunc y), (trunc c))).    if (N1.getOpcode() == ISD::TRUNCATE &&        N1.getOperand(0).getOpcode() == ISD::AND) { @@ -5286,22 +5303,24 @@ SDValue DAGCombiner::visitRotate(SDNode *N) {    unsigned NextOp = N0.getOpcode();    // fold (rot* (rot* x, c2), c1) -> (rot* x, c1 +- c2 % bitsize) -  if (NextOp == ISD::ROTL || NextOp == ISD::ROTR) -    if (SDNode *C1 = DAG.isConstantIntBuildVectorOrConstantInt(N1)) -      if (SDNode *C2 = -          DAG.isConstantIntBuildVectorOrConstantInt(N0.getOperand(1))) { -        bool SameSide = (N->getOpcode() == NextOp); -        unsigned CombineOp = SameSide ? ISD::ADD : ISD::SUB; -        if (SDValue CombinedShift = -            DAG.FoldConstantArithmetic(CombineOp, dl, VT, C1, C2)) { -          unsigned Bitsize = VT.getScalarSizeInBits(); -          SDValue BitsizeC = DAG.getConstant(Bitsize, dl, VT); -          SDValue CombinedShiftNorm = DAG.FoldConstantArithmetic( -            ISD::SREM, dl, VT, CombinedShift.getNode(), BitsizeC.getNode()); -          return DAG.getNode( -            N->getOpcode(), dl, VT, N0->getOperand(0), CombinedShiftNorm); -        } +  if (NextOp == ISD::ROTL || NextOp == ISD::ROTR) { +    SDNode *C1 = DAG.isConstantIntBuildVectorOrConstantInt(N1); +    SDNode *C2 = DAG.isConstantIntBuildVectorOrConstantInt(N0.getOperand(1)); +    if (C1 && C2 && C1->getValueType(0) == C2->getValueType(0)) { +      EVT ShiftVT = C1->getValueType(0); +      bool SameSide = (N->getOpcode() == NextOp); +      unsigned CombineOp = SameSide ? ISD::ADD : ISD::SUB; +      if (SDValue CombinedShift = +              DAG.FoldConstantArithmetic(CombineOp, dl, ShiftVT, C1, C2)) { +        SDValue BitsizeC = DAG.getConstant(Bitsize, dl, ShiftVT); +        SDValue CombinedShiftNorm = DAG.FoldConstantArithmetic( +            ISD::SREM, dl, ShiftVT, CombinedShift.getNode(), +            BitsizeC.getNode()); +        return DAG.getNode(N->getOpcode(), dl, VT, N0->getOperand(0), +                           CombinedShiftNorm);        } +    } +  }    return SDValue();  } @@ -7152,8 +7171,14 @@ SDValue DAGCombiner::visitSIGN_EXTEND(SDNode *N) {        SDValue Trunc = DAG.getNode(ISD::TRUNCATE, SDLoc(N0),                                    N0.getValueType(), ExtLoad);        ExtendSetCCUses(SetCCs, Trunc, ExtLoad, DL, ISD::SIGN_EXTEND); -      CombineTo(N0.getNode(), Trunc, ExtLoad.getValue(1)); -      return CombineTo(N, ExtLoad); // Return N so it doesn't get rechecked! +      // If the load value is used only by N, replace it via CombineTo N. +      bool NoReplaceTrunc = SDValue(LN0, 0).hasOneUse(); +      CombineTo(N, ExtLoad); +      if (NoReplaceTrunc) +        DAG.ReplaceAllUsesOfValueWith(SDValue(LN0, 1), ExtLoad.getValue(1)); +      else +        CombineTo(LN0, Trunc, ExtLoad.getValue(1)); +      return SDValue(N, 0);      }    } @@ -7210,8 +7235,13 @@ SDValue DAGCombiner::visitSIGN_EXTEND(SDNode *N) {                                      SDLoc(N0.getOperand(0)),                                      N0.getOperand(0).getValueType(), ExtLoad);          ExtendSetCCUses(SetCCs, Trunc, ExtLoad, DL, ISD::SIGN_EXTEND); -        CombineTo(N0.getOperand(0).getNode(), Trunc, ExtLoad.getValue(1)); -        return CombineTo(N, And); // Return N so it doesn't get rechecked! +        bool NoReplaceTrunc = SDValue(LN0, 0).hasOneUse(); +        CombineTo(N, And); +        if (NoReplaceTrunc) +          DAG.ReplaceAllUsesOfValueWith(SDValue(LN0, 1), ExtLoad.getValue(1)); +        else +          CombineTo(LN0, Trunc, ExtLoad.getValue(1)); +        return SDValue(N,0); // Return N so it doesn't get rechecked!        }      }    } @@ -7451,8 +7481,14 @@ SDValue DAGCombiner::visitZERO_EXTEND(SDNode *N) {        SDValue Trunc = DAG.getNode(ISD::TRUNCATE, SDLoc(N0),                                    N0.getValueType(), ExtLoad);        ExtendSetCCUses(SetCCs, Trunc, ExtLoad, SDLoc(N), ISD::ZERO_EXTEND); -      CombineTo(N0.getNode(), Trunc, ExtLoad.getValue(1)); -      return CombineTo(N, ExtLoad); // Return N so it doesn't get rechecked! +      // If the load value is used only by N, replace it via CombineTo N. +      bool NoReplaceTrunc = SDValue(LN0, 0).hasOneUse(); +      CombineTo(N, ExtLoad); +      if (NoReplaceTrunc) +        DAG.ReplaceAllUsesOfValueWith(SDValue(LN0, 1), ExtLoad.getValue(1)); +      else +        CombineTo(LN0, Trunc, ExtLoad.getValue(1)); +      return SDValue(N, 0); // Return N so it doesn't get rechecked!      }    } @@ -7503,8 +7539,13 @@ SDValue DAGCombiner::visitZERO_EXTEND(SDNode *N) {                                      SDLoc(N0.getOperand(0)),                                      N0.getOperand(0).getValueType(), ExtLoad);          ExtendSetCCUses(SetCCs, Trunc, ExtLoad, DL, ISD::ZERO_EXTEND); -        CombineTo(N0.getOperand(0).getNode(), Trunc, ExtLoad.getValue(1)); -        return CombineTo(N, And); // Return N so it doesn't get rechecked! +        bool NoReplaceTrunc = SDValue(LN0, 0).hasOneUse(); +        CombineTo(N, And); +        if (NoReplaceTrunc) +          DAG.ReplaceAllUsesOfValueWith(SDValue(LN0, 1), ExtLoad.getValue(1)); +        else +          CombineTo(LN0, Trunc, ExtLoad.getValue(1)); +        return SDValue(N,0); // Return N so it doesn't get rechecked!        }      }    } @@ -7676,13 +7717,18 @@ SDValue DAGCombiner::visitANY_EXTEND(SDNode *N) {                                         LN0->getChain(),                                         LN0->getBasePtr(), N0.getValueType(),                                         LN0->getMemOperand()); -      CombineTo(N, ExtLoad);        SDValue Trunc = DAG.getNode(ISD::TRUNCATE, SDLoc(N0),                                    N0.getValueType(), ExtLoad); -      CombineTo(N0.getNode(), Trunc, ExtLoad.getValue(1));        ExtendSetCCUses(SetCCs, Trunc, ExtLoad, SDLoc(N),                        ISD::ANY_EXTEND); -      return SDValue(N, 0);   // Return N so it doesn't get rechecked! +      // If the load value is used only by N, replace it via CombineTo N. +      bool NoReplaceTrunc = N0.hasOneUse(); +      CombineTo(N, ExtLoad);  +      if (NoReplaceTrunc) +        DAG.ReplaceAllUsesOfValueWith(SDValue(LN0, 1), ExtLoad.getValue(1)); +      else +        CombineTo(LN0, Trunc, ExtLoad.getValue(1)); +      return SDValue(N, 0); // Return N so it doesn't get rechecked!      }    } @@ -11373,12 +11419,8 @@ SDValue DAGCombiner::visitLOAD(SDNode *N) {        SDValue Token = DAG.getNode(ISD::TokenFactor, SDLoc(N),                                    MVT::Other, Chain, ReplLoad.getValue(1)); -      // Make sure the new and old chains are cleaned up. -      AddToWorklist(Token.getNode()); - -      // Replace uses with load result and token factor. Don't add users -      // to work list. -      return CombineTo(N, ReplLoad.getValue(0), Token, false); +      // Replace uses with load result and token factor +      return CombineTo(N, ReplLoad.getValue(0), Token);      }    } @@ -12744,7 +12786,12 @@ bool DAGCombiner::MergeConsecutiveStores(StoreSDNode *St) {               TLI.storeOfVectorConstantIsCheap(MemVT, i + 1, FirstStoreAS)) &&              !NoVectors) {            // Find a legal type for the vector store. -          EVT Ty = EVT::getVectorVT(Context, MemVT, i + 1); +          unsigned Elts = i + 1; +          if (MemVT.isVector()) { +            // When merging vector stores, get the total number of elements. +            Elts *= MemVT.getVectorNumElements(); +          } +          EVT Ty = EVT::getVectorVT(Context, MemVT.getScalarType(), Elts);            if (TLI.isTypeLegal(Ty) &&                TLI.canMergeStoresTo(FirstStoreAS, Ty, DAG) &&                TLI.allowsMemoryAccess(Context, DL, Ty, FirstStoreAS, @@ -13003,7 +13050,7 @@ bool DAGCombiner::MergeConsecutiveStores(StoreSDNode *St) {      SDValue NewStoreChain = getMergeStoreChains(StoreNodes, NumElem);      AddToWorklist(NewStoreChain.getNode()); -    MachineMemOperand::Flags MMOFlags = isDereferenceable ?  +    MachineMemOperand::Flags MMOFlags = isDereferenceable ?                                            MachineMemOperand::MODereferenceable:                                            MachineMemOperand::MONone; @@ -16703,6 +16750,20 @@ bool DAGCombiner::isAlias(LSBaseSDNode *Op0, LSBaseSDNode *Op1) const {    if (BasePtr0.equalBaseIndex(BasePtr1, DAG, PtrDiff))      return !((NumBytes0 <= PtrDiff) || (PtrDiff + NumBytes1 <= 0)); +  // If both BasePtr0 and BasePtr1 are FrameIndexes, we will not be +  // able to calculate their relative offset if at least one arises +  // from an alloca. However, these allocas cannot overlap and we +  // can infer there is no alias. +  if (auto *A = dyn_cast<FrameIndexSDNode>(BasePtr0.getBase())) +    if (auto *B = dyn_cast<FrameIndexSDNode>(BasePtr1.getBase())) { +      MachineFrameInfo &MFI = DAG.getMachineFunction().getFrameInfo(); +      // If the base are the same frame index but the we couldn't find a +      // constant offset, (indices are different) be conservative. +      if (A != B && (!MFI.isFixedObjectIndex(A->getIndex()) || +                     !MFI.isFixedObjectIndex(B->getIndex()))) +        return false; +    } +    // FIXME: findBaseOffset and ConstantValue/GlobalValue/FrameIndex analysis    // modified to use BaseIndexOffset. diff --git a/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp b/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp index ac3247948169e..75fec7bd1d485 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp @@ -1827,10 +1827,11 @@ void DAGTypeLegalizer::ExpandIntRes_ADDSUB(SDNode *N,      TLI.isOperationLegalOrCustom(N->getOpcode() == ISD::ADD ?                                     ISD::UADDO : ISD::USUBO,                                   TLI.getTypeToExpandTo(*DAG.getContext(), NVT)); +  TargetLoweringBase::BooleanContent BoolType = TLI.getBooleanContents(NVT); +    if (hasOVF) {      EVT OvfVT = getSetCCResultType(NVT);      SDVTList VTList = DAG.getVTList(NVT, OvfVT); -    TargetLoweringBase::BooleanContent BoolType = TLI.getBooleanContents(NVT);      int RevOpc;      if (N->getOpcode() == ISD::ADD) {        RevOpc = ISD::SUB; @@ -1863,6 +1864,13 @@ void DAGTypeLegalizer::ExpandIntRes_ADDSUB(SDNode *N,      Hi = DAG.getNode(ISD::ADD, dl, NVT, makeArrayRef(HiOps, 2));      SDValue Cmp1 = DAG.getSetCC(dl, getSetCCResultType(NVT), Lo, LoOps[0],                                  ISD::SETULT); + +    if (BoolType == TargetLoweringBase::ZeroOrOneBooleanContent) { +      SDValue Carry = DAG.getZExtOrTrunc(Cmp1, dl, NVT); +      Hi = DAG.getNode(ISD::ADD, dl, NVT, Hi, Carry); +      return; +    } +      SDValue Carry1 = DAG.getSelect(dl, NVT, Cmp1,                                     DAG.getConstant(1, dl, NVT),                                     DAG.getConstant(0, dl, NVT)); @@ -1877,9 +1885,14 @@ void DAGTypeLegalizer::ExpandIntRes_ADDSUB(SDNode *N,      SDValue Cmp =        DAG.getSetCC(dl, getSetCCResultType(LoOps[0].getValueType()),                     LoOps[0], LoOps[1], ISD::SETULT); -    SDValue Borrow = DAG.getSelect(dl, NVT, Cmp, -                                   DAG.getConstant(1, dl, NVT), -                                   DAG.getConstant(0, dl, NVT)); + +    SDValue Borrow; +    if (BoolType == TargetLoweringBase::ZeroOrOneBooleanContent) +      Borrow = DAG.getZExtOrTrunc(Cmp, dl, NVT); +    else +      Borrow = DAG.getSelect(dl, NVT, Cmp, DAG.getConstant(1, dl, NVT), +                             DAG.getConstant(0, dl, NVT)); +      Hi = DAG.getNode(ISD::SUB, dl, NVT, Hi, Borrow);    }  } diff --git a/lib/CodeGen/XRayInstrumentation.cpp b/lib/CodeGen/XRayInstrumentation.cpp index 1a8d5a4f45dae..0b4c6e551667b 100644 --- a/lib/CodeGen/XRayInstrumentation.cpp +++ b/lib/CodeGen/XRayInstrumentation.cpp @@ -142,9 +142,9 @@ bool XRayInstrumentation::runOnMachineFunction(MachineFunction &MF) {        return false; // Invalid value for threshold.      // Count the number of MachineInstr`s in MachineFunction -    int64_t MICount = 0;
 -    for (const auto& MBB : MF)
 -      MICount += MBB.size();
 +    int64_t MICount = 0; +    for (const auto& MBB : MF) +      MICount += MBB.size();      // Check if we have a loop.      // FIXME: Maybe make this smarter, and see whether the loops are dependent | 
