From: Craig Topper Date: Tue, 11 Apr 2017 05:42:47 +0000 (+0000) Subject: [InstCombine] Support weird size element types in dyn_castNegVal. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=70fe0347f528afe7a03e03918b08750717e46487;p=llvm [InstCombine] Support weird size element types in dyn_castNegVal. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@299915 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/InstCombine/InstructionCombining.cpp b/lib/Transforms/InstCombine/InstructionCombining.cpp index 398b49748ec..3c6f07e7fdd 100644 --- a/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/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/test/Transforms/InstCombine/2008-05-22-NegValVector.ll b/test/Transforms/InstCombine/2008-05-22-NegValVector.ll index bf92faf2fec..58259be8bc9 100644 --- a/test/Transforms/InstCombine/2008-05-22-NegValVector.ll +++ b/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/test/Transforms/InstCombine/rem.ll b/test/Transforms/InstCombine/rem.ll index 75ac27c9c85..7a7a134db9c 100644 --- a/test/Transforms/InstCombine/rem.ll +++ b/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,