From 7a89a5d81bbdc0ab6dbd14d9af4a52e64c868423 Mon Sep 17 00:00:00 2001 From: Jonathan Roelofs Date: Wed, 25 Mar 2020 14:50:16 -0600 Subject: [PATCH] [InstCombine] Fix Incorrect fold of ashr+xor -> lshr w/ vectors Fixes https://bugs.llvm.org/show_bug.cgi?id=43665 --- llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp | 8 ++++++-- llvm/test/Transforms/InstCombine/vector-xor.ll | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp index 06ec027..d07fc85 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp @@ -3069,8 +3069,12 @@ Instruction *InstCombiner::visitXor(BinaryOperator &I) { // ~(C >>s Y) --> ~C >>u Y (when inverting the replicated sign bits) Constant *C; if (match(NotVal, m_AShr(m_Constant(C), m_Value(Y))) && - match(C, m_Negative())) - return BinaryOperator::CreateLShr(ConstantExpr::getNot(C), Y); + match(C, m_Negative())) { + Constant *NewC = ConstantExpr::getNot(C); + if (C->getType()->isVectorTy()) + NewC = getSafeVectorConstantForBinop(Instruction::LShr, NewC, false); + return BinaryOperator::CreateLShr(NewC, Y); + } // ~(C >>u Y) --> ~C >>s Y (when inverting the replicated sign bits) if (match(NotVal, m_LShr(m_Constant(C), m_Value(Y))) && diff --git a/llvm/test/Transforms/InstCombine/vector-xor.ll b/llvm/test/Transforms/InstCombine/vector-xor.ll index c10e56a..52e9049 100644 --- a/llvm/test/Transforms/InstCombine/vector-xor.ll +++ b/llvm/test/Transforms/InstCombine/vector-xor.ll @@ -140,7 +140,7 @@ define <4 x i32> @test_v4i32_not_ashr_negative_const(<4 x i32> %a0) { define <4 x i32> @test_v4i32_not_ashr_negative_const_undef(<4 x i32> %a0) { ; CHECK-LABEL: @test_v4i32_not_ashr_negative_const_undef( -; CHECK-NEXT: [[TMP1:%.*]] = lshr <4 x i32> , [[A0:%.*]] +; CHECK-NEXT: [[TMP1:%.*]] = lshr <4 x i32> , [[A0:%.*]] ; CHECK-NEXT: ret <4 x i32> [[TMP1]] ; %1 = ashr <4 x i32> , %a0 -- 2.7.4