[llvm-commits] [llvm] r142660 - in /llvm/trunk: lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp test/CodeGen/X86/2011-20-21-zext-ui2fp.ll

Nadav Rotem nadav.rotem at intel.com
Fri Oct 21 10:35:19 PDT 2011


Author: nadav
Date: Fri Oct 21 12:35:19 2011
New Revision: 142660

URL: http://llvm.org/viewvc/llvm-project?rev=142660&view=rev
Log:
Fix pr11194. When promoting and splitting integers we need to use
ZExtPromotedInteger and SExtPromotedInteger based on the operation we legalize.

SetCC return type needs to be legalized via PromoteTargetBoolean.


Added:
    llvm/trunk/test/CodeGen/X86/2011-20-21-zext-ui2fp.ll
Modified:
    llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp

Modified: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp?rev=142660&r1=142659&r2=142660&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp Fri Oct 21 12:35:19 2011
@@ -787,7 +787,17 @@
     break;
   }
   case TargetLowering::TypePromoteInteger: {
-    SDValue InOp = GetPromotedInteger(N->getOperand(0));
+    SDValue InOp;
+    if (N->getOpcode() == ISD::SIGN_EXTEND ||
+        N->getOpcode() == ISD::SINT_TO_FP) {
+      InOp =   SExtPromotedInteger(N->getOperand(0));
+    } else if (
+        N->getOpcode() == ISD::ZERO_EXTEND ||
+        N->getOpcode() == ISD::UINT_TO_FP) {
+      InOp =   ZExtPromotedInteger(N->getOperand(0));
+    } else {
+      InOp = GetPromotedInteger(N->getOperand(0));
+    }
     EVT InNVT = EVT::getVectorVT(*DAG.getContext(),
                                  InOp.getValueType().getVectorElementType(),
                                  LoVT.getVectorNumElements());
@@ -2189,8 +2199,7 @@
   SDValue CC = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl,
                            ResVT, WideSETCC, DAG.getIntPtrConstant(0));
 
-  // Convert the result mask to the correct kind.
-  return DAG.getAnyExtOrTrunc(CC, dl, N->getValueType(0));
+  return PromoteTargetBoolean(CC, N->getValueType(0)); 
 }
 
 

Added: llvm/trunk/test/CodeGen/X86/2011-20-21-zext-ui2fp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2011-20-21-zext-ui2fp.ll?rev=142660&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/2011-20-21-zext-ui2fp.ll (added)
+++ llvm/trunk/test/CodeGen/X86/2011-20-21-zext-ui2fp.ll Fri Oct 21 12:35:19 2011
@@ -0,0 +1,19 @@
+; RUN: llc < %s -march=x86-64 -mcpu=corei7 | FileCheck %s
+target triple = "x86_64-unknown-linux-gnu"
+
+; Check that the booleans are converted using zext and not via sext.
+; 0x1 means that we only look at the first bit.
+
+;CHECK: 0x1
+;CHECK: ui_to_fp_conv
+;CHECK: ret
+define void @ui_to_fp_conv(<8 x float> * nocapture %aFOO, <8 x float>* nocapture %RET) nounwind {
+allocas:
+  %bincmp = fcmp olt <8 x float> <float 1.000000e+00, float 1.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00> , <float 3.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00, float 3.000000e+00>
+  %bool2float = uitofp <8 x i1> %bincmp to <8 x float>
+  store <8 x float> %bool2float, <8 x float>* %RET, align 4
+  ret void
+}
+
+
+





More information about the llvm-commits mailing list