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