From: Evan Cheng Date: Thu, 12 Feb 2009 10:32:17 +0000 (+0000) Subject: It's (currently) not safe to keep certain physical registers live across basic blocks... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=8679119f4b686d141462bf6d18f4ae0eb0bd0841;p=oota-llvm.git It's (currently) not safe to keep certain physical registers live across basic blocks, e.g. x86 fp stack registers. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@64374 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/VirtRegMap.cpp b/lib/CodeGen/VirtRegMap.cpp index 95cb0cf5bc1..84c48c652cc 100644 --- a/lib/CodeGen/VirtRegMap.cpp +++ b/lib/CodeGen/VirtRegMap.cpp @@ -496,6 +496,12 @@ void AvailableSpills::AddAvailableRegsToLiveIn(MachineBasicBlock &MBB) { I = PhysRegsAvailable.begin(), E = PhysRegsAvailable.end(); I != E; ++I) { unsigned Reg = (*I).first; + const TargetRegisterClass* RC = TRI->getPhysicalRegisterRegClass(Reg); + // FIXME: A temporary workaround. We can't reuse available value if it's + // not safe to move the def of the virtual register's class. e.g. + // X86::RFP* register classes. Do not add it as a live-in. + if (!TII->isSafeToMoveRegClassDefs(RC)) + continue; if (!MBB.isLiveIn(Reg)) MBB.addLiveIn(Reg); } @@ -1361,7 +1367,12 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, VirtRegMap &VRM, bool DoReMat = VRM.isReMaterialized(VirtReg); int SSorRMId = DoReMat ? VRM.getReMatId(VirtReg) : VRM.getStackSlot(VirtReg); - unsigned InReg = Spills.getSpillSlotOrReMatPhysReg(SSorRMId); + const TargetRegisterClass* RC = RegInfo->getRegClass(VirtReg); + // FIXME: A temporary workaround. Don't reuse available value if it's + // not safe to move the def of the virtual register's class. e.g. + // X86::RFP* register classes. + unsigned InReg = TII->isSafeToMoveRegClassDefs(RC) ? + Spills.getSpillSlotOrReMatPhysReg(SSorRMId) : 0; if (InReg == Phys) { // If the value is already available in the expected register, save // a reload / remat. @@ -1387,7 +1398,6 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, VirtRegMap &VRM, // If the reloaded / remat value is available in another register, // copy it to the desired register. - const TargetRegisterClass* RC = RegInfo->getRegClass(VirtReg); TII->copyRegToReg(MBB, &MI, Phys, InReg, RC, RC); // This invalidates Phys. diff --git a/test/CodeGen/X86/2009-02-12-SpillerBug.ll b/test/CodeGen/X86/2009-02-12-SpillerBug.ll new file mode 100644 index 00000000000..49f3ef60059 --- /dev/null +++ b/test/CodeGen/X86/2009-02-12-SpillerBug.ll @@ -0,0 +1,28 @@ +; RUN: llvm-as < %s | llc -march=x86 -mtriple=i386-apple-darwin8 + +define hidden void @__mulxc3({ x86_fp80, x86_fp80 }* noalias nocapture sret %agg.result, x86_fp80 %a, x86_fp80 %b, x86_fp80 %c, x86_fp80 %d) nounwind { +entry: + %0 = mul x86_fp80 %b, %d ; [#uses=1] + %1 = sub x86_fp80 0xK00000000000000000000, %0 ; [#uses=1] + %2 = add x86_fp80 0xK00000000000000000000, 0xK00000000000000000000 ; [#uses=1] + %3 = fcmp uno x86_fp80 %1, 0xK00000000000000000000 ; [#uses=1] + %4 = fcmp uno x86_fp80 %2, 0xK00000000000000000000 ; [#uses=1] + %or.cond = and i1 %3, %4 ; [#uses=1] + br i1 %or.cond, label %bb47, label %bb71 + +bb47: ; preds = %entry + %5 = fcmp uno x86_fp80 %a, 0xK00000000000000000000 ; [#uses=1] + br i1 %5, label %bb60, label %bb62 + +bb60: ; preds = %bb47 + %6 = tail call x86_fp80 @copysignl(x86_fp80 0xK00000000000000000000, x86_fp80 %a) nounwind readnone ; [#uses=0] + br label %bb62 + +bb62: ; preds = %bb60, %bb47 + unreachable + +bb71: ; preds = %entry + ret void +} + +declare x86_fp80 @copysignl(x86_fp80, x86_fp80) nounwind readnone