mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
230a0cd001
This broke the Chromium build, causing it to fail with e.g. fatal error: error in backend: Cannot select: t362: v4i32 = X86ISD::VSHLI t392, Constant:i8<15> See llvm-commits thread of r372285 for details. This also reverts r372286, r372287, r372288, r372289, r372290, r372291, r372292, r372293, r372296, and r372297, which seemed to depend on the main commit. > Encode them directly as an imm argument to G_INTRINSIC*. > > Since now intrinsics can now define what parameters are required to be > immediates, avoid using registers for them. Intrinsics could > potentially want a constant that isn't a legal register type. Also, > since G_CONSTANT is subject to CSE and legalization, transforms could > potentially obscure the value (and create extra work for the > selector). The register bank of a G_CONSTANT is also meaningful, so > this could throw off future folding and legalization logic for AMDGPU. > > This will be much more convenient to work with than needing to call > getConstantVRegVal and checking if it may have failed for every > constant intrinsic parameter. AMDGPU has quite a lot of intrinsics wth > immarg operands, many of which need inspection during lowering. Having > to find the value in a register is going to add a lot of boilerplate > and waste compile time. > > SelectionDAG has always provided TargetConstant for constants which > should not be legalized or materialized in a register. The distinction > between Constant and TargetConstant was somewhat fuzzy, and there was > no automatic way to force usage of TargetConstant for certain > intrinsic parameters. They were both ultimately ConstantSDNode, and it > was inconsistently used. It was quite easy to mis-select an > instruction requiring an immediate. For SelectionDAG, start emitting > TargetConstant for these arguments, and using timm to match them. > > Most of the work here is to cleanup target handling of constants. Some > targets process intrinsics through intermediate custom nodes, which > need to preserve TargetConstant usage to match the intrinsic > expectation. Pattern inputs now need to distinguish whether a constant > is merely compatible with an operand or whether it is mandatory. > > The GlobalISelEmitter needs to treat timm as a special case of a leaf > node, simlar to MachineBasicBlock operands. This should also enable > handling of patterns for some G_* instructions with immediates, like > G_FENCE or G_EXTRACT. > > This does include a workaround for a crash in GlobalISelEmitter when > ARM tries to uses "imm" in an output with a "timm" pattern source. llvm-svn: 372314 |
||
---|---|---|
.. | ||
Common | ||
FixedLenDecoderEmitter | ||
2003-08-03-PassCode.td | ||
2006-09-18-LargeInt.td | ||
2010-03-24-PrematureDefaults.td | ||
address-space-patfrags.td | ||
AllowDuplicateRegisterNames.td | ||
ambiguous-composition.td | ||
AnonDefinitionOnDemand.td | ||
arithmetic.td | ||
AsmPredicateCondsEmission.td | ||
AsmVariant.td | ||
BigEncoder.td | ||
BitOffsetDecoder.td | ||
BitsInit.td | ||
BitsInitOverflow.td | ||
cast-list-initializer.td | ||
cast-multiclass.td | ||
cast-typeerror.td | ||
cast.td | ||
ClassInstanceValue.td | ||
code.td | ||
compare.td | ||
ConcatenatedSubregs.td | ||
cond-bitlist.td | ||
cond-default.td | ||
cond-empty-list-arg.td | ||
cond-inheritance.td | ||
cond-let.td | ||
cond-list.td | ||
cond-subclass.td | ||
cond-type.td | ||
cond-usage.td | ||
condsbit.td | ||
ConstraintChecking1.td | ||
ConstraintChecking2.td | ||
ConstraintChecking3.td | ||
ConstraintChecking4.td | ||
ConstraintChecking5.td | ||
ConstraintChecking6.td | ||
ConstraintChecking7.td | ||
ConstraintChecking.inc | ||
CStyleComment.td | ||
dag-functional.td | ||
dag-isel-res-order.td | ||
Dag.td | ||
DAGDefaultOps.td | ||
defmclass.td | ||
DefmInherit.td | ||
DefmInsideMultiClass.td | ||
defset-typeerror.td | ||
defset.td | ||
DuplicateFieldValues.td | ||
eq.td | ||
eqbit.td | ||
FastISelEmitter.td | ||
FieldAccess.td | ||
foldl.td | ||
foreach-eval.td | ||
foreach-leak.td | ||
foreach-multiclass.td | ||
foreach-range-parse-errors0.td | ||
foreach-range-parse-errors1.td | ||
foreach-range-parse-errors2.td | ||
foreach-range-parse-errors3.td | ||
foreach-range-parse-errors4.td | ||
foreach-range-parse-errors5.td | ||
foreach-variable-range.td | ||
foreach.td | ||
ForeachList.td | ||
ForeachLoop.td | ||
ForwardRef.td | ||
GeneralList.td | ||
generic-tables-instruction.td | ||
generic-tables.td | ||
get-operand-type.td | ||
gisel-physreg-input.td | ||
GlobalISelEmitter-PR39045.td | ||
GlobalISelEmitter-setcc.td | ||
GlobalISelEmitter.td | ||
GlobalISelEmitterOverloadedPtr.td | ||
GlobalISelEmitterRegSequence.td | ||
GlobalISelEmitterSkippedPatterns.td | ||
GlobalISelEmitterSubreg.td | ||
HwModeSelect.td | ||
if-empty-list-arg.td | ||
if-type.td | ||
if.td | ||
ifbit.td | ||
Include.inc | ||
Include.td | ||
IntBitInit.td | ||
intrin-side-effects.td | ||
intrinsic-long-name.td | ||
intrinsic-pointer-to-any.td | ||
intrinsic-struct.td | ||
intrinsic-varargs.td | ||
IntSpecialValues.td | ||
isa.td | ||
JSON-check.py | ||
JSON.td | ||
LazyChange.td | ||
LetInsideMultiClasses.td | ||
lisp.td | ||
list-element-bitref.td | ||
ListArgs.td | ||
ListArgsSimple.td | ||
listconcat.td | ||
ListConversion.td | ||
ListManip.td | ||
ListOfList.td | ||
listpaste.td | ||
ListSlices.td | ||
listsplat.td | ||
lit.local.cfg | ||
LoLoL.td | ||
math.td | ||
MultiClass-def-fail.td | ||
MultiClass-defm-fail.td | ||
MultiClass-defm.td | ||
MultiClass.td | ||
MultiClassDefName.td | ||
MultiClassInherit.td | ||
MultiPat.td | ||
name-resolution-consistency.td | ||
nested-comment.td | ||
NestedForeach.td | ||
Paste.td | ||
pr8330.td | ||
prep-diag1.td | ||
prep-diag2.td | ||
prep-diag3.td | ||
prep-diag4.td | ||
prep-diag5.td | ||
prep-diag6.td | ||
prep-diag7.td | ||
prep-diag8.td | ||
prep-diag9.td | ||
prep-diag10.td | ||
prep-diag11-include.inc | ||
prep-diag11.td | ||
prep-diag12-include.inc | ||
prep-diag12.td | ||
prep-diag13.td | ||
prep-diag14.td | ||
prep-ifndef-diag-1.td | ||
prep-ifndef-diag-2.td | ||
prep-ifndef.td | ||
prep-region-include.inc | ||
prep-region-processing.td | ||
RegisterBankEmitter.td | ||
RegisterEncoder.td | ||
RelTest.td | ||
SchedModelError.td | ||
searchabletables-intrinsic.td | ||
self-reference-recursion.td | ||
self-reference-typeerror.td | ||
self-reference.td | ||
SetTheory.td | ||
SiblingForeach.td | ||
size.td | ||
Slice.td | ||
strconcat.td | ||
String.td | ||
subst2.td | ||
subst.td | ||
SuperSubclassSameName.td | ||
TargetInstrInfo.td | ||
TargetInstrSpec.td | ||
template-arg-dependency.td | ||
TemplateArgRename.td | ||
Tree.td | ||
TreeNames.td | ||
trydecode-emission2.td | ||
trydecode-emission3.td | ||
trydecode-emission.td | ||
TwoLevelName.td | ||
UnsetBitInit.td | ||
unterminated-c-comment-include.inc | ||
unterminated-c-comment.td | ||
unterminated-code-block-include.inc | ||
unterminated-code-block.td | ||
UnterminatedComment.td | ||
usevalname.td | ||
ValidIdentifiers.td |