1//===- HexagonConstPropagation.cpp ----------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#define DEBUG_TYPE "hcp"
10
11#include "HexagonInstrInfo.h"
12#include "HexagonRegisterInfo.h"
13#include "HexagonSubtarget.h"
14#include "llvm/ADT/APFloat.h"
15#include "llvm/ADT/APInt.h"
16#include "llvm/ADT/PostOrderIterator.h"
17#include "llvm/ADT/SetVector.h"
18#include "llvm/ADT/SmallVector.h"
19#include "llvm/ADT/StringRef.h"
20#include "llvm/CodeGen/MachineBasicBlock.h"
21#include "llvm/CodeGen/MachineFunction.h"
22#include "llvm/CodeGen/MachineFunctionPass.h"
23#include "llvm/CodeGen/MachineInstr.h"
24#include "llvm/CodeGen/MachineInstrBuilder.h"
25#include "llvm/CodeGen/MachineOperand.h"
26#include "llvm/CodeGen/MachineRegisterInfo.h"
27#include "llvm/CodeGen/TargetRegisterInfo.h"
28#include "llvm/CodeGen/TargetSubtargetInfo.h"
29#include "llvm/IR/Constants.h"
30#include "llvm/IR/Type.h"
31#include "llvm/Pass.h"
32#include "llvm/Support/Casting.h"
33#include "llvm/Support/Compiler.h"
34#include "llvm/Support/Debug.h"
35#include "llvm/Support/ErrorHandling.h"
36#include "llvm/Support/MathExtras.h"
37#include "llvm/Support/raw_ostream.h"
38#include <cassert>
39#include <cstdint>
40#include <cstring>
41#include <iterator>
42#include <map>
43#include <queue>
44#include <set>
45#include <utility>
46#include <vector>
47
48using namespace llvm;
49
50namespace {
51
52  // Properties of a value that are tracked by the propagation.
53  // A property that is marked as present (i.e. bit is set) dentes that the
54  // value is known (proven) to have this property. Not all combinations
55  // of bits make sense, for example Zero and NonZero are mutually exclusive,
56  // but on the other hand, Zero implies Finite. In this case, whenever
57  // the Zero property is present, Finite should also be present.
58  class ConstantProperties {
59  public:
60    enum {
61      Unknown   = 0x0000,
62      Zero      = 0x0001,
63      NonZero   = 0x0002,
64      Finite    = 0x0004,
65      Infinity  = 0x0008,
66      NaN       = 0x0010,
67      SignedZero = 0x0020,
68      NumericProperties = (Zero|NonZero|Finite|Infinity|NaN|SignedZero),
69      PosOrZero       = 0x0100,
70      NegOrZero       = 0x0200,
71      SignProperties  = (PosOrZero|NegOrZero),
72      Everything      = (NumericProperties|SignProperties)
73    };
74
75    // For a given constant, deduce the set of trackable properties that this
76    // constant has.
77    static uint32_t deduce(const Constant *C);
78  };
79
80  // A representation of a register as it can appear in a MachineOperand,
81  // i.e. a pair register:subregister.
82
83  // FIXME: Use TargetInstrInfo::RegSubRegPair. Also duplicated in
84  // HexagonGenPredicate
85  struct RegisterSubReg {
86    unsigned Reg, SubReg;
87
88    explicit RegisterSubReg(unsigned R, unsigned SR = 0) : Reg(R), SubReg(SR) {}
89    explicit RegisterSubReg(const MachineOperand &MO)
90      : Reg(MO.getReg()), SubReg(MO.getSubReg()) {}
91
92    void print(const TargetRegisterInfo *TRI = nullptr) const {
93      dbgs() << printReg(Reg, TRI, SubReg);
94    }
95
96    bool operator== (const RegisterSubReg &R) const {
97      return (Reg == R.Reg) && (SubReg == R.SubReg);
98    }
99  };
100
101  // Lattice cell, based on that was described in the W-Z paper on constant
102  // propagation.
103  // Latice cell will be allowed to hold multiple constant values. While
104  // multiple values would normally indicate "bottom", we can still derive
105  // some useful information from them. For example, comparison X > 0
106  // could be folded if all the values in the cell associated with X are
107  // positive.
108  class LatticeCell {
109  private:
110    enum { Normal, Top, Bottom };
111
112    static const unsigned MaxCellSize = 4;
113
114    unsigned Kind:2;
115    unsigned Size:3;
116    unsigned IsSpecial:1;
117    unsigned :0;
118
119  public:
120    union {
121      uint32_t Properties;
122      const Constant *Value;
123      const Constant *Values[MaxCellSize];
124    };
125
126    LatticeCell() : Kind(Top), Size(0), IsSpecial(false) {
127      for (unsigned i = 0; i < MaxCellSize; ++i)
128        Values[i] = nullptr;
129    }
130
131    bool meet(const LatticeCell &L);
132    bool add(const Constant *C);
133    bool add(uint32_t Property);
134    uint32_t properties() const;
135    unsigned size() const { return Size; }
136
137    LatticeCell(const LatticeCell &L) {
138      // This memcpy also copies Properties (when L.Size == 0).
139      uint32_t N =
140          L.IsSpecial ? sizeof L.Properties : L.Size * sizeof(const Constant *);
141      memcpy(Values, L.Values, N);
142      Kind = L.Kind;
143      Size = L.Size;
144      IsSpecial = L.IsSpecial;
145    }
146
147    LatticeCell &operator=(const LatticeCell &L) {
148      if (this != &L) {
149        // This memcpy also copies Properties (when L.Size == 0).
150        uint32_t N = L.IsSpecial ? sizeof L.Properties
151                                 : L.Size * sizeof(const Constant *);
152        memcpy(Values, L.Values, N);
153        Kind = L.Kind;
154        Size = L.Size;
155        IsSpecial = L.IsSpecial;
156      }
157      return *this;
158    }
159
160    bool isSingle() const { return size() == 1; }
161    bool isProperty() const { return IsSpecial; }
162    bool isTop() const { return Kind == Top; }
163    bool isBottom() const { return Kind == Bottom; }
164
165    bool setBottom() {
166      bool Changed = (Kind != Bottom);
167      Kind = Bottom;
168      Size = 0;
169      IsSpecial = false;
170      return Changed;
171    }
172
173    void print(raw_ostream &os) const;
174
175  private:
176    void setProperty() {
177      IsSpecial = true;
178      Size = 0;
179      Kind = Normal;
180    }
181
182    bool convertToProperty();
183  };
184
185#ifndef NDEBUG
186  raw_ostream &operator<< (raw_ostream &os, const LatticeCell &L) {
187    L.print(os);
188    return os;
189  }
190#endif
191
192  class MachineConstEvaluator;
193
194  class MachineConstPropagator {
195  public:
196    MachineConstPropagator(MachineConstEvaluator &E) : MCE(E) {
197      Bottom.setBottom();
198    }
199
200    // Mapping: vreg -> cell
201    // The keys are registers _without_ subregisters. This won't allow
202    // definitions in the form of "vreg:subreg = ...". Such definitions
203    // would be questionable from the point of view of SSA, since the "vreg"
204    // could not be initialized in its entirety (specifically, an instruction
205    // defining the "other part" of "vreg" would also count as a definition
206    // of "vreg", which would violate the SSA).
207    // If a value of a pair vreg:subreg needs to be obtained, the cell for
208    // "vreg" needs to be looked up, and then the value of subregister "subreg"
209    // needs to be evaluated.
210    class CellMap {
211    public:
212      CellMap() {
213        assert(Top.isTop());
214        Bottom.setBottom();
215      }
216
217      void clear() { Map.clear(); }
218
219      bool has(unsigned R) const {
220        // All non-virtual registers are considered "bottom".
221        if (!Register::isVirtualRegister(R))
222          return true;
223        MapType::const_iterator F = Map.find(R);
224        return F != Map.end();
225      }
226
227      const LatticeCell &get(unsigned R) const {
228        if (!Register::isVirtualRegister(R))
229          return Bottom;
230        MapType::const_iterator F = Map.find(R);
231        if (F != Map.end())
232          return F->second;
233        return Top;
234      }
235
236      // Invalidates any const references.
237      void update(unsigned R, const LatticeCell &L) {
238        Map[R] = L;
239      }
240
241      void print(raw_ostream &os, const TargetRegisterInfo &TRI) const;
242
243    private:
244      using MapType = std::map<unsigned, LatticeCell>;
245
246      MapType Map;
247      // To avoid creating "top" entries, return a const reference to
248      // this cell in "get". Also, have a "Bottom" cell to return from
249      // get when a value of a physical register is requested.
250      LatticeCell Top, Bottom;
251
252    public:
253      using const_iterator = MapType::const_iterator;
254
255      const_iterator begin() const { return Map.begin(); }
256      const_iterator end() const { return Map.end(); }
257    };
258
259    bool run(MachineFunction &MF);
260
261  private:
262    void visitPHI(const MachineInstr &PN);
263    void visitNonBranch(const MachineInstr &MI);
264    void visitBranchesFrom(const MachineInstr &BrI);
265    void visitUsesOf(unsigned R);
266    bool computeBlockSuccessors(const MachineBasicBlock *MB,
267          SetVector<const MachineBasicBlock*> &Targets);
268    void removeCFGEdge(MachineBasicBlock *From, MachineBasicBlock *To);
269
270    void propagate(MachineFunction &MF);
271    bool rewrite(MachineFunction &MF);
272
273    MachineRegisterInfo      *MRI = nullptr;
274    MachineConstEvaluator    &MCE;
275
276    using CFGEdge = std::pair<unsigned, unsigned>;
277    using SetOfCFGEdge = std::set<CFGEdge>;
278    using SetOfInstr = std::set<const MachineInstr *>;
279    using QueueOfCFGEdge = std::queue<CFGEdge>;
280
281    LatticeCell     Bottom;
282    CellMap         Cells;
283    SetOfCFGEdge    EdgeExec;
284    SetOfInstr      InstrExec;
285    QueueOfCFGEdge  FlowQ;
286  };
287
288  // The "evaluator/rewriter" of machine instructions. This is an abstract
289  // base class that provides the interface that the propagator will use,
290  // as well as some helper functions that are target-independent.
291  class MachineConstEvaluator {
292  public:
293    MachineConstEvaluator(MachineFunction &Fn)
294      : TRI(*Fn.getSubtarget().getRegisterInfo()),
295        MF(Fn), CX(Fn.getFunction().getContext()) {}
296    virtual ~MachineConstEvaluator() = default;
297
298    // The required interface:
299    // - A set of three "evaluate" functions. Each returns "true" if the
300    //       computation succeeded, "false" otherwise.
301    //   (1) Given an instruction MI, and the map with input values "Inputs",
302    //       compute the set of output values "Outputs". An example of when
303    //       the computation can "fail" is if MI is not an instruction that
304    //       is recognized by the evaluator.
305    //   (2) Given a register R (as reg:subreg), compute the cell that
306    //       corresponds to the "subreg" part of the given register.
307    //   (3) Given a branch instruction BrI, compute the set of target blocks.
308    //       If the branch can fall-through, add null (0) to the list of
309    //       possible targets.
310    // - A function "rewrite", that given the cell map after propagation,
311    //   could rewrite instruction MI in a more beneficial form. Return
312    //   "true" if a change has been made, "false" otherwise.
313    using CellMap = MachineConstPropagator::CellMap;
314    virtual bool evaluate(const MachineInstr &MI, const CellMap &Inputs,
315                          CellMap &Outputs) = 0;
316    virtual bool evaluate(const RegisterSubReg &R, const LatticeCell &SrcC,
317                          LatticeCell &Result) = 0;
318    virtual bool evaluate(const MachineInstr &BrI, const CellMap &Inputs,
319                          SetVector<const MachineBasicBlock*> &Targets,
320                          bool &CanFallThru) = 0;
321    virtual bool rewrite(MachineInstr &MI, const CellMap &Inputs) = 0;
322
323    const TargetRegisterInfo &TRI;
324
325  protected:
326    MachineFunction &MF;
327    LLVMContext     &CX;
328
329    struct Comparison {
330      enum {
331        Unk = 0x00,
332        EQ  = 0x01,
333        NE  = 0x02,
334        L   = 0x04, // Less-than property.
335        G   = 0x08, // Greater-than property.
336        U   = 0x40, // Unsigned property.
337        LTs = L,
338        LEs = L | EQ,
339        GTs = G,
340        GEs = G | EQ,
341        LTu = L      | U,
342        LEu = L | EQ | U,
343        GTu = G      | U,
344        GEu = G | EQ | U
345      };
346
347      static uint32_t negate(uint32_t Cmp) {
348        if (Cmp == EQ)
349          return NE;
350        if (Cmp == NE)
351          return EQ;
352        assert((Cmp & (L|G)) != (L|G));
353        return Cmp ^ (L|G);
354      }
355    };
356
357    // Helper functions.
358
359    bool getCell(const RegisterSubReg &R, const CellMap &Inputs, LatticeCell &RC);
360    bool constToInt(const Constant *C, APInt &Val) const;
361    bool constToFloat(const Constant *C, APFloat &Val) const;
362    const ConstantInt *intToConst(const APInt &Val) const;
363
364    // Compares.
365    bool evaluateCMPrr(uint32_t Cmp, const RegisterSubReg &R1, const RegisterSubReg &R2,
366          const CellMap &Inputs, bool &Result);
367    bool evaluateCMPri(uint32_t Cmp, const RegisterSubReg &R1, const APInt &A2,
368          const CellMap &Inputs, bool &Result);
369    bool evaluateCMPrp(uint32_t Cmp, const RegisterSubReg &R1, uint64_t Props2,
370          const CellMap &Inputs, bool &Result);
371    bool evaluateCMPii(uint32_t Cmp, const APInt &A1, const APInt &A2,
372          bool &Result);
373    bool evaluateCMPpi(uint32_t Cmp, uint32_t Props, const APInt &A2,
374          bool &Result);
375    bool evaluateCMPpp(uint32_t Cmp, uint32_t Props1, uint32_t Props2,
376          bool &Result);
377
378    bool evaluateCOPY(const RegisterSubReg &R1, const CellMap &Inputs,
379          LatticeCell &Result);
380
381    // Logical operations.
382    bool evaluateANDrr(const RegisterSubReg &R1, const RegisterSubReg &R2,
383          const CellMap &Inputs, LatticeCell &Result);
384    bool evaluateANDri(const RegisterSubReg &R1, const APInt &A2,
385          const CellMap &Inputs, LatticeCell &Result);
386    bool evaluateANDii(const APInt &A1, const APInt &A2, APInt &Result);
387    bool evaluateORrr(const RegisterSubReg &R1, const RegisterSubReg &R2,
388          const CellMap &Inputs, LatticeCell &Result);
389    bool evaluateORri(const RegisterSubReg &R1, const APInt &A2,
390          const CellMap &Inputs, LatticeCell &Result);
391    bool evaluateORii(const APInt &A1, const APInt &A2, APInt &Result);
392    bool evaluateXORrr(const RegisterSubReg &R1, const RegisterSubReg &R2,
393          const CellMap &Inputs, LatticeCell &Result);
394    bool evaluateXORri(const RegisterSubReg &R1, const APInt &A2,
395          const CellMap &Inputs, LatticeCell &Result);
396    bool evaluateXORii(const APInt &A1, const APInt &A2, APInt &Result);
397
398    // Extensions.
399    bool evaluateZEXTr(const RegisterSubReg &R1, unsigned Width, unsigned Bits,
400          const CellMap &Inputs, LatticeCell &Result);
401    bool evaluateZEXTi(const APInt &A1, unsigned Width, unsigned Bits,
402          APInt &Result);
403    bool evaluateSEXTr(const RegisterSubReg &R1, unsigned Width, unsigned Bits,
404          const CellMap &Inputs, LatticeCell &Result);
405    bool evaluateSEXTi(const APInt &A1, unsigned Width, unsigned Bits,
406          APInt &Result);
407
408    // Leading/trailing bits.
409    bool evaluateCLBr(const RegisterSubReg &R1, bool Zeros, bool Ones,
410          const CellMap &Inputs, LatticeCell &Result);
411    bool evaluateCLBi(const APInt &A1, bool Zeros, bool Ones, APInt &Result);
412    bool evaluateCTBr(const RegisterSubReg &R1, bool Zeros, bool Ones,
413          const CellMap &Inputs, LatticeCell &Result);
414    bool evaluateCTBi(const APInt &A1, bool Zeros, bool Ones, APInt &Result);
415
416    // Bitfield extract.
417    bool evaluateEXTRACTr(const RegisterSubReg &R1, unsigned Width, unsigned Bits,
418          unsigned Offset, bool Signed, const CellMap &Inputs,
419          LatticeCell &Result);
420    bool evaluateEXTRACTi(const APInt &A1, unsigned Bits, unsigned Offset,
421          bool Signed, APInt &Result);
422    // Vector operations.
423    bool evaluateSplatr(const RegisterSubReg &R1, unsigned Bits, unsigned Count,
424          const CellMap &Inputs, LatticeCell &Result);
425    bool evaluateSplati(const APInt &A1, unsigned Bits, unsigned Count,
426          APInt &Result);
427  };
428
429} // end anonymous namespace
430
431uint32_t ConstantProperties::deduce(const Constant *C) {
432  if (isa<ConstantInt>(C)) {
433    const ConstantInt *CI = cast<ConstantInt>(C);
434    if (CI->isZero())
435      return Zero | PosOrZero | NegOrZero | Finite;
436    uint32_t Props = (NonZero | Finite);
437    if (CI->isNegative())
438      return Props | NegOrZero;
439    return Props | PosOrZero;
440  }
441
442  if (isa<ConstantFP>(C)) {
443    const ConstantFP *CF = cast<ConstantFP>(C);
444    uint32_t Props = CF->isNegative() ? (NegOrZero|NonZero)
445                                      : PosOrZero;
446    if (CF->isZero())
447      return (Props & ~NumericProperties) | (Zero|Finite);
448    Props = (Props & ~NumericProperties) | NonZero;
449    if (CF->isNaN())
450      return (Props & ~NumericProperties) | NaN;
451    const APFloat &Val = CF->getValueAPF();
452    if (Val.isInfinity())
453      return (Props & ~NumericProperties) | Infinity;
454    Props |= Finite;
455    return Props;
456  }
457
458  return Unknown;
459}
460
461// Convert a cell from a set of specific values to a cell that tracks
462// properties.
463bool LatticeCell::convertToProperty() {
464  if (isProperty())
465    return false;
466  // Corner case: converting a fresh (top) cell to "special".
467  // This can happen, when adding a property to a top cell.
468  uint32_t Everything = ConstantProperties::Everything;
469  uint32_t Ps = !isTop() ? properties()
470                         : Everything;
471  if (Ps != ConstantProperties::Unknown) {
472    Properties = Ps;
473    setProperty();
474  } else {
475    setBottom();
476  }
477  return true;
478}
479
480#ifndef NDEBUG
481void LatticeCell::print(raw_ostream &os) const {
482  if (isProperty()) {
483    os << "{ ";
484    uint32_t Ps = properties();
485    if (Ps & ConstantProperties::Zero)
486      os << "zero ";
487    if (Ps & ConstantProperties::NonZero)
488      os << "nonzero ";
489    if (Ps & ConstantProperties::Finite)
490      os << "finite ";
491    if (Ps & ConstantProperties::Infinity)
492      os << "infinity ";
493    if (Ps & ConstantProperties::NaN)
494      os << "nan ";
495    if (Ps & ConstantProperties::PosOrZero)
496      os << "poz ";
497    if (Ps & ConstantProperties::NegOrZero)
498      os << "nez ";
499    os << '}';
500    return;
501  }
502
503  os << "{ ";
504  if (isBottom()) {
505    os << "bottom";
506  } else if (isTop()) {
507    os << "top";
508  } else {
509    for (unsigned i = 0; i < size(); ++i) {
510      const Constant *C = Values[i];
511      if (i != 0)
512        os << ", ";
513      C->print(os);
514    }
515  }
516  os << " }";
517}
518#endif
519
520// "Meet" operation on two cells. This is the key of the propagation
521// algorithm.
522bool LatticeCell::meet(const LatticeCell &L) {
523  bool Changed = false;
524  if (L.isBottom())
525    Changed = setBottom();
526  if (isBottom() || L.isTop())
527    return Changed;
528  if (isTop()) {
529    *this = L;
530    // L can be neither Top nor Bottom, so *this must have changed.
531    return true;
532  }
533
534  // Top/bottom cases covered. Need to integrate L's set into ours.
535  if (L.isProperty())
536    return add(L.properties());
537  for (unsigned i = 0; i < L.size(); ++i) {
538    const Constant *LC = L.Values[i];
539    Changed |= add(LC);
540  }
541  return Changed;
542}
543
544// Add a new constant to the cell. This is actually where the cell update
545// happens. If a cell has room for more constants, the new constant is added.
546// Otherwise, the cell is converted to a "property" cell (i.e. a cell that
547// will track properties of the associated values, and not the values
548// themselves. Care is taken to handle special cases, like "bottom", etc.
549bool LatticeCell::add(const Constant *LC) {
550  assert(LC);
551  if (isBottom())
552    return false;
553
554  if (!isProperty()) {
555    // Cell is not special. Try to add the constant here first,
556    // if there is room.
557    unsigned Index = 0;
558    while (Index < Size) {
559      const Constant *C = Values[Index];
560      // If the constant is already here, no change is needed.
561      if (C == LC)
562        return false;
563      Index++;
564    }
565    if (Index < MaxCellSize) {
566      Values[Index] = LC;
567      Kind = Normal;
568      Size++;
569      return true;
570    }
571  }
572
573  bool Changed = false;
574
575  // This cell is special, or is not special, but is full. After this
576  // it will be special.
577  Changed = convertToProperty();
578  uint32_t Ps = properties();
579  uint32_t NewPs = Ps & ConstantProperties::deduce(LC);
580  if (NewPs == ConstantProperties::Unknown) {
581    setBottom();
582    return true;
583  }
584  if (Ps != NewPs) {
585    Properties = NewPs;
586    Changed = true;
587  }
588  return Changed;
589}
590
591// Add a property to the cell. This will force the cell to become a property-
592// tracking cell.
593bool LatticeCell::add(uint32_t Property) {
594  bool Changed = convertToProperty();
595  uint32_t Ps = properties();
596  if (Ps == (Ps & Property))
597    return Changed;
598  Properties = Property & Ps;
599  return true;
600}
601
602// Return the properties of the values in the cell. This is valid for any
603// cell, and does not alter the cell itself.
604uint32_t LatticeCell::properties() const {
605  if (isProperty())
606    return Properties;
607  assert(!isTop() && "Should not call this for a top cell");
608  if (isBottom())
609    return ConstantProperties::Unknown;
610
611  assert(size() > 0 && "Empty cell");
612  uint32_t Ps = ConstantProperties::deduce(Values[0]);
613  for (unsigned i = 1; i < size(); ++i) {
614    if (Ps == ConstantProperties::Unknown)
615      break;
616    Ps &= ConstantProperties::deduce(Values[i]);
617  }
618  return Ps;
619}
620
621#ifndef NDEBUG
622void MachineConstPropagator::CellMap::print(raw_ostream &os,
623      const TargetRegisterInfo &TRI) const {
624  for (auto &I : Map)
625    dbgs() << "  " << printReg(I.first, &TRI) << " -> " << I.second << '\n';
626}
627#endif
628
629void MachineConstPropagator::visitPHI(const MachineInstr &PN) {
630  const MachineBasicBlock *MB = PN.getParent();
631  unsigned MBN = MB->getNumber();
632  LLVM_DEBUG(dbgs() << "Visiting FI(" << printMBBReference(*MB) << "): " << PN);
633
634  const MachineOperand &MD = PN.getOperand(0);
635  RegisterSubReg DefR(MD);
636  assert(Register::isVirtualRegister(DefR.Reg));
637
638  bool Changed = false;
639
640  // If the def has a sub-register, set the corresponding cell to "bottom".
641  if (DefR.SubReg) {
642Bottomize:
643    const LatticeCell &T = Cells.get(DefR.Reg);
644    Changed = !T.isBottom();
645    Cells.update(DefR.Reg, Bottom);
646    if (Changed)
647      visitUsesOf(DefR.Reg);
648    return;
649  }
650
651  LatticeCell DefC = Cells.get(DefR.Reg);
652
653  for (unsigned i = 1, n = PN.getNumOperands(); i < n; i += 2) {
654    const MachineBasicBlock *PB = PN.getOperand(i+1).getMBB();
655    unsigned PBN = PB->getNumber();
656    if (!EdgeExec.count(CFGEdge(PBN, MBN))) {
657      LLVM_DEBUG(dbgs() << "  edge " << printMBBReference(*PB) << "->"
658                        << printMBBReference(*MB) << " not executable\n");
659      continue;
660    }
661    const MachineOperand &SO = PN.getOperand(i);
662    RegisterSubReg UseR(SO);
663    // If the input is not a virtual register, we don't really know what
664    // value it holds.
665    if (!Register::isVirtualRegister(UseR.Reg))
666      goto Bottomize;
667    // If there is no cell for an input register, it means top.
668    if (!Cells.has(UseR.Reg))
669      continue;
670
671    LatticeCell SrcC;
672    bool Eval = MCE.evaluate(UseR, Cells.get(UseR.Reg), SrcC);
673    LLVM_DEBUG(dbgs() << "  edge from " << printMBBReference(*PB) << ": "
674                      << printReg(UseR.Reg, &MCE.TRI, UseR.SubReg) << SrcC
675                      << '\n');
676    Changed |= Eval ? DefC.meet(SrcC)
677                    : DefC.setBottom();
678    Cells.update(DefR.Reg, DefC);
679    if (DefC.isBottom())
680      break;
681  }
682  if (Changed)
683    visitUsesOf(DefR.Reg);
684}
685
686void MachineConstPropagator::visitNonBranch(const MachineInstr &MI) {
687  LLVM_DEBUG(dbgs() << "Visiting MI(" << printMBBReference(*MI.getParent())
688                    << "): " << MI);
689  CellMap Outputs;
690  bool Eval = MCE.evaluate(MI, Cells, Outputs);
691  LLVM_DEBUG({
692    if (Eval) {
693      dbgs() << "  outputs:";
694      for (auto &I : Outputs)
695        dbgs() << ' ' << I.second;
696      dbgs() << '\n';
697    }
698  });
699
700  // Update outputs. If the value was not computed, set all the
701  // def cells to bottom.
702  for (const MachineOperand &MO : MI.operands()) {
703    if (!MO.isReg() || !MO.isDef())
704      continue;
705    RegisterSubReg DefR(MO);
706    // Only track virtual registers.
707    if (!Register::isVirtualRegister(DefR.Reg))
708      continue;
709    bool Changed = false;
710    // If the evaluation failed, set cells for all output registers to bottom.
711    if (!Eval) {
712      const LatticeCell &T = Cells.get(DefR.Reg);
713      Changed = !T.isBottom();
714      Cells.update(DefR.Reg, Bottom);
715    } else {
716      // Find the corresponding cell in the computed outputs.
717      // If it's not there, go on to the next def.
718      if (!Outputs.has(DefR.Reg))
719        continue;
720      LatticeCell RC = Cells.get(DefR.Reg);
721      Changed = RC.meet(Outputs.get(DefR.Reg));
722      Cells.update(DefR.Reg, RC);
723    }
724    if (Changed)
725      visitUsesOf(DefR.Reg);
726  }
727}
728
729// Starting at a given branch, visit remaining branches in the block.
730// Traverse over the subsequent branches for as long as the preceding one
731// can fall through. Add all the possible targets to the flow work queue,
732// including the potential fall-through to the layout-successor block.
733void MachineConstPropagator::visitBranchesFrom(const MachineInstr &BrI) {
734  const MachineBasicBlock &B = *BrI.getParent();
735  unsigned MBN = B.getNumber();
736  MachineBasicBlock::const_iterator It = BrI.getIterator();
737  MachineBasicBlock::const_iterator End = B.end();
738
739  SetVector<const MachineBasicBlock*> Targets;
740  bool EvalOk = true, FallsThru = true;
741  while (It != End) {
742    const MachineInstr &MI = *It;
743    InstrExec.insert(&MI);
744    LLVM_DEBUG(dbgs() << "Visiting " << (EvalOk ? "BR" : "br") << "("
745                      << printMBBReference(B) << "): " << MI);
746    // Do not evaluate subsequent branches if the evaluation of any of the
747    // previous branches failed. Keep iterating over the branches only
748    // to mark them as executable.
749    EvalOk = EvalOk && MCE.evaluate(MI, Cells, Targets, FallsThru);
750    if (!EvalOk)
751      FallsThru = true;
752    if (!FallsThru)
753      break;
754    ++It;
755  }
756
757  if (EvalOk) {
758    // Need to add all CFG successors that lead to EH landing pads.
759    // There won't be explicit branches to these blocks, but they must
760    // be processed.
761    for (const MachineBasicBlock *SB : B.successors()) {
762      if (SB->isEHPad())
763        Targets.insert(SB);
764    }
765    if (FallsThru) {
766      const MachineFunction &MF = *B.getParent();
767      MachineFunction::const_iterator BI = B.getIterator();
768      MachineFunction::const_iterator Next = std::next(BI);
769      if (Next != MF.end())
770        Targets.insert(&*Next);
771    }
772  } else {
773    // If the evaluation of the branches failed, make "Targets" to be the
774    // set of all successors of the block from the CFG.
775    // If the evaluation succeeded for all visited branches, then if the
776    // last one set "FallsThru", then add an edge to the layout successor
777    // to the targets.
778    Targets.clear();
779    LLVM_DEBUG(dbgs() << "  failed to evaluate a branch...adding all CFG "
780                         "successors\n");
781    for (const MachineBasicBlock *SB : B.successors())
782      Targets.insert(SB);
783  }
784
785  for (const MachineBasicBlock *TB : Targets) {
786    unsigned TBN = TB->getNumber();
787    LLVM_DEBUG(dbgs() << "  pushing edge " << printMBBReference(B) << " -> "
788                      << printMBBReference(*TB) << "\n");
789    FlowQ.push(CFGEdge(MBN, TBN));
790  }
791}
792
793void MachineConstPropagator::visitUsesOf(unsigned Reg) {
794  LLVM_DEBUG(dbgs() << "Visiting uses of " << printReg(Reg, &MCE.TRI)
795                    << Cells.get(Reg) << '\n');
796  for (MachineInstr &MI : MRI->use_nodbg_instructions(Reg)) {
797    // Do not process non-executable instructions. They can become exceutable
798    // later (via a flow-edge in the work queue). In such case, the instruc-
799    // tion will be visited at that time.
800    if (!InstrExec.count(&MI))
801      continue;
802    if (MI.isPHI())
803      visitPHI(MI);
804    else if (!MI.isBranch())
805      visitNonBranch(MI);
806    else
807      visitBranchesFrom(MI);
808  }
809}
810
811bool MachineConstPropagator::computeBlockSuccessors(const MachineBasicBlock *MB,
812      SetVector<const MachineBasicBlock*> &Targets) {
813  MachineBasicBlock::const_iterator FirstBr = MB->end();
814  for (const MachineInstr &MI : *MB) {
815    if (MI.isDebugInstr())
816      continue;
817    if (MI.isBranch()) {
818      FirstBr = MI.getIterator();
819      break;
820    }
821  }
822
823  Targets.clear();
824  MachineBasicBlock::const_iterator End = MB->end();
825
826  bool DoNext = true;
827  for (MachineBasicBlock::const_iterator I = FirstBr; I != End; ++I) {
828    const MachineInstr &MI = *I;
829    // Can there be debug instructions between branches?
830    if (MI.isDebugInstr())
831      continue;
832    if (!InstrExec.count(&MI))
833      continue;
834    bool Eval = MCE.evaluate(MI, Cells, Targets, DoNext);
835    if (!Eval)
836      return false;
837    if (!DoNext)
838      break;
839  }
840  // If the last branch could fall-through, add block's layout successor.
841  if (DoNext) {
842    MachineFunction::const_iterator BI = MB->getIterator();
843    MachineFunction::const_iterator NextI = std::next(BI);
844    if (NextI != MB->getParent()->end())
845      Targets.insert(&*NextI);
846  }
847
848  // Add all the EH landing pads.
849  for (const MachineBasicBlock *SB : MB->successors())
850    if (SB->isEHPad())
851      Targets.insert(SB);
852
853  return true;
854}
855
856void MachineConstPropagator::removeCFGEdge(MachineBasicBlock *From,
857      MachineBasicBlock *To) {
858  // First, remove the CFG successor/predecessor information.
859  From->removeSuccessor(To);
860  // Remove all corresponding PHI operands in the To block.
861  for (auto I = To->begin(), E = To->getFirstNonPHI(); I != E; ++I) {
862    MachineInstr *PN = &*I;
863    // reg0 = PHI reg1, bb2, reg3, bb4, ...
864    int N = PN->getNumOperands()-2;
865    while (N > 0) {
866      if (PN->getOperand(N+1).getMBB() == From) {
867        PN->RemoveOperand(N+1);
868        PN->RemoveOperand(N);
869      }
870      N -= 2;
871    }
872  }
873}
874
875void MachineConstPropagator::propagate(MachineFunction &MF) {
876  MachineBasicBlock *Entry = GraphTraits<MachineFunction*>::getEntryNode(&MF);
877  unsigned EntryNum = Entry->getNumber();
878
879  // Start with a fake edge, just to process the entry node.
880  FlowQ.push(CFGEdge(EntryNum, EntryNum));
881
882  while (!FlowQ.empty()) {
883    CFGEdge Edge = FlowQ.front();
884    FlowQ.pop();
885
886    LLVM_DEBUG(
887        dbgs() << "Picked edge "
888               << printMBBReference(*MF.getBlockNumbered(Edge.first)) << "->"
889               << printMBBReference(*MF.getBlockNumbered(Edge.second)) << '\n');
890    if (Edge.first != EntryNum)
891      if (EdgeExec.count(Edge))
892        continue;
893    EdgeExec.insert(Edge);
894    MachineBasicBlock *SB = MF.getBlockNumbered(Edge.second);
895
896    // Process the block in three stages:
897    // - visit all PHI nodes,
898    // - visit all non-branch instructions,
899    // - visit block branches.
900    MachineBasicBlock::const_iterator It = SB->begin(), End = SB->end();
901
902    // Visit PHI nodes in the successor block.
903    while (It != End && It->isPHI()) {
904      InstrExec.insert(&*It);
905      visitPHI(*It);
906      ++It;
907    }
908
909    // If the successor block just became executable, visit all instructions.
910    // To see if this is the first time we're visiting it, check the first
911    // non-debug instruction to see if it is executable.
912    while (It != End && It->isDebugInstr())
913      ++It;
914    assert(It == End || !It->isPHI());
915    // If this block has been visited, go on to the next one.
916    if (It != End && InstrExec.count(&*It))
917      continue;
918    // For now, scan all non-branch instructions. Branches require different
919    // processing.
920    while (It != End && !It->isBranch()) {
921      if (!It->isDebugInstr()) {
922        InstrExec.insert(&*It);
923        visitNonBranch(*It);
924      }
925      ++It;
926    }
927
928    // Time to process the end of the block. This is different from
929    // processing regular (non-branch) instructions, because there can
930    // be multiple branches in a block, and they can cause the block to
931    // terminate early.
932    if (It != End) {
933      visitBranchesFrom(*It);
934    } else {
935      // If the block didn't have a branch, add all successor edges to the
936      // work queue. (There should really be only one successor in such case.)
937      unsigned SBN = SB->getNumber();
938      for (const MachineBasicBlock *SSB : SB->successors())
939        FlowQ.push(CFGEdge(SBN, SSB->getNumber()));
940    }
941  } // while (FlowQ)
942
943  LLVM_DEBUG({
944    dbgs() << "Cells after propagation:\n";
945    Cells.print(dbgs(), MCE.TRI);
946    dbgs() << "Dead CFG edges:\n";
947    for (const MachineBasicBlock &B : MF) {
948      unsigned BN = B.getNumber();
949      for (const MachineBasicBlock *SB : B.successors()) {
950        unsigned SN = SB->getNumber();
951        if (!EdgeExec.count(CFGEdge(BN, SN)))
952          dbgs() << "  " << printMBBReference(B) << " -> "
953                 << printMBBReference(*SB) << '\n';
954      }
955    }
956  });
957}
958
959bool MachineConstPropagator::rewrite(MachineFunction &MF) {
960  bool Changed = false;
961  // Rewrite all instructions based on the collected cell information.
962  //
963  // Traverse the instructions in a post-order, so that rewriting an
964  // instruction can make changes "downstream" in terms of control-flow
965  // without affecting the rewriting process. (We should not change
966  // instructions that have not yet been visited by the rewriter.)
967  // The reason for this is that the rewriter can introduce new vregs,
968  // and replace uses of old vregs (which had corresponding cells
969  // computed during propagation) with these new vregs (which at this
970  // point would not have any cells, and would appear to be "top").
971  // If an attempt was made to evaluate an instruction with a fresh
972  // "top" vreg, it would cause an error (abend) in the evaluator.
973
974  // Collect the post-order-traversal block ordering. The subsequent
975  // traversal/rewrite will update block successors, so it's safer
976  // if the visiting order it computed ahead of time.
977  std::vector<MachineBasicBlock*> POT;
978  for (MachineBasicBlock *B : post_order(&MF))
979    if (!B->empty())
980      POT.push_back(B);
981
982  for (MachineBasicBlock *B : POT) {
983    // Walk the block backwards (which usually begin with the branches).
984    // If any branch is rewritten, we may need to update the successor
985    // information for this block. Unless the block's successors can be
986    // precisely determined (which may not be the case for indirect
987    // branches), we cannot modify any branch.
988
989    // Compute the successor information.
990    SetVector<const MachineBasicBlock*> Targets;
991    bool HaveTargets = computeBlockSuccessors(B, Targets);
992    // Rewrite the executable instructions. Skip branches if we don't
993    // have block successor information.
994    for (auto I = B->rbegin(), E = B->rend(); I != E; ++I) {
995      MachineInstr &MI = *I;
996      if (InstrExec.count(&MI)) {
997        if (MI.isBranch() && !HaveTargets)
998          continue;
999        Changed |= MCE.rewrite(MI, Cells);
1000      }
1001    }
1002    // The rewriting could rewrite PHI nodes to non-PHI nodes, causing
1003    // regular instructions to appear in between PHI nodes. Bring all
1004    // the PHI nodes to the beginning of the block.
1005    for (auto I = B->begin(), E = B->end(); I != E; ++I) {
1006      if (I->isPHI())
1007        continue;
1008      // I is not PHI. Find the next PHI node P.
1009      auto P = I;
1010      while (++P != E)
1011        if (P->isPHI())
1012          break;
1013      // Not found.
1014      if (P == E)
1015        break;
1016      // Splice P right before I.
1017      B->splice(I, B, P);
1018      // Reset I to point at the just spliced PHI node.
1019      --I;
1020    }
1021    // Update the block successor information: remove unnecessary successors.
1022    if (HaveTargets) {
1023      SmallVector<MachineBasicBlock*,2> ToRemove;
1024      for (MachineBasicBlock *SB : B->successors()) {
1025        if (!Targets.count(SB))
1026          ToRemove.push_back(const_cast<MachineBasicBlock*>(SB));
1027        Targets.remove(SB);
1028      }
1029      for (unsigned i = 0, n = ToRemove.size(); i < n; ++i)
1030        removeCFGEdge(B, ToRemove[i]);
1031      // If there are any blocks left in the computed targets, it means that
1032      // we think that the block could go somewhere, but the CFG does not.
1033      // This could legitimately happen in blocks that have non-returning
1034      // calls---we would think that the execution can continue, but the
1035      // CFG will not have a successor edge.
1036    }
1037  }
1038  // Need to do some final post-processing.
1039  // If a branch was not executable, it will not get rewritten, but should
1040  // be removed (or replaced with something equivalent to a A2_nop). We can't
1041  // erase instructions during rewriting, so this needs to be delayed until
1042  // now.
1043  for (MachineBasicBlock &B : MF) {
1044    MachineBasicBlock::iterator I = B.begin(), E = B.end();
1045    while (I != E) {
1046      auto Next = std::next(I);
1047      if (I->isBranch() && !InstrExec.count(&*I))
1048        B.erase(I);
1049      I = Next;
1050    }
1051  }
1052  return Changed;
1053}
1054
1055// This is the constant propagation algorithm as described by Wegman-Zadeck.
1056// Most of the terminology comes from there.
1057bool MachineConstPropagator::run(MachineFunction &MF) {
1058  LLVM_DEBUG(MF.print(dbgs() << "Starting MachineConstPropagator\n", nullptr));
1059
1060  MRI = &MF.getRegInfo();
1061
1062  Cells.clear();
1063  EdgeExec.clear();
1064  InstrExec.clear();
1065  assert(FlowQ.empty());
1066
1067  propagate(MF);
1068  bool Changed = rewrite(MF);
1069
1070  LLVM_DEBUG({
1071    dbgs() << "End of MachineConstPropagator (Changed=" << Changed << ")\n";
1072    if (Changed)
1073      MF.print(dbgs(), nullptr);
1074  });
1075  return Changed;
1076}
1077
1078// --------------------------------------------------------------------
1079// Machine const evaluator.
1080
1081bool MachineConstEvaluator::getCell(const RegisterSubReg &R, const CellMap &Inputs,
1082      LatticeCell &RC) {
1083  if (!Register::isVirtualRegister(R.Reg))
1084    return false;
1085  const LatticeCell &L = Inputs.get(R.Reg);
1086  if (!R.SubReg) {
1087    RC = L;
1088    return !RC.isBottom();
1089  }
1090  bool Eval = evaluate(R, L, RC);
1091  return Eval && !RC.isBottom();
1092}
1093
1094bool MachineConstEvaluator::constToInt(const Constant *C,
1095      APInt &Val) const {
1096  const ConstantInt *CI = dyn_cast<ConstantInt>(C);
1097  if (!CI)
1098    return false;
1099  Val = CI->getValue();
1100  return true;
1101}
1102
1103const ConstantInt *MachineConstEvaluator::intToConst(const APInt &Val) const {
1104  return ConstantInt::get(CX, Val);
1105}
1106
1107bool MachineConstEvaluator::evaluateCMPrr(uint32_t Cmp, const RegisterSubReg &R1,
1108      const RegisterSubReg &R2, const CellMap &Inputs, bool &Result) {
1109  assert(Inputs.has(R1.Reg) && Inputs.has(R2.Reg));
1110  LatticeCell LS1, LS2;
1111  if (!getCell(R1, Inputs, LS1) || !getCell(R2, Inputs, LS2))
1112    return false;
1113
1114  bool IsProp1 = LS1.isProperty();
1115  bool IsProp2 = LS2.isProperty();
1116  if (IsProp1) {
1117    uint32_t Prop1 = LS1.properties();
1118    if (IsProp2)
1119      return evaluateCMPpp(Cmp, Prop1, LS2.properties(), Result);
1120    uint32_t NegCmp = Comparison::negate(Cmp);
1121    return evaluateCMPrp(NegCmp, R2, Prop1, Inputs, Result);
1122  }
1123  if (IsProp2) {
1124    uint32_t Prop2 = LS2.properties();
1125    return evaluateCMPrp(Cmp, R1, Prop2, Inputs, Result);
1126  }
1127
1128  APInt A;
1129  bool IsTrue = true, IsFalse = true;
1130  for (unsigned i = 0; i < LS2.size(); ++i) {
1131    bool Res;
1132    bool Computed = constToInt(LS2.Values[i], A) &&
1133                    evaluateCMPri(Cmp, R1, A, Inputs, Res);
1134    if (!Computed)
1135      return false;
1136    IsTrue &= Res;
1137    IsFalse &= !Res;
1138  }
1139  assert(!IsTrue || !IsFalse);
1140  // The actual logical value of the comparison is same as IsTrue.
1141  Result = IsTrue;
1142  // Return true if the result was proven to be true or proven to be false.
1143  return IsTrue || IsFalse;
1144}
1145
1146bool MachineConstEvaluator::evaluateCMPri(uint32_t Cmp, const RegisterSubReg &R1,
1147      const APInt &A2, const CellMap &Inputs, bool &Result) {
1148  assert(Inputs.has(R1.Reg));
1149  LatticeCell LS;
1150  if (!getCell(R1, Inputs, LS))
1151    return false;
1152  if (LS.isProperty())
1153    return evaluateCMPpi(Cmp, LS.properties(), A2, Result);
1154
1155  APInt A;
1156  bool IsTrue = true, IsFalse = true;
1157  for (unsigned i = 0; i < LS.size(); ++i) {
1158    bool Res;
1159    bool Computed = constToInt(LS.Values[i], A) &&
1160                    evaluateCMPii(Cmp, A, A2, Res);
1161    if (!Computed)
1162      return false;
1163    IsTrue &= Res;
1164    IsFalse &= !Res;
1165  }
1166  assert(!IsTrue || !IsFalse);
1167  // The actual logical value of the comparison is same as IsTrue.
1168  Result = IsTrue;
1169  // Return true if the result was proven to be true or proven to be false.
1170  return IsTrue || IsFalse;
1171}
1172
1173bool MachineConstEvaluator::evaluateCMPrp(uint32_t Cmp, const RegisterSubReg &R1,
1174      uint64_t Props2, const CellMap &Inputs, bool &Result) {
1175  assert(Inputs.has(R1.Reg));
1176  LatticeCell LS;
1177  if (!getCell(R1, Inputs, LS))
1178    return false;
1179  if (LS.isProperty())
1180    return evaluateCMPpp(Cmp, LS.properties(), Props2, Result);
1181
1182  APInt A;
1183  uint32_t NegCmp = Comparison::negate(Cmp);
1184  bool IsTrue = true, IsFalse = true;
1185  for (unsigned i = 0; i < LS.size(); ++i) {
1186    bool Res;
1187    bool Computed = constToInt(LS.Values[i], A) &&
1188                    evaluateCMPpi(NegCmp, Props2, A, Res);
1189    if (!Computed)
1190      return false;
1191    IsTrue &= Res;
1192    IsFalse &= !Res;
1193  }
1194  assert(!IsTrue || !IsFalse);
1195  Result = IsTrue;
1196  return IsTrue || IsFalse;
1197}
1198
1199bool MachineConstEvaluator::evaluateCMPii(uint32_t Cmp, const APInt &A1,
1200      const APInt &A2, bool &Result) {
1201  // NE is a special kind of comparison (not composed of smaller properties).
1202  if (Cmp == Comparison::NE) {
1203    Result = !APInt::isSameValue(A1, A2);
1204    return true;
1205  }
1206  if (Cmp == Comparison::EQ) {
1207    Result = APInt::isSameValue(A1, A2);
1208    return true;
1209  }
1210  if (Cmp & Comparison::EQ) {
1211    if (APInt::isSameValue(A1, A2))
1212      return (Result = true);
1213  }
1214  assert((Cmp & (Comparison::L | Comparison::G)) && "Malformed comparison");
1215  Result = false;
1216
1217  unsigned W1 = A1.getBitWidth();
1218  unsigned W2 = A2.getBitWidth();
1219  unsigned MaxW = (W1 >= W2) ? W1 : W2;
1220  if (Cmp & Comparison::U) {
1221    const APInt Zx1 = A1.zextOrSelf(MaxW);
1222    const APInt Zx2 = A2.zextOrSelf(MaxW);
1223    if (Cmp & Comparison::L)
1224      Result = Zx1.ult(Zx2);
1225    else if (Cmp & Comparison::G)
1226      Result = Zx2.ult(Zx1);
1227    return true;
1228  }
1229
1230  // Signed comparison.
1231  const APInt Sx1 = A1.sextOrSelf(MaxW);
1232  const APInt Sx2 = A2.sextOrSelf(MaxW);
1233  if (Cmp & Comparison::L)
1234    Result = Sx1.slt(Sx2);
1235  else if (Cmp & Comparison::G)
1236    Result = Sx2.slt(Sx1);
1237  return true;
1238}
1239
1240bool MachineConstEvaluator::evaluateCMPpi(uint32_t Cmp, uint32_t Props,
1241      const APInt &A2, bool &Result) {
1242  if (Props == ConstantProperties::Unknown)
1243    return false;
1244
1245  // Should never see NaN here, but check for it for completeness.
1246  if (Props & ConstantProperties::NaN)
1247    return false;
1248  // Infinity could theoretically be compared to a number, but the
1249  // presence of infinity here would be very suspicious. If we don't
1250  // know for sure that the number is finite, bail out.
1251  if (!(Props & ConstantProperties::Finite))
1252    return false;
1253
1254  // Let X be a number that has properties Props.
1255
1256  if (Cmp & Comparison::U) {
1257    // In case of unsigned comparisons, we can only compare against 0.
1258    if (A2 == 0) {
1259      // Any x!=0 will be considered >0 in an unsigned comparison.
1260      if (Props & ConstantProperties::Zero)
1261        Result = (Cmp & Comparison::EQ);
1262      else if (Props & ConstantProperties::NonZero)
1263        Result = (Cmp & Comparison::G) || (Cmp == Comparison::NE);
1264      else
1265        return false;
1266      return true;
1267    }
1268    // A2 is not zero. The only handled case is if X = 0.
1269    if (Props & ConstantProperties::Zero) {
1270      Result = (Cmp & Comparison::L) || (Cmp == Comparison::NE);
1271      return true;
1272    }
1273    return false;
1274  }
1275
1276  // Signed comparisons are different.
1277  if (Props & ConstantProperties::Zero) {
1278    if (A2 == 0)
1279      Result = (Cmp & Comparison::EQ);
1280    else
1281      Result = (Cmp == Comparison::NE) ||
1282               ((Cmp & Comparison::L) && !A2.isNegative()) ||
1283               ((Cmp & Comparison::G) &&  A2.isNegative());
1284    return true;
1285  }
1286  if (Props & ConstantProperties::PosOrZero) {
1287    // X >= 0 and !(A2 < 0) => cannot compare
1288    if (!A2.isNegative())
1289      return false;
1290    // X >= 0 and A2 < 0
1291    Result = (Cmp & Comparison::G) || (Cmp == Comparison::NE);
1292    return true;
1293  }
1294  if (Props & ConstantProperties::NegOrZero) {
1295    // X <= 0 and Src1 < 0 => cannot compare
1296    if (A2 == 0 || A2.isNegative())
1297      return false;
1298    // X <= 0 and A2 > 0
1299    Result = (Cmp & Comparison::L) || (Cmp == Comparison::NE);
1300    return true;
1301  }
1302
1303  return false;
1304}
1305
1306bool MachineConstEvaluator::evaluateCMPpp(uint32_t Cmp, uint32_t Props1,
1307      uint32_t Props2, bool &Result) {
1308  using P = ConstantProperties;
1309
1310  if ((Props1 & P::NaN) && (Props2 & P::NaN))
1311    return false;
1312  if (!(Props1 & P::Finite) || !(Props2 & P::Finite))
1313    return false;
1314
1315  bool Zero1 = (Props1 & P::Zero), Zero2 = (Props2 & P::Zero);
1316  bool NonZero1 = (Props1 & P::NonZero), NonZero2 = (Props2 & P::NonZero);
1317  if (Zero1 && Zero2) {
1318    Result = (Cmp & Comparison::EQ);
1319    return true;
1320  }
1321  if (Cmp == Comparison::NE) {
1322    if ((Zero1 && NonZero2) || (NonZero1 && Zero2))
1323      return (Result = true);
1324    return false;
1325  }
1326
1327  if (Cmp & Comparison::U) {
1328    // In unsigned comparisons, we can only compare against a known zero,
1329    // or a known non-zero.
1330    if (Zero1 && NonZero2) {
1331      Result = (Cmp & Comparison::L);
1332      return true;
1333    }
1334    if (NonZero1 && Zero2) {
1335      Result = (Cmp & Comparison::G);
1336      return true;
1337    }
1338    return false;
1339  }
1340
1341  // Signed comparison. The comparison is not NE.
1342  bool Poz1 = (Props1 & P::PosOrZero), Poz2 = (Props2 & P::PosOrZero);
1343  bool Nez1 = (Props1 & P::NegOrZero), Nez2 = (Props2 & P::NegOrZero);
1344  if (Nez1 && Poz2) {
1345    if (NonZero1 || NonZero2) {
1346      Result = (Cmp & Comparison::L);
1347      return true;
1348    }
1349    // Either (or both) could be zero. Can only say that X <= Y.
1350    if ((Cmp & Comparison::EQ) && (Cmp & Comparison::L))
1351      return (Result = true);
1352  }
1353  if (Poz1 && Nez2) {
1354    if (NonZero1 || NonZero2) {
1355      Result = (Cmp & Comparison::G);
1356      return true;
1357    }
1358    // Either (or both) could be zero. Can only say that X >= Y.
1359    if ((Cmp & Comparison::EQ) && (Cmp & Comparison::G))
1360      return (Result = true);
1361  }
1362
1363  return false;
1364}
1365
1366bool MachineConstEvaluator::evaluateCOPY(const RegisterSubReg &R1,
1367      const CellMap &Inputs, LatticeCell &Result) {
1368  return getCell(R1, Inputs, Result);
1369}
1370
1371bool MachineConstEvaluator::evaluateANDrr(const RegisterSubReg &R1,
1372      const RegisterSubReg &R2, const CellMap &Inputs, LatticeCell &Result) {
1373  assert(Inputs.has(R1.Reg) && Inputs.has(R2.Reg));
1374  const LatticeCell &L1 = Inputs.get(R2.Reg);
1375  const LatticeCell &L2 = Inputs.get(R2.Reg);
1376  // If both sources are bottom, exit. Otherwise try to evaluate ANDri
1377  // with the non-bottom argument passed as the immediate. This is to
1378  // catch cases of ANDing with 0.
1379  if (L2.isBottom()) {
1380    if (L1.isBottom())
1381      return false;
1382    return evaluateANDrr(R2, R1, Inputs, Result);
1383  }
1384  LatticeCell LS2;
1385  if (!evaluate(R2, L2, LS2))
1386    return false;
1387  if (LS2.isBottom() || LS2.isProperty())
1388    return false;
1389
1390  APInt A;
1391  for (unsigned i = 0; i < LS2.size(); ++i) {
1392    LatticeCell RC;
1393    bool Eval = constToInt(LS2.Values[i], A) &&
1394                evaluateANDri(R1, A, Inputs, RC);
1395    if (!Eval)
1396      return false;
1397    Result.meet(RC);
1398  }
1399  return !Result.isBottom();
1400}
1401
1402bool MachineConstEvaluator::evaluateANDri(const RegisterSubReg &R1,
1403      const APInt &A2, const CellMap &Inputs, LatticeCell &Result) {
1404  assert(Inputs.has(R1.Reg));
1405  if (A2 == -1)
1406    return getCell(R1, Inputs, Result);
1407  if (A2 == 0) {
1408    LatticeCell RC;
1409    RC.add(intToConst(A2));
1410    // Overwrite Result.
1411    Result = RC;
1412    return true;
1413  }
1414  LatticeCell LS1;
1415  if (!getCell(R1, Inputs, LS1))
1416    return false;
1417  if (LS1.isBottom() || LS1.isProperty())
1418    return false;
1419
1420  APInt A, ResA;
1421  for (unsigned i = 0; i < LS1.size(); ++i) {
1422    bool Eval = constToInt(LS1.Values[i], A) &&
1423                evaluateANDii(A, A2, ResA);
1424    if (!Eval)
1425      return false;
1426    const Constant *C = intToConst(ResA);
1427    Result.add(C);
1428  }
1429  return !Result.isBottom();
1430}
1431
1432bool MachineConstEvaluator::evaluateANDii(const APInt &A1,
1433      const APInt &A2, APInt &Result) {
1434  Result = A1 & A2;
1435  return true;
1436}
1437
1438bool MachineConstEvaluator::evaluateORrr(const RegisterSubReg &R1,
1439      const RegisterSubReg &R2, const CellMap &Inputs, LatticeCell &Result) {
1440  assert(Inputs.has(R1.Reg) && Inputs.has(R2.Reg));
1441  const LatticeCell &L1 = Inputs.get(R2.Reg);
1442  const LatticeCell &L2 = Inputs.get(R2.Reg);
1443  // If both sources are bottom, exit. Otherwise try to evaluate ORri
1444  // with the non-bottom argument passed as the immediate. This is to
1445  // catch cases of ORing with -1.
1446  if (L2.isBottom()) {
1447    if (L1.isBottom())
1448      return false;
1449    return evaluateORrr(R2, R1, Inputs, Result);
1450  }
1451  LatticeCell LS2;
1452  if (!evaluate(R2, L2, LS2))
1453    return false;
1454  if (LS2.isBottom() || LS2.isProperty())
1455    return false;
1456
1457  APInt A;
1458  for (unsigned i = 0; i < LS2.size(); ++i) {
1459    LatticeCell RC;
1460    bool Eval = constToInt(LS2.Values[i], A) &&
1461                evaluateORri(R1, A, Inputs, RC);
1462    if (!Eval)
1463      return false;
1464    Result.meet(RC);
1465  }
1466  return !Result.isBottom();
1467}
1468
1469bool MachineConstEvaluator::evaluateORri(const RegisterSubReg &R1,
1470      const APInt &A2, const CellMap &Inputs, LatticeCell &Result) {
1471  assert(Inputs.has(R1.Reg));
1472  if (A2 == 0)
1473    return getCell(R1, Inputs, Result);
1474  if (A2 == -1) {
1475    LatticeCell RC;
1476    RC.add(intToConst(A2));
1477    // Overwrite Result.
1478    Result = RC;
1479    return true;
1480  }
1481  LatticeCell LS1;
1482  if (!getCell(R1, Inputs, LS1))
1483    return false;
1484  if (LS1.isBottom() || LS1.isProperty())
1485    return false;
1486
1487  APInt A, ResA;
1488  for (unsigned i = 0; i < LS1.size(); ++i) {
1489    bool Eval = constToInt(LS1.Values[i], A) &&
1490                evaluateORii(A, A2, ResA);
1491    if (!Eval)
1492      return false;
1493    const Constant *C = intToConst(ResA);
1494    Result.add(C);
1495  }
1496  return !Result.isBottom();
1497}
1498
1499bool MachineConstEvaluator::evaluateORii(const APInt &A1,
1500      const APInt &A2, APInt &Result) {
1501  Result = A1 | A2;
1502  return true;
1503}
1504
1505bool MachineConstEvaluator::evaluateXORrr(const RegisterSubReg &R1,
1506      const RegisterSubReg &R2, const CellMap &Inputs, LatticeCell &Result) {
1507  assert(Inputs.has(R1.Reg) && Inputs.has(R2.Reg));
1508  LatticeCell LS1, LS2;
1509  if (!getCell(R1, Inputs, LS1) || !getCell(R2, Inputs, LS2))
1510    return false;
1511  if (LS1.isProperty()) {
1512    if (LS1.properties() & ConstantProperties::Zero)
1513      return !(Result = LS2).isBottom();
1514    return false;
1515  }
1516  if (LS2.isProperty()) {
1517    if (LS2.properties() & ConstantProperties::Zero)
1518      return !(Result = LS1).isBottom();
1519    return false;
1520  }
1521
1522  APInt A;
1523  for (unsigned i = 0; i < LS2.size(); ++i) {
1524    LatticeCell RC;
1525    bool Eval = constToInt(LS2.Values[i], A) &&
1526                evaluateXORri(R1, A, Inputs, RC);
1527    if (!Eval)
1528      return false;
1529    Result.meet(RC);
1530  }
1531  return !Result.isBottom();
1532}
1533
1534bool MachineConstEvaluator::evaluateXORri(const RegisterSubReg &R1,
1535      const APInt &A2, const CellMap &Inputs, LatticeCell &Result) {
1536  assert(Inputs.has(R1.Reg));
1537  LatticeCell LS1;
1538  if (!getCell(R1, Inputs, LS1))
1539    return false;
1540  if (LS1.isProperty()) {
1541    if (LS1.properties() & ConstantProperties::Zero) {
1542      const Constant *C = intToConst(A2);
1543      Result.add(C);
1544      return !Result.isBottom();
1545    }
1546    return false;
1547  }
1548
1549  APInt A, XA;
1550  for (unsigned i = 0; i < LS1.size(); ++i) {
1551    bool Eval = constToInt(LS1.Values[i], A) &&
1552                evaluateXORii(A, A2, XA);
1553    if (!Eval)
1554      return false;
1555    const Constant *C = intToConst(XA);
1556    Result.add(C);
1557  }
1558  return !Result.isBottom();
1559}
1560
1561bool MachineConstEvaluator::evaluateXORii(const APInt &A1,
1562      const APInt &A2, APInt &Result) {
1563  Result = A1 ^ A2;
1564  return true;
1565}
1566
1567bool MachineConstEvaluator::evaluateZEXTr(const RegisterSubReg &R1, unsigned Width,
1568      unsigned Bits, const CellMap &Inputs, LatticeCell &Result) {
1569  assert(Inputs.has(R1.Reg));
1570  LatticeCell LS1;
1571  if (!getCell(R1, Inputs, LS1))
1572    return false;
1573  if (LS1.isProperty())
1574    return false;
1575
1576  APInt A, XA;
1577  for (unsigned i = 0; i < LS1.size(); ++i) {
1578    bool Eval = constToInt(LS1.Values[i], A) &&
1579                evaluateZEXTi(A, Width, Bits, XA);
1580    if (!Eval)
1581      return false;
1582    const Constant *C = intToConst(XA);
1583    Result.add(C);
1584  }
1585  return true;
1586}
1587
1588bool MachineConstEvaluator::evaluateZEXTi(const APInt &A1, unsigned Width,
1589      unsigned Bits, APInt &Result) {
1590  unsigned BW = A1.getBitWidth();
1591  (void)BW;
1592  assert(Width >= Bits && BW >= Bits);
1593  APInt Mask = APInt::getLowBitsSet(Width, Bits);
1594  Result = A1.zextOrTrunc(Width) & Mask;
1595  return true;
1596}
1597
1598bool MachineConstEvaluator::evaluateSEXTr(const RegisterSubReg &R1, unsigned Width,
1599      unsigned Bits, const CellMap &Inputs, LatticeCell &Result) {
1600  assert(Inputs.has(R1.Reg));
1601  LatticeCell LS1;
1602  if (!getCell(R1, Inputs, LS1))
1603    return false;
1604  if (LS1.isBottom() || LS1.isProperty())
1605    return false;
1606
1607  APInt A, XA;
1608  for (unsigned i = 0; i < LS1.size(); ++i) {
1609    bool Eval = constToInt(LS1.Values[i], A) &&
1610                evaluateSEXTi(A, Width, Bits, XA);
1611    if (!Eval)
1612      return false;
1613    const Constant *C = intToConst(XA);
1614    Result.add(C);
1615  }
1616  return true;
1617}
1618
1619bool MachineConstEvaluator::evaluateSEXTi(const APInt &A1, unsigned Width,
1620      unsigned Bits, APInt &Result) {
1621  unsigned BW = A1.getBitWidth();
1622  assert(Width >= Bits && BW >= Bits);
1623  // Special case to make things faster for smaller source widths.
1624  // Sign extension of 0 bits generates 0 as a result. This is consistent
1625  // with what the HW does.
1626  if (Bits == 0) {
1627    Result = APInt(Width, 0);
1628    return true;
1629  }
1630  // In C, shifts by 64 invoke undefined behavior: handle that case in APInt.
1631  if (BW <= 64 && Bits != 0) {
1632    int64_t V = A1.getSExtValue();
1633    switch (Bits) {
1634      case 8:
1635        V = static_cast<int8_t>(V);
1636        break;
1637      case 16:
1638        V = static_cast<int16_t>(V);
1639        break;
1640      case 32:
1641        V = static_cast<int32_t>(V);
1642        break;
1643      default:
1644        // Shift left to lose all bits except lower "Bits" bits, then shift
1645        // the value back, replicating what was a sign bit after the first
1646        // shift.
1647        V = (V << (64-Bits)) >> (64-Bits);
1648        break;
1649    }
1650    // V is a 64-bit sign-extended value. Convert it to APInt of desired
1651    // width.
1652    Result = APInt(Width, V, true);
1653    return true;
1654  }
1655  // Slow case: the value doesn't fit in int64_t.
1656  if (Bits < BW)
1657    Result = A1.trunc(Bits).sext(Width);
1658  else // Bits == BW
1659    Result = A1.sext(Width);
1660  return true;
1661}
1662
1663bool MachineConstEvaluator::evaluateCLBr(const RegisterSubReg &R1, bool Zeros,
1664      bool Ones, const CellMap &Inputs, LatticeCell &Result) {
1665  assert(Inputs.has(R1.Reg));
1666  LatticeCell LS1;
1667  if (!getCell(R1, Inputs, LS1))
1668    return false;
1669  if (LS1.isBottom() || LS1.isProperty())
1670    return false;
1671
1672  APInt A, CA;
1673  for (unsigned i = 0; i < LS1.size(); ++i) {
1674    bool Eval = constToInt(LS1.Values[i], A) &&
1675                evaluateCLBi(A, Zeros, Ones, CA);
1676    if (!Eval)
1677      return false;
1678    const Constant *C = intToConst(CA);
1679    Result.add(C);
1680  }
1681  return true;
1682}
1683
1684bool MachineConstEvaluator::evaluateCLBi(const APInt &A1, bool Zeros,
1685      bool Ones, APInt &Result) {
1686  unsigned BW = A1.getBitWidth();
1687  if (!Zeros && !Ones)
1688    return false;
1689  unsigned Count = 0;
1690  if (Zeros && (Count == 0))
1691    Count = A1.countLeadingZeros();
1692  if (Ones && (Count == 0))
1693    Count = A1.countLeadingOnes();
1694  Result = APInt(BW, static_cast<uint64_t>(Count), false);
1695  return true;
1696}
1697
1698bool MachineConstEvaluator::evaluateCTBr(const RegisterSubReg &R1, bool Zeros,
1699      bool Ones, const CellMap &Inputs, LatticeCell &Result) {
1700  assert(Inputs.has(R1.Reg));
1701  LatticeCell LS1;
1702  if (!getCell(R1, Inputs, LS1))
1703    return false;
1704  if (LS1.isBottom() || LS1.isProperty())
1705    return false;
1706
1707  APInt A, CA;
1708  for (unsigned i = 0; i < LS1.size(); ++i) {
1709    bool Eval = constToInt(LS1.Values[i], A) &&
1710                evaluateCTBi(A, Zeros, Ones, CA);
1711    if (!Eval)
1712      return false;
1713    const Constant *C = intToConst(CA);
1714    Result.add(C);
1715  }
1716  return true;
1717}
1718
1719bool MachineConstEvaluator::evaluateCTBi(const APInt &A1, bool Zeros,
1720      bool Ones, APInt &Result) {
1721  unsigned BW = A1.getBitWidth();
1722  if (!Zeros && !Ones)
1723    return false;
1724  unsigned Count = 0;
1725  if (Zeros && (Count == 0))
1726    Count = A1.countTrailingZeros();
1727  if (Ones && (Count == 0))
1728    Count = A1.countTrailingOnes();
1729  Result = APInt(BW, static_cast<uint64_t>(Count), false);
1730  return true;
1731}
1732
1733bool MachineConstEvaluator::evaluateEXTRACTr(const RegisterSubReg &R1,
1734      unsigned Width, unsigned Bits, unsigned Offset, bool Signed,
1735      const CellMap &Inputs, LatticeCell &Result) {
1736  assert(Inputs.has(R1.Reg));
1737  assert(Bits+Offset <= Width);
1738  LatticeCell LS1;
1739  if (!getCell(R1, Inputs, LS1))
1740    return false;
1741  if (LS1.isBottom())
1742    return false;
1743  if (LS1.isProperty()) {
1744    uint32_t Ps = LS1.properties();
1745    if (Ps & ConstantProperties::Zero) {
1746      const Constant *C = intToConst(APInt(Width, 0, false));
1747      Result.add(C);
1748      return true;
1749    }
1750    return false;
1751  }
1752
1753  APInt A, CA;
1754  for (unsigned i = 0; i < LS1.size(); ++i) {
1755    bool Eval = constToInt(LS1.Values[i], A) &&
1756                evaluateEXTRACTi(A, Bits, Offset, Signed, CA);
1757    if (!Eval)
1758      return false;
1759    const Constant *C = intToConst(CA);
1760    Result.add(C);
1761  }
1762  return true;
1763}
1764
1765bool MachineConstEvaluator::evaluateEXTRACTi(const APInt &A1, unsigned Bits,
1766      unsigned Offset, bool Signed, APInt &Result) {
1767  unsigned BW = A1.getBitWidth();
1768  assert(Bits+Offset <= BW);
1769  // Extracting 0 bits generates 0 as a result (as indicated by the HW people).
1770  if (Bits == 0) {
1771    Result = APInt(BW, 0);
1772    return true;
1773  }
1774  if (BW <= 64) {
1775    int64_t V = A1.getZExtValue();
1776    V <<= (64-Bits-Offset);
1777    if (Signed)
1778      V >>= (64-Bits);
1779    else
1780      V = static_cast<uint64_t>(V) >> (64-Bits);
1781    Result = APInt(BW, V, Signed);
1782    return true;
1783  }
1784  if (Signed)
1785    Result = A1.shl(BW-Bits-Offset).ashr(BW-Bits);
1786  else
1787    Result = A1.shl(BW-Bits-Offset).lshr(BW-Bits);
1788  return true;
1789}
1790
1791bool MachineConstEvaluator::evaluateSplatr(const RegisterSubReg &R1,
1792      unsigned Bits, unsigned Count, const CellMap &Inputs,
1793      LatticeCell &Result) {
1794  assert(Inputs.has(R1.Reg));
1795  LatticeCell LS1;
1796  if (!getCell(R1, Inputs, LS1))
1797    return false;
1798  if (LS1.isBottom() || LS1.isProperty())
1799    return false;
1800
1801  APInt A, SA;
1802  for (unsigned i = 0; i < LS1.size(); ++i) {
1803    bool Eval = constToInt(LS1.Values[i], A) &&
1804                evaluateSplati(A, Bits, Count, SA);
1805    if (!Eval)
1806      return false;
1807    const Constant *C = intToConst(SA);
1808    Result.add(C);
1809  }
1810  return true;
1811}
1812
1813bool MachineConstEvaluator::evaluateSplati(const APInt &A1, unsigned Bits,
1814      unsigned Count, APInt &Result) {
1815  assert(Count > 0);
1816  unsigned BW = A1.getBitWidth(), SW = Count*Bits;
1817  APInt LoBits = (Bits < BW) ? A1.trunc(Bits) : A1.zextOrSelf(Bits);
1818  if (Count > 1)
1819    LoBits = LoBits.zext(SW);
1820
1821  APInt Res(SW, 0, false);
1822  for (unsigned i = 0; i < Count; ++i) {
1823    Res <<= Bits;
1824    Res |= LoBits;
1825  }
1826  Result = Res;
1827  return true;
1828}
1829
1830// ----------------------------------------------------------------------
1831// Hexagon-specific code.
1832
1833namespace llvm {
1834
1835  FunctionPass *createHexagonConstPropagationPass();
1836  void initializeHexagonConstPropagationPass(PassRegistry &Registry);
1837
1838} // end namespace llvm
1839
1840namespace {
1841
1842  class HexagonConstEvaluator : public MachineConstEvaluator {
1843  public:
1844    HexagonConstEvaluator(MachineFunction &Fn);
1845
1846    bool evaluate(const MachineInstr &MI, const CellMap &Inputs,
1847          CellMap &Outputs) override;
1848    bool evaluate(const RegisterSubReg &R, const LatticeCell &SrcC,
1849          LatticeCell &Result) override;
1850    bool evaluate(const MachineInstr &BrI, const CellMap &Inputs,
1851          SetVector<const MachineBasicBlock*> &Targets, bool &FallsThru)
1852          override;
1853    bool rewrite(MachineInstr &MI, const CellMap &Inputs) override;
1854
1855  private:
1856    unsigned getRegBitWidth(unsigned Reg) const;
1857
1858    static uint32_t getCmp(unsigned Opc);
1859    static APInt getCmpImm(unsigned Opc, unsigned OpX,
1860          const MachineOperand &MO);
1861    void replaceWithNop(MachineInstr &MI);
1862
1863    bool evaluateHexRSEQ32(RegisterSubReg RL, RegisterSubReg RH, const CellMap &Inputs,
1864          LatticeCell &Result);
1865    bool evaluateHexCompare(const MachineInstr &MI, const CellMap &Inputs,
1866          CellMap &Outputs);
1867    // This is suitable to be called for compare-and-jump instructions.
1868    bool evaluateHexCompare2(uint32_t Cmp, const MachineOperand &Src1,
1869          const MachineOperand &Src2, const CellMap &Inputs, bool &Result);
1870    bool evaluateHexLogical(const MachineInstr &MI, const CellMap &Inputs,
1871          CellMap &Outputs);
1872    bool evaluateHexCondMove(const MachineInstr &MI, const CellMap &Inputs,
1873          CellMap &Outputs);
1874    bool evaluateHexExt(const MachineInstr &MI, const CellMap &Inputs,
1875          CellMap &Outputs);
1876    bool evaluateHexVector1(const MachineInstr &MI, const CellMap &Inputs,
1877          CellMap &Outputs);
1878    bool evaluateHexVector2(const MachineInstr &MI, const CellMap &Inputs,
1879          CellMap &Outputs);
1880
1881    void replaceAllRegUsesWith(unsigned FromReg, unsigned ToReg);
1882    bool rewriteHexBranch(MachineInstr &BrI, const CellMap &Inputs);
1883    bool rewriteHexConstDefs(MachineInstr &MI, const CellMap &Inputs,
1884          bool &AllDefs);
1885    bool rewriteHexConstUses(MachineInstr &MI, const CellMap &Inputs);
1886
1887    MachineRegisterInfo *MRI;
1888    const HexagonInstrInfo &HII;
1889    const HexagonRegisterInfo &HRI;
1890  };
1891
1892  class HexagonConstPropagation : public MachineFunctionPass {
1893  public:
1894    static char ID;
1895
1896    HexagonConstPropagation() : MachineFunctionPass(ID) {}
1897
1898    StringRef getPassName() const override {
1899      return "Hexagon Constant Propagation";
1900    }
1901
1902    bool runOnMachineFunction(MachineFunction &MF) override {
1903      const Function &F = MF.getFunction();
1904      if (skipFunction(F))
1905        return false;
1906
1907      HexagonConstEvaluator HCE(MF);
1908      return MachineConstPropagator(HCE).run(MF);
1909    }
1910  };
1911
1912} // end anonymous namespace
1913
1914char HexagonConstPropagation::ID = 0;
1915
1916INITIALIZE_PASS(HexagonConstPropagation, "hexagon-constp",
1917  "Hexagon Constant Propagation", false, false)
1918
1919HexagonConstEvaluator::HexagonConstEvaluator(MachineFunction &Fn)
1920  : MachineConstEvaluator(Fn),
1921    HII(*Fn.getSubtarget<HexagonSubtarget>().getInstrInfo()),
1922    HRI(*Fn.getSubtarget<HexagonSubtarget>().getRegisterInfo()) {
1923  MRI = &Fn.getRegInfo();
1924}
1925
1926bool HexagonConstEvaluator::evaluate(const MachineInstr &MI,
1927      const CellMap &Inputs, CellMap &Outputs) {
1928  if (MI.isCall())
1929    return false;
1930  if (MI.getNumOperands() == 0 || !MI.getOperand(0).isReg())
1931    return false;
1932  const MachineOperand &MD = MI.getOperand(0);
1933  if (!MD.isDef())
1934    return false;
1935
1936  unsigned Opc = MI.getOpcode();
1937  RegisterSubReg DefR(MD);
1938  assert(!DefR.SubReg);
1939  if (!Register::isVirtualRegister(DefR.Reg))
1940    return false;
1941
1942  if (MI.isCopy()) {
1943    LatticeCell RC;
1944    RegisterSubReg SrcR(MI.getOperand(1));
1945    bool Eval = evaluateCOPY(SrcR, Inputs, RC);
1946    if (!Eval)
1947      return false;
1948    Outputs.update(DefR.Reg, RC);
1949    return true;
1950  }
1951  if (MI.isRegSequence()) {
1952    unsigned Sub1 = MI.getOperand(2).getImm();
1953    unsigned Sub2 = MI.getOperand(4).getImm();
1954    const TargetRegisterClass &DefRC = *MRI->getRegClass(DefR.Reg);
1955    unsigned SubLo = HRI.getHexagonSubRegIndex(DefRC, Hexagon::ps_sub_lo);
1956    unsigned SubHi = HRI.getHexagonSubRegIndex(DefRC, Hexagon::ps_sub_hi);
1957    if (Sub1 != SubLo && Sub1 != SubHi)
1958      return false;
1959    if (Sub2 != SubLo && Sub2 != SubHi)
1960      return false;
1961    assert(Sub1 != Sub2);
1962    bool LoIs1 = (Sub1 == SubLo);
1963    const MachineOperand &OpLo = LoIs1 ? MI.getOperand(1) : MI.getOperand(3);
1964    const MachineOperand &OpHi = LoIs1 ? MI.getOperand(3) : MI.getOperand(1);
1965    LatticeCell RC;
1966    RegisterSubReg SrcRL(OpLo), SrcRH(OpHi);
1967    bool Eval = evaluateHexRSEQ32(SrcRL, SrcRH, Inputs, RC);
1968    if (!Eval)
1969      return false;
1970    Outputs.update(DefR.Reg, RC);
1971    return true;
1972  }
1973  if (MI.isCompare()) {
1974    bool Eval = evaluateHexCompare(MI, Inputs, Outputs);
1975    return Eval;
1976  }
1977
1978  switch (Opc) {
1979    default:
1980      return false;
1981    case Hexagon::A2_tfrsi:
1982    case Hexagon::A2_tfrpi:
1983    case Hexagon::CONST32:
1984    case Hexagon::CONST64:
1985    {
1986      const MachineOperand &VO = MI.getOperand(1);
1987      // The operand of CONST32 can be a blockaddress, e.g.
1988      //   %0 = CONST32 <blockaddress(@eat, %l)>
1989      // Do this check for all instructions for safety.
1990      if (!VO.isImm())
1991        return false;
1992      int64_t V = MI.getOperand(1).getImm();
1993      unsigned W = getRegBitWidth(DefR.Reg);
1994      if (W != 32 && W != 64)
1995        return false;
1996      IntegerType *Ty = (W == 32) ? Type::getInt32Ty(CX)
1997                                  : Type::getInt64Ty(CX);
1998      const ConstantInt *CI = ConstantInt::get(Ty, V, true);
1999      LatticeCell RC = Outputs.get(DefR.Reg);
2000      RC.add(CI);
2001      Outputs.update(DefR.Reg, RC);
2002      break;
2003    }
2004
2005    case Hexagon::PS_true:
2006    case Hexagon::PS_false:
2007    {
2008      LatticeCell RC = Outputs.get(DefR.Reg);
2009      bool NonZero = (Opc == Hexagon::PS_true);
2010      uint32_t P = NonZero ? ConstantProperties::NonZero
2011                           : ConstantProperties::Zero;
2012      RC.add(P);
2013      Outputs.update(DefR.Reg, RC);
2014      break;
2015    }
2016
2017    case Hexagon::A2_and:
2018    case Hexagon::A2_andir:
2019    case Hexagon::A2_andp:
2020    case Hexagon::A2_or:
2021    case Hexagon::A2_orir:
2022    case Hexagon::A2_orp:
2023    case Hexagon::A2_xor:
2024    case Hexagon::A2_xorp:
2025    {
2026      bool Eval = evaluateHexLogical(MI, Inputs, Outputs);
2027      if (!Eval)
2028        return false;
2029      break;
2030    }
2031
2032    case Hexagon::A2_combineii:  // combine(#s8Ext, #s8)
2033    case Hexagon::A4_combineii:  // combine(#s8, #u6Ext)
2034    {
2035      if (!MI.getOperand(1).isImm() || !MI.getOperand(2).isImm())
2036        return false;
2037      uint64_t Hi = MI.getOperand(1).getImm();
2038      uint64_t Lo = MI.getOperand(2).getImm();
2039      uint64_t Res = (Hi << 32) | (Lo & 0xFFFFFFFF);
2040      IntegerType *Ty = Type::getInt64Ty(CX);
2041      const ConstantInt *CI = ConstantInt::get(Ty, Res, false);
2042      LatticeCell RC = Outputs.get(DefR.Reg);
2043      RC.add(CI);
2044      Outputs.update(DefR.Reg, RC);
2045      break;
2046    }
2047
2048    case Hexagon::S2_setbit_i:
2049    {
2050      int64_t B = MI.getOperand(2).getImm();
2051      assert(B >=0 && B < 32);
2052      APInt A(32, (1ull << B), false);
2053      RegisterSubReg R(MI.getOperand(1));
2054      LatticeCell RC = Outputs.get(DefR.Reg);
2055      bool Eval = evaluateORri(R, A, Inputs, RC);
2056      if (!Eval)
2057        return false;
2058      Outputs.update(DefR.Reg, RC);
2059      break;
2060    }
2061
2062    case Hexagon::C2_mux:
2063    case Hexagon::C2_muxir:
2064    case Hexagon::C2_muxri:
2065    case Hexagon::C2_muxii:
2066    {
2067      bool Eval = evaluateHexCondMove(MI, Inputs, Outputs);
2068      if (!Eval)
2069        return false;
2070      break;
2071    }
2072
2073    case Hexagon::A2_sxtb:
2074    case Hexagon::A2_sxth:
2075    case Hexagon::A2_sxtw:
2076    case Hexagon::A2_zxtb:
2077    case Hexagon::A2_zxth:
2078    {
2079      bool Eval = evaluateHexExt(MI, Inputs, Outputs);
2080      if (!Eval)
2081        return false;
2082      break;
2083    }
2084
2085    case Hexagon::S2_ct0:
2086    case Hexagon::S2_ct0p:
2087    case Hexagon::S2_ct1:
2088    case Hexagon::S2_ct1p:
2089    {
2090      using namespace Hexagon;
2091
2092      bool Ones = (Opc == S2_ct1) || (Opc == S2_ct1p);
2093      RegisterSubReg R1(MI.getOperand(1));
2094      assert(Inputs.has(R1.Reg));
2095      LatticeCell T;
2096      bool Eval = evaluateCTBr(R1, !Ones, Ones, Inputs, T);
2097      if (!Eval)
2098        return false;
2099      // All of these instructions return a 32-bit value. The evaluate
2100      // will generate the same type as the operand, so truncate the
2101      // result if necessary.
2102      APInt C;
2103      LatticeCell RC = Outputs.get(DefR.Reg);
2104      for (unsigned i = 0; i < T.size(); ++i) {
2105        const Constant *CI = T.Values[i];
2106        if (constToInt(CI, C) && C.getBitWidth() > 32)
2107          CI = intToConst(C.trunc(32));
2108        RC.add(CI);
2109      }
2110      Outputs.update(DefR.Reg, RC);
2111      break;
2112    }
2113
2114    case Hexagon::S2_cl0:
2115    case Hexagon::S2_cl0p:
2116    case Hexagon::S2_cl1:
2117    case Hexagon::S2_cl1p:
2118    case Hexagon::S2_clb:
2119    case Hexagon::S2_clbp:
2120    {
2121      using namespace Hexagon;
2122
2123      bool OnlyZeros = (Opc == S2_cl0) || (Opc == S2_cl0p);
2124      bool OnlyOnes =  (Opc == S2_cl1) || (Opc == S2_cl1p);
2125      RegisterSubReg R1(MI.getOperand(1));
2126      assert(Inputs.has(R1.Reg));
2127      LatticeCell T;
2128      bool Eval = evaluateCLBr(R1, !OnlyOnes, !OnlyZeros, Inputs, T);
2129      if (!Eval)
2130        return false;
2131      // All of these instructions return a 32-bit value. The evaluate
2132      // will generate the same type as the operand, so truncate the
2133      // result if necessary.
2134      APInt C;
2135      LatticeCell RC = Outputs.get(DefR.Reg);
2136      for (unsigned i = 0; i < T.size(); ++i) {
2137        const Constant *CI = T.Values[i];
2138        if (constToInt(CI, C) && C.getBitWidth() > 32)
2139          CI = intToConst(C.trunc(32));
2140        RC.add(CI);
2141      }
2142      Outputs.update(DefR.Reg, RC);
2143      break;
2144    }
2145
2146    case Hexagon::S4_extract:
2147    case Hexagon::S4_extractp:
2148    case Hexagon::S2_extractu:
2149    case Hexagon::S2_extractup:
2150    {
2151      bool Signed = (Opc == Hexagon::S4_extract) ||
2152                    (Opc == Hexagon::S4_extractp);
2153      RegisterSubReg R1(MI.getOperand(1));
2154      unsigned BW = getRegBitWidth(R1.Reg);
2155      unsigned Bits = MI.getOperand(2).getImm();
2156      unsigned Offset = MI.getOperand(3).getImm();
2157      LatticeCell RC = Outputs.get(DefR.Reg);
2158      if (Offset >= BW) {
2159        APInt Zero(BW, 0, false);
2160        RC.add(intToConst(Zero));
2161        break;
2162      }
2163      if (Offset+Bits > BW) {
2164        // If the requested bitfield extends beyond the most significant bit,
2165        // the extra bits are treated as 0s. To emulate this behavior, reduce
2166        // the number of requested bits, and make the extract unsigned.
2167        Bits = BW-Offset;
2168        Signed = false;
2169      }
2170      bool Eval = evaluateEXTRACTr(R1, BW, Bits, Offset, Signed, Inputs, RC);
2171      if (!Eval)
2172        return false;
2173      Outputs.update(DefR.Reg, RC);
2174      break;
2175    }
2176
2177    case Hexagon::S2_vsplatrb:
2178    case Hexagon::S2_vsplatrh:
2179    // vabsh, vabsh:sat
2180    // vabsw, vabsw:sat
2181    // vconj:sat
2182    // vrndwh, vrndwh:sat
2183    // vsathb, vsathub, vsatwuh
2184    // vsxtbh, vsxthw
2185    // vtrunehb, vtrunohb
2186    // vzxtbh, vzxthw
2187    {
2188      bool Eval = evaluateHexVector1(MI, Inputs, Outputs);
2189      if (!Eval)
2190        return false;
2191      break;
2192    }
2193
2194    // TODO:
2195    // A2_vaddh
2196    // A2_vaddhs
2197    // A2_vaddw
2198    // A2_vaddws
2199  }
2200
2201  return true;
2202}
2203
2204bool HexagonConstEvaluator::evaluate(const RegisterSubReg &R,
2205      const LatticeCell &Input, LatticeCell &Result) {
2206  if (!R.SubReg) {
2207    Result = Input;
2208    return true;
2209  }
2210  const TargetRegisterClass *RC = MRI->getRegClass(R.Reg);
2211  if (RC != &Hexagon::DoubleRegsRegClass)
2212    return false;
2213  if (R.SubReg != Hexagon::isub_lo && R.SubReg != Hexagon::isub_hi)
2214    return false;
2215
2216  assert(!Input.isTop());
2217  if (Input.isBottom())
2218    return false;
2219
2220  using P = ConstantProperties;
2221
2222  if (Input.isProperty()) {
2223    uint32_t Ps = Input.properties();
2224    if (Ps & (P::Zero|P::NaN)) {
2225      uint32_t Ns = (Ps & (P::Zero|P::NaN|P::SignProperties));
2226      Result.add(Ns);
2227      return true;
2228    }
2229    if (R.SubReg == Hexagon::isub_hi) {
2230      uint32_t Ns = (Ps & P::SignProperties);
2231      Result.add(Ns);
2232      return true;
2233    }
2234    return false;
2235  }
2236
2237  // The Input cell contains some known values. Pick the word corresponding
2238  // to the subregister.
2239  APInt A;
2240  for (unsigned i = 0; i < Input.size(); ++i) {
2241    const Constant *C = Input.Values[i];
2242    if (!constToInt(C, A))
2243      return false;
2244    if (!A.isIntN(64))
2245      return false;
2246    uint64_t U = A.getZExtValue();
2247    if (R.SubReg == Hexagon::isub_hi)
2248      U >>= 32;
2249    U &= 0xFFFFFFFFULL;
2250    uint32_t U32 = Lo_32(U);
2251    int32_t V32;
2252    memcpy(&V32, &U32, sizeof V32);
2253    IntegerType *Ty = Type::getInt32Ty(CX);
2254    const ConstantInt *C32 = ConstantInt::get(Ty, static_cast<int64_t>(V32));
2255    Result.add(C32);
2256  }
2257  return true;
2258}
2259
2260bool HexagonConstEvaluator::evaluate(const MachineInstr &BrI,
2261      const CellMap &Inputs, SetVector<const MachineBasicBlock*> &Targets,
2262      bool &FallsThru) {
2263  // We need to evaluate one branch at a time. TII::analyzeBranch checks
2264  // all the branches in a basic block at once, so we cannot use it.
2265  unsigned Opc = BrI.getOpcode();
2266  bool SimpleBranch = false;
2267  bool Negated = false;
2268  switch (Opc) {
2269    case Hexagon::J2_jumpf:
2270    case Hexagon::J2_jumpfnew:
2271    case Hexagon::J2_jumpfnewpt:
2272      Negated = true;
2273      LLVM_FALLTHROUGH;
2274    case Hexagon::J2_jumpt:
2275    case Hexagon::J2_jumptnew:
2276    case Hexagon::J2_jumptnewpt:
2277      // Simple branch:  if([!]Pn) jump ...
2278      // i.e. Op0 = predicate, Op1 = branch target.
2279      SimpleBranch = true;
2280      break;
2281    case Hexagon::J2_jump:
2282      Targets.insert(BrI.getOperand(0).getMBB());
2283      FallsThru = false;
2284      return true;
2285    default:
2286Undetermined:
2287      // If the branch is of unknown type, assume that all successors are
2288      // executable.
2289      FallsThru = !BrI.isUnconditionalBranch();
2290      return false;
2291  }
2292
2293  if (SimpleBranch) {
2294    const MachineOperand &MD = BrI.getOperand(0);
2295    RegisterSubReg PR(MD);
2296    // If the condition operand has a subregister, this is not something
2297    // we currently recognize.
2298    if (PR.SubReg)
2299      goto Undetermined;
2300    assert(Inputs.has(PR.Reg));
2301    const LatticeCell &PredC = Inputs.get(PR.Reg);
2302    if (PredC.isBottom())
2303      goto Undetermined;
2304
2305    uint32_t Props = PredC.properties();
2306    bool CTrue = false, CFalse = false;
2307    if (Props & ConstantProperties::Zero)
2308      CFalse = true;
2309    else if (Props & ConstantProperties::NonZero)
2310      CTrue = true;
2311    // If the condition is not known to be either, bail out.
2312    if (!CTrue && !CFalse)
2313      goto Undetermined;
2314
2315    const MachineBasicBlock *BranchTarget = BrI.getOperand(1).getMBB();
2316
2317    FallsThru = false;
2318    if ((!Negated && CTrue) || (Negated && CFalse))
2319      Targets.insert(BranchTarget);
2320    else if ((!Negated && CFalse) || (Negated && CTrue))
2321      FallsThru = true;
2322    else
2323      goto Undetermined;
2324  }
2325
2326  return true;
2327}
2328
2329bool HexagonConstEvaluator::rewrite(MachineInstr &MI, const CellMap &Inputs) {
2330  if (MI.isBranch())
2331    return rewriteHexBranch(MI, Inputs);
2332
2333  unsigned Opc = MI.getOpcode();
2334  switch (Opc) {
2335    default:
2336      break;
2337    case Hexagon::A2_tfrsi:
2338    case Hexagon::A2_tfrpi:
2339    case Hexagon::CONST32:
2340    case Hexagon::CONST64:
2341    case Hexagon::PS_true:
2342    case Hexagon::PS_false:
2343      return false;
2344  }
2345
2346  unsigned NumOp = MI.getNumOperands();
2347  if (NumOp == 0)
2348    return false;
2349
2350  bool AllDefs, Changed;
2351  Changed = rewriteHexConstDefs(MI, Inputs, AllDefs);
2352  // If not all defs have been rewritten (i.e. the instruction defines
2353  // a register that is not compile-time constant), then try to rewrite
2354  // register operands that are known to be constant with immediates.
2355  if (!AllDefs)
2356    Changed |= rewriteHexConstUses(MI, Inputs);
2357
2358  return Changed;
2359}
2360
2361unsigned HexagonConstEvaluator::getRegBitWidth(unsigned Reg) const {
2362  const TargetRegisterClass *RC = MRI->getRegClass(Reg);
2363  if (Hexagon::IntRegsRegClass.hasSubClassEq(RC))
2364    return 32;
2365  if (Hexagon::DoubleRegsRegClass.hasSubClassEq(RC))
2366    return 64;
2367  if (Hexagon::PredRegsRegClass.hasSubClassEq(RC))
2368    return 8;
2369  llvm_unreachable("Invalid register");
2370  return 0;
2371}
2372
2373uint32_t HexagonConstEvaluator::getCmp(unsigned Opc) {
2374  switch (Opc) {
2375    case Hexagon::C2_cmpeq:
2376    case Hexagon::C2_cmpeqp:
2377    case Hexagon::A4_cmpbeq:
2378    case Hexagon::A4_cmpheq:
2379    case Hexagon::A4_cmpbeqi:
2380    case Hexagon::A4_cmpheqi:
2381    case Hexagon::C2_cmpeqi:
2382    case Hexagon::J4_cmpeqn1_t_jumpnv_nt:
2383    case Hexagon::J4_cmpeqn1_t_jumpnv_t:
2384    case Hexagon::J4_cmpeqi_t_jumpnv_nt:
2385    case Hexagon::J4_cmpeqi_t_jumpnv_t:
2386    case Hexagon::J4_cmpeq_t_jumpnv_nt:
2387    case Hexagon::J4_cmpeq_t_jumpnv_t:
2388      return Comparison::EQ;
2389
2390    case Hexagon::C4_cmpneq:
2391    case Hexagon::C4_cmpneqi:
2392    case Hexagon::J4_cmpeqn1_f_jumpnv_nt:
2393    case Hexagon::J4_cmpeqn1_f_jumpnv_t:
2394    case Hexagon::J4_cmpeqi_f_jumpnv_nt:
2395    case Hexagon::J4_cmpeqi_f_jumpnv_t:
2396    case Hexagon::J4_cmpeq_f_jumpnv_nt:
2397    case Hexagon::J4_cmpeq_f_jumpnv_t:
2398      return Comparison::NE;
2399
2400    case Hexagon::C2_cmpgt:
2401    case Hexagon::C2_cmpgtp:
2402    case Hexagon::A4_cmpbgt:
2403    case Hexagon::A4_cmphgt:
2404    case Hexagon::A4_cmpbgti:
2405    case Hexagon::A4_cmphgti:
2406    case Hexagon::C2_cmpgti:
2407    case Hexagon::J4_cmpgtn1_t_jumpnv_nt:
2408    case Hexagon::J4_cmpgtn1_t_jumpnv_t:
2409    case Hexagon::J4_cmpgti_t_jumpnv_nt:
2410    case Hexagon::J4_cmpgti_t_jumpnv_t:
2411    case Hexagon::J4_cmpgt_t_jumpnv_nt:
2412    case Hexagon::J4_cmpgt_t_jumpnv_t:
2413      return Comparison::GTs;
2414
2415    case Hexagon::C4_cmplte:
2416    case Hexagon::C4_cmpltei:
2417    case Hexagon::J4_cmpgtn1_f_jumpnv_nt:
2418    case Hexagon::J4_cmpgtn1_f_jumpnv_t:
2419    case Hexagon::J4_cmpgti_f_jumpnv_nt:
2420    case Hexagon::J4_cmpgti_f_jumpnv_t:
2421    case Hexagon::J4_cmpgt_f_jumpnv_nt:
2422    case Hexagon::J4_cmpgt_f_jumpnv_t:
2423      return Comparison::LEs;
2424
2425    case Hexagon::C2_cmpgtu:
2426    case Hexagon::C2_cmpgtup:
2427    case Hexagon::A4_cmpbgtu:
2428    case Hexagon::A4_cmpbgtui:
2429    case Hexagon::A4_cmphgtu:
2430    case Hexagon::A4_cmphgtui:
2431    case Hexagon::C2_cmpgtui:
2432    case Hexagon::J4_cmpgtui_t_jumpnv_nt:
2433    case Hexagon::J4_cmpgtui_t_jumpnv_t:
2434    case Hexagon::J4_cmpgtu_t_jumpnv_nt:
2435    case Hexagon::J4_cmpgtu_t_jumpnv_t:
2436      return Comparison::GTu;
2437
2438    case Hexagon::J4_cmpltu_f_jumpnv_nt:
2439    case Hexagon::J4_cmpltu_f_jumpnv_t:
2440      return Comparison::GEu;
2441
2442    case Hexagon::J4_cmpltu_t_jumpnv_nt:
2443    case Hexagon::J4_cmpltu_t_jumpnv_t:
2444      return Comparison::LTu;
2445
2446    case Hexagon::J4_cmplt_f_jumpnv_nt:
2447    case Hexagon::J4_cmplt_f_jumpnv_t:
2448      return Comparison::GEs;
2449
2450    case Hexagon::C4_cmplteu:
2451    case Hexagon::C4_cmplteui:
2452    case Hexagon::J4_cmpgtui_f_jumpnv_nt:
2453    case Hexagon::J4_cmpgtui_f_jumpnv_t:
2454    case Hexagon::J4_cmpgtu_f_jumpnv_nt:
2455    case Hexagon::J4_cmpgtu_f_jumpnv_t:
2456      return Comparison::LEu;
2457
2458    case Hexagon::J4_cmplt_t_jumpnv_nt:
2459    case Hexagon::J4_cmplt_t_jumpnv_t:
2460      return Comparison::LTs;
2461
2462    default:
2463      break;
2464  }
2465  return Comparison::Unk;
2466}
2467
2468APInt HexagonConstEvaluator::getCmpImm(unsigned Opc, unsigned OpX,
2469      const MachineOperand &MO) {
2470  bool Signed = false;
2471  switch (Opc) {
2472    case Hexagon::A4_cmpbgtui:   // u7
2473    case Hexagon::A4_cmphgtui:   // u7
2474      break;
2475    case Hexagon::A4_cmpheqi:    // s8
2476    case Hexagon::C4_cmpneqi:   // s8
2477      Signed = true;
2478      break;
2479    case Hexagon::A4_cmpbeqi:    // u8
2480      break;
2481    case Hexagon::C2_cmpgtui:      // u9
2482    case Hexagon::C4_cmplteui:  // u9
2483      break;
2484    case Hexagon::C2_cmpeqi:       // s10
2485    case Hexagon::C2_cmpgti:       // s10
2486    case Hexagon::C4_cmpltei:   // s10
2487      Signed = true;
2488      break;
2489    case Hexagon::J4_cmpeqi_f_jumpnv_nt:   // u5
2490    case Hexagon::J4_cmpeqi_f_jumpnv_t:    // u5
2491    case Hexagon::J4_cmpeqi_t_jumpnv_nt:   // u5
2492    case Hexagon::J4_cmpeqi_t_jumpnv_t:    // u5
2493    case Hexagon::J4_cmpgti_f_jumpnv_nt:   // u5
2494    case Hexagon::J4_cmpgti_f_jumpnv_t:    // u5
2495    case Hexagon::J4_cmpgti_t_jumpnv_nt:   // u5
2496    case Hexagon::J4_cmpgti_t_jumpnv_t:    // u5
2497    case Hexagon::J4_cmpgtui_f_jumpnv_nt:  // u5
2498    case Hexagon::J4_cmpgtui_f_jumpnv_t:   // u5
2499    case Hexagon::J4_cmpgtui_t_jumpnv_nt:  // u5
2500    case Hexagon::J4_cmpgtui_t_jumpnv_t:   // u5
2501      break;
2502    default:
2503      llvm_unreachable("Unhandled instruction");
2504      break;
2505  }
2506
2507  uint64_t Val = MO.getImm();
2508  return APInt(32, Val, Signed);
2509}
2510
2511void HexagonConstEvaluator::replaceWithNop(MachineInstr &MI) {
2512  MI.setDesc(HII.get(Hexagon::A2_nop));
2513  while (MI.getNumOperands() > 0)
2514    MI.RemoveOperand(0);
2515}
2516
2517bool HexagonConstEvaluator::evaluateHexRSEQ32(RegisterSubReg RL, RegisterSubReg RH,
2518      const CellMap &Inputs, LatticeCell &Result) {
2519  assert(Inputs.has(RL.Reg) && Inputs.has(RH.Reg));
2520  LatticeCell LSL, LSH;
2521  if (!getCell(RL, Inputs, LSL) || !getCell(RH, Inputs, LSH))
2522    return false;
2523  if (LSL.isProperty() || LSH.isProperty())
2524    return false;
2525
2526  unsigned LN = LSL.size(), HN = LSH.size();
2527  SmallVector<APInt,4> LoVs(LN), HiVs(HN);
2528  for (unsigned i = 0; i < LN; ++i) {
2529    bool Eval = constToInt(LSL.Values[i], LoVs[i]);
2530    if (!Eval)
2531      return false;
2532    assert(LoVs[i].getBitWidth() == 32);
2533  }
2534  for (unsigned i = 0; i < HN; ++i) {
2535    bool Eval = constToInt(LSH.Values[i], HiVs[i]);
2536    if (!Eval)
2537      return false;
2538    assert(HiVs[i].getBitWidth() == 32);
2539  }
2540
2541  for (unsigned i = 0; i < HiVs.size(); ++i) {
2542    APInt HV = HiVs[i].zextOrSelf(64) << 32;
2543    for (unsigned j = 0; j < LoVs.size(); ++j) {
2544      APInt LV = LoVs[j].zextOrSelf(64);
2545      const Constant *C = intToConst(HV | LV);
2546      Result.add(C);
2547      if (Result.isBottom())
2548        return false;
2549    }
2550  }
2551  return !Result.isBottom();
2552}
2553
2554bool HexagonConstEvaluator::evaluateHexCompare(const MachineInstr &MI,
2555      const CellMap &Inputs, CellMap &Outputs) {
2556  unsigned Opc = MI.getOpcode();
2557  bool Classic = false;
2558  switch (Opc) {
2559    case Hexagon::C2_cmpeq:
2560    case Hexagon::C2_cmpeqp:
2561    case Hexagon::C2_cmpgt:
2562    case Hexagon::C2_cmpgtp:
2563    case Hexagon::C2_cmpgtu:
2564    case Hexagon::C2_cmpgtup:
2565    case Hexagon::C2_cmpeqi:
2566    case Hexagon::C2_cmpgti:
2567    case Hexagon::C2_cmpgtui:
2568      // Classic compare:  Dst0 = CMP Src1, Src2
2569      Classic = true;
2570      break;
2571    default:
2572      // Not handling other compare instructions now.
2573      return false;
2574  }
2575
2576  if (Classic) {
2577    const MachineOperand &Src1 = MI.getOperand(1);
2578    const MachineOperand &Src2 = MI.getOperand(2);
2579
2580    bool Result;
2581    unsigned Opc = MI.getOpcode();
2582    bool Computed = evaluateHexCompare2(Opc, Src1, Src2, Inputs, Result);
2583    if (Computed) {
2584      // Only create a zero/non-zero cell. At this time there isn't really
2585      // much need for specific values.
2586      RegisterSubReg DefR(MI.getOperand(0));
2587      LatticeCell L = Outputs.get(DefR.Reg);
2588      uint32_t P = Result ? ConstantProperties::NonZero
2589                          : ConstantProperties::Zero;
2590      L.add(P);
2591      Outputs.update(DefR.Reg, L);
2592      return true;
2593    }
2594  }
2595
2596  return false;
2597}
2598
2599bool HexagonConstEvaluator::evaluateHexCompare2(unsigned Opc,
2600      const MachineOperand &Src1, const MachineOperand &Src2,
2601      const CellMap &Inputs, bool &Result) {
2602  uint32_t Cmp = getCmp(Opc);
2603  bool Reg1 = Src1.isReg(), Reg2 = Src2.isReg();
2604  bool Imm1 = Src1.isImm(), Imm2 = Src2.isImm();
2605  if (Reg1) {
2606    RegisterSubReg R1(Src1);
2607    if (Reg2) {
2608      RegisterSubReg R2(Src2);
2609      return evaluateCMPrr(Cmp, R1, R2, Inputs, Result);
2610    } else if (Imm2) {
2611      APInt A2 = getCmpImm(Opc, 2, Src2);
2612      return evaluateCMPri(Cmp, R1, A2, Inputs, Result);
2613    }
2614  } else if (Imm1) {
2615    APInt A1 = getCmpImm(Opc, 1, Src1);
2616    if (Reg2) {
2617      RegisterSubReg R2(Src2);
2618      uint32_t NegCmp = Comparison::negate(Cmp);
2619      return evaluateCMPri(NegCmp, R2, A1, Inputs, Result);
2620    } else if (Imm2) {
2621      APInt A2 = getCmpImm(Opc, 2, Src2);
2622      return evaluateCMPii(Cmp, A1, A2, Result);
2623    }
2624  }
2625  // Unknown kind of comparison.
2626  return false;
2627}
2628
2629bool HexagonConstEvaluator::evaluateHexLogical(const MachineInstr &MI,
2630      const CellMap &Inputs, CellMap &Outputs) {
2631  unsigned Opc = MI.getOpcode();
2632  if (MI.getNumOperands() != 3)
2633    return false;
2634  const MachineOperand &Src1 = MI.getOperand(1);
2635  const MachineOperand &Src2 = MI.getOperand(2);
2636  RegisterSubReg R1(Src1);
2637  bool Eval = false;
2638  LatticeCell RC;
2639  switch (Opc) {
2640    default:
2641      return false;
2642    case Hexagon::A2_and:
2643    case Hexagon::A2_andp:
2644      Eval = evaluateANDrr(R1, RegisterSubReg(Src2), Inputs, RC);
2645      break;
2646    case Hexagon::A2_andir: {
2647      if (!Src2.isImm())
2648        return false;
2649      APInt A(32, Src2.getImm(), true);
2650      Eval = evaluateANDri(R1, A, Inputs, RC);
2651      break;
2652    }
2653    case Hexagon::A2_or:
2654    case Hexagon::A2_orp:
2655      Eval = evaluateORrr(R1, RegisterSubReg(Src2), Inputs, RC);
2656      break;
2657    case Hexagon::A2_orir: {
2658      if (!Src2.isImm())
2659        return false;
2660      APInt A(32, Src2.getImm(), true);
2661      Eval = evaluateORri(R1, A, Inputs, RC);
2662      break;
2663    }
2664    case Hexagon::A2_xor:
2665    case Hexagon::A2_xorp:
2666      Eval = evaluateXORrr(R1, RegisterSubReg(Src2), Inputs, RC);
2667      break;
2668  }
2669  if (Eval) {
2670    RegisterSubReg DefR(MI.getOperand(0));
2671    Outputs.update(DefR.Reg, RC);
2672  }
2673  return Eval;
2674}
2675
2676bool HexagonConstEvaluator::evaluateHexCondMove(const MachineInstr &MI,
2677      const CellMap &Inputs, CellMap &Outputs) {
2678  // Dst0 = Cond1 ? Src2 : Src3
2679  RegisterSubReg CR(MI.getOperand(1));
2680  assert(Inputs.has(CR.Reg));
2681  LatticeCell LS;
2682  if (!getCell(CR, Inputs, LS))
2683    return false;
2684  uint32_t Ps = LS.properties();
2685  unsigned TakeOp;
2686  if (Ps & ConstantProperties::Zero)
2687    TakeOp = 3;
2688  else if (Ps & ConstantProperties::NonZero)
2689    TakeOp = 2;
2690  else
2691    return false;
2692
2693  const MachineOperand &ValOp = MI.getOperand(TakeOp);
2694  RegisterSubReg DefR(MI.getOperand(0));
2695  LatticeCell RC = Outputs.get(DefR.Reg);
2696
2697  if (ValOp.isImm()) {
2698    int64_t V = ValOp.getImm();
2699    unsigned W = getRegBitWidth(DefR.Reg);
2700    APInt A(W, V, true);
2701    const Constant *C = intToConst(A);
2702    RC.add(C);
2703    Outputs.update(DefR.Reg, RC);
2704    return true;
2705  }
2706  if (ValOp.isReg()) {
2707    RegisterSubReg R(ValOp);
2708    const LatticeCell &LR = Inputs.get(R.Reg);
2709    LatticeCell LSR;
2710    if (!evaluate(R, LR, LSR))
2711      return false;
2712    RC.meet(LSR);
2713    Outputs.update(DefR.Reg, RC);
2714    return true;
2715  }
2716  return false;
2717}
2718
2719bool HexagonConstEvaluator::evaluateHexExt(const MachineInstr &MI,
2720      const CellMap &Inputs, CellMap &Outputs) {
2721  // Dst0 = ext R1
2722  RegisterSubReg R1(MI.getOperand(1));
2723  assert(Inputs.has(R1.Reg));
2724
2725  unsigned Opc = MI.getOpcode();
2726  unsigned Bits;
2727  switch (Opc) {
2728    case Hexagon::A2_sxtb:
2729    case Hexagon::A2_zxtb:
2730      Bits = 8;
2731      break;
2732    case Hexagon::A2_sxth:
2733    case Hexagon::A2_zxth:
2734      Bits = 16;
2735      break;
2736    case Hexagon::A2_sxtw:
2737      Bits = 32;
2738      break;
2739    default:
2740      llvm_unreachable("Unhandled extension opcode");
2741  }
2742
2743  bool Signed = false;
2744  switch (Opc) {
2745    case Hexagon::A2_sxtb:
2746    case Hexagon::A2_sxth:
2747    case Hexagon::A2_sxtw:
2748      Signed = true;
2749      break;
2750  }
2751
2752  RegisterSubReg DefR(MI.getOperand(0));
2753  unsigned BW = getRegBitWidth(DefR.Reg);
2754  LatticeCell RC = Outputs.get(DefR.Reg);
2755  bool Eval = Signed ? evaluateSEXTr(R1, BW, Bits, Inputs, RC)
2756                     : evaluateZEXTr(R1, BW, Bits, Inputs, RC);
2757  if (!Eval)
2758    return false;
2759  Outputs.update(DefR.Reg, RC);
2760  return true;
2761}
2762
2763bool HexagonConstEvaluator::evaluateHexVector1(const MachineInstr &MI,
2764      const CellMap &Inputs, CellMap &Outputs) {
2765  // DefR = op R1
2766  RegisterSubReg DefR(MI.getOperand(0));
2767  RegisterSubReg R1(MI.getOperand(1));
2768  assert(Inputs.has(R1.Reg));
2769  LatticeCell RC = Outputs.get(DefR.Reg);
2770  bool Eval;
2771
2772  unsigned Opc = MI.getOpcode();
2773  switch (Opc) {
2774    case Hexagon::S2_vsplatrb:
2775      // Rd = 4 times Rs:0..7
2776      Eval = evaluateSplatr(R1, 8, 4, Inputs, RC);
2777      break;
2778    case Hexagon::S2_vsplatrh:
2779      // Rdd = 4 times Rs:0..15
2780      Eval = evaluateSplatr(R1, 16, 4, Inputs, RC);
2781      break;
2782    default:
2783      return false;
2784  }
2785
2786  if (!Eval)
2787    return false;
2788  Outputs.update(DefR.Reg, RC);
2789  return true;
2790}
2791
2792bool HexagonConstEvaluator::rewriteHexConstDefs(MachineInstr &MI,
2793      const CellMap &Inputs, bool &AllDefs) {
2794  AllDefs = false;
2795
2796  // Some diagnostics.
2797  // LLVM_DEBUG({...}) gets confused with all this code as an argument.
2798#ifndef NDEBUG
2799  bool Debugging = DebugFlag && isCurrentDebugType(DEBUG_TYPE);
2800  if (Debugging) {
2801    bool Const = true, HasUse = false;
2802    for (const MachineOperand &MO : MI.operands()) {
2803      if (!MO.isReg() || !MO.isUse() || MO.isImplicit())
2804        continue;
2805      RegisterSubReg R(MO);
2806      if (!Register::isVirtualRegister(R.Reg))
2807        continue;
2808      HasUse = true;
2809      // PHIs can legitimately have "top" cells after propagation.
2810      if (!MI.isPHI() && !Inputs.has(R.Reg)) {
2811        dbgs() << "Top " << printReg(R.Reg, &HRI, R.SubReg)
2812               << " in MI: " << MI;
2813        continue;
2814      }
2815      const LatticeCell &L = Inputs.get(R.Reg);
2816      Const &= L.isSingle();
2817      if (!Const)
2818        break;
2819    }
2820    if (HasUse && Const) {
2821      if (!MI.isCopy()) {
2822        dbgs() << "CONST: " << MI;
2823        for (const MachineOperand &MO : MI.operands()) {
2824          if (!MO.isReg() || !MO.isUse() || MO.isImplicit())
2825            continue;
2826          Register R = MO.getReg();
2827          dbgs() << printReg(R, &TRI) << ": " << Inputs.get(R) << "\n";
2828        }
2829      }
2830    }
2831  }
2832#endif
2833
2834  // Avoid generating TFRIs for register transfers---this will keep the
2835  // coalescing opportunities.
2836  if (MI.isCopy())
2837    return false;
2838
2839  // Collect all virtual register-def operands.
2840  SmallVector<unsigned,2> DefRegs;
2841  for (const MachineOperand &MO : MI.operands()) {
2842    if (!MO.isReg() || !MO.isDef())
2843      continue;
2844    Register R = MO.getReg();
2845    if (!Register::isVirtualRegister(R))
2846      continue;
2847    assert(!MO.getSubReg());
2848    assert(Inputs.has(R));
2849    DefRegs.push_back(R);
2850  }
2851
2852  MachineBasicBlock &B = *MI.getParent();
2853  const DebugLoc &DL = MI.getDebugLoc();
2854  unsigned ChangedNum = 0;
2855#ifndef NDEBUG
2856  SmallVector<const MachineInstr*,4> NewInstrs;
2857#endif
2858
2859  // For each defined register, if it is a constant, create an instruction
2860  //   NewR = const
2861  // and replace all uses of the defined register with NewR.
2862  for (unsigned i = 0, n = DefRegs.size(); i < n; ++i) {
2863    unsigned R = DefRegs[i];
2864    const LatticeCell &L = Inputs.get(R);
2865    if (L.isBottom())
2866      continue;
2867    const TargetRegisterClass *RC = MRI->getRegClass(R);
2868    MachineBasicBlock::iterator At = MI.getIterator();
2869
2870    if (!L.isSingle()) {
2871      // If this a zero/non-zero cell, we can fold a definition
2872      // of a predicate register.
2873      using P = ConstantProperties;
2874
2875      uint64_t Ps = L.properties();
2876      if (!(Ps & (P::Zero|P::NonZero)))
2877        continue;
2878      const TargetRegisterClass *PredRC = &Hexagon::PredRegsRegClass;
2879      if (RC != PredRC)
2880        continue;
2881      const MCInstrDesc *NewD = (Ps & P::Zero) ?
2882        &HII.get(Hexagon::PS_false) :
2883        &HII.get(Hexagon::PS_true);
2884      Register NewR = MRI->createVirtualRegister(PredRC);
2885      const MachineInstrBuilder &MIB = BuildMI(B, At, DL, *NewD, NewR);
2886      (void)MIB;
2887#ifndef NDEBUG
2888      NewInstrs.push_back(&*MIB);
2889#endif
2890      replaceAllRegUsesWith(R, NewR);
2891    } else {
2892      // This cell has a single value.
2893      APInt A;
2894      if (!constToInt(L.Value, A) || !A.isSignedIntN(64))
2895        continue;
2896      const TargetRegisterClass *NewRC;
2897      const MCInstrDesc *NewD;
2898
2899      unsigned W = getRegBitWidth(R);
2900      int64_t V = A.getSExtValue();
2901      assert(W == 32 || W == 64);
2902      if (W == 32)
2903        NewRC = &Hexagon::IntRegsRegClass;
2904      else
2905        NewRC = &Hexagon::DoubleRegsRegClass;
2906      Register NewR = MRI->createVirtualRegister(NewRC);
2907      const MachineInstr *NewMI;
2908
2909      if (W == 32) {
2910        NewD = &HII.get(Hexagon::A2_tfrsi);
2911        NewMI = BuildMI(B, At, DL, *NewD, NewR)
2912                  .addImm(V);
2913      } else {
2914        if (A.isSignedIntN(8)) {
2915          NewD = &HII.get(Hexagon::A2_tfrpi);
2916          NewMI = BuildMI(B, At, DL, *NewD, NewR)
2917                    .addImm(V);
2918        } else {
2919          int32_t Hi = V >> 32;
2920          int32_t Lo = V & 0xFFFFFFFFLL;
2921          if (isInt<8>(Hi) && isInt<8>(Lo)) {
2922            NewD = &HII.get(Hexagon::A2_combineii);
2923            NewMI = BuildMI(B, At, DL, *NewD, NewR)
2924                      .addImm(Hi)
2925                      .addImm(Lo);
2926          } else {
2927            NewD = &HII.get(Hexagon::CONST64);
2928            NewMI = BuildMI(B, At, DL, *NewD, NewR)
2929                      .addImm(V);
2930          }
2931        }
2932      }
2933      (void)NewMI;
2934#ifndef NDEBUG
2935      NewInstrs.push_back(NewMI);
2936#endif
2937      replaceAllRegUsesWith(R, NewR);
2938    }
2939    ChangedNum++;
2940  }
2941
2942  LLVM_DEBUG({
2943    if (!NewInstrs.empty()) {
2944      MachineFunction &MF = *MI.getParent()->getParent();
2945      dbgs() << "In function: " << MF.getName() << "\n";
2946      dbgs() << "Rewrite: for " << MI << "  created " << *NewInstrs[0];
2947      for (unsigned i = 1; i < NewInstrs.size(); ++i)
2948        dbgs() << "          " << *NewInstrs[i];
2949    }
2950  });
2951
2952  AllDefs = (ChangedNum == DefRegs.size());
2953  return ChangedNum > 0;
2954}
2955
2956bool HexagonConstEvaluator::rewriteHexConstUses(MachineInstr &MI,
2957      const CellMap &Inputs) {
2958  bool Changed = false;
2959  unsigned Opc = MI.getOpcode();
2960  MachineBasicBlock &B = *MI.getParent();
2961  const DebugLoc &DL = MI.getDebugLoc();
2962  MachineBasicBlock::iterator At = MI.getIterator();
2963  MachineInstr *NewMI = nullptr;
2964
2965  switch (Opc) {
2966    case Hexagon::M2_maci:
2967    // Convert DefR += mpyi(R2, R3)
2968    //   to   DefR += mpyi(R, #imm),
2969    //   or   DefR -= mpyi(R, #imm).
2970    {
2971      RegisterSubReg DefR(MI.getOperand(0));
2972      assert(!DefR.SubReg);
2973      RegisterSubReg R2(MI.getOperand(2));
2974      RegisterSubReg R3(MI.getOperand(3));
2975      assert(Inputs.has(R2.Reg) && Inputs.has(R3.Reg));
2976      LatticeCell LS2, LS3;
2977      // It is enough to get one of the input cells, since we will only try
2978      // to replace one argument---whichever happens to be a single constant.
2979      bool HasC2 = getCell(R2, Inputs, LS2), HasC3 = getCell(R3, Inputs, LS3);
2980      if (!HasC2 && !HasC3)
2981        return false;
2982      bool Zero = ((HasC2 && (LS2.properties() & ConstantProperties::Zero)) ||
2983                   (HasC3 && (LS3.properties() & ConstantProperties::Zero)));
2984      // If one of the operands is zero, eliminate the multiplication.
2985      if (Zero) {
2986        // DefR == R1 (tied operands).
2987        MachineOperand &Acc = MI.getOperand(1);
2988        RegisterSubReg R1(Acc);
2989        unsigned NewR = R1.Reg;
2990        if (R1.SubReg) {
2991          // Generate COPY. FIXME: Replace with the register:subregister.
2992          const TargetRegisterClass *RC = MRI->getRegClass(DefR.Reg);
2993          NewR = MRI->createVirtualRegister(RC);
2994          NewMI = BuildMI(B, At, DL, HII.get(TargetOpcode::COPY), NewR)
2995                    .addReg(R1.Reg, getRegState(Acc), R1.SubReg);
2996        }
2997        replaceAllRegUsesWith(DefR.Reg, NewR);
2998        MRI->clearKillFlags(NewR);
2999        Changed = true;
3000        break;
3001      }
3002
3003      bool Swap = false;
3004      if (!LS3.isSingle()) {
3005        if (!LS2.isSingle())
3006          return false;
3007        Swap = true;
3008      }
3009      const LatticeCell &LI = Swap ? LS2 : LS3;
3010      const MachineOperand &OpR2 = Swap ? MI.getOperand(3)
3011                                        : MI.getOperand(2);
3012      // LI is single here.
3013      APInt A;
3014      if (!constToInt(LI.Value, A) || !A.isSignedIntN(8))
3015        return false;
3016      int64_t V = A.getSExtValue();
3017      const MCInstrDesc &D = (V >= 0) ? HII.get(Hexagon::M2_macsip)
3018                                      : HII.get(Hexagon::M2_macsin);
3019      if (V < 0)
3020        V = -V;
3021      const TargetRegisterClass *RC = MRI->getRegClass(DefR.Reg);
3022      Register NewR = MRI->createVirtualRegister(RC);
3023      const MachineOperand &Src1 = MI.getOperand(1);
3024      NewMI = BuildMI(B, At, DL, D, NewR)
3025                .addReg(Src1.getReg(), getRegState(Src1), Src1.getSubReg())
3026                .addReg(OpR2.getReg(), getRegState(OpR2), OpR2.getSubReg())
3027                .addImm(V);
3028      replaceAllRegUsesWith(DefR.Reg, NewR);
3029      Changed = true;
3030      break;
3031    }
3032
3033    case Hexagon::A2_and:
3034    {
3035      RegisterSubReg R1(MI.getOperand(1));
3036      RegisterSubReg R2(MI.getOperand(2));
3037      assert(Inputs.has(R1.Reg) && Inputs.has(R2.Reg));
3038      LatticeCell LS1, LS2;
3039      unsigned CopyOf = 0;
3040      // Check if any of the operands is -1 (i.e. all bits set).
3041      if (getCell(R1, Inputs, LS1) && LS1.isSingle()) {
3042        APInt M1;
3043        if (constToInt(LS1.Value, M1) && !~M1)
3044          CopyOf = 2;
3045      }
3046      else if (getCell(R2, Inputs, LS2) && LS2.isSingle()) {
3047        APInt M1;
3048        if (constToInt(LS2.Value, M1) && !~M1)
3049          CopyOf = 1;
3050      }
3051      if (!CopyOf)
3052        return false;
3053      MachineOperand &SO = MI.getOperand(CopyOf);
3054      RegisterSubReg SR(SO);
3055      RegisterSubReg DefR(MI.getOperand(0));
3056      unsigned NewR = SR.Reg;
3057      if (SR.SubReg) {
3058        const TargetRegisterClass *RC = MRI->getRegClass(DefR.Reg);
3059        NewR = MRI->createVirtualRegister(RC);
3060        NewMI = BuildMI(B, At, DL, HII.get(TargetOpcode::COPY), NewR)
3061                  .addReg(SR.Reg, getRegState(SO), SR.SubReg);
3062      }
3063      replaceAllRegUsesWith(DefR.Reg, NewR);
3064      MRI->clearKillFlags(NewR);
3065      Changed = true;
3066    }
3067    break;
3068
3069    case Hexagon::A2_or:
3070    {
3071      RegisterSubReg R1(MI.getOperand(1));
3072      RegisterSubReg R2(MI.getOperand(2));
3073      assert(Inputs.has(R1.Reg) && Inputs.has(R2.Reg));
3074      LatticeCell LS1, LS2;
3075      unsigned CopyOf = 0;
3076
3077      using P = ConstantProperties;
3078
3079      if (getCell(R1, Inputs, LS1) && (LS1.properties() & P::Zero))
3080        CopyOf = 2;
3081      else if (getCell(R2, Inputs, LS2) && (LS2.properties() & P::Zero))
3082        CopyOf = 1;
3083      if (!CopyOf)
3084        return false;
3085      MachineOperand &SO = MI.getOperand(CopyOf);
3086      RegisterSubReg SR(SO);
3087      RegisterSubReg DefR(MI.getOperand(0));
3088      unsigned NewR = SR.Reg;
3089      if (SR.SubReg) {
3090        const TargetRegisterClass *RC = MRI->getRegClass(DefR.Reg);
3091        NewR = MRI->createVirtualRegister(RC);
3092        NewMI = BuildMI(B, At, DL, HII.get(TargetOpcode::COPY), NewR)
3093                  .addReg(SR.Reg, getRegState(SO), SR.SubReg);
3094      }
3095      replaceAllRegUsesWith(DefR.Reg, NewR);
3096      MRI->clearKillFlags(NewR);
3097      Changed = true;
3098    }
3099    break;
3100  }
3101
3102  if (NewMI) {
3103    // clear all the kill flags of this new instruction.
3104    for (MachineOperand &MO : NewMI->operands())
3105      if (MO.isReg() && MO.isUse())
3106        MO.setIsKill(false);
3107  }
3108
3109  LLVM_DEBUG({
3110    if (NewMI) {
3111      dbgs() << "Rewrite: for " << MI;
3112      if (NewMI != &MI)
3113        dbgs() << "  created " << *NewMI;
3114      else
3115        dbgs() << "  modified the instruction itself and created:" << *NewMI;
3116    }
3117  });
3118
3119  return Changed;
3120}
3121
3122void HexagonConstEvaluator::replaceAllRegUsesWith(unsigned FromReg,
3123      unsigned ToReg) {
3124  assert(Register::isVirtualRegister(FromReg));
3125  assert(Register::isVirtualRegister(ToReg));
3126  for (auto I = MRI->use_begin(FromReg), E = MRI->use_end(); I != E;) {
3127    MachineOperand &O = *I;
3128    ++I;
3129    O.setReg(ToReg);
3130  }
3131}
3132
3133bool HexagonConstEvaluator::rewriteHexBranch(MachineInstr &BrI,
3134      const CellMap &Inputs) {
3135  MachineBasicBlock &B = *BrI.getParent();
3136  unsigned NumOp = BrI.getNumOperands();
3137  if (!NumOp)
3138    return false;
3139
3140  bool FallsThru;
3141  SetVector<const MachineBasicBlock*> Targets;
3142  bool Eval = evaluate(BrI, Inputs, Targets, FallsThru);
3143  unsigned NumTargets = Targets.size();
3144  if (!Eval || NumTargets > 1 || (NumTargets == 1 && FallsThru))
3145    return false;
3146  if (BrI.getOpcode() == Hexagon::J2_jump)
3147    return false;
3148
3149  LLVM_DEBUG(dbgs() << "Rewrite(" << printMBBReference(B) << "):" << BrI);
3150  bool Rewritten = false;
3151  if (NumTargets > 0) {
3152    assert(!FallsThru && "This should have been checked before");
3153    // MIB.addMBB needs non-const pointer.
3154    MachineBasicBlock *TargetB = const_cast<MachineBasicBlock*>(Targets[0]);
3155    bool Moot = B.isLayoutSuccessor(TargetB);
3156    if (!Moot) {
3157      // If we build a branch here, we must make sure that it won't be
3158      // erased as "non-executable". We can't mark any new instructions
3159      // as executable here, so we need to overwrite the BrI, which we
3160      // know is executable.
3161      const MCInstrDesc &JD = HII.get(Hexagon::J2_jump);
3162      auto NI = BuildMI(B, BrI.getIterator(), BrI.getDebugLoc(), JD)
3163                  .addMBB(TargetB);
3164      BrI.setDesc(JD);
3165      while (BrI.getNumOperands() > 0)
3166        BrI.RemoveOperand(0);
3167      // This ensures that all implicit operands (e.g. implicit-def %r31, etc)
3168      // are present in the rewritten branch.
3169      for (auto &Op : NI->operands())
3170        BrI.addOperand(Op);
3171      NI->eraseFromParent();
3172      Rewritten = true;
3173    }
3174  }
3175
3176  // Do not erase instructions. A newly created instruction could get
3177  // the same address as an instruction marked as executable during the
3178  // propagation.
3179  if (!Rewritten)
3180    replaceWithNop(BrI);
3181  return true;
3182}
3183
3184FunctionPass *llvm::createHexagonConstPropagationPass() {
3185  return new HexagonConstPropagation();
3186}
3187