diff options
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 4 | ||||
-rw-r--r-- | llvm/test/CodeGen/X86/combine-rotates.ll | 1 |
2 files changed, 4 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 6fb5e3996e2..7a34179ad32 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -5273,6 +5273,10 @@ SDValue DAGCombiner::visitRotate(SDNode *N) { SDValue N1 = N->getOperand(1); EVT VT = N->getValueType(0); + // fold (rot x, 0) -> x + if (isNullConstantOrNullSplatConstant(N1)) + return N0; + // fold (rot* x, (trunc (and y, c))) -> (rot* x, (and (trunc y), (trunc c))). if (N1.getOpcode() == ISD::TRUNCATE && N1.getOperand(0).getOpcode() == ISD::AND) { diff --git a/llvm/test/CodeGen/X86/combine-rotates.ll b/llvm/test/CodeGen/X86/combine-rotates.ll index 1bce1cff326..713ee5d0f65 100644 --- a/llvm/test/CodeGen/X86/combine-rotates.ll +++ b/llvm/test/CodeGen/X86/combine-rotates.ll @@ -59,7 +59,6 @@ define <4 x i32> @combine_vec_rot_rot_splat(<4 x i32> %x) { define <4 x i32> @combine_vec_rot_rot_splat_zero(<4 x i32> %x) { ; XOP-LABEL: combine_vec_rot_rot_splat_zero: ; XOP: # BB#0: -; XOP-NEXT: vprotd $0, %xmm0, %xmm0 ; XOP-NEXT: retq ; ; AVX512-LABEL: combine_vec_rot_rot_splat_zero: |