Be nice to CellSPU: for this target getSetCCResultType
authorDuncan Sands <baldrick@free.fr>
Wed, 22 Oct 2008 09:23:20 +0000 (09:23 +0000)
committerDuncan Sands <baldrick@free.fr>
Wed, 22 Oct 2008 09:23:20 +0000 (09:23 +0000)
may return i8, which can result in SELECT nodes for
which the type of the condition is i8, but there are
no patterns for select with i8 condition.  Tweak the
LegalizeTypes logic to avoid this as much as possible.
This isn't a real fix because it is still perfectly
possible to end up with such select nodes - CellSPU
needs to be fixed IMHO.

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

lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp

index 6cbd50df5a516a585b3f297aee0a66c60cb75b5b..ca4c6564e430a85746b61a27bb0a28305bec55ec 100644 (file)
@@ -811,10 +811,16 @@ SDValue DAGTypeLegalizer::PromoteIntOp_SELECT(SDNode *N, unsigned OpNo) {
   SDValue Cond = GetPromotedInteger(N->getOperand(0));
 
   // Promote all the way up to SVT, the canonical SetCC type.
-  MVT SVT = TLI.getSetCCResultType(Cond);
+  // FIXME: Not clear what value to pass to getSetCCResultType.
+  // [This only matters for CellSPU since all other targets
+  // ignore the argument.]  We used to pass Cond, resulting in
+  // SVT = MVT::i8, but CellSPU has no select patterns for i8,
+  // causing an abort later.  Passing the result type works
+  // around the problem.
+  MVT SVT = TLI.getSetCCResultType(N->getOperand(1));
   assert(isTypeLegal(SVT) && "Illegal SetCC type!");
   assert(Cond.getValueSizeInBits() <= SVT.getSizeInBits() &&
-         "Integer type overpromoted?");
+         "Unexpected SetCC type!");
 
   // Make sure the extra bits conform to getSetCCResultContents.  There are
   // two sets of extra bits: those in Cond, which come from type promotion,