~ubuntu-branches/ubuntu/wily/clamav/wily-proposed

« back to all changes in this revision

Viewing changes to libclamav/c++/llvm/utils/TableGen/CodeGenDAGPatterns.cpp

  • Committer: Package Import Robot
  • Author(s): Scott Kitterman, Sebastian Andrzej Siewior, Andreas Cadhalpun, Scott Kitterman, Javier Fernández-Sanguino
  • Date: 2015-01-28 00:25:13 UTC
  • mfrom: (0.48.14 sid)
  • Revision ID: package-import@ubuntu.com-20150128002513-lil2oi74cooy4lzr
Tags: 0.98.6+dfsg-1
[ Sebastian Andrzej Siewior ]
* update "fix-ssize_t-size_t-off_t-printf-modifier", include of misc.h was
  missing but was pulled in via the systemd patch.
* Don't leak return codes from libmspack to clamav API. (Closes: #774686).

[ Andreas Cadhalpun ]
* Add patch to avoid emitting incremental progress messages when not
  outputting to a terminal. (Closes: #767350)
* Update lintian-overrides for unused-file-paragraph-in-dep5-copyright.
* clamav-base.postinst: always chown /var/log/clamav and /var/lib/clamav
  to clamav:clamav, not only on fresh installations. (Closes: #775400)
* Adapt the clamav-daemon and clamav-freshclam logrotate scripts,
  so that they correctly work under systemd.
* Move the PidFile variable from the clamd/freshclam configuration files
  to the init scripts. This makes the init scripts more robust against
  misconfiguration and avoids error messages with systemd. (Closes: #767353)
* debian/copyright: drop files from Files-Excluded only present in github
  tarballs
* Drop Workaround-a-bug-in-libc-on-Hurd.patch, because hurd got fixed.
  (see #752237)
* debian/rules: Remove useless --with-system-tommath --without-included-ltdl
  configure options.

[ Scott Kitterman ]
* Stop stripping llvm when repacking the tarball as the system llvm on some
  releases is too old to use
* New upstream bugfix release
  - Library shared object revisions.
  - Includes a patch from Sebastian Andrzej Siewior making ClamAV pid files
    compatible with systemd.
  - Fix a heap out of bounds condition with crafted Yoda's crypter files.
    This issue was discovered by Felix Groebert of the Google Security Team.
  - Fix a heap out of bounds condition with crafted mew packer files. This
    issue was discovered by Felix Groebert of the Google Security Team.
  - Fix a heap out of bounds condition with crafted upx packer files. This
    issue was discovered by Kevin Szkudlapski of Quarkslab.
  - Fix a heap out of bounds condition with crafted upack packer files. This
    issue was discovered by Sebastian Andrzej Siewior. CVE-2014-9328.
  - Compensate a crash due to incorrect compiler optimization when handling
    crafted petite packer files. This issue was discovered by Sebastian
    Andrzej Siewior.
* Update lintian override for embedded zlib to match new so version

[ Javier Fernández-Sanguino ]
* Updated Spanish Debconf template translation (Closes: #773563)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
//===- CodeGenDAGPatterns.cpp - Read DAG patterns from .td file -----------===//
 
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 implements the CodeGenDAGPatterns class, which is used to read and
 
11
// represent the patterns present in a .td file for instructions.
 
12
//
 
13
//===----------------------------------------------------------------------===//
 
14
 
 
15
#include "CodeGenDAGPatterns.h"
 
16
#include "Record.h"
 
17
#include "llvm/ADT/StringExtras.h"
 
18
#include "llvm/ADT/STLExtras.h"
 
19
#include "llvm/Support/Debug.h"
 
20
#include <set>
 
21
#include <algorithm>
 
22
using namespace llvm;
 
23
 
 
24
//===----------------------------------------------------------------------===//
 
25
//  EEVT::TypeSet Implementation
 
26
//===----------------------------------------------------------------------===//
 
27
 
 
28
static inline bool isInteger(MVT::SimpleValueType VT) {
 
29
  return EVT(VT).isInteger();
 
30
}
 
31
static inline bool isFloatingPoint(MVT::SimpleValueType VT) {
 
32
  return EVT(VT).isFloatingPoint();
 
33
}
 
34
static inline bool isVector(MVT::SimpleValueType VT) {
 
35
  return EVT(VT).isVector();
 
36
}
 
37
static inline bool isScalar(MVT::SimpleValueType VT) {
 
38
  return !EVT(VT).isVector();
 
39
}
 
40
 
 
41
EEVT::TypeSet::TypeSet(MVT::SimpleValueType VT, TreePattern &TP) {
 
42
  if (VT == MVT::iAny)
 
43
    EnforceInteger(TP);
 
44
  else if (VT == MVT::fAny)
 
45
    EnforceFloatingPoint(TP);
 
46
  else if (VT == MVT::vAny)
 
47
    EnforceVector(TP);
 
48
  else {
 
49
    assert((VT < MVT::LAST_VALUETYPE || VT == MVT::iPTR ||
 
50
            VT == MVT::iPTRAny) && "Not a concrete type!");
 
51
    TypeVec.push_back(VT);
 
52
  }
 
53
}
 
54
 
 
55
 
 
56
EEVT::TypeSet::TypeSet(const std::vector<MVT::SimpleValueType> &VTList) {
 
57
  assert(!VTList.empty() && "empty list?");
 
58
  TypeVec.append(VTList.begin(), VTList.end());
 
59
  
 
60
  if (!VTList.empty())
 
61
    assert(VTList[0] != MVT::iAny && VTList[0] != MVT::vAny &&
 
62
           VTList[0] != MVT::fAny);
 
63
  
 
64
  // Verify no duplicates.
 
65
  array_pod_sort(TypeVec.begin(), TypeVec.end());
 
66
  assert(std::unique(TypeVec.begin(), TypeVec.end()) == TypeVec.end());
 
67
}
 
68
 
 
69
/// FillWithPossibleTypes - Set to all legal types and return true, only valid
 
70
/// on completely unknown type sets.
 
71
bool EEVT::TypeSet::FillWithPossibleTypes(TreePattern &TP,
 
72
                                          bool (*Pred)(MVT::SimpleValueType),
 
73
                                          const char *PredicateName) {
 
74
  assert(isCompletelyUnknown());
 
75
  const std::vector<MVT::SimpleValueType> &LegalTypes = 
 
76
    TP.getDAGPatterns().getTargetInfo().getLegalValueTypes();
 
77
  
 
78
  for (unsigned i = 0, e = LegalTypes.size(); i != e; ++i)
 
79
    if (Pred == 0 || Pred(LegalTypes[i]))
 
80
      TypeVec.push_back(LegalTypes[i]);
 
81
 
 
82
  // If we have nothing that matches the predicate, bail out.
 
83
  if (TypeVec.empty())
 
84
    TP.error("Type inference contradiction found, no " +
 
85
             std::string(PredicateName) + " types found");  
 
86
  // No need to sort with one element.
 
87
  if (TypeVec.size() == 1) return true;
 
88
 
 
89
  // Remove duplicates.
 
90
  array_pod_sort(TypeVec.begin(), TypeVec.end());
 
91
  TypeVec.erase(std::unique(TypeVec.begin(), TypeVec.end()), TypeVec.end());
 
92
  
 
93
  return true;
 
94
}
 
95
 
 
96
/// hasIntegerTypes - Return true if this TypeSet contains iAny or an
 
97
/// integer value type.
 
98
bool EEVT::TypeSet::hasIntegerTypes() const {
 
99
  for (unsigned i = 0, e = TypeVec.size(); i != e; ++i)
 
100
    if (isInteger(TypeVec[i]))
 
101
      return true;
 
102
  return false;
 
103
}  
 
104
 
 
105
/// hasFloatingPointTypes - Return true if this TypeSet contains an fAny or
 
106
/// a floating point value type.
 
107
bool EEVT::TypeSet::hasFloatingPointTypes() const {
 
108
  for (unsigned i = 0, e = TypeVec.size(); i != e; ++i)
 
109
    if (isFloatingPoint(TypeVec[i]))
 
110
      return true;
 
111
  return false;
 
112
}  
 
113
 
 
114
/// hasVectorTypes - Return true if this TypeSet contains a vAny or a vector
 
115
/// value type.
 
116
bool EEVT::TypeSet::hasVectorTypes() const {
 
117
  for (unsigned i = 0, e = TypeVec.size(); i != e; ++i)
 
118
    if (isVector(TypeVec[i]))
 
119
      return true;
 
120
  return false;
 
121
}
 
122
 
 
123
 
 
124
std::string EEVT::TypeSet::getName() const {
 
125
  if (TypeVec.empty()) return "<empty>";
 
126
  
 
127
  std::string Result;
 
128
    
 
129
  for (unsigned i = 0, e = TypeVec.size(); i != e; ++i) {
 
130
    std::string VTName = llvm::getEnumName(TypeVec[i]);
 
131
    // Strip off MVT:: prefix if present.
 
132
    if (VTName.substr(0,5) == "MVT::")
 
133
      VTName = VTName.substr(5);
 
134
    if (i) Result += ':';
 
135
    Result += VTName;
 
136
  }
 
137
  
 
138
  if (TypeVec.size() == 1)
 
139
    return Result;
 
140
  return "{" + Result + "}";
 
141
}
 
142
 
 
143
/// MergeInTypeInfo - This merges in type information from the specified
 
144
/// argument.  If 'this' changes, it returns true.  If the two types are
 
145
/// contradictory (e.g. merge f32 into i32) then this throws an exception.
 
146
bool EEVT::TypeSet::MergeInTypeInfo(const EEVT::TypeSet &InVT, TreePattern &TP){
 
147
  if (InVT.isCompletelyUnknown() || *this == InVT)
 
148
    return false;
 
149
  
 
150
  if (isCompletelyUnknown()) {
 
151
    *this = InVT;
 
152
    return true;
 
153
  }
 
154
  
 
155
  assert(TypeVec.size() >= 1 && InVT.TypeVec.size() >= 1 && "No unknowns");
 
156
  
 
157
  // Handle the abstract cases, seeing if we can resolve them better.
 
158
  switch (TypeVec[0]) {
 
159
  default: break;
 
160
  case MVT::iPTR:
 
161
  case MVT::iPTRAny:
 
162
    if (InVT.hasIntegerTypes()) {
 
163
      EEVT::TypeSet InCopy(InVT);
 
164
      InCopy.EnforceInteger(TP);
 
165
      InCopy.EnforceScalar(TP);
 
166
      
 
167
      if (InCopy.isConcrete()) {
 
168
        // If the RHS has one integer type, upgrade iPTR to i32.
 
169
        TypeVec[0] = InVT.TypeVec[0];
 
170
        return true;
 
171
      }
 
172
      
 
173
      // If the input has multiple scalar integers, this doesn't add any info.
 
174
      if (!InCopy.isCompletelyUnknown())
 
175
        return false;
 
176
    }
 
177
    break;
 
178
  }
 
179
  
 
180
  // If the input constraint is iAny/iPTR and this is an integer type list,
 
181
  // remove non-integer types from the list.
 
182
  if ((InVT.TypeVec[0] == MVT::iPTR || InVT.TypeVec[0] == MVT::iPTRAny) &&
 
183
      hasIntegerTypes()) {
 
184
    bool MadeChange = EnforceInteger(TP);
 
185
    
 
186
    // If we're merging in iPTR/iPTRAny and the node currently has a list of
 
187
    // multiple different integer types, replace them with a single iPTR.
 
188
    if ((InVT.TypeVec[0] == MVT::iPTR || InVT.TypeVec[0] == MVT::iPTRAny) &&
 
189
        TypeVec.size() != 1) {
 
190
      TypeVec.resize(1);
 
191
      TypeVec[0] = InVT.TypeVec[0];
 
192
      MadeChange = true;
 
193
    }
 
194
    
 
195
    return MadeChange;
 
196
  }
 
197
  
 
198
  // If this is a type list and the RHS is a typelist as well, eliminate entries
 
199
  // from this list that aren't in the other one.
 
200
  bool MadeChange = false;
 
201
  TypeSet InputSet(*this);
 
202
 
 
203
  for (unsigned i = 0; i != TypeVec.size(); ++i) {
 
204
    bool InInVT = false;
 
205
    for (unsigned j = 0, e = InVT.TypeVec.size(); j != e; ++j)
 
206
      if (TypeVec[i] == InVT.TypeVec[j]) {
 
207
        InInVT = true;
 
208
        break;
 
209
      }
 
210
    
 
211
    if (InInVT) continue;
 
212
    TypeVec.erase(TypeVec.begin()+i--);
 
213
    MadeChange = true;
 
214
  }
 
215
  
 
216
  // If we removed all of our types, we have a type contradiction.
 
217
  if (!TypeVec.empty())
 
218
    return MadeChange;
 
219
  
 
220
  // FIXME: Really want an SMLoc here!
 
221
  TP.error("Type inference contradiction found, merging '" +
 
222
           InVT.getName() + "' into '" + InputSet.getName() + "'");
 
223
  return true; // unreachable
 
224
}
 
225
 
 
226
/// EnforceInteger - Remove all non-integer types from this set.
 
227
bool EEVT::TypeSet::EnforceInteger(TreePattern &TP) {
 
228
  // If we know nothing, then get the full set.
 
229
  if (TypeVec.empty())
 
230
    return FillWithPossibleTypes(TP, isInteger, "integer");
 
231
  if (!hasFloatingPointTypes())
 
232
    return false;
 
233
 
 
234
  TypeSet InputSet(*this);
 
235
  
 
236
  // Filter out all the fp types.
 
237
  for (unsigned i = 0; i != TypeVec.size(); ++i)
 
238
    if (!isInteger(TypeVec[i]))
 
239
      TypeVec.erase(TypeVec.begin()+i--);
 
240
  
 
241
  if (TypeVec.empty())
 
242
    TP.error("Type inference contradiction found, '" +
 
243
             InputSet.getName() + "' needs to be integer");
 
244
  return true;
 
245
}
 
246
 
 
247
/// EnforceFloatingPoint - Remove all integer types from this set.
 
248
bool EEVT::TypeSet::EnforceFloatingPoint(TreePattern &TP) {
 
249
  // If we know nothing, then get the full set.
 
250
  if (TypeVec.empty())
 
251
    return FillWithPossibleTypes(TP, isFloatingPoint, "floating point");
 
252
 
 
253
  if (!hasIntegerTypes())
 
254
    return false;
 
255
 
 
256
  TypeSet InputSet(*this);
 
257
  
 
258
  // Filter out all the fp types.
 
259
  for (unsigned i = 0; i != TypeVec.size(); ++i)
 
260
    if (!isFloatingPoint(TypeVec[i]))
 
261
      TypeVec.erase(TypeVec.begin()+i--);
 
262
  
 
263
  if (TypeVec.empty())
 
264
    TP.error("Type inference contradiction found, '" +
 
265
             InputSet.getName() + "' needs to be floating point");
 
266
  return true;
 
267
}
 
268
 
 
269
/// EnforceScalar - Remove all vector types from this.
 
270
bool EEVT::TypeSet::EnforceScalar(TreePattern &TP) {
 
271
  // If we know nothing, then get the full set.
 
272
  if (TypeVec.empty())
 
273
    return FillWithPossibleTypes(TP, isScalar, "scalar");
 
274
 
 
275
  if (!hasVectorTypes())
 
276
    return false;
 
277
 
 
278
  TypeSet InputSet(*this);
 
279
  
 
280
  // Filter out all the vector types.
 
281
  for (unsigned i = 0; i != TypeVec.size(); ++i)
 
282
    if (!isScalar(TypeVec[i]))
 
283
      TypeVec.erase(TypeVec.begin()+i--);
 
284
  
 
285
  if (TypeVec.empty())
 
286
    TP.error("Type inference contradiction found, '" +
 
287
             InputSet.getName() + "' needs to be scalar");
 
288
  return true;
 
289
}
 
290
 
 
291
/// EnforceVector - Remove all vector types from this.
 
292
bool EEVT::TypeSet::EnforceVector(TreePattern &TP) {
 
293
  // If we know nothing, then get the full set.
 
294
  if (TypeVec.empty())
 
295
    return FillWithPossibleTypes(TP, isVector, "vector");
 
296
 
 
297
  TypeSet InputSet(*this);
 
298
  bool MadeChange = false;
 
299
  
 
300
  // Filter out all the scalar types.
 
301
  for (unsigned i = 0; i != TypeVec.size(); ++i)
 
302
    if (!isVector(TypeVec[i])) {
 
303
      TypeVec.erase(TypeVec.begin()+i--);
 
304
      MadeChange = true;
 
305
    }
 
306
  
 
307
  if (TypeVec.empty())
 
308
    TP.error("Type inference contradiction found, '" +
 
309
             InputSet.getName() + "' needs to be a vector");
 
310
  return MadeChange;
 
311
}
 
312
 
 
313
 
 
314
 
 
315
/// EnforceSmallerThan - 'this' must be a smaller VT than Other.  Update
 
316
/// this an other based on this information.
 
317
bool EEVT::TypeSet::EnforceSmallerThan(EEVT::TypeSet &Other, TreePattern &TP) {
 
318
  // Both operands must be integer or FP, but we don't care which.
 
319
  bool MadeChange = false;
 
320
  
 
321
  if (isCompletelyUnknown())
 
322
    MadeChange = FillWithPossibleTypes(TP);
 
323
 
 
324
  if (Other.isCompletelyUnknown())
 
325
    MadeChange = Other.FillWithPossibleTypes(TP);
 
326
    
 
327
  // If one side is known to be integer or known to be FP but the other side has
 
328
  // no information, get at least the type integrality info in there.
 
329
  if (!hasFloatingPointTypes())
 
330
    MadeChange |= Other.EnforceInteger(TP);
 
331
  else if (!hasIntegerTypes())
 
332
    MadeChange |= Other.EnforceFloatingPoint(TP);
 
333
  if (!Other.hasFloatingPointTypes())
 
334
    MadeChange |= EnforceInteger(TP);
 
335
  else if (!Other.hasIntegerTypes())
 
336
    MadeChange |= EnforceFloatingPoint(TP);
 
337
  
 
338
  assert(!isCompletelyUnknown() && !Other.isCompletelyUnknown() &&
 
339
         "Should have a type list now");
 
340
  
 
341
  // If one contains vectors but the other doesn't pull vectors out.
 
342
  if (!hasVectorTypes())
 
343
    MadeChange |= Other.EnforceScalar(TP);
 
344
  if (!hasVectorTypes())
 
345
    MadeChange |= EnforceScalar(TP);
 
346
  
 
347
  // This code does not currently handle nodes which have multiple types,
 
348
  // where some types are integer, and some are fp.  Assert that this is not
 
349
  // the case.
 
350
  assert(!(hasIntegerTypes() && hasFloatingPointTypes()) &&
 
351
         !(Other.hasIntegerTypes() && Other.hasFloatingPointTypes()) &&
 
352
         "SDTCisOpSmallerThanOp does not handle mixed int/fp types!");
 
353
  
 
354
  // Okay, find the smallest type from the current set and remove it from the
 
355
  // largest set.
 
356
  MVT::SimpleValueType Smallest = TypeVec[0];
 
357
  for (unsigned i = 1, e = TypeVec.size(); i != e; ++i)
 
358
    if (TypeVec[i] < Smallest)
 
359
      Smallest = TypeVec[i];
 
360
  
 
361
  // If this is the only type in the large set, the constraint can never be
 
362
  // satisfied.
 
363
  if (Other.TypeVec.size() == 1 && Other.TypeVec[0] == Smallest)
 
364
    TP.error("Type inference contradiction found, '" +
 
365
             Other.getName() + "' has nothing larger than '" + getName() +"'!");
 
366
  
 
367
  SmallVector<MVT::SimpleValueType, 2>::iterator TVI =
 
368
    std::find(Other.TypeVec.begin(), Other.TypeVec.end(), Smallest);
 
369
  if (TVI != Other.TypeVec.end()) {
 
370
    Other.TypeVec.erase(TVI);
 
371
    MadeChange = true;
 
372
  }
 
373
  
 
374
  // Okay, find the largest type in the Other set and remove it from the
 
375
  // current set.
 
376
  MVT::SimpleValueType Largest = Other.TypeVec[0];
 
377
  for (unsigned i = 1, e = Other.TypeVec.size(); i != e; ++i)
 
378
    if (Other.TypeVec[i] > Largest)
 
379
      Largest = Other.TypeVec[i];
 
380
  
 
381
  // If this is the only type in the small set, the constraint can never be
 
382
  // satisfied.
 
383
  if (TypeVec.size() == 1 && TypeVec[0] == Largest)
 
384
    TP.error("Type inference contradiction found, '" +
 
385
             getName() + "' has nothing smaller than '" + Other.getName()+"'!");
 
386
  
 
387
  TVI = std::find(TypeVec.begin(), TypeVec.end(), Largest);
 
388
  if (TVI != TypeVec.end()) {
 
389
    TypeVec.erase(TVI);
 
390
    MadeChange = true;
 
391
  }
 
392
  
 
393
  return MadeChange;
 
394
}
 
395
 
 
396
/// EnforceVectorEltTypeIs - 'this' is now constrainted to be a vector type
 
397
/// whose element is specified by VTOperand.
 
398
bool EEVT::TypeSet::EnforceVectorEltTypeIs(EEVT::TypeSet &VTOperand,
 
399
                                           TreePattern &TP) {
 
400
  // "This" must be a vector and "VTOperand" must be a scalar.
 
401
  bool MadeChange = false;
 
402
  MadeChange |= EnforceVector(TP);
 
403
  MadeChange |= VTOperand.EnforceScalar(TP);
 
404
 
 
405
  // If we know the vector type, it forces the scalar to agree.
 
406
  if (isConcrete()) {
 
407
    EVT IVT = getConcrete();
 
408
    IVT = IVT.getVectorElementType();
 
409
    return MadeChange | 
 
410
      VTOperand.MergeInTypeInfo(IVT.getSimpleVT().SimpleTy, TP);
 
411
  }
 
412
 
 
413
  // If the scalar type is known, filter out vector types whose element types
 
414
  // disagree.
 
415
  if (!VTOperand.isConcrete())
 
416
    return MadeChange;
 
417
  
 
418
  MVT::SimpleValueType VT = VTOperand.getConcrete();
 
419
  
 
420
  TypeSet InputSet(*this);
 
421
  
 
422
  // Filter out all the types which don't have the right element type.
 
423
  for (unsigned i = 0; i != TypeVec.size(); ++i) {
 
424
    assert(isVector(TypeVec[i]) && "EnforceVector didn't work");
 
425
    if (EVT(TypeVec[i]).getVectorElementType().getSimpleVT().SimpleTy != VT) {
 
426
      TypeVec.erase(TypeVec.begin()+i--);
 
427
      MadeChange = true;
 
428
    }
 
429
  }
 
430
  
 
431
  if (TypeVec.empty())  // FIXME: Really want an SMLoc here!
 
432
    TP.error("Type inference contradiction found, forcing '" +
 
433
             InputSet.getName() + "' to have a vector element");
 
434
  return MadeChange;
 
435
}
 
436
 
 
437
//===----------------------------------------------------------------------===//
 
438
// Helpers for working with extended types.
 
439
 
 
440
bool RecordPtrCmp::operator()(const Record *LHS, const Record *RHS) const {
 
441
  return LHS->getID() < RHS->getID();
 
442
}
 
443
 
 
444
/// Dependent variable map for CodeGenDAGPattern variant generation
 
445
typedef std::map<std::string, int> DepVarMap;
 
446
 
 
447
/// Const iterator shorthand for DepVarMap
 
448
typedef DepVarMap::const_iterator DepVarMap_citer;
 
449
 
 
450
namespace {
 
451
void FindDepVarsOf(TreePatternNode *N, DepVarMap &DepMap) {
 
452
  if (N->isLeaf()) {
 
453
    if (dynamic_cast<DefInit*>(N->getLeafValue()) != NULL) {
 
454
      DepMap[N->getName()]++;
 
455
    }
 
456
  } else {
 
457
    for (size_t i = 0, e = N->getNumChildren(); i != e; ++i)
 
458
      FindDepVarsOf(N->getChild(i), DepMap);
 
459
  }
 
460
}
 
461
 
 
462
//! Find dependent variables within child patterns
 
463
/*!
 
464
 */
 
465
void FindDepVars(TreePatternNode *N, MultipleUseVarSet &DepVars) {
 
466
  DepVarMap depcounts;
 
467
  FindDepVarsOf(N, depcounts);
 
468
  for (DepVarMap_citer i = depcounts.begin(); i != depcounts.end(); ++i) {
 
469
    if (i->second > 1) {            // std::pair<std::string, int>
 
470
      DepVars.insert(i->first);
 
471
    }
 
472
  }
 
473
}
 
474
 
 
475
//! Dump the dependent variable set:
 
476
void DumpDepVars(MultipleUseVarSet &DepVars) {
 
477
  if (DepVars.empty()) {
 
478
    DEBUG(errs() << "<empty set>");
 
479
  } else {
 
480
    DEBUG(errs() << "[ ");
 
481
    for (MultipleUseVarSet::const_iterator i = DepVars.begin(), e = DepVars.end();
 
482
         i != e; ++i) {
 
483
      DEBUG(errs() << (*i) << " ");
 
484
    }
 
485
    DEBUG(errs() << "]");
 
486
  }
 
487
}
 
488
}
 
489
 
 
490
//===----------------------------------------------------------------------===//
 
491
// PatternToMatch implementation
 
492
//
 
493
 
 
494
 
 
495
/// getPatternSize - Return the 'size' of this pattern.  We want to match large
 
496
/// patterns before small ones.  This is used to determine the size of a
 
497
/// pattern.
 
498
static unsigned getPatternSize(const TreePatternNode *P,
 
499
                               const CodeGenDAGPatterns &CGP) {
 
500
  unsigned Size = 3;  // The node itself.
 
501
  // If the root node is a ConstantSDNode, increases its size.
 
502
  // e.g. (set R32:$dst, 0).
 
503
  if (P->isLeaf() && dynamic_cast<IntInit*>(P->getLeafValue()))
 
504
    Size += 2;
 
505
  
 
506
  // FIXME: This is a hack to statically increase the priority of patterns
 
507
  // which maps a sub-dag to a complex pattern. e.g. favors LEA over ADD.
 
508
  // Later we can allow complexity / cost for each pattern to be (optionally)
 
509
  // specified. To get best possible pattern match we'll need to dynamically
 
510
  // calculate the complexity of all patterns a dag can potentially map to.
 
511
  const ComplexPattern *AM = P->getComplexPatternInfo(CGP);
 
512
  if (AM)
 
513
    Size += AM->getNumOperands() * 3;
 
514
  
 
515
  // If this node has some predicate function that must match, it adds to the
 
516
  // complexity of this node.
 
517
  if (!P->getPredicateFns().empty())
 
518
    ++Size;
 
519
  
 
520
  // Count children in the count if they are also nodes.
 
521
  for (unsigned i = 0, e = P->getNumChildren(); i != e; ++i) {
 
522
    TreePatternNode *Child = P->getChild(i);
 
523
    if (!Child->isLeaf() && Child->getNumTypes() &&
 
524
        Child->getType(0) != MVT::Other)
 
525
      Size += getPatternSize(Child, CGP);
 
526
    else if (Child->isLeaf()) {
 
527
      if (dynamic_cast<IntInit*>(Child->getLeafValue())) 
 
528
        Size += 5;  // Matches a ConstantSDNode (+3) and a specific value (+2).
 
529
      else if (Child->getComplexPatternInfo(CGP))
 
530
        Size += getPatternSize(Child, CGP);
 
531
      else if (!Child->getPredicateFns().empty())
 
532
        ++Size;
 
533
    }
 
534
  }
 
535
  
 
536
  return Size;
 
537
}
 
538
 
 
539
/// Compute the complexity metric for the input pattern.  This roughly
 
540
/// corresponds to the number of nodes that are covered.
 
541
unsigned PatternToMatch::
 
542
getPatternComplexity(const CodeGenDAGPatterns &CGP) const {
 
543
  return getPatternSize(getSrcPattern(), CGP) + getAddedComplexity();
 
544
}
 
545
 
 
546
 
 
547
/// getPredicateCheck - Return a single string containing all of this
 
548
/// pattern's predicates concatenated with "&&" operators.
 
549
///
 
550
std::string PatternToMatch::getPredicateCheck() const {
 
551
  std::string PredicateCheck;
 
552
  for (unsigned i = 0, e = Predicates->getSize(); i != e; ++i) {
 
553
    if (DefInit *Pred = dynamic_cast<DefInit*>(Predicates->getElement(i))) {
 
554
      Record *Def = Pred->getDef();
 
555
      if (!Def->isSubClassOf("Predicate")) {
 
556
#ifndef NDEBUG
 
557
        Def->dump();
 
558
#endif
 
559
        assert(0 && "Unknown predicate type!");
 
560
      }
 
561
      if (!PredicateCheck.empty())
 
562
        PredicateCheck += " && ";
 
563
      PredicateCheck += "(" + Def->getValueAsString("CondString") + ")";
 
564
    }
 
565
  }
 
566
 
 
567
  return PredicateCheck;
 
568
}
 
569
 
 
570
//===----------------------------------------------------------------------===//
 
571
// SDTypeConstraint implementation
 
572
//
 
573
 
 
574
SDTypeConstraint::SDTypeConstraint(Record *R) {
 
575
  OperandNo = R->getValueAsInt("OperandNum");
 
576
  
 
577
  if (R->isSubClassOf("SDTCisVT")) {
 
578
    ConstraintType = SDTCisVT;
 
579
    x.SDTCisVT_Info.VT = getValueType(R->getValueAsDef("VT"));
 
580
    if (x.SDTCisVT_Info.VT == MVT::isVoid)
 
581
      throw TGError(R->getLoc(), "Cannot use 'Void' as type to SDTCisVT");
 
582
      
 
583
  } else if (R->isSubClassOf("SDTCisPtrTy")) {
 
584
    ConstraintType = SDTCisPtrTy;
 
585
  } else if (R->isSubClassOf("SDTCisInt")) {
 
586
    ConstraintType = SDTCisInt;
 
587
  } else if (R->isSubClassOf("SDTCisFP")) {
 
588
    ConstraintType = SDTCisFP;
 
589
  } else if (R->isSubClassOf("SDTCisVec")) {
 
590
    ConstraintType = SDTCisVec;
 
591
  } else if (R->isSubClassOf("SDTCisSameAs")) {
 
592
    ConstraintType = SDTCisSameAs;
 
593
    x.SDTCisSameAs_Info.OtherOperandNum = R->getValueAsInt("OtherOperandNum");
 
594
  } else if (R->isSubClassOf("SDTCisVTSmallerThanOp")) {
 
595
    ConstraintType = SDTCisVTSmallerThanOp;
 
596
    x.SDTCisVTSmallerThanOp_Info.OtherOperandNum = 
 
597
      R->getValueAsInt("OtherOperandNum");
 
598
  } else if (R->isSubClassOf("SDTCisOpSmallerThanOp")) {
 
599
    ConstraintType = SDTCisOpSmallerThanOp;
 
600
    x.SDTCisOpSmallerThanOp_Info.BigOperandNum = 
 
601
      R->getValueAsInt("BigOperandNum");
 
602
  } else if (R->isSubClassOf("SDTCisEltOfVec")) {
 
603
    ConstraintType = SDTCisEltOfVec;
 
604
    x.SDTCisEltOfVec_Info.OtherOperandNum = R->getValueAsInt("OtherOpNum");
 
605
  } else {
 
606
    errs() << "Unrecognized SDTypeConstraint '" << R->getName() << "'!\n";
 
607
    exit(1);
 
608
  }
 
609
}
 
610
 
 
611
/// getOperandNum - Return the node corresponding to operand #OpNo in tree
 
612
/// N, and the result number in ResNo.
 
613
static TreePatternNode *getOperandNum(unsigned OpNo, TreePatternNode *N,
 
614
                                      const SDNodeInfo &NodeInfo,
 
615
                                      unsigned &ResNo) {
 
616
  unsigned NumResults = NodeInfo.getNumResults();
 
617
  if (OpNo < NumResults) {
 
618
    ResNo = OpNo;
 
619
    return N;
 
620
  }
 
621
  
 
622
  OpNo -= NumResults;
 
623
  
 
624
  if (OpNo >= N->getNumChildren()) {
 
625
    errs() << "Invalid operand number in type constraint " 
 
626
           << (OpNo+NumResults) << " ";
 
627
    N->dump();
 
628
    errs() << '\n';
 
629
    exit(1);
 
630
  }
 
631
 
 
632
  return N->getChild(OpNo);
 
633
}
 
634
 
 
635
/// ApplyTypeConstraint - Given a node in a pattern, apply this type
 
636
/// constraint to the nodes operands.  This returns true if it makes a
 
637
/// change, false otherwise.  If a type contradiction is found, throw an
 
638
/// exception.
 
639
bool SDTypeConstraint::ApplyTypeConstraint(TreePatternNode *N,
 
640
                                           const SDNodeInfo &NodeInfo,
 
641
                                           TreePattern &TP) const {
 
642
  unsigned ResNo = 0; // The result number being referenced.
 
643
  TreePatternNode *NodeToApply = getOperandNum(OperandNo, N, NodeInfo, ResNo);
 
644
  
 
645
  switch (ConstraintType) {
 
646
  default: assert(0 && "Unknown constraint type!");
 
647
  case SDTCisVT:
 
648
    // Operand must be a particular type.
 
649
    return NodeToApply->UpdateNodeType(ResNo, x.SDTCisVT_Info.VT, TP);
 
650
  case SDTCisPtrTy:
 
651
    // Operand must be same as target pointer type.
 
652
    return NodeToApply->UpdateNodeType(ResNo, MVT::iPTR, TP);
 
653
  case SDTCisInt:
 
654
    // Require it to be one of the legal integer VTs.
 
655
    return NodeToApply->getExtType(ResNo).EnforceInteger(TP);
 
656
  case SDTCisFP:
 
657
    // Require it to be one of the legal fp VTs.
 
658
    return NodeToApply->getExtType(ResNo).EnforceFloatingPoint(TP);
 
659
  case SDTCisVec:
 
660
    // Require it to be one of the legal vector VTs.
 
661
    return NodeToApply->getExtType(ResNo).EnforceVector(TP);
 
662
  case SDTCisSameAs: {
 
663
    unsigned OResNo = 0;
 
664
    TreePatternNode *OtherNode =
 
665
      getOperandNum(x.SDTCisSameAs_Info.OtherOperandNum, N, NodeInfo, OResNo);
 
666
    return NodeToApply->UpdateNodeType(OResNo, OtherNode->getExtType(ResNo),TP)|
 
667
           OtherNode->UpdateNodeType(ResNo,NodeToApply->getExtType(OResNo),TP);
 
668
  }
 
669
  case SDTCisVTSmallerThanOp: {
 
670
    // The NodeToApply must be a leaf node that is a VT.  OtherOperandNum must
 
671
    // have an integer type that is smaller than the VT.
 
672
    if (!NodeToApply->isLeaf() ||
 
673
        !dynamic_cast<DefInit*>(NodeToApply->getLeafValue()) ||
 
674
        !static_cast<DefInit*>(NodeToApply->getLeafValue())->getDef()
 
675
               ->isSubClassOf("ValueType"))
 
676
      TP.error(N->getOperator()->getName() + " expects a VT operand!");
 
677
    MVT::SimpleValueType VT =
 
678
     getValueType(static_cast<DefInit*>(NodeToApply->getLeafValue())->getDef());
 
679
    
 
680
    EEVT::TypeSet TypeListTmp(VT, TP);
 
681
    
 
682
    unsigned OResNo = 0;
 
683
    TreePatternNode *OtherNode =
 
684
      getOperandNum(x.SDTCisVTSmallerThanOp_Info.OtherOperandNum, N, NodeInfo,
 
685
                    OResNo);
 
686
 
 
687
    return TypeListTmp.EnforceSmallerThan(OtherNode->getExtType(OResNo), TP);
 
688
  }
 
689
  case SDTCisOpSmallerThanOp: {
 
690
    unsigned BResNo = 0;
 
691
    TreePatternNode *BigOperand =
 
692
      getOperandNum(x.SDTCisOpSmallerThanOp_Info.BigOperandNum, N, NodeInfo,
 
693
                    BResNo);
 
694
    return NodeToApply->getExtType(ResNo).
 
695
                  EnforceSmallerThan(BigOperand->getExtType(BResNo), TP);
 
696
  }
 
697
  case SDTCisEltOfVec: {
 
698
    unsigned VResNo = 0;
 
699
    TreePatternNode *VecOperand =
 
700
      getOperandNum(x.SDTCisEltOfVec_Info.OtherOperandNum, N, NodeInfo,
 
701
                    VResNo);
 
702
    
 
703
    // Filter vector types out of VecOperand that don't have the right element
 
704
    // type.
 
705
    return VecOperand->getExtType(VResNo).
 
706
      EnforceVectorEltTypeIs(NodeToApply->getExtType(ResNo), TP);
 
707
  }
 
708
  }  
 
709
  return false;
 
710
}
 
711
 
 
712
//===----------------------------------------------------------------------===//
 
713
// SDNodeInfo implementation
 
714
//
 
715
SDNodeInfo::SDNodeInfo(Record *R) : Def(R) {
 
716
  EnumName    = R->getValueAsString("Opcode");
 
717
  SDClassName = R->getValueAsString("SDClass");
 
718
  Record *TypeProfile = R->getValueAsDef("TypeProfile");
 
719
  NumResults = TypeProfile->getValueAsInt("NumResults");
 
720
  NumOperands = TypeProfile->getValueAsInt("NumOperands");
 
721
  
 
722
  // Parse the properties.
 
723
  Properties = 0;
 
724
  std::vector<Record*> PropList = R->getValueAsListOfDefs("Properties");
 
725
  for (unsigned i = 0, e = PropList.size(); i != e; ++i) {
 
726
    if (PropList[i]->getName() == "SDNPCommutative") {
 
727
      Properties |= 1 << SDNPCommutative;
 
728
    } else if (PropList[i]->getName() == "SDNPAssociative") {
 
729
      Properties |= 1 << SDNPAssociative;
 
730
    } else if (PropList[i]->getName() == "SDNPHasChain") {
 
731
      Properties |= 1 << SDNPHasChain;
 
732
    } else if (PropList[i]->getName() == "SDNPOutFlag") {
 
733
      Properties |= 1 << SDNPOutFlag;
 
734
    } else if (PropList[i]->getName() == "SDNPInFlag") {
 
735
      Properties |= 1 << SDNPInFlag;
 
736
    } else if (PropList[i]->getName() == "SDNPOptInFlag") {
 
737
      Properties |= 1 << SDNPOptInFlag;
 
738
    } else if (PropList[i]->getName() == "SDNPMayStore") {
 
739
      Properties |= 1 << SDNPMayStore;
 
740
    } else if (PropList[i]->getName() == "SDNPMayLoad") {
 
741
      Properties |= 1 << SDNPMayLoad;
 
742
    } else if (PropList[i]->getName() == "SDNPSideEffect") {
 
743
      Properties |= 1 << SDNPSideEffect;
 
744
    } else if (PropList[i]->getName() == "SDNPMemOperand") {
 
745
      Properties |= 1 << SDNPMemOperand;
 
746
    } else if (PropList[i]->getName() == "SDNPVariadic") {
 
747
      Properties |= 1 << SDNPVariadic;
 
748
    } else {
 
749
      errs() << "Unknown SD Node property '" << PropList[i]->getName()
 
750
             << "' on node '" << R->getName() << "'!\n";
 
751
      exit(1);
 
752
    }
 
753
  }
 
754
  
 
755
  
 
756
  // Parse the type constraints.
 
757
  std::vector<Record*> ConstraintList =
 
758
    TypeProfile->getValueAsListOfDefs("Constraints");
 
759
  TypeConstraints.assign(ConstraintList.begin(), ConstraintList.end());
 
760
}
 
761
 
 
762
/// getKnownType - If the type constraints on this node imply a fixed type
 
763
/// (e.g. all stores return void, etc), then return it as an
 
764
/// MVT::SimpleValueType.  Otherwise, return EEVT::Other.
 
765
MVT::SimpleValueType SDNodeInfo::getKnownType(unsigned ResNo) const {
 
766
  unsigned NumResults = getNumResults();
 
767
  assert(NumResults <= 1 &&
 
768
         "We only work with nodes with zero or one result so far!");
 
769
  assert(ResNo == 0 && "Only handles single result nodes so far");
 
770
  
 
771
  for (unsigned i = 0, e = TypeConstraints.size(); i != e; ++i) {
 
772
    // Make sure that this applies to the correct node result.
 
773
    if (TypeConstraints[i].OperandNo >= NumResults)  // FIXME: need value #
 
774
      continue;
 
775
    
 
776
    switch (TypeConstraints[i].ConstraintType) {
 
777
    default: break;
 
778
    case SDTypeConstraint::SDTCisVT:
 
779
      return TypeConstraints[i].x.SDTCisVT_Info.VT;
 
780
    case SDTypeConstraint::SDTCisPtrTy:
 
781
      return MVT::iPTR;
 
782
    }
 
783
  }
 
784
  return MVT::Other;
 
785
}
 
786
 
 
787
//===----------------------------------------------------------------------===//
 
788
// TreePatternNode implementation
 
789
//
 
790
 
 
791
TreePatternNode::~TreePatternNode() {
 
792
#if 0 // FIXME: implement refcounted tree nodes!
 
793
  for (unsigned i = 0, e = getNumChildren(); i != e; ++i)
 
794
    delete getChild(i);
 
795
#endif
 
796
}
 
797
 
 
798
static unsigned GetNumNodeResults(Record *Operator, CodeGenDAGPatterns &CDP) {
 
799
  if (Operator->getName() == "set" ||
 
800
      Operator->getName() == "implicit")
 
801
    return 0;  // All return nothing.
 
802
  
 
803
  if (Operator->isSubClassOf("Intrinsic"))
 
804
    return CDP.getIntrinsic(Operator).IS.RetVTs.size();
 
805
  
 
806
  if (Operator->isSubClassOf("SDNode"))
 
807
    return CDP.getSDNodeInfo(Operator).getNumResults();
 
808
  
 
809
  if (Operator->isSubClassOf("PatFrag")) {
 
810
    // If we've already parsed this pattern fragment, get it.  Otherwise, handle
 
811
    // the forward reference case where one pattern fragment references another
 
812
    // before it is processed.
 
813
    if (TreePattern *PFRec = CDP.getPatternFragmentIfRead(Operator))
 
814
      return PFRec->getOnlyTree()->getNumTypes();
 
815
    
 
816
    // Get the result tree.
 
817
    DagInit *Tree = Operator->getValueAsDag("Fragment");
 
818
    Record *Op = 0;
 
819
    if (Tree && dynamic_cast<DefInit*>(Tree->getOperator()))
 
820
      Op = dynamic_cast<DefInit*>(Tree->getOperator())->getDef();
 
821
    assert(Op && "Invalid Fragment");
 
822
    return GetNumNodeResults(Op, CDP);
 
823
  }
 
824
  
 
825
  if (Operator->isSubClassOf("Instruction")) {
 
826
    CodeGenInstruction &InstInfo = CDP.getTargetInfo().getInstruction(Operator);
 
827
 
 
828
    // FIXME: Should allow access to all the results here.
 
829
    unsigned NumDefsToAdd = InstInfo.NumDefs ? 1 : 0;
 
830
    
 
831
    // Add on one implicit def if it has a resolvable type.
 
832
    if (InstInfo.HasOneImplicitDefWithKnownVT(CDP.getTargetInfo()) !=MVT::Other)
 
833
      ++NumDefsToAdd;
 
834
    return NumDefsToAdd;
 
835
  }
 
836
  
 
837
  if (Operator->isSubClassOf("SDNodeXForm"))
 
838
    return 1;  // FIXME: Generalize SDNodeXForm
 
839
  
 
840
  Operator->dump();
 
841
  errs() << "Unhandled node in GetNumNodeResults\n";
 
842
  exit(1);
 
843
}
 
844
 
 
845
void TreePatternNode::print(raw_ostream &OS) const {
 
846
  if (isLeaf())
 
847
    OS << *getLeafValue();
 
848
  else
 
849
    OS << '(' << getOperator()->getName();
 
850
 
 
851
  for (unsigned i = 0, e = Types.size(); i != e; ++i)
 
852
    OS << ':' << getExtType(i).getName();
 
853
 
 
854
  if (!isLeaf()) {
 
855
    if (getNumChildren() != 0) {
 
856
      OS << " ";
 
857
      getChild(0)->print(OS);
 
858
      for (unsigned i = 1, e = getNumChildren(); i != e; ++i) {
 
859
        OS << ", ";
 
860
        getChild(i)->print(OS);
 
861
      }
 
862
    }
 
863
    OS << ")";
 
864
  }
 
865
  
 
866
  for (unsigned i = 0, e = PredicateFns.size(); i != e; ++i)
 
867
    OS << "<<P:" << PredicateFns[i] << ">>";
 
868
  if (TransformFn)
 
869
    OS << "<<X:" << TransformFn->getName() << ">>";
 
870
  if (!getName().empty())
 
871
    OS << ":$" << getName();
 
872
 
 
873
}
 
874
void TreePatternNode::dump() const {
 
875
  print(errs());
 
876
}
 
877
 
 
878
/// isIsomorphicTo - Return true if this node is recursively
 
879
/// isomorphic to the specified node.  For this comparison, the node's
 
880
/// entire state is considered. The assigned name is ignored, since
 
881
/// nodes with differing names are considered isomorphic. However, if
 
882
/// the assigned name is present in the dependent variable set, then
 
883
/// the assigned name is considered significant and the node is
 
884
/// isomorphic if the names match.
 
885
bool TreePatternNode::isIsomorphicTo(const TreePatternNode *N,
 
886
                                     const MultipleUseVarSet &DepVars) const {
 
887
  if (N == this) return true;
 
888
  if (N->isLeaf() != isLeaf() || getExtTypes() != N->getExtTypes() ||
 
889
      getPredicateFns() != N->getPredicateFns() ||
 
890
      getTransformFn() != N->getTransformFn())
 
891
    return false;
 
892
 
 
893
  if (isLeaf()) {
 
894
    if (DefInit *DI = dynamic_cast<DefInit*>(getLeafValue())) {
 
895
      if (DefInit *NDI = dynamic_cast<DefInit*>(N->getLeafValue())) {
 
896
        return ((DI->getDef() == NDI->getDef())
 
897
                && (DepVars.find(getName()) == DepVars.end()
 
898
                    || getName() == N->getName()));
 
899
      }
 
900
    }
 
901
    return getLeafValue() == N->getLeafValue();
 
902
  }
 
903
  
 
904
  if (N->getOperator() != getOperator() ||
 
905
      N->getNumChildren() != getNumChildren()) return false;
 
906
  for (unsigned i = 0, e = getNumChildren(); i != e; ++i)
 
907
    if (!getChild(i)->isIsomorphicTo(N->getChild(i), DepVars))
 
908
      return false;
 
909
  return true;
 
910
}
 
911
 
 
912
/// clone - Make a copy of this tree and all of its children.
 
913
///
 
914
TreePatternNode *TreePatternNode::clone() const {
 
915
  TreePatternNode *New;
 
916
  if (isLeaf()) {
 
917
    New = new TreePatternNode(getLeafValue(), getNumTypes());
 
918
  } else {
 
919
    std::vector<TreePatternNode*> CChildren;
 
920
    CChildren.reserve(Children.size());
 
921
    for (unsigned i = 0, e = getNumChildren(); i != e; ++i)
 
922
      CChildren.push_back(getChild(i)->clone());
 
923
    New = new TreePatternNode(getOperator(), CChildren, getNumTypes());
 
924
  }
 
925
  New->setName(getName());
 
926
  New->Types = Types;
 
927
  New->setPredicateFns(getPredicateFns());
 
928
  New->setTransformFn(getTransformFn());
 
929
  return New;
 
930
}
 
931
 
 
932
/// RemoveAllTypes - Recursively strip all the types of this tree.
 
933
void TreePatternNode::RemoveAllTypes() {
 
934
  for (unsigned i = 0, e = Types.size(); i != e; ++i)
 
935
    Types[i] = EEVT::TypeSet();  // Reset to unknown type.
 
936
  if (isLeaf()) return;
 
937
  for (unsigned i = 0, e = getNumChildren(); i != e; ++i)
 
938
    getChild(i)->RemoveAllTypes();
 
939
}
 
940
 
 
941
 
 
942
/// SubstituteFormalArguments - Replace the formal arguments in this tree
 
943
/// with actual values specified by ArgMap.
 
944
void TreePatternNode::
 
945
SubstituteFormalArguments(std::map<std::string, TreePatternNode*> &ArgMap) {
 
946
  if (isLeaf()) return;
 
947
  
 
948
  for (unsigned i = 0, e = getNumChildren(); i != e; ++i) {
 
949
    TreePatternNode *Child = getChild(i);
 
950
    if (Child->isLeaf()) {
 
951
      Init *Val = Child->getLeafValue();
 
952
      if (dynamic_cast<DefInit*>(Val) &&
 
953
          static_cast<DefInit*>(Val)->getDef()->getName() == "node") {
 
954
        // We found a use of a formal argument, replace it with its value.
 
955
        TreePatternNode *NewChild = ArgMap[Child->getName()];
 
956
        assert(NewChild && "Couldn't find formal argument!");
 
957
        assert((Child->getPredicateFns().empty() ||
 
958
                NewChild->getPredicateFns() == Child->getPredicateFns()) &&
 
959
               "Non-empty child predicate clobbered!");
 
960
        setChild(i, NewChild);
 
961
      }
 
962
    } else {
 
963
      getChild(i)->SubstituteFormalArguments(ArgMap);
 
964
    }
 
965
  }
 
966
}
 
967
 
 
968
 
 
969
/// InlinePatternFragments - If this pattern refers to any pattern
 
970
/// fragments, inline them into place, giving us a pattern without any
 
971
/// PatFrag references.
 
972
TreePatternNode *TreePatternNode::InlinePatternFragments(TreePattern &TP) {
 
973
  if (isLeaf()) return this;  // nothing to do.
 
974
  Record *Op = getOperator();
 
975
  
 
976
  if (!Op->isSubClassOf("PatFrag")) {
 
977
    // Just recursively inline children nodes.
 
978
    for (unsigned i = 0, e = getNumChildren(); i != e; ++i) {
 
979
      TreePatternNode *Child = getChild(i);
 
980
      TreePatternNode *NewChild = Child->InlinePatternFragments(TP);
 
981
 
 
982
      assert((Child->getPredicateFns().empty() ||
 
983
              NewChild->getPredicateFns() == Child->getPredicateFns()) &&
 
984
             "Non-empty child predicate clobbered!");
 
985
 
 
986
      setChild(i, NewChild);
 
987
    }
 
988
    return this;
 
989
  }
 
990
 
 
991
  // Otherwise, we found a reference to a fragment.  First, look up its
 
992
  // TreePattern record.
 
993
  TreePattern *Frag = TP.getDAGPatterns().getPatternFragment(Op);
 
994
  
 
995
  // Verify that we are passing the right number of operands.
 
996
  if (Frag->getNumArgs() != Children.size())
 
997
    TP.error("'" + Op->getName() + "' fragment requires " +
 
998
             utostr(Frag->getNumArgs()) + " operands!");
 
999
 
 
1000
  TreePatternNode *FragTree = Frag->getOnlyTree()->clone();
 
1001
 
 
1002
  std::string Code = Op->getValueAsCode("Predicate");
 
1003
  if (!Code.empty())
 
1004
    FragTree->addPredicateFn("Predicate_"+Op->getName());
 
1005
 
 
1006
  // Resolve formal arguments to their actual value.
 
1007
  if (Frag->getNumArgs()) {
 
1008
    // Compute the map of formal to actual arguments.
 
1009
    std::map<std::string, TreePatternNode*> ArgMap;
 
1010
    for (unsigned i = 0, e = Frag->getNumArgs(); i != e; ++i)
 
1011
      ArgMap[Frag->getArgName(i)] = getChild(i)->InlinePatternFragments(TP);
 
1012
  
 
1013
    FragTree->SubstituteFormalArguments(ArgMap);
 
1014
  }
 
1015
  
 
1016
  FragTree->setName(getName());
 
1017
  for (unsigned i = 0, e = Types.size(); i != e; ++i)
 
1018
    FragTree->UpdateNodeType(i, getExtType(i), TP);
 
1019
 
 
1020
  // Transfer in the old predicates.
 
1021
  for (unsigned i = 0, e = getPredicateFns().size(); i != e; ++i)
 
1022
    FragTree->addPredicateFn(getPredicateFns()[i]);
 
1023
 
 
1024
  // Get a new copy of this fragment to stitch into here.
 
1025
  //delete this;    // FIXME: implement refcounting!
 
1026
  
 
1027
  // The fragment we inlined could have recursive inlining that is needed.  See
 
1028
  // if there are any pattern fragments in it and inline them as needed.
 
1029
  return FragTree->InlinePatternFragments(TP);
 
1030
}
 
1031
 
 
1032
/// getImplicitType - Check to see if the specified record has an implicit
 
1033
/// type which should be applied to it.  This will infer the type of register
 
1034
/// references from the register file information, for example.
 
1035
///
 
1036
static EEVT::TypeSet getImplicitType(Record *R, unsigned ResNo,
 
1037
                                     bool NotRegisters, TreePattern &TP) {
 
1038
  // Check to see if this is a register or a register class.
 
1039
  if (R->isSubClassOf("RegisterClass")) {
 
1040
    assert(ResNo == 0 && "Regclass ref only has one result!");
 
1041
    if (NotRegisters) 
 
1042
      return EEVT::TypeSet(); // Unknown.
 
1043
    const CodeGenTarget &T = TP.getDAGPatterns().getTargetInfo();
 
1044
    return EEVT::TypeSet(T.getRegisterClass(R).getValueTypes());
 
1045
  }
 
1046
  
 
1047
  if (R->isSubClassOf("PatFrag")) {
 
1048
    assert(ResNo == 0 && "FIXME: PatFrag with multiple results?");
 
1049
    // Pattern fragment types will be resolved when they are inlined.
 
1050
    return EEVT::TypeSet(); // Unknown.
 
1051
  }
 
1052
  
 
1053
  if (R->isSubClassOf("Register")) {
 
1054
    assert(ResNo == 0 && "Registers only produce one result!");
 
1055
    if (NotRegisters) 
 
1056
      return EEVT::TypeSet(); // Unknown.
 
1057
    const CodeGenTarget &T = TP.getDAGPatterns().getTargetInfo();
 
1058
    return EEVT::TypeSet(T.getRegisterVTs(R));
 
1059
  }
 
1060
 
 
1061
  if (R->isSubClassOf("SubRegIndex")) {
 
1062
    assert(ResNo == 0 && "SubRegisterIndices only produce one result!");
 
1063
    return EEVT::TypeSet();
 
1064
  }
 
1065
  
 
1066
  if (R->isSubClassOf("ValueType") || R->isSubClassOf("CondCode")) {
 
1067
    assert(ResNo == 0 && "This node only has one result!");
 
1068
    // Using a VTSDNode or CondCodeSDNode.
 
1069
    return EEVT::TypeSet(MVT::Other, TP);
 
1070
  }
 
1071
  
 
1072
  if (R->isSubClassOf("ComplexPattern")) {
 
1073
    assert(ResNo == 0 && "FIXME: ComplexPattern with multiple results?");
 
1074
    if (NotRegisters) 
 
1075
      return EEVT::TypeSet(); // Unknown.
 
1076
   return EEVT::TypeSet(TP.getDAGPatterns().getComplexPattern(R).getValueType(),
 
1077
                         TP);
 
1078
  }
 
1079
  if (R->isSubClassOf("PointerLikeRegClass")) {
 
1080
    assert(ResNo == 0 && "Regclass can only have one result!");
 
1081
    return EEVT::TypeSet(MVT::iPTR, TP);
 
1082
  }
 
1083
  
 
1084
  if (R->getName() == "node" || R->getName() == "srcvalue" ||
 
1085
      R->getName() == "zero_reg") {
 
1086
    // Placeholder.
 
1087
    return EEVT::TypeSet(); // Unknown.
 
1088
  }
 
1089
  
 
1090
  TP.error("Unknown node flavor used in pattern: " + R->getName());
 
1091
  return EEVT::TypeSet(MVT::Other, TP);
 
1092
}
 
1093
 
 
1094
 
 
1095
/// getIntrinsicInfo - If this node corresponds to an intrinsic, return the
 
1096
/// CodeGenIntrinsic information for it, otherwise return a null pointer.
 
1097
const CodeGenIntrinsic *TreePatternNode::
 
1098
getIntrinsicInfo(const CodeGenDAGPatterns &CDP) const {
 
1099
  if (getOperator() != CDP.get_intrinsic_void_sdnode() &&
 
1100
      getOperator() != CDP.get_intrinsic_w_chain_sdnode() &&
 
1101
      getOperator() != CDP.get_intrinsic_wo_chain_sdnode())
 
1102
    return 0;
 
1103
    
 
1104
  unsigned IID = 
 
1105
    dynamic_cast<IntInit*>(getChild(0)->getLeafValue())->getValue();
 
1106
  return &CDP.getIntrinsicInfo(IID);
 
1107
}
 
1108
 
 
1109
/// getComplexPatternInfo - If this node corresponds to a ComplexPattern,
 
1110
/// return the ComplexPattern information, otherwise return null.
 
1111
const ComplexPattern *
 
1112
TreePatternNode::getComplexPatternInfo(const CodeGenDAGPatterns &CGP) const {
 
1113
  if (!isLeaf()) return 0;
 
1114
  
 
1115
  DefInit *DI = dynamic_cast<DefInit*>(getLeafValue());
 
1116
  if (DI && DI->getDef()->isSubClassOf("ComplexPattern"))
 
1117
    return &CGP.getComplexPattern(DI->getDef());
 
1118
  return 0;
 
1119
}
 
1120
 
 
1121
/// NodeHasProperty - Return true if this node has the specified property.
 
1122
bool TreePatternNode::NodeHasProperty(SDNP Property,
 
1123
                                      const CodeGenDAGPatterns &CGP) const {
 
1124
  if (isLeaf()) {
 
1125
    if (const ComplexPattern *CP = getComplexPatternInfo(CGP))
 
1126
      return CP->hasProperty(Property);
 
1127
    return false;
 
1128
  }
 
1129
  
 
1130
  Record *Operator = getOperator();
 
1131
  if (!Operator->isSubClassOf("SDNode")) return false;
 
1132
  
 
1133
  return CGP.getSDNodeInfo(Operator).hasProperty(Property);
 
1134
}
 
1135
 
 
1136
 
 
1137
 
 
1138
 
 
1139
/// TreeHasProperty - Return true if any node in this tree has the specified
 
1140
/// property.
 
1141
bool TreePatternNode::TreeHasProperty(SDNP Property,
 
1142
                                      const CodeGenDAGPatterns &CGP) const {
 
1143
  if (NodeHasProperty(Property, CGP))
 
1144
    return true;
 
1145
  for (unsigned i = 0, e = getNumChildren(); i != e; ++i)
 
1146
    if (getChild(i)->TreeHasProperty(Property, CGP))
 
1147
      return true;
 
1148
  return false;
 
1149
}  
 
1150
 
 
1151
/// isCommutativeIntrinsic - Return true if the node corresponds to a
 
1152
/// commutative intrinsic.
 
1153
bool
 
1154
TreePatternNode::isCommutativeIntrinsic(const CodeGenDAGPatterns &CDP) const {
 
1155
  if (const CodeGenIntrinsic *Int = getIntrinsicInfo(CDP))
 
1156
    return Int->isCommutative;
 
1157
  return false;
 
1158
}
 
1159
 
 
1160
 
 
1161
/// ApplyTypeConstraints - Apply all of the type constraints relevant to
 
1162
/// this node and its children in the tree.  This returns true if it makes a
 
1163
/// change, false otherwise.  If a type contradiction is found, throw an
 
1164
/// exception.
 
1165
bool TreePatternNode::ApplyTypeConstraints(TreePattern &TP, bool NotRegisters) {
 
1166
  CodeGenDAGPatterns &CDP = TP.getDAGPatterns();
 
1167
  if (isLeaf()) {
 
1168
    if (DefInit *DI = dynamic_cast<DefInit*>(getLeafValue())) {
 
1169
      // If it's a regclass or something else known, include the type.
 
1170
      bool MadeChange = false;
 
1171
      for (unsigned i = 0, e = Types.size(); i != e; ++i)
 
1172
        MadeChange |= UpdateNodeType(i, getImplicitType(DI->getDef(), i,
 
1173
                                                        NotRegisters, TP), TP);
 
1174
      return MadeChange;
 
1175
    }
 
1176
    
 
1177
    if (IntInit *II = dynamic_cast<IntInit*>(getLeafValue())) {
 
1178
      assert(Types.size() == 1 && "Invalid IntInit");
 
1179
      
 
1180
      // Int inits are always integers. :)
 
1181
      bool MadeChange = Types[0].EnforceInteger(TP);
 
1182
      
 
1183
      if (!Types[0].isConcrete())
 
1184
        return MadeChange;
 
1185
      
 
1186
      MVT::SimpleValueType VT = getType(0);
 
1187
      if (VT == MVT::iPTR || VT == MVT::iPTRAny)
 
1188
        return MadeChange;
 
1189
      
 
1190
      unsigned Size = EVT(VT).getSizeInBits();
 
1191
      // Make sure that the value is representable for this type.
 
1192
      if (Size >= 32) return MadeChange;
 
1193
      
 
1194
      int Val = (II->getValue() << (32-Size)) >> (32-Size);
 
1195
      if (Val == II->getValue()) return MadeChange;
 
1196
      
 
1197
      // If sign-extended doesn't fit, does it fit as unsigned?
 
1198
      unsigned ValueMask;
 
1199
      unsigned UnsignedVal;
 
1200
      ValueMask = unsigned(~uint32_t(0UL) >> (32-Size));
 
1201
      UnsignedVal = unsigned(II->getValue());
 
1202
 
 
1203
      if ((ValueMask & UnsignedVal) == UnsignedVal)
 
1204
        return MadeChange;
 
1205
      
 
1206
      TP.error("Integer value '" + itostr(II->getValue())+
 
1207
               "' is out of range for type '" + getEnumName(getType(0)) + "'!");
 
1208
      return MadeChange;
 
1209
    }
 
1210
    return false;
 
1211
  }
 
1212
  
 
1213
  // special handling for set, which isn't really an SDNode.
 
1214
  if (getOperator()->getName() == "set") {
 
1215
    assert(getNumTypes() == 0 && "Set doesn't produce a value");
 
1216
    assert(getNumChildren() >= 2 && "Missing RHS of a set?");
 
1217
    unsigned NC = getNumChildren();
 
1218
    
 
1219
    TreePatternNode *SetVal = getChild(NC-1);
 
1220
    bool MadeChange = SetVal->ApplyTypeConstraints(TP, NotRegisters);
 
1221
 
 
1222
    for (unsigned i = 0; i < NC-1; ++i) {
 
1223
      TreePatternNode *Child = getChild(i);
 
1224
      MadeChange |= Child->ApplyTypeConstraints(TP, NotRegisters);
 
1225
    
 
1226
      // Types of operands must match.
 
1227
      MadeChange |= Child->UpdateNodeType(0, SetVal->getExtType(i), TP);
 
1228
      MadeChange |= SetVal->UpdateNodeType(i, Child->getExtType(0), TP);
 
1229
    }
 
1230
    return MadeChange;
 
1231
  }
 
1232
  
 
1233
  if (getOperator()->getName() == "implicit") {
 
1234
    assert(getNumTypes() == 0 && "Node doesn't produce a value");
 
1235
 
 
1236
    bool MadeChange = false;
 
1237
    for (unsigned i = 0; i < getNumChildren(); ++i)
 
1238
      MadeChange = getChild(i)->ApplyTypeConstraints(TP, NotRegisters);
 
1239
    return MadeChange;
 
1240
  }
 
1241
  
 
1242
  if (getOperator()->getName() == "COPY_TO_REGCLASS") {
 
1243
    bool MadeChange = false;
 
1244
    MadeChange |= getChild(0)->ApplyTypeConstraints(TP, NotRegisters);
 
1245
    MadeChange |= getChild(1)->ApplyTypeConstraints(TP, NotRegisters);
 
1246
    
 
1247
    assert(getChild(0)->getNumTypes() == 1 &&
 
1248
           getChild(1)->getNumTypes() == 1 && "Unhandled case");
 
1249
    
 
1250
    // child #1 of COPY_TO_REGCLASS should be a register class.  We don't care
 
1251
    // what type it gets, so if it didn't get a concrete type just give it the
 
1252
    // first viable type from the reg class.
 
1253
    if (!getChild(1)->hasTypeSet(0) &&
 
1254
        !getChild(1)->getExtType(0).isCompletelyUnknown()) {
 
1255
      MVT::SimpleValueType RCVT = getChild(1)->getExtType(0).getTypeList()[0];
 
1256
      MadeChange |= getChild(1)->UpdateNodeType(0, RCVT, TP);
 
1257
    }
 
1258
    return MadeChange;
 
1259
  }
 
1260
  
 
1261
  if (const CodeGenIntrinsic *Int = getIntrinsicInfo(CDP)) {
 
1262
    bool MadeChange = false;
 
1263
 
 
1264
    // Apply the result type to the node.
 
1265
    unsigned NumRetVTs = Int->IS.RetVTs.size();
 
1266
    unsigned NumParamVTs = Int->IS.ParamVTs.size();
 
1267
    
 
1268
    for (unsigned i = 0, e = NumRetVTs; i != e; ++i)
 
1269
      MadeChange |= UpdateNodeType(i, Int->IS.RetVTs[i], TP);
 
1270
 
 
1271
    if (getNumChildren() != NumParamVTs + 1)
 
1272
      TP.error("Intrinsic '" + Int->Name + "' expects " +
 
1273
               utostr(NumParamVTs) + " operands, not " +
 
1274
               utostr(getNumChildren() - 1) + " operands!");
 
1275
 
 
1276
    // Apply type info to the intrinsic ID.
 
1277
    MadeChange |= getChild(0)->UpdateNodeType(0, MVT::iPTR, TP);
 
1278
    
 
1279
    for (unsigned i = 0, e = getNumChildren()-1; i != e; ++i) {
 
1280
      MadeChange |= getChild(i+1)->ApplyTypeConstraints(TP, NotRegisters);
 
1281
      
 
1282
      MVT::SimpleValueType OpVT = Int->IS.ParamVTs[i];
 
1283
      assert(getChild(i+1)->getNumTypes() == 1 && "Unhandled case");
 
1284
      MadeChange |= getChild(i+1)->UpdateNodeType(0, OpVT, TP);
 
1285
    }
 
1286
    return MadeChange;
 
1287
  }
 
1288
  
 
1289
  if (getOperator()->isSubClassOf("SDNode")) {
 
1290
    const SDNodeInfo &NI = CDP.getSDNodeInfo(getOperator());
 
1291
    
 
1292
    // Check that the number of operands is sane.  Negative operands -> varargs.
 
1293
    if (NI.getNumOperands() >= 0 &&
 
1294
        getNumChildren() != (unsigned)NI.getNumOperands())
 
1295
      TP.error(getOperator()->getName() + " node requires exactly " +
 
1296
               itostr(NI.getNumOperands()) + " operands!");
 
1297
    
 
1298
    bool MadeChange = NI.ApplyTypeConstraints(this, TP);
 
1299
    for (unsigned i = 0, e = getNumChildren(); i != e; ++i)
 
1300
      MadeChange |= getChild(i)->ApplyTypeConstraints(TP, NotRegisters);
 
1301
    return MadeChange;
 
1302
  }
 
1303
  
 
1304
  if (getOperator()->isSubClassOf("Instruction")) {
 
1305
    const DAGInstruction &Inst = CDP.getInstruction(getOperator());
 
1306
    CodeGenInstruction &InstInfo =
 
1307
      CDP.getTargetInfo().getInstruction(getOperator());
 
1308
    
 
1309
    bool MadeChange = false;
 
1310
 
 
1311
    // Apply the result types to the node, these come from the things in the
 
1312
    // (outs) list of the instruction.
 
1313
    // FIXME: Cap at one result so far.
 
1314
    unsigned NumResultsToAdd = InstInfo.NumDefs ? 1 : 0;
 
1315
    for (unsigned ResNo = 0; ResNo != NumResultsToAdd; ++ResNo) {
 
1316
      Record *ResultNode = Inst.getResult(ResNo);
 
1317
      
 
1318
      if (ResultNode->isSubClassOf("PointerLikeRegClass")) {
 
1319
        MadeChange |= UpdateNodeType(ResNo, MVT::iPTR, TP);
 
1320
      } else if (ResultNode->getName() == "unknown") {
 
1321
        // Nothing to do.
 
1322
      } else {
 
1323
        assert(ResultNode->isSubClassOf("RegisterClass") &&
 
1324
               "Operands should be register classes!");
 
1325
        const CodeGenRegisterClass &RC = 
 
1326
          CDP.getTargetInfo().getRegisterClass(ResultNode);
 
1327
        MadeChange |= UpdateNodeType(ResNo, RC.getValueTypes(), TP);
 
1328
      }
 
1329
    }
 
1330
    
 
1331
    // If the instruction has implicit defs, we apply the first one as a result.
 
1332
    // FIXME: This sucks, it should apply all implicit defs.
 
1333
    if (!InstInfo.ImplicitDefs.empty()) {
 
1334
      unsigned ResNo = NumResultsToAdd;
 
1335
      
 
1336
      // FIXME: Generalize to multiple possible types and multiple possible
 
1337
      // ImplicitDefs.
 
1338
      MVT::SimpleValueType VT =
 
1339
        InstInfo.HasOneImplicitDefWithKnownVT(CDP.getTargetInfo());
 
1340
      
 
1341
      if (VT != MVT::Other)
 
1342
        MadeChange |= UpdateNodeType(ResNo, VT, TP);
 
1343
    }
 
1344
    
 
1345
    // If this is an INSERT_SUBREG, constrain the source and destination VTs to
 
1346
    // be the same.
 
1347
    if (getOperator()->getName() == "INSERT_SUBREG") {
 
1348
      assert(getChild(0)->getNumTypes() == 1 && "FIXME: Unhandled");
 
1349
      MadeChange |= UpdateNodeType(0, getChild(0)->getExtType(0), TP);
 
1350
      MadeChange |= getChild(0)->UpdateNodeType(0, getExtType(0), TP);
 
1351
    }
 
1352
 
 
1353
    unsigned ChildNo = 0;
 
1354
    for (unsigned i = 0, e = Inst.getNumOperands(); i != e; ++i) {
 
1355
      Record *OperandNode = Inst.getOperand(i);
 
1356
      
 
1357
      // If the instruction expects a predicate or optional def operand, we
 
1358
      // codegen this by setting the operand to it's default value if it has a
 
1359
      // non-empty DefaultOps field.
 
1360
      if ((OperandNode->isSubClassOf("PredicateOperand") ||
 
1361
           OperandNode->isSubClassOf("OptionalDefOperand")) &&
 
1362
          !CDP.getDefaultOperand(OperandNode).DefaultOps.empty())
 
1363
        continue;
 
1364
       
 
1365
      // Verify that we didn't run out of provided operands.
 
1366
      if (ChildNo >= getNumChildren())
 
1367
        TP.error("Instruction '" + getOperator()->getName() +
 
1368
                 "' expects more operands than were provided.");
 
1369
      
 
1370
      MVT::SimpleValueType VT;
 
1371
      TreePatternNode *Child = getChild(ChildNo++);
 
1372
      unsigned ChildResNo = 0;  // Instructions always use res #0 of their op.
 
1373
      
 
1374
      if (OperandNode->isSubClassOf("RegisterClass")) {
 
1375
        const CodeGenRegisterClass &RC = 
 
1376
          CDP.getTargetInfo().getRegisterClass(OperandNode);
 
1377
        MadeChange |= Child->UpdateNodeType(ChildResNo, RC.getValueTypes(), TP);
 
1378
      } else if (OperandNode->isSubClassOf("Operand")) {
 
1379
        VT = getValueType(OperandNode->getValueAsDef("Type"));
 
1380
        MadeChange |= Child->UpdateNodeType(ChildResNo, VT, TP);
 
1381
      } else if (OperandNode->isSubClassOf("PointerLikeRegClass")) {
 
1382
        MadeChange |= Child->UpdateNodeType(ChildResNo, MVT::iPTR, TP);
 
1383
      } else if (OperandNode->getName() == "unknown") {
 
1384
        // Nothing to do.
 
1385
      } else {
 
1386
        assert(0 && "Unknown operand type!");
 
1387
        abort();
 
1388
      }
 
1389
      MadeChange |= Child->ApplyTypeConstraints(TP, NotRegisters);
 
1390
    }
 
1391
 
 
1392
    if (ChildNo != getNumChildren())
 
1393
      TP.error("Instruction '" + getOperator()->getName() +
 
1394
               "' was provided too many operands!");
 
1395
    
 
1396
    return MadeChange;
 
1397
  }
 
1398
  
 
1399
  assert(getOperator()->isSubClassOf("SDNodeXForm") && "Unknown node type!");
 
1400
  
 
1401
  // Node transforms always take one operand.
 
1402
  if (getNumChildren() != 1)
 
1403
    TP.error("Node transform '" + getOperator()->getName() +
 
1404
             "' requires one operand!");
 
1405
 
 
1406
  bool MadeChange = getChild(0)->ApplyTypeConstraints(TP, NotRegisters);
 
1407
 
 
1408
  
 
1409
  // If either the output or input of the xform does not have exact
 
1410
  // type info. We assume they must be the same. Otherwise, it is perfectly
 
1411
  // legal to transform from one type to a completely different type.
 
1412
#if 0
 
1413
  if (!hasTypeSet() || !getChild(0)->hasTypeSet()) {
 
1414
    bool MadeChange = UpdateNodeType(getChild(0)->getExtType(), TP);
 
1415
    MadeChange |= getChild(0)->UpdateNodeType(getExtType(), TP);
 
1416
    return MadeChange;
 
1417
  }
 
1418
#endif
 
1419
  return MadeChange;
 
1420
}
 
1421
 
 
1422
/// OnlyOnRHSOfCommutative - Return true if this value is only allowed on the
 
1423
/// RHS of a commutative operation, not the on LHS.
 
1424
static bool OnlyOnRHSOfCommutative(TreePatternNode *N) {
 
1425
  if (!N->isLeaf() && N->getOperator()->getName() == "imm")
 
1426
    return true;
 
1427
  if (N->isLeaf() && dynamic_cast<IntInit*>(N->getLeafValue()))
 
1428
    return true;
 
1429
  return false;
 
1430
}
 
1431
 
 
1432
 
 
1433
/// canPatternMatch - If it is impossible for this pattern to match on this
 
1434
/// target, fill in Reason and return false.  Otherwise, return true.  This is
 
1435
/// used as a sanity check for .td files (to prevent people from writing stuff
 
1436
/// that can never possibly work), and to prevent the pattern permuter from
 
1437
/// generating stuff that is useless.
 
1438
bool TreePatternNode::canPatternMatch(std::string &Reason, 
 
1439
                                      const CodeGenDAGPatterns &CDP) {
 
1440
  if (isLeaf()) return true;
 
1441
 
 
1442
  for (unsigned i = 0, e = getNumChildren(); i != e; ++i)
 
1443
    if (!getChild(i)->canPatternMatch(Reason, CDP))
 
1444
      return false;
 
1445
 
 
1446
  // If this is an intrinsic, handle cases that would make it not match.  For
 
1447
  // example, if an operand is required to be an immediate.
 
1448
  if (getOperator()->isSubClassOf("Intrinsic")) {
 
1449
    // TODO:
 
1450
    return true;
 
1451
  }
 
1452
  
 
1453
  // If this node is a commutative operator, check that the LHS isn't an
 
1454
  // immediate.
 
1455
  const SDNodeInfo &NodeInfo = CDP.getSDNodeInfo(getOperator());
 
1456
  bool isCommIntrinsic = isCommutativeIntrinsic(CDP);
 
1457
  if (NodeInfo.hasProperty(SDNPCommutative) || isCommIntrinsic) {
 
1458
    // Scan all of the operands of the node and make sure that only the last one
 
1459
    // is a constant node, unless the RHS also is.
 
1460
    if (!OnlyOnRHSOfCommutative(getChild(getNumChildren()-1))) {
 
1461
      bool Skip = isCommIntrinsic ? 1 : 0; // First operand is intrinsic id.
 
1462
      for (unsigned i = Skip, e = getNumChildren()-1; i != e; ++i)
 
1463
        if (OnlyOnRHSOfCommutative(getChild(i))) {
 
1464
          Reason="Immediate value must be on the RHS of commutative operators!";
 
1465
          return false;
 
1466
        }
 
1467
    }
 
1468
  }
 
1469
  
 
1470
  return true;
 
1471
}
 
1472
 
 
1473
//===----------------------------------------------------------------------===//
 
1474
// TreePattern implementation
 
1475
//
 
1476
 
 
1477
TreePattern::TreePattern(Record *TheRec, ListInit *RawPat, bool isInput,
 
1478
                         CodeGenDAGPatterns &cdp) : TheRecord(TheRec), CDP(cdp){
 
1479
  isInputPattern = isInput;
 
1480
  for (unsigned i = 0, e = RawPat->getSize(); i != e; ++i)
 
1481
    Trees.push_back(ParseTreePattern(RawPat->getElement(i), ""));
 
1482
}
 
1483
 
 
1484
TreePattern::TreePattern(Record *TheRec, DagInit *Pat, bool isInput,
 
1485
                         CodeGenDAGPatterns &cdp) : TheRecord(TheRec), CDP(cdp){
 
1486
  isInputPattern = isInput;
 
1487
  Trees.push_back(ParseTreePattern(Pat, ""));
 
1488
}
 
1489
 
 
1490
TreePattern::TreePattern(Record *TheRec, TreePatternNode *Pat, bool isInput,
 
1491
                         CodeGenDAGPatterns &cdp) : TheRecord(TheRec), CDP(cdp){
 
1492
  isInputPattern = isInput;
 
1493
  Trees.push_back(Pat);
 
1494
}
 
1495
 
 
1496
void TreePattern::error(const std::string &Msg) const {
 
1497
  dump();
 
1498
  throw TGError(TheRecord->getLoc(), "In " + TheRecord->getName() + ": " + Msg);
 
1499
}
 
1500
 
 
1501
void TreePattern::ComputeNamedNodes() {
 
1502
  for (unsigned i = 0, e = Trees.size(); i != e; ++i)
 
1503
    ComputeNamedNodes(Trees[i]);
 
1504
}
 
1505
 
 
1506
void TreePattern::ComputeNamedNodes(TreePatternNode *N) {
 
1507
  if (!N->getName().empty())
 
1508
    NamedNodes[N->getName()].push_back(N);
 
1509
  
 
1510
  for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i)
 
1511
    ComputeNamedNodes(N->getChild(i));
 
1512
}
 
1513
 
 
1514
 
 
1515
TreePatternNode *TreePattern::ParseTreePattern(Init *TheInit, StringRef OpName){
 
1516
  if (DefInit *DI = dynamic_cast<DefInit*>(TheInit)) {
 
1517
    Record *R = DI->getDef();
 
1518
    
 
1519
    // Direct reference to a leaf DagNode or PatFrag?  Turn it into a
 
1520
    // TreePatternNode if its own.  For example:
 
1521
    ///   (foo GPR, imm) -> (foo GPR, (imm))
 
1522
    if (R->isSubClassOf("SDNode") || R->isSubClassOf("PatFrag"))
 
1523
      return ParseTreePattern(new DagInit(DI, "",
 
1524
                          std::vector<std::pair<Init*, std::string> >()),
 
1525
                              OpName);
 
1526
    
 
1527
    // Input argument?
 
1528
    TreePatternNode *Res = new TreePatternNode(DI, 1);
 
1529
    if (R->getName() == "node" && !OpName.empty()) {
 
1530
      if (OpName.empty())
 
1531
        error("'node' argument requires a name to match with operand list");
 
1532
      Args.push_back(OpName);
 
1533
    }
 
1534
 
 
1535
    Res->setName(OpName);
 
1536
    return Res;
 
1537
  }
 
1538
  
 
1539
  if (IntInit *II = dynamic_cast<IntInit*>(TheInit)) {
 
1540
    if (!OpName.empty())
 
1541
      error("Constant int argument should not have a name!");
 
1542
    return new TreePatternNode(II, 1);
 
1543
  }
 
1544
  
 
1545
  if (BitsInit *BI = dynamic_cast<BitsInit*>(TheInit)) {
 
1546
    // Turn this into an IntInit.
 
1547
    Init *II = BI->convertInitializerTo(new IntRecTy());
 
1548
    if (II == 0 || !dynamic_cast<IntInit*>(II))
 
1549
      error("Bits value must be constants!");
 
1550
    return ParseTreePattern(II, OpName);
 
1551
  }
 
1552
 
 
1553
  DagInit *Dag = dynamic_cast<DagInit*>(TheInit);
 
1554
  if (!Dag) {
 
1555
    TheInit->dump();
 
1556
    error("Pattern has unexpected init kind!");
 
1557
  }
 
1558
  DefInit *OpDef = dynamic_cast<DefInit*>(Dag->getOperator());
 
1559
  if (!OpDef) error("Pattern has unexpected operator type!");
 
1560
  Record *Operator = OpDef->getDef();
 
1561
  
 
1562
  if (Operator->isSubClassOf("ValueType")) {
 
1563
    // If the operator is a ValueType, then this must be "type cast" of a leaf
 
1564
    // node.
 
1565
    if (Dag->getNumArgs() != 1)
 
1566
      error("Type cast only takes one operand!");
 
1567
    
 
1568
    TreePatternNode *New = ParseTreePattern(Dag->getArg(0), Dag->getArgName(0));
 
1569
    
 
1570
    // Apply the type cast.
 
1571
    assert(New->getNumTypes() == 1 && "FIXME: Unhandled");
 
1572
    New->UpdateNodeType(0, getValueType(Operator), *this);
 
1573
    
 
1574
    if (!OpName.empty())
 
1575
      error("ValueType cast should not have a name!");
 
1576
    return New;
 
1577
  }
 
1578
  
 
1579
  // Verify that this is something that makes sense for an operator.
 
1580
  if (!Operator->isSubClassOf("PatFrag") && 
 
1581
      !Operator->isSubClassOf("SDNode") &&
 
1582
      !Operator->isSubClassOf("Instruction") && 
 
1583
      !Operator->isSubClassOf("SDNodeXForm") &&
 
1584
      !Operator->isSubClassOf("Intrinsic") &&
 
1585
      Operator->getName() != "set" &&
 
1586
      Operator->getName() != "implicit")
 
1587
    error("Unrecognized node '" + Operator->getName() + "'!");
 
1588
  
 
1589
  //  Check to see if this is something that is illegal in an input pattern.
 
1590
  if (isInputPattern) {
 
1591
    if (Operator->isSubClassOf("Instruction") ||
 
1592
        Operator->isSubClassOf("SDNodeXForm"))
 
1593
      error("Cannot use '" + Operator->getName() + "' in an input pattern!");
 
1594
  } else {
 
1595
    if (Operator->isSubClassOf("Intrinsic"))
 
1596
      error("Cannot use '" + Operator->getName() + "' in an output pattern!");
 
1597
    
 
1598
    if (Operator->isSubClassOf("SDNode") &&
 
1599
        Operator->getName() != "imm" &&
 
1600
        Operator->getName() != "fpimm" &&
 
1601
        Operator->getName() != "tglobaltlsaddr" &&
 
1602
        Operator->getName() != "tconstpool" &&
 
1603
        Operator->getName() != "tjumptable" &&
 
1604
        Operator->getName() != "tframeindex" &&
 
1605
        Operator->getName() != "texternalsym" &&
 
1606
        Operator->getName() != "tblockaddress" &&
 
1607
        Operator->getName() != "tglobaladdr" &&
 
1608
        Operator->getName() != "bb" &&
 
1609
        Operator->getName() != "vt")
 
1610
      error("Cannot use '" + Operator->getName() + "' in an output pattern!");
 
1611
  }
 
1612
  
 
1613
  std::vector<TreePatternNode*> Children;
 
1614
 
 
1615
  // Parse all the operands.
 
1616
  for (unsigned i = 0, e = Dag->getNumArgs(); i != e; ++i)
 
1617
    Children.push_back(ParseTreePattern(Dag->getArg(i), Dag->getArgName(i)));
 
1618
  
 
1619
  // If the operator is an intrinsic, then this is just syntactic sugar for for
 
1620
  // (intrinsic_* <number>, ..children..).  Pick the right intrinsic node, and 
 
1621
  // convert the intrinsic name to a number.
 
1622
  if (Operator->isSubClassOf("Intrinsic")) {
 
1623
    const CodeGenIntrinsic &Int = getDAGPatterns().getIntrinsic(Operator);
 
1624
    unsigned IID = getDAGPatterns().getIntrinsicID(Operator)+1;
 
1625
 
 
1626
    // If this intrinsic returns void, it must have side-effects and thus a
 
1627
    // chain.
 
1628
    if (Int.IS.RetVTs.empty())
 
1629
      Operator = getDAGPatterns().get_intrinsic_void_sdnode();
 
1630
    else if (Int.ModRef != CodeGenIntrinsic::NoMem)
 
1631
      // Has side-effects, requires chain.
 
1632
      Operator = getDAGPatterns().get_intrinsic_w_chain_sdnode();
 
1633
    else // Otherwise, no chain.
 
1634
      Operator = getDAGPatterns().get_intrinsic_wo_chain_sdnode();
 
1635
    
 
1636
    TreePatternNode *IIDNode = new TreePatternNode(new IntInit(IID), 1);
 
1637
    Children.insert(Children.begin(), IIDNode);
 
1638
  }
 
1639
  
 
1640
  unsigned NumResults = GetNumNodeResults(Operator, CDP);
 
1641
  TreePatternNode *Result = new TreePatternNode(Operator, Children, NumResults);
 
1642
  Result->setName(OpName);
 
1643
  
 
1644
  if (!Dag->getName().empty()) {
 
1645
    assert(Result->getName().empty());
 
1646
    Result->setName(Dag->getName());
 
1647
  }
 
1648
  return Result;
 
1649
}
 
1650
 
 
1651
/// SimplifyTree - See if we can simplify this tree to eliminate something that
 
1652
/// will never match in favor of something obvious that will.  This is here
 
1653
/// strictly as a convenience to target authors because it allows them to write
 
1654
/// more type generic things and have useless type casts fold away.
 
1655
///
 
1656
/// This returns true if any change is made.
 
1657
static bool SimplifyTree(TreePatternNode *&N) {
 
1658
  if (N->isLeaf())
 
1659
    return false;
 
1660
 
 
1661
  // If we have a bitconvert with a resolved type and if the source and
 
1662
  // destination types are the same, then the bitconvert is useless, remove it.
 
1663
  if (N->getOperator()->getName() == "bitconvert" &&
 
1664
      N->getExtType(0).isConcrete() &&
 
1665
      N->getExtType(0) == N->getChild(0)->getExtType(0) &&
 
1666
      N->getName().empty()) {
 
1667
    N = N->getChild(0);
 
1668
    SimplifyTree(N);
 
1669
    return true;
 
1670
  }
 
1671
 
 
1672
  // Walk all children.
 
1673
  bool MadeChange = false;
 
1674
  for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i) {
 
1675
    TreePatternNode *Child = N->getChild(i);
 
1676
    MadeChange |= SimplifyTree(Child);
 
1677
    N->setChild(i, Child);
 
1678
  }
 
1679
  return MadeChange;
 
1680
}
 
1681
 
 
1682
 
 
1683
 
 
1684
/// InferAllTypes - Infer/propagate as many types throughout the expression
 
1685
/// patterns as possible.  Return true if all types are inferred, false
 
1686
/// otherwise.  Throw an exception if a type contradiction is found.
 
1687
bool TreePattern::
 
1688
InferAllTypes(const StringMap<SmallVector<TreePatternNode*,1> > *InNamedTypes) {
 
1689
  if (NamedNodes.empty())
 
1690
    ComputeNamedNodes();
 
1691
 
 
1692
  bool MadeChange = true;
 
1693
  while (MadeChange) {
 
1694
    MadeChange = false;
 
1695
    for (unsigned i = 0, e = Trees.size(); i != e; ++i) {
 
1696
      MadeChange |= Trees[i]->ApplyTypeConstraints(*this, false);
 
1697
      MadeChange |= SimplifyTree(Trees[i]);
 
1698
    }
 
1699
 
 
1700
    // If there are constraints on our named nodes, apply them.
 
1701
    for (StringMap<SmallVector<TreePatternNode*,1> >::iterator 
 
1702
         I = NamedNodes.begin(), E = NamedNodes.end(); I != E; ++I) {
 
1703
      SmallVectorImpl<TreePatternNode*> &Nodes = I->second;
 
1704
      
 
1705
      // If we have input named node types, propagate their types to the named
 
1706
      // values here.
 
1707
      if (InNamedTypes) {
 
1708
        // FIXME: Should be error?
 
1709
        assert(InNamedTypes->count(I->getKey()) &&
 
1710
               "Named node in output pattern but not input pattern?");
 
1711
 
 
1712
        const SmallVectorImpl<TreePatternNode*> &InNodes =
 
1713
          InNamedTypes->find(I->getKey())->second;
 
1714
 
 
1715
        // The input types should be fully resolved by now.
 
1716
        for (unsigned i = 0, e = Nodes.size(); i != e; ++i) {
 
1717
          // If this node is a register class, and it is the root of the pattern
 
1718
          // then we're mapping something onto an input register.  We allow
 
1719
          // changing the type of the input register in this case.  This allows
 
1720
          // us to match things like:
 
1721
          //  def : Pat<(v1i64 (bitconvert(v2i32 DPR:$src))), (v1i64 DPR:$src)>;
 
1722
          if (Nodes[i] == Trees[0] && Nodes[i]->isLeaf()) {
 
1723
            DefInit *DI = dynamic_cast<DefInit*>(Nodes[i]->getLeafValue());
 
1724
            if (DI && DI->getDef()->isSubClassOf("RegisterClass"))
 
1725
              continue;
 
1726
          }
 
1727
          
 
1728
          assert(Nodes[i]->getNumTypes() == 1 &&
 
1729
                 InNodes[0]->getNumTypes() == 1 &&
 
1730
                 "FIXME: cannot name multiple result nodes yet");
 
1731
          MadeChange |= Nodes[i]->UpdateNodeType(0, InNodes[0]->getExtType(0),
 
1732
                                                 *this);
 
1733
        }
 
1734
      }
 
1735
      
 
1736
      // If there are multiple nodes with the same name, they must all have the
 
1737
      // same type.
 
1738
      if (I->second.size() > 1) {
 
1739
        for (unsigned i = 0, e = Nodes.size()-1; i != e; ++i) {
 
1740
          TreePatternNode *N1 = Nodes[i], *N2 = Nodes[i+1];
 
1741
          assert(N1->getNumTypes() == 1 && N2->getNumTypes() == 1 &&
 
1742
                 "FIXME: cannot name multiple result nodes yet");
 
1743
          
 
1744
          MadeChange |= N1->UpdateNodeType(0, N2->getExtType(0), *this);
 
1745
          MadeChange |= N2->UpdateNodeType(0, N1->getExtType(0), *this);
 
1746
        }
 
1747
      }
 
1748
    }
 
1749
  }
 
1750
  
 
1751
  bool HasUnresolvedTypes = false;
 
1752
  for (unsigned i = 0, e = Trees.size(); i != e; ++i)
 
1753
    HasUnresolvedTypes |= Trees[i]->ContainsUnresolvedType();
 
1754
  return !HasUnresolvedTypes;
 
1755
}
 
1756
 
 
1757
void TreePattern::print(raw_ostream &OS) const {
 
1758
  OS << getRecord()->getName();
 
1759
  if (!Args.empty()) {
 
1760
    OS << "(" << Args[0];
 
1761
    for (unsigned i = 1, e = Args.size(); i != e; ++i)
 
1762
      OS << ", " << Args[i];
 
1763
    OS << ")";
 
1764
  }
 
1765
  OS << ": ";
 
1766
  
 
1767
  if (Trees.size() > 1)
 
1768
    OS << "[\n";
 
1769
  for (unsigned i = 0, e = Trees.size(); i != e; ++i) {
 
1770
    OS << "\t";
 
1771
    Trees[i]->print(OS);
 
1772
    OS << "\n";
 
1773
  }
 
1774
 
 
1775
  if (Trees.size() > 1)
 
1776
    OS << "]\n";
 
1777
}
 
1778
 
 
1779
void TreePattern::dump() const { print(errs()); }
 
1780
 
 
1781
//===----------------------------------------------------------------------===//
 
1782
// CodeGenDAGPatterns implementation
 
1783
//
 
1784
 
 
1785
CodeGenDAGPatterns::CodeGenDAGPatterns(RecordKeeper &R) : Records(R) {
 
1786
  Intrinsics = LoadIntrinsics(Records, false);
 
1787
  TgtIntrinsics = LoadIntrinsics(Records, true);
 
1788
  ParseNodeInfo();
 
1789
  ParseNodeTransforms();
 
1790
  ParseComplexPatterns();
 
1791
  ParsePatternFragments();
 
1792
  ParseDefaultOperands();
 
1793
  ParseInstructions();
 
1794
  ParsePatterns();
 
1795
  
 
1796
  // Generate variants.  For example, commutative patterns can match
 
1797
  // multiple ways.  Add them to PatternsToMatch as well.
 
1798
  GenerateVariants();
 
1799
 
 
1800
  // Infer instruction flags.  For example, we can detect loads,
 
1801
  // stores, and side effects in many cases by examining an
 
1802
  // instruction's pattern.
 
1803
  InferInstructionFlags();
 
1804
}
 
1805
 
 
1806
CodeGenDAGPatterns::~CodeGenDAGPatterns() {
 
1807
  for (pf_iterator I = PatternFragments.begin(),
 
1808
       E = PatternFragments.end(); I != E; ++I)
 
1809
    delete I->second;
 
1810
}
 
1811
 
 
1812
 
 
1813
Record *CodeGenDAGPatterns::getSDNodeNamed(const std::string &Name) const {
 
1814
  Record *N = Records.getDef(Name);
 
1815
  if (!N || !N->isSubClassOf("SDNode")) {
 
1816
    errs() << "Error getting SDNode '" << Name << "'!\n";
 
1817
    exit(1);
 
1818
  }
 
1819
  return N;
 
1820
}
 
1821
 
 
1822
// Parse all of the SDNode definitions for the target, populating SDNodes.
 
1823
void CodeGenDAGPatterns::ParseNodeInfo() {
 
1824
  std::vector<Record*> Nodes = Records.getAllDerivedDefinitions("SDNode");
 
1825
  while (!Nodes.empty()) {
 
1826
    SDNodes.insert(std::make_pair(Nodes.back(), Nodes.back()));
 
1827
    Nodes.pop_back();
 
1828
  }
 
1829
 
 
1830
  // Get the builtin intrinsic nodes.
 
1831
  intrinsic_void_sdnode     = getSDNodeNamed("intrinsic_void");
 
1832
  intrinsic_w_chain_sdnode  = getSDNodeNamed("intrinsic_w_chain");
 
1833
  intrinsic_wo_chain_sdnode = getSDNodeNamed("intrinsic_wo_chain");
 
1834
}
 
1835
 
 
1836
/// ParseNodeTransforms - Parse all SDNodeXForm instances into the SDNodeXForms
 
1837
/// map, and emit them to the file as functions.
 
1838
void CodeGenDAGPatterns::ParseNodeTransforms() {
 
1839
  std::vector<Record*> Xforms = Records.getAllDerivedDefinitions("SDNodeXForm");
 
1840
  while (!Xforms.empty()) {
 
1841
    Record *XFormNode = Xforms.back();
 
1842
    Record *SDNode = XFormNode->getValueAsDef("Opcode");
 
1843
    std::string Code = XFormNode->getValueAsCode("XFormFunction");
 
1844
    SDNodeXForms.insert(std::make_pair(XFormNode, NodeXForm(SDNode, Code)));
 
1845
 
 
1846
    Xforms.pop_back();
 
1847
  }
 
1848
}
 
1849
 
 
1850
void CodeGenDAGPatterns::ParseComplexPatterns() {
 
1851
  std::vector<Record*> AMs = Records.getAllDerivedDefinitions("ComplexPattern");
 
1852
  while (!AMs.empty()) {
 
1853
    ComplexPatterns.insert(std::make_pair(AMs.back(), AMs.back()));
 
1854
    AMs.pop_back();
 
1855
  }
 
1856
}
 
1857
 
 
1858
 
 
1859
/// ParsePatternFragments - Parse all of the PatFrag definitions in the .td
 
1860
/// file, building up the PatternFragments map.  After we've collected them all,
 
1861
/// inline fragments together as necessary, so that there are no references left
 
1862
/// inside a pattern fragment to a pattern fragment.
 
1863
///
 
1864
void CodeGenDAGPatterns::ParsePatternFragments() {
 
1865
  std::vector<Record*> Fragments = Records.getAllDerivedDefinitions("PatFrag");
 
1866
  
 
1867
  // First step, parse all of the fragments.
 
1868
  for (unsigned i = 0, e = Fragments.size(); i != e; ++i) {
 
1869
    DagInit *Tree = Fragments[i]->getValueAsDag("Fragment");
 
1870
    TreePattern *P = new TreePattern(Fragments[i], Tree, true, *this);
 
1871
    PatternFragments[Fragments[i]] = P;
 
1872
    
 
1873
    // Validate the argument list, converting it to set, to discard duplicates.
 
1874
    std::vector<std::string> &Args = P->getArgList();
 
1875
    std::set<std::string> OperandsSet(Args.begin(), Args.end());
 
1876
    
 
1877
    if (OperandsSet.count(""))
 
1878
      P->error("Cannot have unnamed 'node' values in pattern fragment!");
 
1879
    
 
1880
    // Parse the operands list.
 
1881
    DagInit *OpsList = Fragments[i]->getValueAsDag("Operands");
 
1882
    DefInit *OpsOp = dynamic_cast<DefInit*>(OpsList->getOperator());
 
1883
    // Special cases: ops == outs == ins. Different names are used to
 
1884
    // improve readability.
 
1885
    if (!OpsOp ||
 
1886
        (OpsOp->getDef()->getName() != "ops" &&
 
1887
         OpsOp->getDef()->getName() != "outs" &&
 
1888
         OpsOp->getDef()->getName() != "ins"))
 
1889
      P->error("Operands list should start with '(ops ... '!");
 
1890
    
 
1891
    // Copy over the arguments.       
 
1892
    Args.clear();
 
1893
    for (unsigned j = 0, e = OpsList->getNumArgs(); j != e; ++j) {
 
1894
      if (!dynamic_cast<DefInit*>(OpsList->getArg(j)) ||
 
1895
          static_cast<DefInit*>(OpsList->getArg(j))->
 
1896
          getDef()->getName() != "node")
 
1897
        P->error("Operands list should all be 'node' values.");
 
1898
      if (OpsList->getArgName(j).empty())
 
1899
        P->error("Operands list should have names for each operand!");
 
1900
      if (!OperandsSet.count(OpsList->getArgName(j)))
 
1901
        P->error("'" + OpsList->getArgName(j) +
 
1902
                 "' does not occur in pattern or was multiply specified!");
 
1903
      OperandsSet.erase(OpsList->getArgName(j));
 
1904
      Args.push_back(OpsList->getArgName(j));
 
1905
    }
 
1906
    
 
1907
    if (!OperandsSet.empty())
 
1908
      P->error("Operands list does not contain an entry for operand '" +
 
1909
               *OperandsSet.begin() + "'!");
 
1910
 
 
1911
    // If there is a code init for this fragment, keep track of the fact that
 
1912
    // this fragment uses it.
 
1913
    std::string Code = Fragments[i]->getValueAsCode("Predicate");
 
1914
    if (!Code.empty())
 
1915
      P->getOnlyTree()->addPredicateFn("Predicate_"+Fragments[i]->getName());
 
1916
    
 
1917
    // If there is a node transformation corresponding to this, keep track of
 
1918
    // it.
 
1919
    Record *Transform = Fragments[i]->getValueAsDef("OperandTransform");
 
1920
    if (!getSDNodeTransform(Transform).second.empty())    // not noop xform?
 
1921
      P->getOnlyTree()->setTransformFn(Transform);
 
1922
  }
 
1923
  
 
1924
  // Now that we've parsed all of the tree fragments, do a closure on them so
 
1925
  // that there are not references to PatFrags left inside of them.
 
1926
  for (unsigned i = 0, e = Fragments.size(); i != e; ++i) {
 
1927
    TreePattern *ThePat = PatternFragments[Fragments[i]];
 
1928
    ThePat->InlinePatternFragments();
 
1929
        
 
1930
    // Infer as many types as possible.  Don't worry about it if we don't infer
 
1931
    // all of them, some may depend on the inputs of the pattern.
 
1932
    try {
 
1933
      ThePat->InferAllTypes();
 
1934
    } catch (...) {
 
1935
      // If this pattern fragment is not supported by this target (no types can
 
1936
      // satisfy its constraints), just ignore it.  If the bogus pattern is
 
1937
      // actually used by instructions, the type consistency error will be
 
1938
      // reported there.
 
1939
    }
 
1940
    
 
1941
    // If debugging, print out the pattern fragment result.
 
1942
    DEBUG(ThePat->dump());
 
1943
  }
 
1944
}
 
1945
 
 
1946
void CodeGenDAGPatterns::ParseDefaultOperands() {
 
1947
  std::vector<Record*> DefaultOps[2];
 
1948
  DefaultOps[0] = Records.getAllDerivedDefinitions("PredicateOperand");
 
1949
  DefaultOps[1] = Records.getAllDerivedDefinitions("OptionalDefOperand");
 
1950
 
 
1951
  // Find some SDNode.
 
1952
  assert(!SDNodes.empty() && "No SDNodes parsed?");
 
1953
  Init *SomeSDNode = new DefInit(SDNodes.begin()->first);
 
1954
  
 
1955
  for (unsigned iter = 0; iter != 2; ++iter) {
 
1956
    for (unsigned i = 0, e = DefaultOps[iter].size(); i != e; ++i) {
 
1957
      DagInit *DefaultInfo = DefaultOps[iter][i]->getValueAsDag("DefaultOps");
 
1958
    
 
1959
      // Clone the DefaultInfo dag node, changing the operator from 'ops' to
 
1960
      // SomeSDnode so that we can parse this.
 
1961
      std::vector<std::pair<Init*, std::string> > Ops;
 
1962
      for (unsigned op = 0, e = DefaultInfo->getNumArgs(); op != e; ++op)
 
1963
        Ops.push_back(std::make_pair(DefaultInfo->getArg(op),
 
1964
                                     DefaultInfo->getArgName(op)));
 
1965
      DagInit *DI = new DagInit(SomeSDNode, "", Ops);
 
1966
    
 
1967
      // Create a TreePattern to parse this.
 
1968
      TreePattern P(DefaultOps[iter][i], DI, false, *this);
 
1969
      assert(P.getNumTrees() == 1 && "This ctor can only produce one tree!");
 
1970
 
 
1971
      // Copy the operands over into a DAGDefaultOperand.
 
1972
      DAGDefaultOperand DefaultOpInfo;
 
1973
    
 
1974
      TreePatternNode *T = P.getTree(0);
 
1975
      for (unsigned op = 0, e = T->getNumChildren(); op != e; ++op) {
 
1976
        TreePatternNode *TPN = T->getChild(op);
 
1977
        while (TPN->ApplyTypeConstraints(P, false))
 
1978
          /* Resolve all types */;
 
1979
      
 
1980
        if (TPN->ContainsUnresolvedType()) {
 
1981
          if (iter == 0)
 
1982
            throw "Value #" + utostr(i) + " of PredicateOperand '" +
 
1983
              DefaultOps[iter][i]->getName() +"' doesn't have a concrete type!";
 
1984
          else
 
1985
            throw "Value #" + utostr(i) + " of OptionalDefOperand '" +
 
1986
              DefaultOps[iter][i]->getName() +"' doesn't have a concrete type!";
 
1987
        }
 
1988
        DefaultOpInfo.DefaultOps.push_back(TPN);
 
1989
      }
 
1990
 
 
1991
      // Insert it into the DefaultOperands map so we can find it later.
 
1992
      DefaultOperands[DefaultOps[iter][i]] = DefaultOpInfo;
 
1993
    }
 
1994
  }
 
1995
}
 
1996
 
 
1997
/// HandleUse - Given "Pat" a leaf in the pattern, check to see if it is an
 
1998
/// instruction input.  Return true if this is a real use.
 
1999
static bool HandleUse(TreePattern *I, TreePatternNode *Pat,
 
2000
                      std::map<std::string, TreePatternNode*> &InstInputs) {
 
2001
  // No name -> not interesting.
 
2002
  if (Pat->getName().empty()) {
 
2003
    if (Pat->isLeaf()) {
 
2004
      DefInit *DI = dynamic_cast<DefInit*>(Pat->getLeafValue());
 
2005
      if (DI && DI->getDef()->isSubClassOf("RegisterClass"))
 
2006
        I->error("Input " + DI->getDef()->getName() + " must be named!");
 
2007
    }
 
2008
    return false;
 
2009
  }
 
2010
 
 
2011
  Record *Rec;
 
2012
  if (Pat->isLeaf()) {
 
2013
    DefInit *DI = dynamic_cast<DefInit*>(Pat->getLeafValue());
 
2014
    if (!DI) I->error("Input $" + Pat->getName() + " must be an identifier!");
 
2015
    Rec = DI->getDef();
 
2016
  } else {
 
2017
    Rec = Pat->getOperator();
 
2018
  }
 
2019
 
 
2020
  // SRCVALUE nodes are ignored.
 
2021
  if (Rec->getName() == "srcvalue")
 
2022
    return false;
 
2023
 
 
2024
  TreePatternNode *&Slot = InstInputs[Pat->getName()];
 
2025
  if (!Slot) {
 
2026
    Slot = Pat;
 
2027
    return true;
 
2028
  }
 
2029
  Record *SlotRec;
 
2030
  if (Slot->isLeaf()) {
 
2031
    SlotRec = dynamic_cast<DefInit*>(Slot->getLeafValue())->getDef();
 
2032
  } else {
 
2033
    assert(Slot->getNumChildren() == 0 && "can't be a use with children!");
 
2034
    SlotRec = Slot->getOperator();
 
2035
  }
 
2036
  
 
2037
  // Ensure that the inputs agree if we've already seen this input.
 
2038
  if (Rec != SlotRec)
 
2039
    I->error("All $" + Pat->getName() + " inputs must agree with each other");
 
2040
  if (Slot->getExtTypes() != Pat->getExtTypes())
 
2041
    I->error("All $" + Pat->getName() + " inputs must agree with each other");
 
2042
  return true;
 
2043
}
 
2044
 
 
2045
/// FindPatternInputsAndOutputs - Scan the specified TreePatternNode (which is
 
2046
/// part of "I", the instruction), computing the set of inputs and outputs of
 
2047
/// the pattern.  Report errors if we see anything naughty.
 
2048
void CodeGenDAGPatterns::
 
2049
FindPatternInputsAndOutputs(TreePattern *I, TreePatternNode *Pat,
 
2050
                            std::map<std::string, TreePatternNode*> &InstInputs,
 
2051
                            std::map<std::string, TreePatternNode*>&InstResults,
 
2052
                            std::vector<Record*> &InstImpResults) {
 
2053
  if (Pat->isLeaf()) {
 
2054
    bool isUse = HandleUse(I, Pat, InstInputs);
 
2055
    if (!isUse && Pat->getTransformFn())
 
2056
      I->error("Cannot specify a transform function for a non-input value!");
 
2057
    return;
 
2058
  }
 
2059
  
 
2060
  if (Pat->getOperator()->getName() == "implicit") {
 
2061
    for (unsigned i = 0, e = Pat->getNumChildren(); i != e; ++i) {
 
2062
      TreePatternNode *Dest = Pat->getChild(i);
 
2063
      if (!Dest->isLeaf())
 
2064
        I->error("implicitly defined value should be a register!");
 
2065
    
 
2066
      DefInit *Val = dynamic_cast<DefInit*>(Dest->getLeafValue());
 
2067
      if (!Val || !Val->getDef()->isSubClassOf("Register"))
 
2068
        I->error("implicitly defined value should be a register!");
 
2069
      InstImpResults.push_back(Val->getDef());
 
2070
    }
 
2071
    return;
 
2072
  }
 
2073
  
 
2074
  if (Pat->getOperator()->getName() != "set") {
 
2075
    // If this is not a set, verify that the children nodes are not void typed,
 
2076
    // and recurse.
 
2077
    for (unsigned i = 0, e = Pat->getNumChildren(); i != e; ++i) {
 
2078
      if (Pat->getChild(i)->getNumTypes() == 0)
 
2079
        I->error("Cannot have void nodes inside of patterns!");
 
2080
      FindPatternInputsAndOutputs(I, Pat->getChild(i), InstInputs, InstResults,
 
2081
                                  InstImpResults);
 
2082
    }
 
2083
    
 
2084
    // If this is a non-leaf node with no children, treat it basically as if
 
2085
    // it were a leaf.  This handles nodes like (imm).
 
2086
    bool isUse = HandleUse(I, Pat, InstInputs);
 
2087
    
 
2088
    if (!isUse && Pat->getTransformFn())
 
2089
      I->error("Cannot specify a transform function for a non-input value!");
 
2090
    return;
 
2091
  }
 
2092
  
 
2093
  // Otherwise, this is a set, validate and collect instruction results.
 
2094
  if (Pat->getNumChildren() == 0)
 
2095
    I->error("set requires operands!");
 
2096
  
 
2097
  if (Pat->getTransformFn())
 
2098
    I->error("Cannot specify a transform function on a set node!");
 
2099
  
 
2100
  // Check the set destinations.
 
2101
  unsigned NumDests = Pat->getNumChildren()-1;
 
2102
  for (unsigned i = 0; i != NumDests; ++i) {
 
2103
    TreePatternNode *Dest = Pat->getChild(i);
 
2104
    if (!Dest->isLeaf())
 
2105
      I->error("set destination should be a register!");
 
2106
    
 
2107
    DefInit *Val = dynamic_cast<DefInit*>(Dest->getLeafValue());
 
2108
    if (!Val)
 
2109
      I->error("set destination should be a register!");
 
2110
 
 
2111
    if (Val->getDef()->isSubClassOf("RegisterClass") ||
 
2112
        Val->getDef()->isSubClassOf("PointerLikeRegClass")) {
 
2113
      if (Dest->getName().empty())
 
2114
        I->error("set destination must have a name!");
 
2115
      if (InstResults.count(Dest->getName()))
 
2116
        I->error("cannot set '" + Dest->getName() +"' multiple times");
 
2117
      InstResults[Dest->getName()] = Dest;
 
2118
    } else if (Val->getDef()->isSubClassOf("Register")) {
 
2119
      InstImpResults.push_back(Val->getDef());
 
2120
    } else {
 
2121
      I->error("set destination should be a register!");
 
2122
    }
 
2123
  }
 
2124
    
 
2125
  // Verify and collect info from the computation.
 
2126
  FindPatternInputsAndOutputs(I, Pat->getChild(NumDests),
 
2127
                              InstInputs, InstResults, InstImpResults);
 
2128
}
 
2129
 
 
2130
//===----------------------------------------------------------------------===//
 
2131
// Instruction Analysis
 
2132
//===----------------------------------------------------------------------===//
 
2133
 
 
2134
class InstAnalyzer {
 
2135
  const CodeGenDAGPatterns &CDP;
 
2136
  bool &mayStore;
 
2137
  bool &mayLoad;
 
2138
  bool &HasSideEffects;
 
2139
  bool &IsVariadic;
 
2140
public:
 
2141
  InstAnalyzer(const CodeGenDAGPatterns &cdp,
 
2142
               bool &maystore, bool &mayload, bool &hse, bool &isv)
 
2143
    : CDP(cdp), mayStore(maystore), mayLoad(mayload), HasSideEffects(hse),
 
2144
      IsVariadic(isv) {
 
2145
  }
 
2146
 
 
2147
  /// Analyze - Analyze the specified instruction, returning true if the
 
2148
  /// instruction had a pattern.
 
2149
  bool Analyze(Record *InstRecord) {
 
2150
    const TreePattern *Pattern = CDP.getInstruction(InstRecord).getPattern();
 
2151
    if (Pattern == 0) {
 
2152
      HasSideEffects = 1;
 
2153
      return false;  // No pattern.
 
2154
    }
 
2155
 
 
2156
    // FIXME: Assume only the first tree is the pattern. The others are clobber
 
2157
    // nodes.
 
2158
    AnalyzeNode(Pattern->getTree(0));
 
2159
    return true;
 
2160
  }
 
2161
 
 
2162
private:
 
2163
  void AnalyzeNode(const TreePatternNode *N) {
 
2164
    if (N->isLeaf()) {
 
2165
      if (DefInit *DI = dynamic_cast<DefInit*>(N->getLeafValue())) {
 
2166
        Record *LeafRec = DI->getDef();
 
2167
        // Handle ComplexPattern leaves.
 
2168
        if (LeafRec->isSubClassOf("ComplexPattern")) {
 
2169
          const ComplexPattern &CP = CDP.getComplexPattern(LeafRec);
 
2170
          if (CP.hasProperty(SDNPMayStore)) mayStore = true;
 
2171
          if (CP.hasProperty(SDNPMayLoad)) mayLoad = true;
 
2172
          if (CP.hasProperty(SDNPSideEffect)) HasSideEffects = true;
 
2173
        }
 
2174
      }
 
2175
      return;
 
2176
    }
 
2177
 
 
2178
    // Analyze children.
 
2179
    for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i)
 
2180
      AnalyzeNode(N->getChild(i));
 
2181
 
 
2182
    // Ignore set nodes, which are not SDNodes.
 
2183
    if (N->getOperator()->getName() == "set")
 
2184
      return;
 
2185
 
 
2186
    // Get information about the SDNode for the operator.
 
2187
    const SDNodeInfo &OpInfo = CDP.getSDNodeInfo(N->getOperator());
 
2188
 
 
2189
    // Notice properties of the node.
 
2190
    if (OpInfo.hasProperty(SDNPMayStore)) mayStore = true;
 
2191
    if (OpInfo.hasProperty(SDNPMayLoad)) mayLoad = true;
 
2192
    if (OpInfo.hasProperty(SDNPSideEffect)) HasSideEffects = true;
 
2193
    if (OpInfo.hasProperty(SDNPVariadic)) IsVariadic = true;
 
2194
 
 
2195
    if (const CodeGenIntrinsic *IntInfo = N->getIntrinsicInfo(CDP)) {
 
2196
      // If this is an intrinsic, analyze it.
 
2197
      if (IntInfo->ModRef >= CodeGenIntrinsic::ReadArgMem)
 
2198
        mayLoad = true;// These may load memory.
 
2199
 
 
2200
      if (IntInfo->ModRef >= CodeGenIntrinsic::ReadWriteArgMem)
 
2201
        mayStore = true;// Intrinsics that can write to memory are 'mayStore'.
 
2202
 
 
2203
      if (IntInfo->ModRef >= CodeGenIntrinsic::ReadWriteMem)
 
2204
        // WriteMem intrinsics can have other strange effects.
 
2205
        HasSideEffects = true;
 
2206
    }
 
2207
  }
 
2208
 
 
2209
};
 
2210
 
 
2211
static void InferFromPattern(const CodeGenInstruction &Inst,
 
2212
                             bool &MayStore, bool &MayLoad,
 
2213
                             bool &HasSideEffects, bool &IsVariadic,
 
2214
                             const CodeGenDAGPatterns &CDP) {
 
2215
  MayStore = MayLoad = HasSideEffects = IsVariadic = false;
 
2216
 
 
2217
  bool HadPattern =
 
2218
    InstAnalyzer(CDP, MayStore, MayLoad, HasSideEffects, IsVariadic)
 
2219
    .Analyze(Inst.TheDef);
 
2220
 
 
2221
  // InstAnalyzer only correctly analyzes mayStore/mayLoad so far.
 
2222
  if (Inst.mayStore) {  // If the .td file explicitly sets mayStore, use it.
 
2223
    // If we decided that this is a store from the pattern, then the .td file
 
2224
    // entry is redundant.
 
2225
    if (MayStore)
 
2226
      fprintf(stderr,
 
2227
              "Warning: mayStore flag explicitly set on instruction '%s'"
 
2228
              " but flag already inferred from pattern.\n",
 
2229
              Inst.TheDef->getName().c_str());
 
2230
    MayStore = true;
 
2231
  }
 
2232
 
 
2233
  if (Inst.mayLoad) {  // If the .td file explicitly sets mayLoad, use it.
 
2234
    // If we decided that this is a load from the pattern, then the .td file
 
2235
    // entry is redundant.
 
2236
    if (MayLoad)
 
2237
      fprintf(stderr,
 
2238
              "Warning: mayLoad flag explicitly set on instruction '%s'"
 
2239
              " but flag already inferred from pattern.\n",
 
2240
              Inst.TheDef->getName().c_str());
 
2241
    MayLoad = true;
 
2242
  }
 
2243
 
 
2244
  if (Inst.neverHasSideEffects) {
 
2245
    if (HadPattern)
 
2246
      fprintf(stderr, "Warning: neverHasSideEffects set on instruction '%s' "
 
2247
              "which already has a pattern\n", Inst.TheDef->getName().c_str());
 
2248
    HasSideEffects = false;
 
2249
  }
 
2250
 
 
2251
  if (Inst.hasSideEffects) {
 
2252
    if (HasSideEffects)
 
2253
      fprintf(stderr, "Warning: hasSideEffects set on instruction '%s' "
 
2254
              "which already inferred this.\n", Inst.TheDef->getName().c_str());
 
2255
    HasSideEffects = true;
 
2256
  }
 
2257
  
 
2258
  if (Inst.isVariadic)
 
2259
    IsVariadic = true;  // Can warn if we want.
 
2260
}
 
2261
 
 
2262
/// ParseInstructions - Parse all of the instructions, inlining and resolving
 
2263
/// any fragments involved.  This populates the Instructions list with fully
 
2264
/// resolved instructions.
 
2265
void CodeGenDAGPatterns::ParseInstructions() {
 
2266
  std::vector<Record*> Instrs = Records.getAllDerivedDefinitions("Instruction");
 
2267
  
 
2268
  for (unsigned i = 0, e = Instrs.size(); i != e; ++i) {
 
2269
    ListInit *LI = 0;
 
2270
    
 
2271
    if (dynamic_cast<ListInit*>(Instrs[i]->getValueInit("Pattern")))
 
2272
      LI = Instrs[i]->getValueAsListInit("Pattern");
 
2273
    
 
2274
    // If there is no pattern, only collect minimal information about the
 
2275
    // instruction for its operand list.  We have to assume that there is one
 
2276
    // result, as we have no detailed info.
 
2277
    if (!LI || LI->getSize() == 0) {
 
2278
      std::vector<Record*> Results;
 
2279
      std::vector<Record*> Operands;
 
2280
      
 
2281
      CodeGenInstruction &InstInfo = Target.getInstruction(Instrs[i]);
 
2282
 
 
2283
      if (InstInfo.OperandList.size() != 0) {
 
2284
        if (InstInfo.NumDefs == 0) {
 
2285
          // These produce no results
 
2286
          for (unsigned j = 0, e = InstInfo.OperandList.size(); j < e; ++j)
 
2287
            Operands.push_back(InstInfo.OperandList[j].Rec);
 
2288
        } else {
 
2289
          // Assume the first operand is the result.
 
2290
          Results.push_back(InstInfo.OperandList[0].Rec);
 
2291
      
 
2292
          // The rest are inputs.
 
2293
          for (unsigned j = 1, e = InstInfo.OperandList.size(); j < e; ++j)
 
2294
            Operands.push_back(InstInfo.OperandList[j].Rec);
 
2295
        }
 
2296
      }
 
2297
      
 
2298
      // Create and insert the instruction.
 
2299
      std::vector<Record*> ImpResults;
 
2300
      Instructions.insert(std::make_pair(Instrs[i], 
 
2301
                          DAGInstruction(0, Results, Operands, ImpResults)));
 
2302
      continue;  // no pattern.
 
2303
    }
 
2304
    
 
2305
    // Parse the instruction.
 
2306
    TreePattern *I = new TreePattern(Instrs[i], LI, true, *this);
 
2307
    // Inline pattern fragments into it.
 
2308
    I->InlinePatternFragments();
 
2309
    
 
2310
    // Infer as many types as possible.  If we cannot infer all of them, we can
 
2311
    // never do anything with this instruction pattern: report it to the user.
 
2312
    if (!I->InferAllTypes())
 
2313
      I->error("Could not infer all types in pattern!");
 
2314
    
 
2315
    // InstInputs - Keep track of all of the inputs of the instruction, along 
 
2316
    // with the record they are declared as.
 
2317
    std::map<std::string, TreePatternNode*> InstInputs;
 
2318
    
 
2319
    // InstResults - Keep track of all the virtual registers that are 'set'
 
2320
    // in the instruction, including what reg class they are.
 
2321
    std::map<std::string, TreePatternNode*> InstResults;
 
2322
 
 
2323
    std::vector<Record*> InstImpResults;
 
2324
    
 
2325
    // Verify that the top-level forms in the instruction are of void type, and
 
2326
    // fill in the InstResults map.
 
2327
    for (unsigned j = 0, e = I->getNumTrees(); j != e; ++j) {
 
2328
      TreePatternNode *Pat = I->getTree(j);
 
2329
      if (Pat->getNumTypes() != 0)
 
2330
        I->error("Top-level forms in instruction pattern should have"
 
2331
                 " void types");
 
2332
 
 
2333
      // Find inputs and outputs, and verify the structure of the uses/defs.
 
2334
      FindPatternInputsAndOutputs(I, Pat, InstInputs, InstResults,
 
2335
                                  InstImpResults);
 
2336
    }
 
2337
 
 
2338
    // Now that we have inputs and outputs of the pattern, inspect the operands
 
2339
    // list for the instruction.  This determines the order that operands are
 
2340
    // added to the machine instruction the node corresponds to.
 
2341
    unsigned NumResults = InstResults.size();
 
2342
 
 
2343
    // Parse the operands list from the (ops) list, validating it.
 
2344
    assert(I->getArgList().empty() && "Args list should still be empty here!");
 
2345
    CodeGenInstruction &CGI = Target.getInstruction(Instrs[i]);
 
2346
 
 
2347
    // Check that all of the results occur first in the list.
 
2348
    std::vector<Record*> Results;
 
2349
    TreePatternNode *Res0Node = 0;
 
2350
    for (unsigned i = 0; i != NumResults; ++i) {
 
2351
      if (i == CGI.OperandList.size())
 
2352
        I->error("'" + InstResults.begin()->first +
 
2353
                 "' set but does not appear in operand list!");
 
2354
      const std::string &OpName = CGI.OperandList[i].Name;
 
2355
      
 
2356
      // Check that it exists in InstResults.
 
2357
      TreePatternNode *RNode = InstResults[OpName];
 
2358
      if (RNode == 0)
 
2359
        I->error("Operand $" + OpName + " does not exist in operand list!");
 
2360
        
 
2361
      if (i == 0)
 
2362
        Res0Node = RNode;
 
2363
      Record *R = dynamic_cast<DefInit*>(RNode->getLeafValue())->getDef();
 
2364
      if (R == 0)
 
2365
        I->error("Operand $" + OpName + " should be a set destination: all "
 
2366
                 "outputs must occur before inputs in operand list!");
 
2367
      
 
2368
      if (CGI.OperandList[i].Rec != R)
 
2369
        I->error("Operand $" + OpName + " class mismatch!");
 
2370
      
 
2371
      // Remember the return type.
 
2372
      Results.push_back(CGI.OperandList[i].Rec);
 
2373
      
 
2374
      // Okay, this one checks out.
 
2375
      InstResults.erase(OpName);
 
2376
    }
 
2377
 
 
2378
    // Loop over the inputs next.  Make a copy of InstInputs so we can destroy
 
2379
    // the copy while we're checking the inputs.
 
2380
    std::map<std::string, TreePatternNode*> InstInputsCheck(InstInputs);
 
2381
 
 
2382
    std::vector<TreePatternNode*> ResultNodeOperands;
 
2383
    std::vector<Record*> Operands;
 
2384
    for (unsigned i = NumResults, e = CGI.OperandList.size(); i != e; ++i) {
 
2385
      CodeGenInstruction::OperandInfo &Op = CGI.OperandList[i];
 
2386
      const std::string &OpName = Op.Name;
 
2387
      if (OpName.empty())
 
2388
        I->error("Operand #" + utostr(i) + " in operands list has no name!");
 
2389
 
 
2390
      if (!InstInputsCheck.count(OpName)) {
 
2391
        // If this is an predicate operand or optional def operand with an
 
2392
        // DefaultOps set filled in, we can ignore this.  When we codegen it,
 
2393
        // we will do so as always executed.
 
2394
        if (Op.Rec->isSubClassOf("PredicateOperand") ||
 
2395
            Op.Rec->isSubClassOf("OptionalDefOperand")) {
 
2396
          // Does it have a non-empty DefaultOps field?  If so, ignore this
 
2397
          // operand.
 
2398
          if (!getDefaultOperand(Op.Rec).DefaultOps.empty())
 
2399
            continue;
 
2400
        }
 
2401
        I->error("Operand $" + OpName +
 
2402
                 " does not appear in the instruction pattern");
 
2403
      }
 
2404
      TreePatternNode *InVal = InstInputsCheck[OpName];
 
2405
      InstInputsCheck.erase(OpName);   // It occurred, remove from map.
 
2406
      
 
2407
      if (InVal->isLeaf() &&
 
2408
          dynamic_cast<DefInit*>(InVal->getLeafValue())) {
 
2409
        Record *InRec = static_cast<DefInit*>(InVal->getLeafValue())->getDef();
 
2410
        if (Op.Rec != InRec && !InRec->isSubClassOf("ComplexPattern"))
 
2411
          I->error("Operand $" + OpName + "'s register class disagrees"
 
2412
                   " between the operand and pattern");
 
2413
      }
 
2414
      Operands.push_back(Op.Rec);
 
2415
      
 
2416
      // Construct the result for the dest-pattern operand list.
 
2417
      TreePatternNode *OpNode = InVal->clone();
 
2418
      
 
2419
      // No predicate is useful on the result.
 
2420
      OpNode->clearPredicateFns();
 
2421
      
 
2422
      // Promote the xform function to be an explicit node if set.
 
2423
      if (Record *Xform = OpNode->getTransformFn()) {
 
2424
        OpNode->setTransformFn(0);
 
2425
        std::vector<TreePatternNode*> Children;
 
2426
        Children.push_back(OpNode);
 
2427
        OpNode = new TreePatternNode(Xform, Children, OpNode->getNumTypes());
 
2428
      }
 
2429
      
 
2430
      ResultNodeOperands.push_back(OpNode);
 
2431
    }
 
2432
    
 
2433
    if (!InstInputsCheck.empty())
 
2434
      I->error("Input operand $" + InstInputsCheck.begin()->first +
 
2435
               " occurs in pattern but not in operands list!");
 
2436
 
 
2437
    TreePatternNode *ResultPattern =
 
2438
      new TreePatternNode(I->getRecord(), ResultNodeOperands,
 
2439
                          GetNumNodeResults(I->getRecord(), *this));
 
2440
    // Copy fully inferred output node type to instruction result pattern.
 
2441
    for (unsigned i = 0; i != NumResults; ++i)
 
2442
      ResultPattern->setType(i, Res0Node->getExtType(i));
 
2443
 
 
2444
    // Create and insert the instruction.
 
2445
    // FIXME: InstImpResults should not be part of DAGInstruction.
 
2446
    DAGInstruction TheInst(I, Results, Operands, InstImpResults);
 
2447
    Instructions.insert(std::make_pair(I->getRecord(), TheInst));
 
2448
 
 
2449
    // Use a temporary tree pattern to infer all types and make sure that the
 
2450
    // constructed result is correct.  This depends on the instruction already
 
2451
    // being inserted into the Instructions map.
 
2452
    TreePattern Temp(I->getRecord(), ResultPattern, false, *this);
 
2453
    Temp.InferAllTypes(&I->getNamedNodesMap());
 
2454
 
 
2455
    DAGInstruction &TheInsertedInst = Instructions.find(I->getRecord())->second;
 
2456
    TheInsertedInst.setResultPattern(Temp.getOnlyTree());
 
2457
    
 
2458
    DEBUG(I->dump());
 
2459
  }
 
2460
   
 
2461
  // If we can, convert the instructions to be patterns that are matched!
 
2462
  for (std::map<Record*, DAGInstruction, RecordPtrCmp>::iterator II =
 
2463
        Instructions.begin(),
 
2464
       E = Instructions.end(); II != E; ++II) {
 
2465
    DAGInstruction &TheInst = II->second;
 
2466
    const TreePattern *I = TheInst.getPattern();
 
2467
    if (I == 0) continue;  // No pattern.
 
2468
 
 
2469
    // FIXME: Assume only the first tree is the pattern. The others are clobber
 
2470
    // nodes.
 
2471
    TreePatternNode *Pattern = I->getTree(0);
 
2472
    TreePatternNode *SrcPattern;
 
2473
    if (Pattern->getOperator()->getName() == "set") {
 
2474
      SrcPattern = Pattern->getChild(Pattern->getNumChildren()-1)->clone();
 
2475
    } else{
 
2476
      // Not a set (store or something?)
 
2477
      SrcPattern = Pattern;
 
2478
    }
 
2479
    
 
2480
    Record *Instr = II->first;
 
2481
    AddPatternToMatch(I,
 
2482
                      PatternToMatch(Instr->getValueAsListInit("Predicates"),
 
2483
                                     SrcPattern,
 
2484
                                     TheInst.getResultPattern(),
 
2485
                                     TheInst.getImpResults(),
 
2486
                                     Instr->getValueAsInt("AddedComplexity"),
 
2487
                                     Instr->getID()));
 
2488
  }
 
2489
}
 
2490
 
 
2491
 
 
2492
typedef std::pair<const TreePatternNode*, unsigned> NameRecord;
 
2493
 
 
2494
static void FindNames(const TreePatternNode *P, 
 
2495
                      std::map<std::string, NameRecord> &Names,
 
2496
                      const TreePattern *PatternTop) {
 
2497
  if (!P->getName().empty()) {
 
2498
    NameRecord &Rec = Names[P->getName()];
 
2499
    // If this is the first instance of the name, remember the node.
 
2500
    if (Rec.second++ == 0)
 
2501
      Rec.first = P;
 
2502
    else if (Rec.first->getExtTypes() != P->getExtTypes())
 
2503
      PatternTop->error("repetition of value: $" + P->getName() +
 
2504
                        " where different uses have different types!");
 
2505
  }
 
2506
  
 
2507
  if (!P->isLeaf()) {
 
2508
    for (unsigned i = 0, e = P->getNumChildren(); i != e; ++i)
 
2509
      FindNames(P->getChild(i), Names, PatternTop);
 
2510
  }
 
2511
}
 
2512
 
 
2513
void CodeGenDAGPatterns::AddPatternToMatch(const TreePattern *Pattern,
 
2514
                                           const PatternToMatch &PTM) {
 
2515
  // Do some sanity checking on the pattern we're about to match.
 
2516
  std::string Reason;
 
2517
  if (!PTM.getSrcPattern()->canPatternMatch(Reason, *this))
 
2518
    Pattern->error("Pattern can never match: " + Reason);
 
2519
  
 
2520
  // If the source pattern's root is a complex pattern, that complex pattern
 
2521
  // must specify the nodes it can potentially match.
 
2522
  if (const ComplexPattern *CP =
 
2523
        PTM.getSrcPattern()->getComplexPatternInfo(*this))
 
2524
    if (CP->getRootNodes().empty())
 
2525
      Pattern->error("ComplexPattern at root must specify list of opcodes it"
 
2526
                     " could match");
 
2527
  
 
2528
  
 
2529
  // Find all of the named values in the input and output, ensure they have the
 
2530
  // same type.
 
2531
  std::map<std::string, NameRecord> SrcNames, DstNames;
 
2532
  FindNames(PTM.getSrcPattern(), SrcNames, Pattern);
 
2533
  FindNames(PTM.getDstPattern(), DstNames, Pattern);
 
2534
 
 
2535
  // Scan all of the named values in the destination pattern, rejecting them if
 
2536
  // they don't exist in the input pattern.
 
2537
  for (std::map<std::string, NameRecord>::iterator
 
2538
       I = DstNames.begin(), E = DstNames.end(); I != E; ++I) {
 
2539
    if (SrcNames[I->first].first == 0)
 
2540
      Pattern->error("Pattern has input without matching name in output: $" +
 
2541
                     I->first);
 
2542
  }
 
2543
  
 
2544
  // Scan all of the named values in the source pattern, rejecting them if the
 
2545
  // name isn't used in the dest, and isn't used to tie two values together.
 
2546
  for (std::map<std::string, NameRecord>::iterator
 
2547
       I = SrcNames.begin(), E = SrcNames.end(); I != E; ++I)
 
2548
    if (DstNames[I->first].first == 0 && SrcNames[I->first].second == 1)
 
2549
      Pattern->error("Pattern has dead named input: $" + I->first);
 
2550
  
 
2551
  PatternsToMatch.push_back(PTM);
 
2552
}
 
2553
 
 
2554
 
 
2555
 
 
2556
void CodeGenDAGPatterns::InferInstructionFlags() {
 
2557
  const std::vector<const CodeGenInstruction*> &Instructions =
 
2558
    Target.getInstructionsByEnumValue();
 
2559
  for (unsigned i = 0, e = Instructions.size(); i != e; ++i) {
 
2560
    CodeGenInstruction &InstInfo =
 
2561
      const_cast<CodeGenInstruction &>(*Instructions[i]);
 
2562
    // Determine properties of the instruction from its pattern.
 
2563
    bool MayStore, MayLoad, HasSideEffects, IsVariadic;
 
2564
    InferFromPattern(InstInfo, MayStore, MayLoad, HasSideEffects, IsVariadic,
 
2565
                     *this);
 
2566
    InstInfo.mayStore = MayStore;
 
2567
    InstInfo.mayLoad = MayLoad;
 
2568
    InstInfo.hasSideEffects = HasSideEffects;
 
2569
    InstInfo.isVariadic = IsVariadic;
 
2570
  }
 
2571
}
 
2572
 
 
2573
/// Given a pattern result with an unresolved type, see if we can find one
 
2574
/// instruction with an unresolved result type.  Force this result type to an
 
2575
/// arbitrary element if it's possible types to converge results.
 
2576
static bool ForceArbitraryInstResultType(TreePatternNode *N, TreePattern &TP) {
 
2577
  if (N->isLeaf())
 
2578
    return false;
 
2579
  
 
2580
  // Analyze children.
 
2581
  for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i)
 
2582
    if (ForceArbitraryInstResultType(N->getChild(i), TP))
 
2583
      return true;
 
2584
 
 
2585
  if (!N->getOperator()->isSubClassOf("Instruction"))
 
2586
    return false;
 
2587
 
 
2588
  // If this type is already concrete or completely unknown we can't do
 
2589
  // anything.
 
2590
  for (unsigned i = 0, e = N->getNumTypes(); i != e; ++i) {
 
2591
    if (N->getExtType(i).isCompletelyUnknown() || N->getExtType(i).isConcrete())
 
2592
      continue;
 
2593
  
 
2594
    // Otherwise, force its type to the first possibility (an arbitrary choice).
 
2595
    if (N->getExtType(i).MergeInTypeInfo(N->getExtType(i).getTypeList()[0], TP))
 
2596
      return true;
 
2597
  }
 
2598
  
 
2599
  return false;
 
2600
}
 
2601
 
 
2602
void CodeGenDAGPatterns::ParsePatterns() {
 
2603
  std::vector<Record*> Patterns = Records.getAllDerivedDefinitions("Pattern");
 
2604
 
 
2605
  for (unsigned i = 0, e = Patterns.size(); i != e; ++i) {
 
2606
    Record *CurPattern = Patterns[i];
 
2607
    DagInit *Tree = CurPattern->getValueAsDag("PatternToMatch");
 
2608
    TreePattern *Pattern = new TreePattern(CurPattern, Tree, true, *this);
 
2609
 
 
2610
    // Inline pattern fragments into it.
 
2611
    Pattern->InlinePatternFragments();
 
2612
    
 
2613
    ListInit *LI = CurPattern->getValueAsListInit("ResultInstrs");
 
2614
    if (LI->getSize() == 0) continue;  // no pattern.
 
2615
    
 
2616
    // Parse the instruction.
 
2617
    TreePattern *Result = new TreePattern(CurPattern, LI, false, *this);
 
2618
    
 
2619
    // Inline pattern fragments into it.
 
2620
    Result->InlinePatternFragments();
 
2621
 
 
2622
    if (Result->getNumTrees() != 1)
 
2623
      Result->error("Cannot handle instructions producing instructions "
 
2624
                    "with temporaries yet!");
 
2625
    
 
2626
    bool IterateInference;
 
2627
    bool InferredAllPatternTypes, InferredAllResultTypes;
 
2628
    do {
 
2629
      // Infer as many types as possible.  If we cannot infer all of them, we
 
2630
      // can never do anything with this pattern: report it to the user.
 
2631
      InferredAllPatternTypes =
 
2632
        Pattern->InferAllTypes(&Pattern->getNamedNodesMap());
 
2633
      
 
2634
      // Infer as many types as possible.  If we cannot infer all of them, we
 
2635
      // can never do anything with this pattern: report it to the user.
 
2636
      InferredAllResultTypes =
 
2637
        Result->InferAllTypes(&Pattern->getNamedNodesMap());
 
2638
 
 
2639
      IterateInference = false;
 
2640
      
 
2641
      // Apply the type of the result to the source pattern.  This helps us
 
2642
      // resolve cases where the input type is known to be a pointer type (which
 
2643
      // is considered resolved), but the result knows it needs to be 32- or
 
2644
      // 64-bits.  Infer the other way for good measure.
 
2645
      for (unsigned i = 0, e = std::min(Result->getTree(0)->getNumTypes(),
 
2646
                                        Pattern->getTree(0)->getNumTypes());
 
2647
           i != e; ++i) {
 
2648
        IterateInference = Pattern->getTree(0)->
 
2649
          UpdateNodeType(i, Result->getTree(0)->getExtType(i), *Result);
 
2650
        IterateInference |= Result->getTree(0)->
 
2651
          UpdateNodeType(i, Pattern->getTree(0)->getExtType(i), *Result);
 
2652
      }
 
2653
      
 
2654
      // If our iteration has converged and the input pattern's types are fully
 
2655
      // resolved but the result pattern is not fully resolved, we may have a
 
2656
      // situation where we have two instructions in the result pattern and
 
2657
      // the instructions require a common register class, but don't care about
 
2658
      // what actual MVT is used.  This is actually a bug in our modelling:
 
2659
      // output patterns should have register classes, not MVTs.
 
2660
      //
 
2661
      // In any case, to handle this, we just go through and disambiguate some
 
2662
      // arbitrary types to the result pattern's nodes.
 
2663
      if (!IterateInference && InferredAllPatternTypes &&
 
2664
          !InferredAllResultTypes)
 
2665
        IterateInference = ForceArbitraryInstResultType(Result->getTree(0),
 
2666
                                                        *Result);
 
2667
    } while (IterateInference);
 
2668
    
 
2669
    // Verify that we inferred enough types that we can do something with the
 
2670
    // pattern and result.  If these fire the user has to add type casts.
 
2671
    if (!InferredAllPatternTypes)
 
2672
      Pattern->error("Could not infer all types in pattern!");
 
2673
    if (!InferredAllResultTypes) {
 
2674
      Pattern->dump();
 
2675
      Result->error("Could not infer all types in pattern result!");
 
2676
    }
 
2677
    
 
2678
    // Validate that the input pattern is correct.
 
2679
    std::map<std::string, TreePatternNode*> InstInputs;
 
2680
    std::map<std::string, TreePatternNode*> InstResults;
 
2681
    std::vector<Record*> InstImpResults;
 
2682
    for (unsigned j = 0, ee = Pattern->getNumTrees(); j != ee; ++j)
 
2683
      FindPatternInputsAndOutputs(Pattern, Pattern->getTree(j),
 
2684
                                  InstInputs, InstResults,
 
2685
                                  InstImpResults);
 
2686
 
 
2687
    // Promote the xform function to be an explicit node if set.
 
2688
    TreePatternNode *DstPattern = Result->getOnlyTree();
 
2689
    std::vector<TreePatternNode*> ResultNodeOperands;
 
2690
    for (unsigned ii = 0, ee = DstPattern->getNumChildren(); ii != ee; ++ii) {
 
2691
      TreePatternNode *OpNode = DstPattern->getChild(ii);
 
2692
      if (Record *Xform = OpNode->getTransformFn()) {
 
2693
        OpNode->setTransformFn(0);
 
2694
        std::vector<TreePatternNode*> Children;
 
2695
        Children.push_back(OpNode);
 
2696
        OpNode = new TreePatternNode(Xform, Children, OpNode->getNumTypes());
 
2697
      }
 
2698
      ResultNodeOperands.push_back(OpNode);
 
2699
    }
 
2700
    DstPattern = Result->getOnlyTree();
 
2701
    if (!DstPattern->isLeaf())
 
2702
      DstPattern = new TreePatternNode(DstPattern->getOperator(),
 
2703
                                       ResultNodeOperands,
 
2704
                                       DstPattern->getNumTypes());
 
2705
    
 
2706
    for (unsigned i = 0, e = Result->getOnlyTree()->getNumTypes(); i != e; ++i)
 
2707
      DstPattern->setType(i, Result->getOnlyTree()->getExtType(i));
 
2708
    
 
2709
    TreePattern Temp(Result->getRecord(), DstPattern, false, *this);
 
2710
    Temp.InferAllTypes();
 
2711
 
 
2712
    
 
2713
    AddPatternToMatch(Pattern,
 
2714
                    PatternToMatch(CurPattern->getValueAsListInit("Predicates"),
 
2715
                                   Pattern->getTree(0),
 
2716
                                   Temp.getOnlyTree(), InstImpResults,
 
2717
                                   CurPattern->getValueAsInt("AddedComplexity"),
 
2718
                                   CurPattern->getID()));
 
2719
  }
 
2720
}
 
2721
 
 
2722
/// CombineChildVariants - Given a bunch of permutations of each child of the
 
2723
/// 'operator' node, put them together in all possible ways.
 
2724
static void CombineChildVariants(TreePatternNode *Orig, 
 
2725
               const std::vector<std::vector<TreePatternNode*> > &ChildVariants,
 
2726
                                 std::vector<TreePatternNode*> &OutVariants,
 
2727
                                 CodeGenDAGPatterns &CDP,
 
2728
                                 const MultipleUseVarSet &DepVars) {
 
2729
  // Make sure that each operand has at least one variant to choose from.
 
2730
  for (unsigned i = 0, e = ChildVariants.size(); i != e; ++i)
 
2731
    if (ChildVariants[i].empty())
 
2732
      return;
 
2733
        
 
2734
  // The end result is an all-pairs construction of the resultant pattern.
 
2735
  std::vector<unsigned> Idxs;
 
2736
  Idxs.resize(ChildVariants.size());
 
2737
  bool NotDone;
 
2738
  do {
 
2739
#ifndef NDEBUG
 
2740
    DEBUG(if (!Idxs.empty()) {
 
2741
            errs() << Orig->getOperator()->getName() << ": Idxs = [ ";
 
2742
              for (unsigned i = 0; i < Idxs.size(); ++i) {
 
2743
                errs() << Idxs[i] << " ";
 
2744
            }
 
2745
            errs() << "]\n";
 
2746
          });
 
2747
#endif
 
2748
    // Create the variant and add it to the output list.
 
2749
    std::vector<TreePatternNode*> NewChildren;
 
2750
    for (unsigned i = 0, e = ChildVariants.size(); i != e; ++i)
 
2751
      NewChildren.push_back(ChildVariants[i][Idxs[i]]);
 
2752
    TreePatternNode *R = new TreePatternNode(Orig->getOperator(), NewChildren,
 
2753
                                             Orig->getNumTypes());
 
2754
    
 
2755
    // Copy over properties.
 
2756
    R->setName(Orig->getName());
 
2757
    R->setPredicateFns(Orig->getPredicateFns());
 
2758
    R->setTransformFn(Orig->getTransformFn());
 
2759
    for (unsigned i = 0, e = Orig->getNumTypes(); i != e; ++i)
 
2760
      R->setType(i, Orig->getExtType(i));
 
2761
    
 
2762
    // If this pattern cannot match, do not include it as a variant.
 
2763
    std::string ErrString;
 
2764
    if (!R->canPatternMatch(ErrString, CDP)) {
 
2765
      delete R;
 
2766
    } else {
 
2767
      bool AlreadyExists = false;
 
2768
      
 
2769
      // Scan to see if this pattern has already been emitted.  We can get
 
2770
      // duplication due to things like commuting:
 
2771
      //   (and GPRC:$a, GPRC:$b) -> (and GPRC:$b, GPRC:$a)
 
2772
      // which are the same pattern.  Ignore the dups.
 
2773
      for (unsigned i = 0, e = OutVariants.size(); i != e; ++i)
 
2774
        if (R->isIsomorphicTo(OutVariants[i], DepVars)) {
 
2775
          AlreadyExists = true;
 
2776
          break;
 
2777
        }
 
2778
      
 
2779
      if (AlreadyExists)
 
2780
        delete R;
 
2781
      else
 
2782
        OutVariants.push_back(R);
 
2783
    }
 
2784
    
 
2785
    // Increment indices to the next permutation by incrementing the
 
2786
    // indicies from last index backward, e.g., generate the sequence
 
2787
    // [0, 0], [0, 1], [1, 0], [1, 1].
 
2788
    int IdxsIdx;
 
2789
    for (IdxsIdx = Idxs.size() - 1; IdxsIdx >= 0; --IdxsIdx) {
 
2790
      if (++Idxs[IdxsIdx] == ChildVariants[IdxsIdx].size())
 
2791
        Idxs[IdxsIdx] = 0;
 
2792
      else
 
2793
        break;
 
2794
    }
 
2795
    NotDone = (IdxsIdx >= 0);
 
2796
  } while (NotDone);
 
2797
}
 
2798
 
 
2799
/// CombineChildVariants - A helper function for binary operators.
 
2800
///
 
2801
static void CombineChildVariants(TreePatternNode *Orig, 
 
2802
                                 const std::vector<TreePatternNode*> &LHS,
 
2803
                                 const std::vector<TreePatternNode*> &RHS,
 
2804
                                 std::vector<TreePatternNode*> &OutVariants,
 
2805
                                 CodeGenDAGPatterns &CDP,
 
2806
                                 const MultipleUseVarSet &DepVars) {
 
2807
  std::vector<std::vector<TreePatternNode*> > ChildVariants;
 
2808
  ChildVariants.push_back(LHS);
 
2809
  ChildVariants.push_back(RHS);
 
2810
  CombineChildVariants(Orig, ChildVariants, OutVariants, CDP, DepVars);
 
2811
}  
 
2812
 
 
2813
 
 
2814
static void GatherChildrenOfAssociativeOpcode(TreePatternNode *N,
 
2815
                                     std::vector<TreePatternNode *> &Children) {
 
2816
  assert(N->getNumChildren()==2 &&"Associative but doesn't have 2 children!");
 
2817
  Record *Operator = N->getOperator();
 
2818
  
 
2819
  // Only permit raw nodes.
 
2820
  if (!N->getName().empty() || !N->getPredicateFns().empty() ||
 
2821
      N->getTransformFn()) {
 
2822
    Children.push_back(N);
 
2823
    return;
 
2824
  }
 
2825
 
 
2826
  if (N->getChild(0)->isLeaf() || N->getChild(0)->getOperator() != Operator)
 
2827
    Children.push_back(N->getChild(0));
 
2828
  else
 
2829
    GatherChildrenOfAssociativeOpcode(N->getChild(0), Children);
 
2830
 
 
2831
  if (N->getChild(1)->isLeaf() || N->getChild(1)->getOperator() != Operator)
 
2832
    Children.push_back(N->getChild(1));
 
2833
  else
 
2834
    GatherChildrenOfAssociativeOpcode(N->getChild(1), Children);
 
2835
}
 
2836
 
 
2837
/// GenerateVariantsOf - Given a pattern N, generate all permutations we can of
 
2838
/// the (potentially recursive) pattern by using algebraic laws.
 
2839
///
 
2840
static void GenerateVariantsOf(TreePatternNode *N,
 
2841
                               std::vector<TreePatternNode*> &OutVariants,
 
2842
                               CodeGenDAGPatterns &CDP,
 
2843
                               const MultipleUseVarSet &DepVars) {
 
2844
  // We cannot permute leaves.
 
2845
  if (N->isLeaf()) {
 
2846
    OutVariants.push_back(N);
 
2847
    return;
 
2848
  }
 
2849
 
 
2850
  // Look up interesting info about the node.
 
2851
  const SDNodeInfo &NodeInfo = CDP.getSDNodeInfo(N->getOperator());
 
2852
 
 
2853
  // If this node is associative, re-associate.
 
2854
  if (NodeInfo.hasProperty(SDNPAssociative)) {
 
2855
    // Re-associate by pulling together all of the linked operators 
 
2856
    std::vector<TreePatternNode*> MaximalChildren;
 
2857
    GatherChildrenOfAssociativeOpcode(N, MaximalChildren);
 
2858
 
 
2859
    // Only handle child sizes of 3.  Otherwise we'll end up trying too many
 
2860
    // permutations.
 
2861
    if (MaximalChildren.size() == 3) {
 
2862
      // Find the variants of all of our maximal children.
 
2863
      std::vector<TreePatternNode*> AVariants, BVariants, CVariants;
 
2864
      GenerateVariantsOf(MaximalChildren[0], AVariants, CDP, DepVars);
 
2865
      GenerateVariantsOf(MaximalChildren[1], BVariants, CDP, DepVars);
 
2866
      GenerateVariantsOf(MaximalChildren[2], CVariants, CDP, DepVars);
 
2867
      
 
2868
      // There are only two ways we can permute the tree:
 
2869
      //   (A op B) op C    and    A op (B op C)
 
2870
      // Within these forms, we can also permute A/B/C.
 
2871
      
 
2872
      // Generate legal pair permutations of A/B/C.
 
2873
      std::vector<TreePatternNode*> ABVariants;
 
2874
      std::vector<TreePatternNode*> BAVariants;
 
2875
      std::vector<TreePatternNode*> ACVariants;
 
2876
      std::vector<TreePatternNode*> CAVariants;
 
2877
      std::vector<TreePatternNode*> BCVariants;
 
2878
      std::vector<TreePatternNode*> CBVariants;
 
2879
      CombineChildVariants(N, AVariants, BVariants, ABVariants, CDP, DepVars);
 
2880
      CombineChildVariants(N, BVariants, AVariants, BAVariants, CDP, DepVars);
 
2881
      CombineChildVariants(N, AVariants, CVariants, ACVariants, CDP, DepVars);
 
2882
      CombineChildVariants(N, CVariants, AVariants, CAVariants, CDP, DepVars);
 
2883
      CombineChildVariants(N, BVariants, CVariants, BCVariants, CDP, DepVars);
 
2884
      CombineChildVariants(N, CVariants, BVariants, CBVariants, CDP, DepVars);
 
2885
 
 
2886
      // Combine those into the result: (x op x) op x
 
2887
      CombineChildVariants(N, ABVariants, CVariants, OutVariants, CDP, DepVars);
 
2888
      CombineChildVariants(N, BAVariants, CVariants, OutVariants, CDP, DepVars);
 
2889
      CombineChildVariants(N, ACVariants, BVariants, OutVariants, CDP, DepVars);
 
2890
      CombineChildVariants(N, CAVariants, BVariants, OutVariants, CDP, DepVars);
 
2891
      CombineChildVariants(N, BCVariants, AVariants, OutVariants, CDP, DepVars);
 
2892
      CombineChildVariants(N, CBVariants, AVariants, OutVariants, CDP, DepVars);
 
2893
 
 
2894
      // Combine those into the result: x op (x op x)
 
2895
      CombineChildVariants(N, CVariants, ABVariants, OutVariants, CDP, DepVars);
 
2896
      CombineChildVariants(N, CVariants, BAVariants, OutVariants, CDP, DepVars);
 
2897
      CombineChildVariants(N, BVariants, ACVariants, OutVariants, CDP, DepVars);
 
2898
      CombineChildVariants(N, BVariants, CAVariants, OutVariants, CDP, DepVars);
 
2899
      CombineChildVariants(N, AVariants, BCVariants, OutVariants, CDP, DepVars);
 
2900
      CombineChildVariants(N, AVariants, CBVariants, OutVariants, CDP, DepVars);
 
2901
      return;
 
2902
    }
 
2903
  }
 
2904
  
 
2905
  // Compute permutations of all children.
 
2906
  std::vector<std::vector<TreePatternNode*> > ChildVariants;
 
2907
  ChildVariants.resize(N->getNumChildren());
 
2908
  for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i)
 
2909
    GenerateVariantsOf(N->getChild(i), ChildVariants[i], CDP, DepVars);
 
2910
 
 
2911
  // Build all permutations based on how the children were formed.
 
2912
  CombineChildVariants(N, ChildVariants, OutVariants, CDP, DepVars);
 
2913
 
 
2914
  // If this node is commutative, consider the commuted order.
 
2915
  bool isCommIntrinsic = N->isCommutativeIntrinsic(CDP);
 
2916
  if (NodeInfo.hasProperty(SDNPCommutative) || isCommIntrinsic) {
 
2917
    assert((N->getNumChildren()==2 || isCommIntrinsic) &&
 
2918
           "Commutative but doesn't have 2 children!");
 
2919
    // Don't count children which are actually register references.
 
2920
    unsigned NC = 0;
 
2921
    for (unsigned i = 0, e = N->getNumChildren(); i != e; ++i) {
 
2922
      TreePatternNode *Child = N->getChild(i);
 
2923
      if (Child->isLeaf())
 
2924
        if (DefInit *DI = dynamic_cast<DefInit*>(Child->getLeafValue())) {
 
2925
          Record *RR = DI->getDef();
 
2926
          if (RR->isSubClassOf("Register"))
 
2927
            continue;
 
2928
        }
 
2929
      NC++;
 
2930
    }
 
2931
    // Consider the commuted order.
 
2932
    if (isCommIntrinsic) {
 
2933
      // Commutative intrinsic. First operand is the intrinsic id, 2nd and 3rd
 
2934
      // operands are the commutative operands, and there might be more operands
 
2935
      // after those.
 
2936
      assert(NC >= 3 &&
 
2937
             "Commutative intrinsic should have at least 3 childrean!");
 
2938
      std::vector<std::vector<TreePatternNode*> > Variants;
 
2939
      Variants.push_back(ChildVariants[0]); // Intrinsic id.
 
2940
      Variants.push_back(ChildVariants[2]);
 
2941
      Variants.push_back(ChildVariants[1]);
 
2942
      for (unsigned i = 3; i != NC; ++i)
 
2943
        Variants.push_back(ChildVariants[i]);
 
2944
      CombineChildVariants(N, Variants, OutVariants, CDP, DepVars);
 
2945
    } else if (NC == 2)
 
2946
      CombineChildVariants(N, ChildVariants[1], ChildVariants[0],
 
2947
                           OutVariants, CDP, DepVars);
 
2948
  }
 
2949
}
 
