forked from OSchip/llvm-project
f84bc3793e
Summary: Previously, a extending load was represented at (G_*EXT (G_LOAD x)). This had a few drawbacks: * G_LOAD had to be legal for all sizes you could extend from, even if registers didn't naturally hold those sizes. * All sizes you could extend from had to be allocatable just in case the extend went missing (e.g. by optimization). * At minimum, G_*EXT and G_TRUNC had to be legal for these sizes. As we improve optimization of extends and truncates, this legality requirement would spread without considerable care w.r.t when certain combines were permitted. * The SelectionDAG importer required some ugly and fragile pattern rewriting to translate patterns into this style. This patch changes the representation to: * (G_[SZ]EXTLOAD x) * (G_LOAD x) any-extends when MMO.getSize() * 8 < ResultTy.getSizeInBits() which resolves these issues by allowing targets to work entirely in their native register sizes, and by having a more direct translation from SelectionDAG patterns. Each extending load can be lowered by the legalizer into separate extends and loads, however a target that supports s1 will need the any-extending load to extend to at least s8 since LLVM does not represent memory accesses smaller than 8 bit. The legalizer can widenScalar G_LOAD into an any-extending load but sign/zero-extending loads need help from something else like a combiner pass. A follow-up patch that adds combiner helpers for for this will follow. The new representation requires that the MMO correctly reflect the memory access so this has been corrected in a couple tests. I've also moved the extending loads to their own tests since they are (mostly) separate opcodes now. Additionally, the re-write appears to have invalidated two tests from select-with-no-legality-check.mir since the matcher table no longer contains loads that result in s1's and they aren't legal in AArch64 anymore. Depends on D45540 Reviewers: ab, aditya_nandakumar, bogner, rtereshin, volkan, rovka, javed.absar Reviewed By: rtereshin Subscribers: javed.absar, llvm-commits, kristof.beyls Differential Revision: https://reviews.llvm.org/D45541 llvm-svn: 331601 |
||
---|---|---|
.. | ||
2003-08-03-PassCode.td | ||
2006-09-18-LargeInt.td | ||
2010-03-24-PrematureDefaults.td | ||
AllowDuplicateRegisterNames.td | ||
AnonDefinitionOnDemand.td | ||
AsmPredicateCondsEmission.td | ||
AsmVariant.td | ||
BitOffsetDecoder.td | ||
BitsInit.td | ||
BitsInitOverflow.td | ||
CStyleComment.td | ||
ClassInstanceValue.td | ||
ConcatenatedSubregs.td | ||
Dag.td | ||
DefmInherit.td | ||
DefmInsideMultiClass.td | ||
DuplicateFieldValues.td | ||
FieldAccess.td | ||
ForeachList.td | ||
ForeachLoop.td | ||
ForwardRef.td | ||
GeneralList.td | ||
GlobalISelEmitter.td | ||
HwModeSelect.td | ||
Include.inc | ||
Include.td | ||
IntBitInit.td | ||
LazyChange.td | ||
LetInsideMultiClasses.td | ||
ListArgs.td | ||
ListArgsSimple.td | ||
ListConversion.td | ||
ListManip.td | ||
ListOfList.td | ||
ListSlices.td | ||
LoLoL.td | ||
MultiClass-defm-fail.td | ||
MultiClass-defm.td | ||
MultiClass.td | ||
MultiClassDefName.td | ||
MultiClassInherit.td | ||
MultiPat.td | ||
NestedForeach.td | ||
Paste.td | ||
RegisterBankEmitter.td | ||
RegisterEncoder.td | ||
RelTest.td | ||
SetTheory.td | ||
SiblingForeach.td | ||
Slice.td | ||
String.td | ||
SuperSubclassSameName.td | ||
TargetInstrInfo.td | ||
TargetInstrSpec.td | ||
TemplateArgRename.td | ||
Tree.td | ||
TreeNames.td | ||
TwoLevelName.td | ||
UnsetBitInit.td | ||
UnterminatedComment.td | ||
ValidIdentifiers.td | ||
arithmetic.td | ||
cast-list-initializer.td | ||
cast-typeerror.td | ||
cast.td | ||
code.td | ||
compare.td | ||
dag-functional.td | ||
defmclass.td | ||
defset-typeerror.td | ||
defset.td | ||
eq.td | ||
eqbit.td | ||
foldl.td | ||
foreach-eval.td | ||
foreach-leak.td | ||
foreach-multiclass.td | ||
foreach.td | ||
if-empty-list-arg.td | ||
if-type.td | ||
if.td | ||
ifbit.td | ||
intrinsic-long-name.td | ||
intrinsic-struct.td | ||
intrinsic-varargs.td | ||
isa.td | ||
lisp.td | ||
list-element-bitref.td | ||
listconcat.td | ||
lit.local.cfg | ||
math.td | ||
name-resolution-consistency.td | ||
nested-comment.td | ||
pr8330.td | ||
searchabletables-intrinsic.td | ||
self-reference-recursion.td | ||
self-reference-typeerror.td | ||
self-reference.td | ||
size.td | ||
strconcat.td | ||
subst.td | ||
subst2.td | ||
template-arg-dependency.td | ||
trydecode-emission.td | ||
trydecode-emission2.td | ||
trydecode-emission3.td | ||
usevalname.td |