summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/X86CallLowering.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/X86/X86CallLowering.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/X86/X86CallLowering.cpp')
-rw-r--r--llvm/lib/Target/X86/X86CallLowering.cpp30
1 files changed, 24 insertions, 6 deletions
diff --git a/llvm/lib/Target/X86/X86CallLowering.cpp b/llvm/lib/Target/X86/X86CallLowering.cpp
index 2d18aeca3af..7beb9c6e357 100644
--- a/llvm/lib/Target/X86/X86CallLowering.cpp
+++ b/llvm/lib/Target/X86/X86CallLowering.cpp
@@ -226,6 +226,28 @@ struct IncomingValueHandler : public CallLowering::ValueHandler {
MIRBuilder.buildLoad(ValVReg, Addr, *MMO);
}
+ void assignValueToReg(unsigned ValVReg, unsigned PhysReg,
+ CCValAssign &VA) override {
+ markPhysRegUsed(PhysReg);
+ 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;
+ }
+ }
+ }
+
+ /// How the physical register gets marked varies between formal
+ /// parameters (it's a basic-block live-in), and a call instruction
+ /// (it's an implicit-def of the BL).
+ virtual void markPhysRegUsed(unsigned PhysReg) = 0;
+
protected:
const DataLayout &DL;
};
@@ -235,10 +257,8 @@ struct FormalArgHandler : public IncomingValueHandler {
CCAssignFn *AssignFn)
: IncomingValueHandler(MIRBuilder, MRI, AssignFn) {}
- void assignValueToReg(unsigned ValVReg, unsigned PhysReg,
- CCValAssign &VA) override {
+ void markPhysRegUsed(unsigned PhysReg) override {
MIRBuilder.getMBB().addLiveIn(PhysReg);
- MIRBuilder.buildCopy(ValVReg, PhysReg);
}
};
@@ -247,10 +267,8 @@ struct CallReturnHandler : public IncomingValueHandler {
CCAssignFn *AssignFn, MachineInstrBuilder &MIB)
: IncomingValueHandler(MIRBuilder, MRI, AssignFn), MIB(MIB) {}
- void assignValueToReg(unsigned ValVReg, unsigned PhysReg,
- CCValAssign &VA) override {
+ void markPhysRegUsed(unsigned PhysReg) override {
MIB.addDef(PhysReg, RegState::Implicit);
- MIRBuilder.buildCopy(ValVReg, PhysReg);
}
protected:
OpenPOWER on IntegriCloud