Implement fast-isel support for zero-extending from i1.
authorDan Gohman <gohman@apple.com>
Fri, 3 Oct 2008 01:28:47 +0000 (01:28 +0000)
committerDan Gohman <gohman@apple.com>
Fri, 3 Oct 2008 01:28:47 +0000 (01:28 +0000)
It turns out that this is a fairly common operation,
and it's easy enough to handle.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56990 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/SelectionDAG/FastISel.cpp

index c0e8418c4c5853900436bc1a5b8b8a59c5a85de7..17b37a34452100e3cc530d06e85e086a083b3c9e 100644 (file)
@@ -386,10 +386,21 @@ bool FastISel::SelectCast(User *I, ISD::NodeType Opcode) {
     
   if (SrcVT == MVT::Other || !SrcVT.isSimple() ||
       DstVT == MVT::Other || !DstVT.isSimple() ||
-      !TLI.isTypeLegal(SrcVT) || !TLI.isTypeLegal(DstVT))
+      !TLI.isTypeLegal(DstVT))
     // Unhandled type. Halt "fast" selection and bail.
     return false;
     
+  // Check if the source operand is legal. Or as a special case,
+  // it may be i1 if we're doing zero-extension because that's
+  // trivially easy and somewhat common.
+  if (!TLI.isTypeLegal(SrcVT)) {
+    if (SrcVT == MVT::i1 && Opcode == ISD::ZERO_EXTEND)
+      SrcVT = TLI.getTypeToTransformTo(SrcVT);
+    else
+      // Unhandled type. Halt "fast" selection and bail.
+      return false;
+  }
+    
   unsigned InputReg = getRegForValue(I->getOperand(0));
   if (!InputReg)
     // Unhandled operand.  Halt "fast" selection and bail.