From: Evan Cheng Date: Fri, 7 Mar 2008 20:12:54 +0000 (+0000) Subject: Fixed a register scavenger bug. If a def is re-defining part of a super register... X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=d68f47c6fd744e051f7f2d97b6366d40bf27c438;p=oota-llvm.git Fixed a register scavenger bug. If a def is re-defining part of a super register, there must be an implicit def of the super-register on the MI. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48024 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/RegisterScavenging.cpp b/lib/CodeGen/RegisterScavenging.cpp index 635e0cc825b..2535d78cd98 100644 --- a/lib/CodeGen/RegisterScavenging.cpp +++ b/lib/CodeGen/RegisterScavenging.cpp @@ -29,15 +29,20 @@ using namespace llvm; /// part of a super-register. static bool RedefinesSuperRegPart(const MachineInstr *MI, unsigned SubReg, const TargetRegisterInfo *TRI) { + bool SeenSuperUse = false; + bool SeenSuperDef = false; for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { const MachineOperand &MO = MI->getOperand(i); - if (!MO.isRegister() || !MO.isUse()) + if (!MO.isRegister()) continue; if (TRI->isSuperRegister(SubReg, MO.getReg())) - return true; + if (MO.isUse()) + SeenSuperUse = true; + else if (MO.isImplicit()) + SeenSuperDef = true; } - return false; + return SeenSuperDef && SeenSuperUse; } static bool RedefinesSuperRegPart(const MachineInstr *MI, diff --git a/test/CodeGen/ARM/2008-03-07-RegScavengerAssert.ll b/test/CodeGen/ARM/2008-03-07-RegScavengerAssert.ll new file mode 100644 index 00000000000..70f1774b4c5 --- /dev/null +++ b/test/CodeGen/ARM/2008-03-07-RegScavengerAssert.ll @@ -0,0 +1,20 @@ +; RUN: llvm-as < %s | llc -mtriple=arm-apple-darwin -mattr=+v6,+vfp2 + +@accum = external global { double, double } ; <{ double, double }*> [#uses=1] +@.str = external constant [4 x i8] ; <[4 x i8]*> [#uses=1] + +define i32 @main() { +entry: + br label %bb74.i +bb74.i: ; preds = %bb88.i, %bb74.i, %entry + br i1 false, label %bb88.i, label %bb74.i +bb88.i: ; preds = %bb74.i + br i1 false, label %mandel.exit, label %bb74.i +mandel.exit: ; preds = %bb88.i + %tmp2 = volatile load double* getelementptr ({ double, double }* @accum, i32 0, i32 0), align 8 ; [#uses=1] + %tmp23 = fptosi double %tmp2 to i32 ; [#uses=1] + %tmp5 = tail call i32 (i8*, ...)* @printf( i8* getelementptr ([4 x i8]* @.str, i32 0, i32 0), i32 %tmp23 ) ; [#uses=0] + ret i32 0 +} + +declare i32 @printf(i8*, ...)