[llvm-commits] [llvm] r136787 - in /llvm/trunk: lib/Target/X86/X86FloatingPoint.cpp test/CodeGen/X86/fp-stack-O0-crash.ll
Jakob Stoklund Olesen
stoklund at 2pi.dk
Wed Aug 3 09:33:19 PDT 2011
Author: stoklund
Date: Wed Aug 3 11:33:19 2011
New Revision: 136787
URL: http://llvm.org/viewvc/llvm-project?rev=136787&view=rev
Log:
Handle IMPLICIT_DEF instructions in X86FloatingPoint.
This fixes PR10575.
Modified:
llvm/trunk/lib/Target/X86/X86FloatingPoint.cpp
llvm/trunk/test/CodeGen/X86/fp-stack-O0-crash.ll
Modified: llvm/trunk/lib/Target/X86/X86FloatingPoint.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86FloatingPoint.cpp?rev=136787&r1=136786&r2=136787&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86FloatingPoint.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86FloatingPoint.cpp Wed Aug 3 11:33:19 2011
@@ -406,6 +406,10 @@
if (MI->isCopy() && isFPCopy(MI))
FPInstClass = X86II::SpecialFP;
+ if (MI->isImplicitDef() &&
+ X86::RFP80RegClass.contains(MI->getOperand(0).getReg()))
+ FPInstClass = X86II::SpecialFP;
+
if (FPInstClass == X86II::NotFP)
continue; // Efficiently ignore non-fp insts!
@@ -1369,6 +1373,15 @@
break;
}
+ case TargetOpcode::IMPLICIT_DEF: {
+ // All FP registers must be explicitly defined, so load a 0 instead.
+ unsigned Reg = MI->getOperand(0).getReg() - X86::FP0;
+ DEBUG(dbgs() << "Emitting LD_F0 for implicit FP" << Reg << '\n');
+ BuildMI(*MBB, I, MI->getDebugLoc(), TII->get(X86::LD_F0));
+ pushReg(Reg);
+ break;
+ }
+
case X86::FpPOP_RETVAL: {
// The FpPOP_RETVAL instruction is used after calls that return a value on
// the floating point stack. We cannot model this with ST defs since CALL
Modified: llvm/trunk/test/CodeGen/X86/fp-stack-O0-crash.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/fp-stack-O0-crash.ll?rev=136787&r1=136786&r2=136787&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/fp-stack-O0-crash.ll (original)
+++ llvm/trunk/test/CodeGen/X86/fp-stack-O0-crash.ll Wed Aug 3 11:33:19 2011
@@ -1,4 +1,4 @@
-; RUN: llc %s -O0 -fast-isel -regalloc=fast -o -
+; RUN: llc %s -O0 -fast-isel -regalloc=fast -mcpu=i386 -o -
; PR4767
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
@@ -28,3 +28,22 @@
if.end: ; preds = %if.then, %cond.false, %cond.true
ret void
}
+
+; PR10575
+; This produces a FP0 = IMPLICIT_DEF instruction.
+define void @__m_rankmerge_MOD_dindexmerge_() nounwind {
+entry:
+ br label %"20"
+
+"20": ; preds = %"23", %entry
+ %0 = phi double [ undef, %entry ], [ %0, %"23" ]
+ %1 = phi double [ 0.000000e+00, %entry ], [ %2, %"23" ]
+ br i1 undef, label %"21", label %"23"
+
+"21": ; preds = %"20"
+ ret void
+
+"23": ; preds = %"20"
+ %2 = select i1 undef, double %0, double %1
+ br label %"20"
+}
More information about the llvm-commits
mailing list