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