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