From 18f9e424e7a8ad4688b114225f0e7a51f0fdb35b Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Tue, 11 Apr 2017 05:42:47 +0000 Subject: [PATCH] [InstCombine] Support weird size element types in dyn_castNegVal. llvm-svn: 299915 --- llvm/lib/Transforms/InstCombine/InstructionCombining.cpp | 4 ++++ llvm/test/Transforms/InstCombine/2008-05-22-NegValVector.ll | 6 ++++++ llvm/test/Transforms/InstCombine/rem.ll | 7 +++---- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp index 398b4974..3c6f07e 100644 --- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -726,6 +726,10 @@ Value *InstCombiner::dyn_castNegVal(Value *V) const { if (C->getType()->getElementType()->isIntegerTy()) return ConstantExpr::getNeg(C); + if (ConstantVector *C = dyn_cast(V)) + if (C->getType()->getElementType()->isIntegerTy()) + return ConstantExpr::getNeg(C); + return nullptr; } diff --git a/llvm/test/Transforms/InstCombine/2008-05-22-NegValVector.ll b/llvm/test/Transforms/InstCombine/2008-05-22-NegValVector.ll index bf92faf..58259be 100644 --- a/llvm/test/Transforms/InstCombine/2008-05-22-NegValVector.ll +++ b/llvm/test/Transforms/InstCombine/2008-05-22-NegValVector.ll @@ -6,3 +6,9 @@ define <3 x i8> @f(<3 x i8> %a) { ret <3 x i8> %B } +define <3 x i4> @g(<3 x i4> %a) { + %A = sub <3 x i4> zeroinitializer, %a + %B = mul <3 x i4> %A, + ret <3 x i4> %B +} + diff --git a/llvm/test/Transforms/InstCombine/rem.ll b/llvm/test/Transforms/InstCombine/rem.ll index 75ac27c..7a7a134 100644 --- a/llvm/test/Transforms/InstCombine/rem.ll +++ b/llvm/test/Transforms/InstCombine/rem.ll @@ -57,12 +57,11 @@ define i5 @biggest_divisor(i5 %x) { ret i5 %rem } -; TODO: Should vector subtract of constant be canonicalized to add? define <2 x i4> @big_divisor_vec(<2 x i4> %x) { ; CHECK-LABEL: @big_divisor_vec( -; CHECK-NEXT: [[TMP1:%.*]] = icmp ult <2 x i4> %x, -; CHECK-NEXT: [[TMP2:%.*]] = sub <2 x i4> %x, -; CHECK-NEXT: [[REM:%.*]] = select <2 x i1> [[TMP1]], <2 x i4> %x, <2 x i4> [[TMP2]] +; CHECK-NEXT: [[TMP1:%.*]] = icmp ult <2 x i4> [[X:%.*]], +; CHECK-NEXT: [[TMP2:%.*]] = add <2 x i4> [[X]], +; CHECK-NEXT: [[REM:%.*]] = select <2 x i1> [[TMP1]], <2 x i4> [[X]], <2 x i4> [[TMP2]] ; CHECK-NEXT: ret <2 x i4> [[REM]] ; %rem = urem <2 x i4> %x, -- 2.7.4