summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/AArch64/AArch64CallLowering.cpp
diff options
context:
space:
mode:
authorAditya Nandakumar <aditya_nandakumar@apple.com>2017-10-09 20:07:43 +0000
committerAditya Nandakumar <aditya_nandakumar@apple.com>2017-10-09 20:07:43 +0000
commitc3bfc81a1f88a156f1b9d7f3328ef7b7fc1f5fea (patch)
tree93d09a1378c5ee3f9177026fdc8baa46c10d5c2c /llvm/lib/Target/AArch64/AArch64CallLowering.cpp
parent4d62ca3ae903f2c88203d25907ef0b71b0d660ea (diff)
downloadbcm5719-llvm-c3bfc81a1f88a156f1b9d7f3328ef7b7fc1f5fea.tar.gz
bcm5719-llvm-c3bfc81a1f88a156f1b9d7f3328ef7b7fc1f5fea.zip
[GISel]: Fix generation of illegal COPYs during CallLowering
We end up creating COPY's that are either truncating/extending and this should be illegal. https://reviews.llvm.org/D37640 Patch for X86 and ARM by igorb, rovka llvm-svn: 315240
Diffstat (limited to 'llvm/lib/Target/AArch64/AArch64CallLowering.cpp')
-rw-r--r--llvm/lib/Target/AArch64/AArch64CallLowering.cpp14
1 files changed, 12 insertions, 2 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64CallLowering.cpp b/llvm/lib/Target/AArch64/AArch64CallLowering.cpp
index 13769a22800..a56c7508844 100644
--- a/llvm/lib/Target/AArch64/AArch64CallLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64CallLowering.cpp
@@ -70,8 +70,18 @@ struct IncomingArgHandler : public CallLowering::ValueHandler {
void assignValueToReg(unsigned ValVReg, unsigned PhysReg,
CCValAssign &VA) override {
markPhysRegUsed(PhysReg);
- MIRBuilder.buildCopy(ValVReg, PhysReg);
- // FIXME: assert extension
+ switch (VA.getLocInfo()) {
+ default:
+ MIRBuilder.buildCopy(ValVReg, PhysReg);
+ break;
+ case CCValAssign::LocInfo::SExt:
+ case CCValAssign::LocInfo::ZExt:
+ case CCValAssign::LocInfo::AExt: {
+ auto Copy = MIRBuilder.buildCopy(LLT{VA.getLocVT()}, PhysReg);
+ MIRBuilder.buildTrunc(ValVReg, Copy);
+ break;
+ }
+ }
}
void assignValueToAddress(unsigned ValVReg, unsigned Addr, uint64_t Size,
OpenPOWER on IntegriCloud