diff options
| author | Aditya Nandakumar <aditya_nandakumar@apple.com> | 2017-10-09 20:07:43 +0000 |
|---|---|---|
| committer | Aditya Nandakumar <aditya_nandakumar@apple.com> | 2017-10-09 20:07:43 +0000 |
| commit | c3bfc81a1f88a156f1b9d7f3328ef7b7fc1f5fea (patch) | |
| tree | 93d09a1378c5ee3f9177026fdc8baa46c10d5c2c /llvm/lib/Target/AArch64/AArch64CallLowering.cpp | |
| parent | 4d62ca3ae903f2c88203d25907ef0b71b0d660ea (diff) | |
| download | bcm5719-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.cpp | 14 |
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, |

