[llvm-commits] [llvm] r146630 - in /llvm/trunk: lib/CodeGen/SelectionDAG/TargetLowering.cpp test/CodeGen/X86/movmsk.ll
Eli Friedman
eli.friedman at gmail.com
Wed Dec 14 18:07:20 PST 2011
Author: efriedma
Date: Wed Dec 14 20:07:20 2011
New Revision: 146630
URL: http://llvm.org/viewvc/llvm-project?rev=146630&view=rev
Log:
Don't try to form FGETSIGN after legalization; it is possible in some cases, but the existing code can't do it correctly. PR11570.
Modified:
llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp
llvm/trunk/test/CodeGen/X86/movmsk.ll
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp?rev=146630&r1=146629&r2=146630&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/TargetLowering.cpp Wed Dec 14 20:07:20 2011
@@ -1792,7 +1792,8 @@
case ISD::BITCAST:
// If this is an FP->Int bitcast and if the sign bit is the only
// thing demanded, turn this into a FGETSIGN.
- if (!Op.getValueType().isVector() &&
+ if (!TLO.LegalOperations() &&
+ !Op.getValueType().isVector() &&
!Op.getOperand(0).getValueType().isVector() &&
NewMask == APInt::getSignBit(Op.getValueType().getSizeInBits()) &&
Op.getOperand(0).getValueType().isFloatingPoint()) {
Modified: llvm/trunk/test/CodeGen/X86/movmsk.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/movmsk.ll?rev=146630&r1=146629&r2=146630&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/movmsk.ll (original)
+++ llvm/trunk/test/CodeGen/X86/movmsk.ll Wed Dec 14 20:07:20 2011
@@ -78,6 +78,22 @@
ret i32 %shr.i
}
+; PR11570
+define void @float_call_signbit(double %n) {
+entry:
+; FIXME: This should also use movmskps; we don't form the FGETSIGN node
+; in this case, though.
+; CHECK: float_call_signbit:
+; CHECK: movd %xmm0, %rdi
+; FIXME
+ %t0 = bitcast double %n to i64
+ %tobool.i.i.i.i = icmp slt i64 %t0, 0
+ tail call void @float_call_signbit_callee(i1 zeroext %tobool.i.i.i.i)
+ ret void
+}
+declare void @float_call_signbit_callee(i1 zeroext)
+
+
; rdar://10247336
; movmskp{s|d} only set low 4/2 bits, high bits are known zero
More information about the llvm-commits
mailing list