1 //===-- SystemZISelDAGToDAG.cpp - A dag to dag inst selector for SystemZ --===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines an instruction selector for the SystemZ target.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "SystemZTargetMachine.h"
15 #include "llvm/Analysis/AliasAnalysis.h"
16 #include "llvm/CodeGen/SelectionDAGISel.h"
17 #include "llvm/Support/Debug.h"
18 #include "llvm/Support/raw_ostream.h"
19 
20 using namespace llvm;
21 
22 #define DEBUG_TYPE "systemz-isel"
23 
24 namespace {
25 // Used to build addressing modes.
26 struct SystemZAddressingMode {
27   // The shape of the address.
28   enum AddrForm {
29     // base+displacement
30     FormBD,
31 
32     // base+displacement+index for load and store operands
33     FormBDXNormal,
34 
35     // base+displacement+index for load address operands
36     FormBDXLA,
37 
38     // base+displacement+index+ADJDYNALLOC
39     FormBDXDynAlloc
40   };
41   AddrForm Form;
42 
43   // The type of displacement.  The enum names here correspond directly
44   // to the definitions in SystemZOperand.td.  We could split them into
45   // flags -- single/pair, 128-bit, etc. -- but it hardly seems worth it.
46   enum DispRange {
47     Disp12Only,
48     Disp12Pair,
49     Disp20Only,
50     Disp20Only128,
51     Disp20Pair
52   };
53   DispRange DR;
54 
55   // The parts of the address.  The address is equivalent to:
56   //
57   //     Base + Disp + Index + (IncludesDynAlloc ? ADJDYNALLOC : 0)
58   SDValue Base;
59   int64_t Disp;
60   SDValue Index;
61   bool IncludesDynAlloc;
62 
63   SystemZAddressingMode(AddrForm form, DispRange dr)
64     : Form(form), DR(dr), Base(), Disp(0), Index(),
65       IncludesDynAlloc(false) {}
66 
67   // True if the address can have an index register.
68   bool hasIndexField() { return Form != FormBD; }
69 
70   // True if the address can (and must) include ADJDYNALLOC.
71   bool isDynAlloc() { return Form == FormBDXDynAlloc; }
72 
73   void dump() {
74     errs() << "SystemZAddressingMode " << this << '\n';
75 
76     errs() << " Base ";
77     if (Base.getNode())
78       Base.getNode()->dump();
79     else
80       errs() << "null\n";
81 
82     if (hasIndexField()) {
83       errs() << " Index ";
84       if (Index.getNode())
85         Index.getNode()->dump();
86       else
87         errs() << "null\n";
88     }
89 
90     errs() << " Disp " << Disp;
91     if (IncludesDynAlloc)
92       errs() << " + ADJDYNALLOC";
93     errs() << '\n';
94   }
95 };
96 
97 // Return a mask with Count low bits set.
98 static uint64_t allOnes(unsigned int Count) {
99   assert(Count <= 64);
100   if (Count > 63)
101     return UINT64_MAX;
102   return (uint64_t(1) << Count) - 1;
103 }
104 
105 // Represents operands 2 to 5 of the ROTATE AND ... SELECTED BITS operation
106 // given by Opcode.  The operands are: Input (R2), Start (I3), End (I4) and
107 // Rotate (I5).  The combined operand value is effectively:
108 //
109 //   (or (rotl Input, Rotate), ~Mask)
110 //
111 // for RNSBG and:
112 //
113 //   (and (rotl Input, Rotate), Mask)
114 //
115 // otherwise.  The output value has BitSize bits, although Input may be
116 // narrower (in which case the upper bits are don't care).
117 struct RxSBGOperands {
118   RxSBGOperands(unsigned Op, SDValue N)
119     : Opcode(Op), BitSize(N.getValueType().getSizeInBits()),
120       Mask(allOnes(BitSize)), Input(N), Start(64 - BitSize), End(63),
121       Rotate(0) {}
122 
123   unsigned Opcode;
124   unsigned BitSize;
125   uint64_t Mask;
126   SDValue Input;
127   unsigned Start;
128   unsigned End;
129   unsigned Rotate;
130 };
131 
132 class SystemZDAGToDAGISel : public SelectionDAGISel {
133   const SystemZSubtarget *Subtarget;
134 
135   // Used by SystemZOperands.td to create integer constants.
136   inline SDValue getImm(const SDNode *Node, uint64_t Imm) const {
137     return CurDAG->getTargetConstant(Imm, SDLoc(Node), Node->getValueType(0));
138   }
139 
140   const SystemZTargetMachine &getTargetMachine() const {
141     return static_cast<const SystemZTargetMachine &>(TM);
142   }
143 
144   const SystemZInstrInfo *getInstrInfo() const {
145     return Subtarget->getInstrInfo();
146   }
147 
148   // Try to fold more of the base or index of AM into AM, where IsBase
149   // selects between the base and index.
150   bool expandAddress(SystemZAddressingMode &AM, bool IsBase) const;
151 
152   // Try to describe N in AM, returning true on success.
153   bool selectAddress(SDValue N, SystemZAddressingMode &AM) const;
154 
155   // Extract individual target operands from matched address AM.
156   void getAddressOperands(const SystemZAddressingMode &AM, EVT VT,
157                           SDValue &Base, SDValue &Disp) const;
158   void getAddressOperands(const SystemZAddressingMode &AM, EVT VT,
159                           SDValue &Base, SDValue &Disp, SDValue &Index) const;
160 
161   // Try to match Addr as a FormBD address with displacement type DR.
162   // Return true on success, storing the base and displacement in
163   // Base and Disp respectively.
164   bool selectBDAddr(SystemZAddressingMode::DispRange DR, SDValue Addr,
165                     SDValue &Base, SDValue &Disp) const;
166 
167   // Try to match Addr as a FormBDX address with displacement type DR.
168   // Return true on success and if the result had no index.  Store the
169   // base and displacement in Base and Disp respectively.
170   bool selectMVIAddr(SystemZAddressingMode::DispRange DR, SDValue Addr,
171                      SDValue &Base, SDValue &Disp) const;
172 
173   // Try to match Addr as a FormBDX* address of form Form with
174   // displacement type DR.  Return true on success, storing the base,
175   // displacement and index in Base, Disp and Index respectively.
176   bool selectBDXAddr(SystemZAddressingMode::AddrForm Form,
177                      SystemZAddressingMode::DispRange DR, SDValue Addr,
178                      SDValue &Base, SDValue &Disp, SDValue &Index) const;
179 
180   // PC-relative address matching routines used by SystemZOperands.td.
181   bool selectPCRelAddress(SDValue Addr, SDValue &Target) const {
182     if (SystemZISD::isPCREL(Addr.getOpcode())) {
183       Target = Addr.getOperand(0);
184       return true;
185     }
186     return false;
187   }
188 
189   // BD matching routines used by SystemZOperands.td.
190   bool selectBDAddr12Only(SDValue Addr, SDValue &Base, SDValue &Disp) const {
191     return selectBDAddr(SystemZAddressingMode::Disp12Only, Addr, Base, Disp);
192   }
193   bool selectBDAddr12Pair(SDValue Addr, SDValue &Base, SDValue &Disp) const {
194     return selectBDAddr(SystemZAddressingMode::Disp12Pair, Addr, Base, Disp);
195   }
196   bool selectBDAddr20Only(SDValue Addr, SDValue &Base, SDValue &Disp) const {
197     return selectBDAddr(SystemZAddressingMode::Disp20Only, Addr, Base, Disp);
198   }
199   bool selectBDAddr20Pair(SDValue Addr, SDValue &Base, SDValue &Disp) const {
200     return selectBDAddr(SystemZAddressingMode::Disp20Pair, Addr, Base, Disp);
201   }
202 
203   // MVI matching routines used by SystemZOperands.td.
204   bool selectMVIAddr12Pair(SDValue Addr, SDValue &Base, SDValue &Disp) const {
205     return selectMVIAddr(SystemZAddressingMode::Disp12Pair, Addr, Base, Disp);
206   }
207   bool selectMVIAddr20Pair(SDValue Addr, SDValue &Base, SDValue &Disp) const {
208     return selectMVIAddr(SystemZAddressingMode::Disp20Pair, Addr, Base, Disp);
209   }
210 
211   // BDX matching routines used by SystemZOperands.td.
212   bool selectBDXAddr12Only(SDValue Addr, SDValue &Base, SDValue &Disp,
213                            SDValue &Index) const {
214     return selectBDXAddr(SystemZAddressingMode::FormBDXNormal,
215                          SystemZAddressingMode::Disp12Only,
216                          Addr, Base, Disp, Index);
217   }
218   bool selectBDXAddr12Pair(SDValue Addr, SDValue &Base, SDValue &Disp,
219                            SDValue &Index) const {
220     return selectBDXAddr(SystemZAddressingMode::FormBDXNormal,
221                          SystemZAddressingMode::Disp12Pair,
222                          Addr, Base, Disp, Index);
223   }
224   bool selectDynAlloc12Only(SDValue Addr, SDValue &Base, SDValue &Disp,
225                             SDValue &Index) const {
226     return selectBDXAddr(SystemZAddressingMode::FormBDXDynAlloc,
227                          SystemZAddressingMode::Disp12Only,
228                          Addr, Base, Disp, Index);
229   }
230   bool selectBDXAddr20Only(SDValue Addr, SDValue &Base, SDValue &Disp,
231                            SDValue &Index) const {
232     return selectBDXAddr(SystemZAddressingMode::FormBDXNormal,
233                          SystemZAddressingMode::Disp20Only,
234                          Addr, Base, Disp, Index);
235   }
236   bool selectBDXAddr20Only128(SDValue Addr, SDValue &Base, SDValue &Disp,
237                               SDValue &Index) const {
238     return selectBDXAddr(SystemZAddressingMode::FormBDXNormal,
239                          SystemZAddressingMode::Disp20Only128,
240                          Addr, Base, Disp, Index);
241   }
242   bool selectBDXAddr20Pair(SDValue Addr, SDValue &Base, SDValue &Disp,
243                            SDValue &Index) const {
244     return selectBDXAddr(SystemZAddressingMode::FormBDXNormal,
245                          SystemZAddressingMode::Disp20Pair,
246                          Addr, Base, Disp, Index);
247   }
248   bool selectLAAddr12Pair(SDValue Addr, SDValue &Base, SDValue &Disp,
249                           SDValue &Index) const {
250     return selectBDXAddr(SystemZAddressingMode::FormBDXLA,
251                          SystemZAddressingMode::Disp12Pair,
252                          Addr, Base, Disp, Index);
253   }
254   bool selectLAAddr20Pair(SDValue Addr, SDValue &Base, SDValue &Disp,
255                           SDValue &Index) const {
256     return selectBDXAddr(SystemZAddressingMode::FormBDXLA,
257                          SystemZAddressingMode::Disp20Pair,
258                          Addr, Base, Disp, Index);
259   }
260 
261   // Try to match Addr as an address with a base, 12-bit displacement
262   // and index, where the index is element Elem of a vector.
263   // Return true on success, storing the base, displacement and vector
264   // in Base, Disp and Index respectively.
265   bool selectBDVAddr12Only(SDValue Addr, SDValue Elem, SDValue &Base,
266                            SDValue &Disp, SDValue &Index) const;
267 
268   // Check whether (or Op (and X InsertMask)) is effectively an insertion
269   // of X into bits InsertMask of some Y != Op.  Return true if so and
270   // set Op to that Y.
271   bool detectOrAndInsertion(SDValue &Op, uint64_t InsertMask) const;
272 
273   // Try to update RxSBG so that only the bits of RxSBG.Input in Mask are used.
274   // Return true on success.
275   bool refineRxSBGMask(RxSBGOperands &RxSBG, uint64_t Mask) const;
276 
277   // Try to fold some of RxSBG.Input into other fields of RxSBG.
278   // Return true on success.
279   bool expandRxSBG(RxSBGOperands &RxSBG) const;
280 
281   // Return an undefined value of type VT.
282   SDValue getUNDEF(const SDLoc &DL, EVT VT) const;
283 
284   // Convert N to VT, if it isn't already.
285   SDValue convertTo(const SDLoc &DL, EVT VT, SDValue N) const;
286 
287   // Try to implement AND or shift node N using RISBG with the zero flag set.
288   // Return the selected node on success, otherwise return null.
289   bool tryRISBGZero(SDNode *N);
290 
291   // Try to use RISBG or Opcode to implement OR or XOR node N.
292   // Return the selected node on success, otherwise return null.
293   bool tryRxSBG(SDNode *N, unsigned Opcode);
294 
295   // If Op0 is null, then Node is a constant that can be loaded using:
296   //
297   //   (Opcode UpperVal LowerVal)
298   //
299   // If Op0 is nonnull, then Node can be implemented using:
300   //
301   //   (Opcode (Opcode Op0 UpperVal) LowerVal)
302   void splitLargeImmediate(unsigned Opcode, SDNode *Node, SDValue Op0,
303                            uint64_t UpperVal, uint64_t LowerVal);
304 
305   // Try to use gather instruction Opcode to implement vector insertion N.
306   bool tryGather(SDNode *N, unsigned Opcode);
307 
308   // Try to use scatter instruction Opcode to implement store Store.
309   bool tryScatter(StoreSDNode *Store, unsigned Opcode);
310 
311   // Return true if Load and Store are loads and stores of the same size
312   // and are guaranteed not to overlap.  Such operations can be implemented
313   // using block (SS-format) instructions.
314   //
315   // Partial overlap would lead to incorrect code, since the block operations
316   // are logically bytewise, even though they have a fast path for the
317   // non-overlapping case.  We also need to avoid full overlap (i.e. two
318   // addresses that might be equal at run time) because although that case
319   // would be handled correctly, it might be implemented by millicode.
320   bool canUseBlockOperation(StoreSDNode *Store, LoadSDNode *Load) const;
321 
322   // N is a (store (load Y), X) pattern.  Return true if it can use an MVC
323   // from Y to X.
324   bool storeLoadCanUseMVC(SDNode *N) const;
325 
326   // N is a (store (op (load A[0]), (load A[1])), X) pattern.  Return true
327   // if A[1 - I] == X and if N can use a block operation like NC from A[I]
328   // to X.
329   bool storeLoadCanUseBlockBinary(SDNode *N, unsigned I) const;
330 
331 public:
332   SystemZDAGToDAGISel(SystemZTargetMachine &TM, CodeGenOpt::Level OptLevel)
333       : SelectionDAGISel(TM, OptLevel) {}
334 
335   bool runOnMachineFunction(MachineFunction &MF) override {
336     Subtarget = &MF.getSubtarget<SystemZSubtarget>();
337     return SelectionDAGISel::runOnMachineFunction(MF);
338   }
339 
340   // Override MachineFunctionPass.
341   const char *getPassName() const override {
342     return "SystemZ DAG->DAG Pattern Instruction Selection";
343   }
344 
345   // Override SelectionDAGISel.
346   void Select(SDNode *Node) override;
347   bool SelectInlineAsmMemoryOperand(const SDValue &Op, unsigned ConstraintID,
348                                     std::vector<SDValue> &OutOps) override;
349 
350   // Include the pieces autogenerated from the target description.
351   #include "SystemZGenDAGISel.inc"
352 };
353 } // end anonymous namespace
354 
355 FunctionPass *llvm::createSystemZISelDag(SystemZTargetMachine &TM,
356                                          CodeGenOpt::Level OptLevel) {
357   return new SystemZDAGToDAGISel(TM, OptLevel);
358 }
359 
360 // Return true if Val should be selected as a displacement for an address
361 // with range DR.  Here we're interested in the range of both the instruction
362 // described by DR and of any pairing instruction.
363 static bool selectDisp(SystemZAddressingMode::DispRange DR, int64_t Val) {
364   switch (DR) {
365   case SystemZAddressingMode::Disp12Only:
366     return isUInt<12>(Val);
367 
368   case SystemZAddressingMode::Disp12Pair:
369   case SystemZAddressingMode::Disp20Only:
370   case SystemZAddressingMode::Disp20Pair:
371     return isInt<20>(Val);
372 
373   case SystemZAddressingMode::Disp20Only128:
374     return isInt<20>(Val) && isInt<20>(Val + 8);
375   }
376   llvm_unreachable("Unhandled displacement range");
377 }
378 
379 // Change the base or index in AM to Value, where IsBase selects
380 // between the base and index.
381 static void changeComponent(SystemZAddressingMode &AM, bool IsBase,
382                             SDValue Value) {
383   if (IsBase)
384     AM.Base = Value;
385   else
386     AM.Index = Value;
387 }
388 
389 // The base or index of AM is equivalent to Value + ADJDYNALLOC,
390 // where IsBase selects between the base and index.  Try to fold the
391 // ADJDYNALLOC into AM.
392 static bool expandAdjDynAlloc(SystemZAddressingMode &AM, bool IsBase,
393                               SDValue Value) {
394   if (AM.isDynAlloc() && !AM.IncludesDynAlloc) {
395     changeComponent(AM, IsBase, Value);
396     AM.IncludesDynAlloc = true;
397     return true;
398   }
399   return false;
400 }
401 
402 // The base of AM is equivalent to Base + Index.  Try to use Index as
403 // the index register.
404 static bool expandIndex(SystemZAddressingMode &AM, SDValue Base,
405                         SDValue Index) {
406   if (AM.hasIndexField() && !AM.Index.getNode()) {
407     AM.Base = Base;
408     AM.Index = Index;
409     return true;
410   }
411   return false;
412 }
413 
414 // The base or index of AM is equivalent to Op0 + Op1, where IsBase selects
415 // between the base and index.  Try to fold Op1 into AM's displacement.
416 static bool expandDisp(SystemZAddressingMode &AM, bool IsBase,
417                        SDValue Op0, uint64_t Op1) {
418   // First try adjusting the displacement.
419   int64_t TestDisp = AM.Disp + Op1;
420   if (selectDisp(AM.DR, TestDisp)) {
421     changeComponent(AM, IsBase, Op0);
422     AM.Disp = TestDisp;
423     return true;
424   }
425 
426   // We could consider forcing the displacement into a register and
427   // using it as an index, but it would need to be carefully tuned.
428   return false;
429 }
430 
431 bool SystemZDAGToDAGISel::expandAddress(SystemZAddressingMode &AM,
432                                         bool IsBase) const {
433   SDValue N = IsBase ? AM.Base : AM.Index;
434   unsigned Opcode = N.getOpcode();
435   if (Opcode == ISD::TRUNCATE) {
436     N = N.getOperand(0);
437     Opcode = N.getOpcode();
438   }
439   if (Opcode == ISD::ADD || CurDAG->isBaseWithConstantOffset(N)) {
440     SDValue Op0 = N.getOperand(0);
441     SDValue Op1 = N.getOperand(1);
442 
443     unsigned Op0Code = Op0->getOpcode();
444     unsigned Op1Code = Op1->getOpcode();
445 
446     if (Op0Code == SystemZISD::ADJDYNALLOC)
447       return expandAdjDynAlloc(AM, IsBase, Op1);
448     if (Op1Code == SystemZISD::ADJDYNALLOC)
449       return expandAdjDynAlloc(AM, IsBase, Op0);
450 
451     if (Op0Code == ISD::Constant)
452       return expandDisp(AM, IsBase, Op1,
453                         cast<ConstantSDNode>(Op0)->getSExtValue());
454     if (Op1Code == ISD::Constant)
455       return expandDisp(AM, IsBase, Op0,
456                         cast<ConstantSDNode>(Op1)->getSExtValue());
457 
458     if (IsBase && expandIndex(AM, Op0, Op1))
459       return true;
460   }
461   if (Opcode == SystemZISD::PCREL_OFFSET) {
462     SDValue Full = N.getOperand(0);
463     SDValue Base = N.getOperand(1);
464     SDValue Anchor = Base.getOperand(0);
465     uint64_t Offset = (cast<GlobalAddressSDNode>(Full)->getOffset() -
466                        cast<GlobalAddressSDNode>(Anchor)->getOffset());
467     return expandDisp(AM, IsBase, Base, Offset);
468   }
469   return false;
470 }
471 
472 // Return true if an instruction with displacement range DR should be
473 // used for displacement value Val.  selectDisp(DR, Val) must already hold.
474 static bool isValidDisp(SystemZAddressingMode::DispRange DR, int64_t Val) {
475   assert(selectDisp(DR, Val) && "Invalid displacement");
476   switch (DR) {
477   case SystemZAddressingMode::Disp12Only:
478   case SystemZAddressingMode::Disp20Only:
479   case SystemZAddressingMode::Disp20Only128:
480     return true;
481 
482   case SystemZAddressingMode::Disp12Pair:
483     // Use the other instruction if the displacement is too large.
484     return isUInt<12>(Val);
485 
486   case SystemZAddressingMode::Disp20Pair:
487     // Use the other instruction if the displacement is small enough.
488     return !isUInt<12>(Val);
489   }
490   llvm_unreachable("Unhandled displacement range");
491 }
492 
493 // Return true if Base + Disp + Index should be performed by LA(Y).
494 static bool shouldUseLA(SDNode *Base, int64_t Disp, SDNode *Index) {
495   // Don't use LA(Y) for constants.
496   if (!Base)
497     return false;
498 
499   // Always use LA(Y) for frame addresses, since we know that the destination
500   // register is almost always (perhaps always) going to be different from
501   // the frame register.
502   if (Base->getOpcode() == ISD::FrameIndex)
503     return true;
504 
505   if (Disp) {
506     // Always use LA(Y) if there is a base, displacement and index.
507     if (Index)
508       return true;
509 
510     // Always use LA if the displacement is small enough.  It should always
511     // be no worse than AGHI (and better if it avoids a move).
512     if (isUInt<12>(Disp))
513       return true;
514 
515     // For similar reasons, always use LAY if the constant is too big for AGHI.
516     // LAY should be no worse than AGFI.
517     if (!isInt<16>(Disp))
518       return true;
519   } else {
520     // Don't use LA for plain registers.
521     if (!Index)
522       return false;
523 
524     // Don't use LA for plain addition if the index operand is only used
525     // once.  It should be a natural two-operand addition in that case.
526     if (Index->hasOneUse())
527       return false;
528 
529     // Prefer addition if the second operation is sign-extended, in the
530     // hope of using AGF.
531     unsigned IndexOpcode = Index->getOpcode();
532     if (IndexOpcode == ISD::SIGN_EXTEND ||
533         IndexOpcode == ISD::SIGN_EXTEND_INREG)
534       return false;
535   }
536 
537   // Don't use LA for two-operand addition if either operand is only
538   // used once.  The addition instructions are better in that case.
539   if (Base->hasOneUse())
540     return false;
541 
542   return true;
543 }
544 
545 // Return true if Addr is suitable for AM, updating AM if so.
546 bool SystemZDAGToDAGISel::selectAddress(SDValue Addr,
547                                         SystemZAddressingMode &AM) const {
548   // Start out assuming that the address will need to be loaded separately,
549   // then try to extend it as much as we can.
550   AM.Base = Addr;
551 
552   // First try treating the address as a constant.
553   if (Addr.getOpcode() == ISD::Constant &&
554       expandDisp(AM, true, SDValue(),
555                  cast<ConstantSDNode>(Addr)->getSExtValue()))
556     ;
557   // Also see if it's a bare ADJDYNALLOC.
558   else if (Addr.getOpcode() == SystemZISD::ADJDYNALLOC &&
559            expandAdjDynAlloc(AM, true, SDValue()))
560     ;
561   else
562     // Otherwise try expanding each component.
563     while (expandAddress(AM, true) ||
564            (AM.Index.getNode() && expandAddress(AM, false)))
565       continue;
566 
567   // Reject cases where it isn't profitable to use LA(Y).
568   if (AM.Form == SystemZAddressingMode::FormBDXLA &&
569       !shouldUseLA(AM.Base.getNode(), AM.Disp, AM.Index.getNode()))
570     return false;
571 
572   // Reject cases where the other instruction in a pair should be used.
573   if (!isValidDisp(AM.DR, AM.Disp))
574     return false;
575 
576   // Make sure that ADJDYNALLOC is included where necessary.
577   if (AM.isDynAlloc() && !AM.IncludesDynAlloc)
578     return false;
579 
580   DEBUG(AM.dump());
581   return true;
582 }
583 
584 // Insert a node into the DAG at least before Pos.  This will reposition
585 // the node as needed, and will assign it a node ID that is <= Pos's ID.
586 // Note that this does *not* preserve the uniqueness of node IDs!
587 // The selection DAG must no longer depend on their uniqueness when this
588 // function is used.
589 static void insertDAGNode(SelectionDAG *DAG, SDNode *Pos, SDValue N) {
590   if (N.getNode()->getNodeId() == -1 ||
591       N.getNode()->getNodeId() > Pos->getNodeId()) {
592     DAG->RepositionNode(Pos->getIterator(), N.getNode());
593     N.getNode()->setNodeId(Pos->getNodeId());
594   }
595 }
596 
597 void SystemZDAGToDAGISel::getAddressOperands(const SystemZAddressingMode &AM,
598                                              EVT VT, SDValue &Base,
599                                              SDValue &Disp) const {
600   Base = AM.Base;
601   if (!Base.getNode())
602     // Register 0 means "no base".  This is mostly useful for shifts.
603     Base = CurDAG->getRegister(0, VT);
604   else if (Base.getOpcode() == ISD::FrameIndex) {
605     // Lower a FrameIndex to a TargetFrameIndex.
606     int64_t FrameIndex = cast<FrameIndexSDNode>(Base)->getIndex();
607     Base = CurDAG->getTargetFrameIndex(FrameIndex, VT);
608   } else if (Base.getValueType() != VT) {
609     // Truncate values from i64 to i32, for shifts.
610     assert(VT == MVT::i32 && Base.getValueType() == MVT::i64 &&
611            "Unexpected truncation");
612     SDLoc DL(Base);
613     SDValue Trunc = CurDAG->getNode(ISD::TRUNCATE, DL, VT, Base);
614     insertDAGNode(CurDAG, Base.getNode(), Trunc);
615     Base = Trunc;
616   }
617 
618   // Lower the displacement to a TargetConstant.
619   Disp = CurDAG->getTargetConstant(AM.Disp, SDLoc(Base), VT);
620 }
621 
622 void SystemZDAGToDAGISel::getAddressOperands(const SystemZAddressingMode &AM,
623                                              EVT VT, SDValue &Base,
624                                              SDValue &Disp,
625                                              SDValue &Index) const {
626   getAddressOperands(AM, VT, Base, Disp);
627 
628   Index = AM.Index;
629   if (!Index.getNode())
630     // Register 0 means "no index".
631     Index = CurDAG->getRegister(0, VT);
632 }
633 
634 bool SystemZDAGToDAGISel::selectBDAddr(SystemZAddressingMode::DispRange DR,
635                                        SDValue Addr, SDValue &Base,
636                                        SDValue &Disp) const {
637   SystemZAddressingMode AM(SystemZAddressingMode::FormBD, DR);
638   if (!selectAddress(Addr, AM))
639     return false;
640 
641   getAddressOperands(AM, Addr.getValueType(), Base, Disp);
642   return true;
643 }
644 
645 bool SystemZDAGToDAGISel::selectMVIAddr(SystemZAddressingMode::DispRange DR,
646                                         SDValue Addr, SDValue &Base,
647                                         SDValue &Disp) const {
648   SystemZAddressingMode AM(SystemZAddressingMode::FormBDXNormal, DR);
649   if (!selectAddress(Addr, AM) || AM.Index.getNode())
650     return false;
651 
652   getAddressOperands(AM, Addr.getValueType(), Base, Disp);
653   return true;
654 }
655 
656 bool SystemZDAGToDAGISel::selectBDXAddr(SystemZAddressingMode::AddrForm Form,
657                                         SystemZAddressingMode::DispRange DR,
658                                         SDValue Addr, SDValue &Base,
659                                         SDValue &Disp, SDValue &Index) const {
660   SystemZAddressingMode AM(Form, DR);
661   if (!selectAddress(Addr, AM))
662     return false;
663 
664   getAddressOperands(AM, Addr.getValueType(), Base, Disp, Index);
665   return true;
666 }
667 
668 bool SystemZDAGToDAGISel::selectBDVAddr12Only(SDValue Addr, SDValue Elem,
669                                               SDValue &Base,
670                                               SDValue &Disp,
671                                               SDValue &Index) const {
672   SDValue Regs[2];
673   if (selectBDXAddr12Only(Addr, Regs[0], Disp, Regs[1]) &&
674       Regs[0].getNode() && Regs[1].getNode()) {
675     for (unsigned int I = 0; I < 2; ++I) {
676       Base = Regs[I];
677       Index = Regs[1 - I];
678       // We can't tell here whether the index vector has the right type
679       // for the access; the caller needs to do that instead.
680       if (Index.getOpcode() == ISD::ZERO_EXTEND)
681         Index = Index.getOperand(0);
682       if (Index.getOpcode() == ISD::EXTRACT_VECTOR_ELT &&
683           Index.getOperand(1) == Elem) {
684         Index = Index.getOperand(0);
685         return true;
686       }
687     }
688   }
689   return false;
690 }
691 
692 bool SystemZDAGToDAGISel::detectOrAndInsertion(SDValue &Op,
693                                                uint64_t InsertMask) const {
694   // We're only interested in cases where the insertion is into some operand
695   // of Op, rather than into Op itself.  The only useful case is an AND.
696   if (Op.getOpcode() != ISD::AND)
697     return false;
698 
699   // We need a constant mask.
700   auto *MaskNode = dyn_cast<ConstantSDNode>(Op.getOperand(1).getNode());
701   if (!MaskNode)
702     return false;
703 
704   // It's not an insertion of Op.getOperand(0) if the two masks overlap.
705   uint64_t AndMask = MaskNode->getZExtValue();
706   if (InsertMask & AndMask)
707     return false;
708 
709   // It's only an insertion if all bits are covered or are known to be zero.
710   // The inner check covers all cases but is more expensive.
711   uint64_t Used = allOnes(Op.getValueType().getSizeInBits());
712   if (Used != (AndMask | InsertMask)) {
713     APInt KnownZero, KnownOne;
714     CurDAG->computeKnownBits(Op.getOperand(0), KnownZero, KnownOne);
715     if (Used != (AndMask | InsertMask | KnownZero.getZExtValue()))
716       return false;
717   }
718 
719   Op = Op.getOperand(0);
720   return true;
721 }
722 
723 bool SystemZDAGToDAGISel::refineRxSBGMask(RxSBGOperands &RxSBG,
724                                           uint64_t Mask) const {
725   const SystemZInstrInfo *TII = getInstrInfo();
726   if (RxSBG.Rotate != 0)
727     Mask = (Mask << RxSBG.Rotate) | (Mask >> (64 - RxSBG.Rotate));
728   Mask &= RxSBG.Mask;
729   if (TII->isRxSBGMask(Mask, RxSBG.BitSize, RxSBG.Start, RxSBG.End)) {
730     RxSBG.Mask = Mask;
731     return true;
732   }
733   return false;
734 }
735 
736 // Return true if any bits of (RxSBG.Input & Mask) are significant.
737 static bool maskMatters(RxSBGOperands &RxSBG, uint64_t Mask) {
738   // Rotate the mask in the same way as RxSBG.Input is rotated.
739   if (RxSBG.Rotate != 0)
740     Mask = ((Mask << RxSBG.Rotate) | (Mask >> (64 - RxSBG.Rotate)));
741   return (Mask & RxSBG.Mask) != 0;
742 }
743 
744 bool SystemZDAGToDAGISel::expandRxSBG(RxSBGOperands &RxSBG) const {
745   SDValue N = RxSBG.Input;
746   unsigned Opcode = N.getOpcode();
747   switch (Opcode) {
748   case ISD::AND: {
749     if (RxSBG.Opcode == SystemZ::RNSBG)
750       return false;
751 
752     auto *MaskNode = dyn_cast<ConstantSDNode>(N.getOperand(1).getNode());
753     if (!MaskNode)
754       return false;
755 
756     SDValue Input = N.getOperand(0);
757     uint64_t Mask = MaskNode->getZExtValue();
758     if (!refineRxSBGMask(RxSBG, Mask)) {
759       // If some bits of Input are already known zeros, those bits will have
760       // been removed from the mask.  See if adding them back in makes the
761       // mask suitable.
762       APInt KnownZero, KnownOne;
763       CurDAG->computeKnownBits(Input, KnownZero, KnownOne);
764       Mask |= KnownZero.getZExtValue();
765       if (!refineRxSBGMask(RxSBG, Mask))
766         return false;
767     }
768     RxSBG.Input = Input;
769     return true;
770   }
771 
772   case ISD::OR: {
773     if (RxSBG.Opcode != SystemZ::RNSBG)
774       return false;
775 
776     auto *MaskNode = dyn_cast<ConstantSDNode>(N.getOperand(1).getNode());
777     if (!MaskNode)
778       return false;
779 
780     SDValue Input = N.getOperand(0);
781     uint64_t Mask = ~MaskNode->getZExtValue();
782     if (!refineRxSBGMask(RxSBG, Mask)) {
783       // If some bits of Input are already known ones, those bits will have
784       // been removed from the mask.  See if adding them back in makes the
785       // mask suitable.
786       APInt KnownZero, KnownOne;
787       CurDAG->computeKnownBits(Input, KnownZero, KnownOne);
788       Mask &= ~KnownOne.getZExtValue();
789       if (!refineRxSBGMask(RxSBG, Mask))
790         return false;
791     }
792     RxSBG.Input = Input;
793     return true;
794   }
795 
796   case ISD::ROTL: {
797     // Any 64-bit rotate left can be merged into the RxSBG.
798     if (RxSBG.BitSize != 64 || N.getValueType() != MVT::i64)
799       return false;
800     auto *CountNode = dyn_cast<ConstantSDNode>(N.getOperand(1).getNode());
801     if (!CountNode)
802       return false;
803 
804     RxSBG.Rotate = (RxSBG.Rotate + CountNode->getZExtValue()) & 63;
805     RxSBG.Input = N.getOperand(0);
806     return true;
807   }
808 
809   case ISD::ANY_EXTEND:
810     // Bits above the extended operand are don't-care.
811     RxSBG.Input = N.getOperand(0);
812     return true;
813 
814   case ISD::ZERO_EXTEND:
815     if (RxSBG.Opcode != SystemZ::RNSBG) {
816       // Restrict the mask to the extended operand.
817       unsigned InnerBitSize = N.getOperand(0).getValueType().getSizeInBits();
818       if (!refineRxSBGMask(RxSBG, allOnes(InnerBitSize)))
819         return false;
820 
821       RxSBG.Input = N.getOperand(0);
822       return true;
823     }
824     // Fall through.
825 
826   case ISD::SIGN_EXTEND: {
827     // Check that the extension bits are don't-care (i.e. are masked out
828     // by the final mask).
829     unsigned InnerBitSize = N.getOperand(0).getValueType().getSizeInBits();
830     if (maskMatters(RxSBG, allOnes(RxSBG.BitSize) - allOnes(InnerBitSize)))
831       return false;
832 
833     RxSBG.Input = N.getOperand(0);
834     return true;
835   }
836 
837   case ISD::SHL: {
838     auto *CountNode = dyn_cast<ConstantSDNode>(N.getOperand(1).getNode());
839     if (!CountNode)
840       return false;
841 
842     uint64_t Count = CountNode->getZExtValue();
843     unsigned BitSize = N.getValueType().getSizeInBits();
844     if (Count < 1 || Count >= BitSize)
845       return false;
846 
847     if (RxSBG.Opcode == SystemZ::RNSBG) {
848       // Treat (shl X, count) as (rotl X, size-count) as long as the bottom
849       // count bits from RxSBG.Input are ignored.
850       if (maskMatters(RxSBG, allOnes(Count)))
851         return false;
852     } else {
853       // Treat (shl X, count) as (and (rotl X, count), ~0<<count).
854       if (!refineRxSBGMask(RxSBG, allOnes(BitSize - Count) << Count))
855         return false;
856     }
857 
858     RxSBG.Rotate = (RxSBG.Rotate + Count) & 63;
859     RxSBG.Input = N.getOperand(0);
860     return true;
861   }
862 
863   case ISD::SRL:
864   case ISD::SRA: {
865     auto *CountNode = dyn_cast<ConstantSDNode>(N.getOperand(1).getNode());
866     if (!CountNode)
867       return false;
868 
869     uint64_t Count = CountNode->getZExtValue();
870     unsigned BitSize = N.getValueType().getSizeInBits();
871     if (Count < 1 || Count >= BitSize)
872       return false;
873 
874     if (RxSBG.Opcode == SystemZ::RNSBG || Opcode == ISD::SRA) {
875       // Treat (srl|sra X, count) as (rotl X, size-count) as long as the top
876       // count bits from RxSBG.Input are ignored.
877       if (maskMatters(RxSBG, allOnes(Count) << (BitSize - Count)))
878         return false;
879     } else {
880       // Treat (srl X, count), mask) as (and (rotl X, size-count), ~0>>count),
881       // which is similar to SLL above.
882       if (!refineRxSBGMask(RxSBG, allOnes(BitSize - Count)))
883         return false;
884     }
885 
886     RxSBG.Rotate = (RxSBG.Rotate - Count) & 63;
887     RxSBG.Input = N.getOperand(0);
888     return true;
889   }
890   default:
891     return false;
892   }
893 }
894 
895 SDValue SystemZDAGToDAGISel::getUNDEF(const SDLoc &DL, EVT VT) const {
896   SDNode *N = CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF, DL, VT);
897   return SDValue(N, 0);
898 }
899 
900 SDValue SystemZDAGToDAGISel::convertTo(const SDLoc &DL, EVT VT,
901                                        SDValue N) const {
902   if (N.getValueType() == MVT::i32 && VT == MVT::i64)
903     return CurDAG->getTargetInsertSubreg(SystemZ::subreg_l32,
904                                          DL, VT, getUNDEF(DL, MVT::i64), N);
905   if (N.getValueType() == MVT::i64 && VT == MVT::i32)
906     return CurDAG->getTargetExtractSubreg(SystemZ::subreg_l32, DL, VT, N);
907   assert(N.getValueType() == VT && "Unexpected value types");
908   return N;
909 }
910 
911 bool SystemZDAGToDAGISel::tryRISBGZero(SDNode *N) {
912   SDLoc DL(N);
913   EVT VT = N->getValueType(0);
914   if (!VT.isInteger() || VT.getSizeInBits() > 64)
915     return false;
916   RxSBGOperands RISBG(SystemZ::RISBG, SDValue(N, 0));
917   unsigned Count = 0;
918   while (expandRxSBG(RISBG))
919     if (RISBG.Input.getOpcode() != ISD::ANY_EXTEND)
920       Count += 1;
921   if (Count == 0)
922     return false;
923   if (Count == 1) {
924     // Prefer to use normal shift instructions over RISBG, since they can handle
925     // all cases and are sometimes shorter.
926     if (N->getOpcode() != ISD::AND)
927       return false;
928 
929     // Prefer register extensions like LLC over RISBG.  Also prefer to start
930     // out with normal ANDs if one instruction would be enough.  We can convert
931     // these ANDs into an RISBG later if a three-address instruction is useful.
932     if (VT == MVT::i32 ||
933         RISBG.Mask == 0xff ||
934         RISBG.Mask == 0xffff ||
935         SystemZ::isImmLF(~RISBG.Mask) ||
936         SystemZ::isImmHF(~RISBG.Mask)) {
937       // Force the new mask into the DAG, since it may include known-one bits.
938       auto *MaskN = cast<ConstantSDNode>(N->getOperand(1).getNode());
939       if (MaskN->getZExtValue() != RISBG.Mask) {
940         SDValue NewMask = CurDAG->getConstant(RISBG.Mask, DL, VT);
941         N = CurDAG->UpdateNodeOperands(N, N->getOperand(0), NewMask);
942         SelectCode(N);
943         return true;
944       }
945       return false;
946     }
947   }
948 
949   // If the RISBG operands require no rotation and just masks the bottom
950   // 8/16 bits, attempt to convert this to a LLC zero extension.
951   if (RISBG.Rotate == 0 && (RISBG.Mask == 0xff || RISBG.Mask == 0xffff)) {
952     unsigned OpCode = (RISBG.Mask == 0xff ? SystemZ::LLGCR : SystemZ::LLGHR);
953     if (VT == MVT::i32) {
954       if (Subtarget->hasHighWord())
955         OpCode = (RISBG.Mask == 0xff ? SystemZ::LLCRMux : SystemZ::LLHRMux);
956       else
957         OpCode = (RISBG.Mask == 0xff ? SystemZ::LLCR : SystemZ::LLHR);
958     }
959 
960     SDValue In = convertTo(DL, VT, RISBG.Input);
961     SDValue New = convertTo(
962         DL, VT, SDValue(CurDAG->getMachineNode(OpCode, DL, VT, In), 0));
963     ReplaceUses(N, New.getNode());
964     CurDAG->RemoveDeadNode(N);
965     return true;
966   }
967 
968   unsigned Opcode = SystemZ::RISBG;
969   // Prefer RISBGN if available, since it does not clobber CC.
970   if (Subtarget->hasMiscellaneousExtensions())
971     Opcode = SystemZ::RISBGN;
972   EVT OpcodeVT = MVT::i64;
973   if (VT == MVT::i32 && Subtarget->hasHighWord()) {
974     Opcode = SystemZ::RISBMux;
975     OpcodeVT = MVT::i32;
976     RISBG.Start &= 31;
977     RISBG.End &= 31;
978   }
979   SDValue Ops[5] = {
980     getUNDEF(DL, OpcodeVT),
981     convertTo(DL, OpcodeVT, RISBG.Input),
982     CurDAG->getTargetConstant(RISBG.Start, DL, MVT::i32),
983     CurDAG->getTargetConstant(RISBG.End | 128, DL, MVT::i32),
984     CurDAG->getTargetConstant(RISBG.Rotate, DL, MVT::i32)
985   };
986   SDValue New = convertTo(
987       DL, VT, SDValue(CurDAG->getMachineNode(Opcode, DL, OpcodeVT, Ops), 0));
988   ReplaceUses(N, New.getNode());
989   CurDAG->RemoveDeadNode(N);
990   return true;
991 }
992 
993 bool SystemZDAGToDAGISel::tryRxSBG(SDNode *N, unsigned Opcode) {
994   SDLoc DL(N);
995   EVT VT = N->getValueType(0);
996   if (!VT.isInteger() || VT.getSizeInBits() > 64)
997     return false;
998   // Try treating each operand of N as the second operand of the RxSBG
999   // and see which goes deepest.
1000   RxSBGOperands RxSBG[] = {
1001     RxSBGOperands(Opcode, N->getOperand(0)),
1002     RxSBGOperands(Opcode, N->getOperand(1))
1003   };
1004   unsigned Count[] = { 0, 0 };
1005   for (unsigned I = 0; I < 2; ++I)
1006     while (expandRxSBG(RxSBG[I]))
1007       if (RxSBG[I].Input.getOpcode() != ISD::ANY_EXTEND)
1008         Count[I] += 1;
1009 
1010   // Do nothing if neither operand is suitable.
1011   if (Count[0] == 0 && Count[1] == 0)
1012     return false;
1013 
1014   // Pick the deepest second operand.
1015   unsigned I = Count[0] > Count[1] ? 0 : 1;
1016   SDValue Op0 = N->getOperand(I ^ 1);
1017 
1018   // Prefer IC for character insertions from memory.
1019   if (Opcode == SystemZ::ROSBG && (RxSBG[I].Mask & 0xff) == 0)
1020     if (auto *Load = dyn_cast<LoadSDNode>(Op0.getNode()))
1021       if (Load->getMemoryVT() == MVT::i8)
1022         return false;
1023 
1024   // See whether we can avoid an AND in the first operand by converting
1025   // ROSBG to RISBG.
1026   if (Opcode == SystemZ::ROSBG && detectOrAndInsertion(Op0, RxSBG[I].Mask)) {
1027     Opcode = SystemZ::RISBG;
1028     // Prefer RISBGN if available, since it does not clobber CC.
1029     if (Subtarget->hasMiscellaneousExtensions())
1030       Opcode = SystemZ::RISBGN;
1031   }
1032 
1033   SDValue Ops[5] = {
1034     convertTo(DL, MVT::i64, Op0),
1035     convertTo(DL, MVT::i64, RxSBG[I].Input),
1036     CurDAG->getTargetConstant(RxSBG[I].Start, DL, MVT::i32),
1037     CurDAG->getTargetConstant(RxSBG[I].End, DL, MVT::i32),
1038     CurDAG->getTargetConstant(RxSBG[I].Rotate, DL, MVT::i32)
1039   };
1040   SDValue New = convertTo(
1041       DL, VT, SDValue(CurDAG->getMachineNode(Opcode, DL, MVT::i64, Ops), 0));
1042   ReplaceNode(N, New.getNode());
1043   return true;
1044 }
1045 
1046 void SystemZDAGToDAGISel::splitLargeImmediate(unsigned Opcode, SDNode *Node,
1047                                               SDValue Op0, uint64_t UpperVal,
1048                                               uint64_t LowerVal) {
1049   EVT VT = Node->getValueType(0);
1050   SDLoc DL(Node);
1051   SDValue Upper = CurDAG->getConstant(UpperVal, DL, VT);
1052   if (Op0.getNode())
1053     Upper = CurDAG->getNode(Opcode, DL, VT, Op0, Upper);
1054 
1055   {
1056     // When we haven't passed in Op0, Upper will be a constant. In order to
1057     // prevent folding back to the large immediate in `Or = getNode(...)` we run
1058     // SelectCode first and end up with an opaque machine node. This means that
1059     // we need to use a handle to keep track of Upper in case it gets CSE'd by
1060     // SelectCode.
1061     //
1062     // Note that in the case where Op0 is passed in we could just call
1063     // SelectCode(Upper) later, along with the SelectCode(Or), and avoid needing
1064     // the handle at all, but it's fine to do it here.
1065     //
1066     // TODO: This is a pretty hacky way to do this. Can we do something that
1067     // doesn't require a two paragraph explanation?
1068     HandleSDNode Handle(Upper);
1069     SelectCode(Upper.getNode());
1070     Upper = Handle.getValue();
1071   }
1072 
1073   SDValue Lower = CurDAG->getConstant(LowerVal, DL, VT);
1074   SDValue Or = CurDAG->getNode(Opcode, DL, VT, Upper, Lower);
1075 
1076   ReplaceUses(Node, Or.getNode());
1077   CurDAG->RemoveDeadNode(Node);
1078 
1079   SelectCode(Or.getNode());
1080 }
1081 
1082 bool SystemZDAGToDAGISel::tryGather(SDNode *N, unsigned Opcode) {
1083   SDValue ElemV = N->getOperand(2);
1084   auto *ElemN = dyn_cast<ConstantSDNode>(ElemV);
1085   if (!ElemN)
1086     return false;
1087 
1088   unsigned Elem = ElemN->getZExtValue();
1089   EVT VT = N->getValueType(0);
1090   if (Elem >= VT.getVectorNumElements())
1091     return false;
1092 
1093   auto *Load = dyn_cast<LoadSDNode>(N->getOperand(1));
1094   if (!Load || !Load->hasOneUse())
1095     return false;
1096   if (Load->getMemoryVT().getSizeInBits() !=
1097       Load->getValueType(0).getSizeInBits())
1098     return false;
1099 
1100   SDValue Base, Disp, Index;
1101   if (!selectBDVAddr12Only(Load->getBasePtr(), ElemV, Base, Disp, Index) ||
1102       Index.getValueType() != VT.changeVectorElementTypeToInteger())
1103     return false;
1104 
1105   SDLoc DL(Load);
1106   SDValue Ops[] = {
1107     N->getOperand(0), Base, Disp, Index,
1108     CurDAG->getTargetConstant(Elem, DL, MVT::i32), Load->getChain()
1109   };
1110   SDNode *Res = CurDAG->getMachineNode(Opcode, DL, VT, MVT::Other, Ops);
1111   ReplaceUses(SDValue(Load, 1), SDValue(Res, 1));
1112   ReplaceNode(N, Res);
1113   return true;
1114 }
1115 
1116 bool SystemZDAGToDAGISel::tryScatter(StoreSDNode *Store, unsigned Opcode) {
1117   SDValue Value = Store->getValue();
1118   if (Value.getOpcode() != ISD::EXTRACT_VECTOR_ELT)
1119     return false;
1120   if (Store->getMemoryVT().getSizeInBits() !=
1121       Value.getValueType().getSizeInBits())
1122     return false;
1123 
1124   SDValue ElemV = Value.getOperand(1);
1125   auto *ElemN = dyn_cast<ConstantSDNode>(ElemV);
1126   if (!ElemN)
1127     return false;
1128 
1129   SDValue Vec = Value.getOperand(0);
1130   EVT VT = Vec.getValueType();
1131   unsigned Elem = ElemN->getZExtValue();
1132   if (Elem >= VT.getVectorNumElements())
1133     return false;
1134 
1135   SDValue Base, Disp, Index;
1136   if (!selectBDVAddr12Only(Store->getBasePtr(), ElemV, Base, Disp, Index) ||
1137       Index.getValueType() != VT.changeVectorElementTypeToInteger())
1138     return false;
1139 
1140   SDLoc DL(Store);
1141   SDValue Ops[] = {
1142     Vec, Base, Disp, Index, CurDAG->getTargetConstant(Elem, DL, MVT::i32),
1143     Store->getChain()
1144   };
1145   ReplaceNode(Store, CurDAG->getMachineNode(Opcode, DL, MVT::Other, Ops));
1146   return true;
1147 }
1148 
1149 bool SystemZDAGToDAGISel::canUseBlockOperation(StoreSDNode *Store,
1150                                                LoadSDNode *Load) const {
1151   // Check that the two memory operands have the same size.
1152   if (Load->getMemoryVT() != Store->getMemoryVT())
1153     return false;
1154 
1155   // Volatility stops an access from being decomposed.
1156   if (Load->isVolatile() || Store->isVolatile())
1157     return false;
1158 
1159   // There's no chance of overlap if the load is invariant.
1160   if (Load->isInvariant())
1161     return true;
1162 
1163   // Otherwise we need to check whether there's an alias.
1164   const Value *V1 = Load->getMemOperand()->getValue();
1165   const Value *V2 = Store->getMemOperand()->getValue();
1166   if (!V1 || !V2)
1167     return false;
1168 
1169   // Reject equality.
1170   uint64_t Size = Load->getMemoryVT().getStoreSize();
1171   int64_t End1 = Load->getSrcValueOffset() + Size;
1172   int64_t End2 = Store->getSrcValueOffset() + Size;
1173   if (V1 == V2 && End1 == End2)
1174     return false;
1175 
1176   return !AA->alias(MemoryLocation(V1, End1, Load->getAAInfo()),
1177                     MemoryLocation(V2, End2, Store->getAAInfo()));
1178 }
1179 
1180 bool SystemZDAGToDAGISel::storeLoadCanUseMVC(SDNode *N) const {
1181   auto *Store = cast<StoreSDNode>(N);
1182   auto *Load = cast<LoadSDNode>(Store->getValue());
1183 
1184   // Prefer not to use MVC if either address can use ... RELATIVE LONG
1185   // instructions.
1186   uint64_t Size = Load->getMemoryVT().getStoreSize();
1187   if (Size > 1 && Size <= 8) {
1188     // Prefer LHRL, LRL and LGRL.
1189     if (SystemZISD::isPCREL(Load->getBasePtr().getOpcode()))
1190       return false;
1191     // Prefer STHRL, STRL and STGRL.
1192     if (SystemZISD::isPCREL(Store->getBasePtr().getOpcode()))
1193       return false;
1194   }
1195 
1196   return canUseBlockOperation(Store, Load);
1197 }
1198 
1199 bool SystemZDAGToDAGISel::storeLoadCanUseBlockBinary(SDNode *N,
1200                                                      unsigned I) const {
1201   auto *StoreA = cast<StoreSDNode>(N);
1202   auto *LoadA = cast<LoadSDNode>(StoreA->getValue().getOperand(1 - I));
1203   auto *LoadB = cast<LoadSDNode>(StoreA->getValue().getOperand(I));
1204   return !LoadA->isVolatile() && canUseBlockOperation(StoreA, LoadB);
1205 }
1206 
1207 void SystemZDAGToDAGISel::Select(SDNode *Node) {
1208   // Dump information about the Node being selected
1209   DEBUG(errs() << "Selecting: "; Node->dump(CurDAG); errs() << "\n");
1210 
1211   // If we have a custom node, we already have selected!
1212   if (Node->isMachineOpcode()) {
1213     DEBUG(errs() << "== "; Node->dump(CurDAG); errs() << "\n");
1214     Node->setNodeId(-1);
1215     return;
1216   }
1217 
1218   unsigned Opcode = Node->getOpcode();
1219   switch (Opcode) {
1220   case ISD::OR:
1221     if (Node->getOperand(1).getOpcode() != ISD::Constant)
1222       if (tryRxSBG(Node, SystemZ::ROSBG))
1223         return;
1224     goto or_xor;
1225 
1226   case ISD::XOR:
1227     if (Node->getOperand(1).getOpcode() != ISD::Constant)
1228       if (tryRxSBG(Node, SystemZ::RXSBG))
1229         return;
1230     // Fall through.
1231   or_xor:
1232     // If this is a 64-bit operation in which both 32-bit halves are nonzero,
1233     // split the operation into two.
1234     if (Node->getValueType(0) == MVT::i64)
1235       if (auto *Op1 = dyn_cast<ConstantSDNode>(Node->getOperand(1))) {
1236         uint64_t Val = Op1->getZExtValue();
1237         if (!SystemZ::isImmLF(Val) && !SystemZ::isImmHF(Val)) {
1238           splitLargeImmediate(Opcode, Node, Node->getOperand(0),
1239                               Val - uint32_t(Val), uint32_t(Val));
1240           return;
1241         }
1242       }
1243     break;
1244 
1245   case ISD::AND:
1246     if (Node->getOperand(1).getOpcode() != ISD::Constant)
1247       if (tryRxSBG(Node, SystemZ::RNSBG))
1248         return;
1249     // Fall through.
1250   case ISD::ROTL:
1251   case ISD::SHL:
1252   case ISD::SRL:
1253   case ISD::ZERO_EXTEND:
1254     if (tryRISBGZero(Node))
1255       return;
1256     break;
1257 
1258   case ISD::Constant:
1259     // If this is a 64-bit constant that is out of the range of LLILF,
1260     // LLIHF and LGFI, split it into two 32-bit pieces.
1261     if (Node->getValueType(0) == MVT::i64) {
1262       uint64_t Val = cast<ConstantSDNode>(Node)->getZExtValue();
1263       if (!SystemZ::isImmLF(Val) && !SystemZ::isImmHF(Val) && !isInt<32>(Val)) {
1264         splitLargeImmediate(ISD::OR, Node, SDValue(), Val - uint32_t(Val),
1265                             uint32_t(Val));
1266         return;
1267       }
1268     }
1269     break;
1270 
1271   case SystemZISD::SELECT_CCMASK: {
1272     SDValue Op0 = Node->getOperand(0);
1273     SDValue Op1 = Node->getOperand(1);
1274     // Prefer to put any load first, so that it can be matched as a
1275     // conditional load.
1276     if (Op1.getOpcode() == ISD::LOAD && Op0.getOpcode() != ISD::LOAD) {
1277       SDValue CCValid = Node->getOperand(2);
1278       SDValue CCMask = Node->getOperand(3);
1279       uint64_t ConstCCValid =
1280         cast<ConstantSDNode>(CCValid.getNode())->getZExtValue();
1281       uint64_t ConstCCMask =
1282         cast<ConstantSDNode>(CCMask.getNode())->getZExtValue();
1283       // Invert the condition.
1284       CCMask = CurDAG->getConstant(ConstCCValid ^ ConstCCMask, SDLoc(Node),
1285                                    CCMask.getValueType());
1286       SDValue Op4 = Node->getOperand(4);
1287       Node = CurDAG->UpdateNodeOperands(Node, Op1, Op0, CCValid, CCMask, Op4);
1288     }
1289     break;
1290   }
1291 
1292   case ISD::INSERT_VECTOR_ELT: {
1293     EVT VT = Node->getValueType(0);
1294     unsigned ElemBitSize = VT.getVectorElementType().getSizeInBits();
1295     if (ElemBitSize == 32) {
1296       if (tryGather(Node, SystemZ::VGEF))
1297         return;
1298     } else if (ElemBitSize == 64) {
1299       if (tryGather(Node, SystemZ::VGEG))
1300         return;
1301     }
1302     break;
1303   }
1304 
1305   case ISD::STORE: {
1306     auto *Store = cast<StoreSDNode>(Node);
1307     unsigned ElemBitSize = Store->getValue().getValueType().getSizeInBits();
1308     if (ElemBitSize == 32) {
1309       if (tryScatter(Store, SystemZ::VSCEF))
1310         return;
1311     } else if (ElemBitSize == 64) {
1312       if (tryScatter(Store, SystemZ::VSCEG))
1313         return;
1314     }
1315     break;
1316   }
1317   }
1318 
1319   SelectCode(Node);
1320 }
1321 
1322 bool SystemZDAGToDAGISel::
1323 SelectInlineAsmMemoryOperand(const SDValue &Op,
1324                              unsigned ConstraintID,
1325                              std::vector<SDValue> &OutOps) {
1326   SystemZAddressingMode::AddrForm Form;
1327   SystemZAddressingMode::DispRange DispRange;
1328   SDValue Base, Disp, Index;
1329 
1330   switch(ConstraintID) {
1331   default:
1332     llvm_unreachable("Unexpected asm memory constraint");
1333   case InlineAsm::Constraint_i:
1334   case InlineAsm::Constraint_Q:
1335     // Accept an address with a short displacement, but no index.
1336     Form = SystemZAddressingMode::FormBD;
1337     DispRange = SystemZAddressingMode::Disp12Only;
1338     break;
1339   case InlineAsm::Constraint_R:
1340     // Accept an address with a short displacement and an index.
1341     Form = SystemZAddressingMode::FormBDXNormal;
1342     DispRange = SystemZAddressingMode::Disp12Only;
1343     break;
1344   case InlineAsm::Constraint_S:
1345     // Accept an address with a long displacement, but no index.
1346     Form = SystemZAddressingMode::FormBD;
1347     DispRange = SystemZAddressingMode::Disp20Only;
1348     break;
1349   case InlineAsm::Constraint_T:
1350   case InlineAsm::Constraint_m:
1351     // Accept an address with a long displacement and an index.
1352     // m works the same as T, as this is the most general case.
1353     Form = SystemZAddressingMode::FormBDXNormal;
1354     DispRange = SystemZAddressingMode::Disp20Only;
1355     break;
1356   }
1357 
1358   if (selectBDXAddr(Form, DispRange, Op, Base, Disp, Index)) {
1359     OutOps.push_back(Base);
1360     OutOps.push_back(Disp);
1361     OutOps.push_back(Index);
1362     return false;
1363   }
1364 
1365   return true;
1366 }
1367