diff options
author | Tim Northover <tnorthover@apple.com> | 2016-08-23 21:01:33 +0000 |
---|---|---|
committer | Tim Northover <tnorthover@apple.com> | 2016-08-23 21:01:33 +0000 |
commit | bdf67c9a00d0cba65506f39edc4d06d4aac98cff (patch) | |
tree | 04e085eace34983a0b1076593752814b8c8e4b46 /llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp | |
parent | 6cd4b23a0fc9cc2f24d996148e170b0a538079d7 (diff) | |
download | bcm5719-llvm-bdf67c9a00d0cba65506f39edc4d06d4aac98cff.tar.gz bcm5719-llvm-bdf67c9a00d0cba65506f39edc4d06d4aac98cff.zip |
GlobalISel: make truncate/extend casts uniform
They really should have both types represented, but early variants were created
before MachineInstrs could have multiple types so they're rather ambiguous.
llvm-svn: 279567
Diffstat (limited to 'llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp')
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp index 92323895562..c9499ca7e6f 100644 --- a/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp +++ b/llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp @@ -141,18 +141,21 @@ MachineInstrBuilder MachineIRBuilder::buildUAdde(LLT Ty, unsigned Res, .addUse(CarryIn); } -MachineInstrBuilder MachineIRBuilder::buildAnyExtend(LLT Ty, unsigned Res, - unsigned Op) { - return buildInstr(TargetOpcode::G_ANYEXTEND, Ty).addDef(Res).addUse(Op); +MachineInstrBuilder MachineIRBuilder::buildAnyExt(ArrayRef<LLT> Tys, + unsigned Res, unsigned Op) { + validateTruncExt(Tys, true); + return buildInstr(TargetOpcode::G_ANYEXT, Tys).addDef(Res).addUse(Op); } MachineInstrBuilder MachineIRBuilder::buildSExt(ArrayRef<LLT> Tys, unsigned Res, unsigned Op) { + validateTruncExt(Tys, true); return buildInstr(TargetOpcode::G_SEXT, Tys).addDef(Res).addUse(Op); } MachineInstrBuilder MachineIRBuilder::buildZExt(ArrayRef<LLT> Tys, unsigned Res, unsigned Op) { + validateTruncExt(Tys, true); return buildInstr(TargetOpcode::G_ZEXT, Tys).addDef(Res).addUse(Op); } @@ -216,14 +219,16 @@ MachineInstrBuilder MachineIRBuilder::buildIntrinsic(ArrayRef<LLT> Tys, return MIB; } -MachineInstrBuilder MachineIRBuilder::buildTrunc(LLT Ty, unsigned Res, - unsigned Op) { - return buildInstr(TargetOpcode::G_TRUNC, Ty).addDef(Res).addUse(Op); +MachineInstrBuilder MachineIRBuilder::buildTrunc(ArrayRef<LLT> Tys, + unsigned Res, unsigned Op) { + validateTruncExt(Tys, false); + return buildInstr(TargetOpcode::G_TRUNC, Tys).addDef(Res).addUse(Op); } -MachineInstrBuilder MachineIRBuilder::buildFPTrunc(LLT Ty, unsigned Res, - unsigned Op) { - return buildInstr(TargetOpcode::G_FPTRUNC, Ty).addDef(Res).addUse(Op); +MachineInstrBuilder MachineIRBuilder::buildFPTrunc(ArrayRef<LLT> Tys, + unsigned Res, unsigned Op) { + validateTruncExt(Tys, false); + return buildInstr(TargetOpcode::G_FPTRUNC, Tys).addDef(Res).addUse(Op); } MachineInstrBuilder MachineIRBuilder::buildICmp(ArrayRef<LLT> Tys, @@ -257,3 +262,22 @@ MachineInstrBuilder MachineIRBuilder::buildSelect(LLT Ty, unsigned Res, .addUse(Op0) .addUse(Op1); } + +void MachineIRBuilder::validateTruncExt(ArrayRef<LLT> Tys, bool IsExtend) { + assert(Tys.size() == 2 && "cast should have a source and a dest type"); + LLT DstTy{Tys[0]}, SrcTy{Tys[1]}; + + if (DstTy.isVector()) { + assert(SrcTy.isVector() && "mismatched cast between vecot and non-vector"); + assert(SrcTy.getNumElements() == DstTy.getNumElements() && + "different number of elements in a trunc/ext"); + } else + assert(DstTy.isScalar() && SrcTy.isScalar() && "invalid extend/trunc"); + + if (IsExtend) + assert(DstTy.getSizeInBits() > SrcTy.getSizeInBits() && + "invalid narrowing extend"); + else + assert(DstTy.getSizeInBits() < SrcTy.getSizeInBits() && + "invalid widening trunc"); +} |