[llvm-commits] Fix for assertion in DAGCombiner
Jan Sjodin
jan_sjodin at yahoo.com
Wed Apr 28 15:00:32 PDT 2010
My expectation of doing a truncate of a vector of the same length,
but smaller element types is that each element is truncated to the
smaller size. This is what happens in the X86 backend today.
A truncate of a vector of shorter length, but identical
element types could mean to reduce the size of the vector. I have not
checked if this is the case.
Below I included the code using getSExtOrTrunc as pointed out by Micha.
- Jan
> I don't know if this is the right approach. Do you have an idea
> of what kind of code you'd like to get out of a vector
> truncate?
>
> Dan
> On Apr 26, 2010, at 12:11 PM, Jan Sjodin
> > wrote:
>
> > Below is one way of fixing the issue of sign extending a
> > vector of smaller element types.
> > I suppose it would be fairly trivial to
> > include the case where the type is larger by replacing
> > truncate with a
> > second sign extend, but I wanted to get feedback on this code:
Index: lib/CodeGen/SelectionDAG/DAGCombiner.cpp
===================================================================
--- lib/CodeGen/SelectionDAG/DAGCombiner.cpp (revision 102340)
+++ lib/CodeGen/SelectionDAG/DAGCombiner.cpp (working copy)
@@ -3495,20 +3495,35 @@
if (N0.getOpcode() == ISD::SETCC) {
// sext(setcc) -> sext_in_reg(vsetcc) for vectors.
- if (VT.isVector() &&
+ // Only do this before legalize for now.
+ if (VT.isVector() && !LegalOperations) {
+ EVT N0VT = N0.getOperand(0).getValueType();
// We know that the # elements of the results is the same as the
// # elements of the compare (and the # elements of the compare result
// for that matter). Check to see that they are the same size. If so,
// we know that the element size of the sext'd result matches the
// element size of the compare operands.
- VT.getSizeInBits() == N0.getOperand(0).getValueType().getSizeInBits() &&
-
- // Only do this before legalize for now.
- !LegalOperations) {
- return DAG.getVSetCC(N->getDebugLoc(), VT, N0.getOperand(0),
- N0.getOperand(1),
- cast<CondCodeSDNode>(N0.getOperand(2))->get());
- }
+ if(VT.getSizeInBits() == N0VT.getSizeInBits())
+ return DAG.getVSetCC(N->getDebugLoc(), VT, N0.getOperand(0),
+ N0.getOperand(1),
+ cast<CondCodeSDNode>(N0.getOperand(2))->get());
+ // If the desired elements are smaller or larger than the source
+ // elements we can use a matching integer vector type and then
+ // truncate/sign extend
+ else {
+ EVT MatchingElementType =
+ EVT::getIntegerVT(*DAG.getContext(),
+ N0VT.getScalarType().getSizeInBits());
+ EVT MatchingVectorType =
+ EVT::getVectorVT(*DAG.getContext(), MatchingElementType,
+ N0VT.getVectorNumElements());
+ SDValue VsetCC =
+ DAG.getVSetCC(N->getDebugLoc(), MatchingVectorType, N0.getOperand(0),
+ N0.getOperand(1),
+ cast<CondCodeSDNode>(N0.getOperand(2))->get());
+ return DAG.getSExtOrTrunc(VsetCC, N->getDebugLoc(), VT);
+ }
+ }
// sext(setcc x, y, cc) -> (select_cc x, y, -1, 0, cc)
unsigned ElementWidth = VT.getScalarType().getSizeInBits();
More information about the llvm-commits
mailing list