[llvm] r307900 - [DAGCombiner] Fix issue with rotate combines asserting if the constant value types differ from the result type.
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 13 03:41:49 PDT 2017
Author: rksimon
Date: Thu Jul 13 03:41:49 2017
New Revision: 307900
URL: http://llvm.org/viewvc/llvm-project?rev=307900&view=rev
Log:
[DAGCombiner] Fix issue with rotate combines asserting if the constant value types differ from the result type.
Added:
llvm/trunk/test/CodeGen/X86/bswap-rotate.ll
Modified:
llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp?rev=307900&r1=307899&r2=307900&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Thu Jul 13 03:41:49 2017
@@ -5285,22 +5285,25 @@ SDValue DAGCombiner::visitRotate(SDNode
unsigned NextOp = N0.getOpcode();
// fold (rot* (rot* x, c2), c1) -> (rot* x, c1 +- c2 % bitsize)
- if (NextOp == ISD::ROTL || NextOp == ISD::ROTR)
- if (SDNode *C1 = DAG.isConstantIntBuildVectorOrConstantInt(N1))
- if (SDNode *C2 =
- DAG.isConstantIntBuildVectorOrConstantInt(N0.getOperand(1))) {
- bool SameSide = (N->getOpcode() == NextOp);
- unsigned CombineOp = SameSide ? ISD::ADD : ISD::SUB;
- if (SDValue CombinedShift =
- DAG.FoldConstantArithmetic(CombineOp, dl, VT, C1, C2)) {
- unsigned Bitsize = VT.getScalarSizeInBits();
- SDValue BitsizeC = DAG.getConstant(Bitsize, dl, VT);
- SDValue CombinedShiftNorm = DAG.FoldConstantArithmetic(
- ISD::SREM, dl, VT, CombinedShift.getNode(), BitsizeC.getNode());
- return DAG.getNode(
- N->getOpcode(), dl, VT, N0->getOperand(0), CombinedShiftNorm);
- }
+ if (NextOp == ISD::ROTL || NextOp == ISD::ROTR) {
+ SDNode *C1 = DAG.isConstantIntBuildVectorOrConstantInt(N1);
+ SDNode *C2 = DAG.isConstantIntBuildVectorOrConstantInt(N0.getOperand(1));
+ if (C1 && C2 && C1->getValueType(0) == C2->getValueType(0)) {
+ EVT ShiftVT = C1->getValueType(0);
+ bool SameSide = (N->getOpcode() == NextOp);
+ unsigned CombineOp = SameSide ? ISD::ADD : ISD::SUB;
+ if (SDValue CombinedShift =
+ DAG.FoldConstantArithmetic(CombineOp, dl, ShiftVT, C1, C2)) {
+ unsigned Bitsize = VT.getScalarSizeInBits();
+ SDValue BitsizeC = DAG.getConstant(Bitsize, dl, ShiftVT);
+ SDValue CombinedShiftNorm = DAG.FoldConstantArithmetic(
+ ISD::SREM, dl, ShiftVT, CombinedShift.getNode(),
+ BitsizeC.getNode());
+ return DAG.getNode(N->getOpcode(), dl, VT, N0->getOperand(0),
+ CombinedShiftNorm);
}
+ }
+ }
return SDValue();
}
Added: llvm/trunk/test/CodeGen/X86/bswap-rotate.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/bswap-rotate.ll?rev=307900&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/X86/bswap-rotate.ll (added)
+++ llvm/trunk/test/CodeGen/X86/bswap-rotate.ll Thu Jul 13 03:41:49 2017
@@ -0,0 +1,27 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=i686-unknown-unknown -mcpu=i686 | FileCheck %s --check-prefix=X86
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=X64
+
+; Combine BSWAP (lowered to rolw 8) with a second rotate.
+; This test checks for combining rotates with inconsistent constant value types.
+
+define i16 @combine_bswap_rotate(i16 %a0) {
+; X86-LABEL: combine_bswap_rotate:
+; X86: # BB#0:
+; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax
+; X86-NEXT: rolw $9, %ax
+; X86-NEXT: retl
+;
+; X64-LABEL: combine_bswap_rotate:
+; X64: # BB#0:
+; X64-NEXT: rolw $9, %di
+; X64-NEXT: movl %edi, %eax
+; X64-NEXT: retq
+ %1 = call i16 @llvm.bswap.i16(i16 %a0)
+ %2 = shl i16 %1, 1
+ %3 = lshr i16 %1, 15
+ %4 = or i16 %2, %3
+ ret i16 %4
+}
+
+declare i16 @llvm.bswap.i16(i16)
More information about the llvm-commits
mailing list