2950
 
 
2951
 
 
2952
// GenerateVariants - Generate variants.  For example, commutative patterns can
 
2953
// match multiple ways.  Add them to PatternsToMatch as well.
 
2954
void CodeGenDAGPatterns::GenerateVariants() {
 
2955
  DEBUG(errs() << "Generating instruction variants.\n");
 
2956
  
 
2957
  // Loop over all of the patterns we've collected, checking to see if we can
 
2958
  // generate variants of the instruction, through the exploitation of
 
2959
  // identities.  This permits the target to provide aggressive matching without
 
2960
  // the .td file having to contain tons of variants of instructions.
 
2961
  //
 
2962
  // Note that this loop adds new patterns to the PatternsToMatch list, but we
 
2963
  // intentionally do not reconsider these.  Any variants of added patterns have
 
2964
  // already been added.
 
2965
  //
 
2966
  for (unsigned i = 0, e = PatternsToMatch.size(); i != e; ++i) {
 
2967
    MultipleUseVarSet             DepVars;
 
2968
    std::vector<TreePatternNode*> Variants;
 
2969
    FindDepVars(PatternsToMatch[i].getSrcPattern(), DepVars);
 
2970
    DEBUG(errs() << "Dependent/multiply used variables: ");
 
2971
    DEBUG(DumpDepVars(DepVars));
 
2972
    DEBUG(errs() << "\n");
 
2973
    GenerateVariantsOf(PatternsToMatch[i].getSrcPattern(), Variants, *this, DepVars);
 
2974
 
 
2975
    assert(!Variants.empty() && "Must create at least original variant!");
 
2976
    Variants.erase(Variants.begin());  // Remove the original pattern.
 
2977
 
 
2978
    if (Variants.empty())  // No variants for this pattern.
 
2979
      continue;
 
2980
 
 
2981
    DEBUG(errs() << "FOUND VARIANTS OF: ";
 
2982
          PatternsToMatch[i].getSrcPattern()->dump();
 
2983
          errs() << "\n");
 
2984
 
 
2985
    for (unsigned v = 0, e = Variants.size(); v != e; ++v) {
 
2986
      TreePatternNode *Variant = Variants[v];
 
2987
 
 
2988
      DEBUG(errs() << "  VAR#" << v <<  ": ";
 
2989
            Variant->dump();
 
2990
            errs() << "\n");
 
2991
      
 
2992
      // Scan to see if an instruction or explicit pattern already matches this.
 
2993
      bool AlreadyExists = false;
 
2994
      for (unsigned p = 0, e = PatternsToMatch.size(); p != e; ++p) {
 
2995
        // Skip if the top level predicates do not match.
 
2996
        if (PatternsToMatch[i].getPredicates() !=
 
2997
            PatternsToMatch[p].getPredicates())
 
2998
          continue;
 
2999
        // Check to see if this variant already exists.
 
3000
        if (Variant->isIsomorphicTo(PatternsToMatch[p].getSrcPattern(), DepVars)) {
 
3001
          DEBUG(errs() << "  *** ALREADY EXISTS, ignoring variant.\n");
 
3002
          AlreadyExists = true;
 
3003
          break;
 
3004
        }
 
3005
      }
 
3006
      // If we already have it, ignore the variant.
 
3007
      if (AlreadyExists) continue;
 
3008
 
 
3009
      // Otherwise, add it to the list of patterns we have.
 
3010
      PatternsToMatch.
 
3011
        push_back(PatternToMatch(PatternsToMatch[i].getPredicates(),
 
3012
                                 Variant, PatternsToMatch[i].getDstPattern(),
 
3013
                                 PatternsToMatch[i].getDstRegs(),
 
3014
                                 PatternsToMatch[i].getAddedComplexity(),
 
3015
                                 Record::getNewUID()));
 
3016
    }
 
3017
 
 
3018
    DEBUG(errs() << "\n");
 
3019
  }
 
3020
}
 
3021