From 58b28fa7a2fd57051f3d2911878776d6f57b18d8 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 5 Sep 2020 12:37:45 +0200 Subject: [PATCH] [InstCombine] Fold mul of abs intrinsic Same as the existing SPF_ABS fold. We don't need to explicitly handle NABS, as the negs will get folded away first. --- llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp | 3 +++ llvm/test/Transforms/InstCombine/mul.ll | 6 ++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp index 99f19d9..245fd58 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp @@ -275,6 +275,9 @@ Instruction *InstCombinerImpl::visitMul(BinaryOperator &I) { SelectPatternFlavor SPF = matchSelectPattern(Op0, X, Y).Flavor; if (SPF == SPF_ABS || SPF == SPF_NABS) return BinaryOperator::CreateMul(X, X); + + if (match(Op0, m_Intrinsic(m_Value(X)))) + return BinaryOperator::CreateMul(X, X); } // -X * C --> X * -C diff --git a/llvm/test/Transforms/InstCombine/mul.ll b/llvm/test/Transforms/InstCombine/mul.ll index 8d00ad5..9959841 100644 --- a/llvm/test/Transforms/InstCombine/mul.ll +++ b/llvm/test/Transforms/InstCombine/mul.ll @@ -862,8 +862,7 @@ define <4 x i32> @combine_mul_nabs_v4i32(<4 x i32> %0) { define i32 @combine_mul_abs_intrin(i32 %x) { ; CHECK-LABEL: @combine_mul_abs_intrin( -; CHECK-NEXT: [[ABS:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false) -; CHECK-NEXT: [[MUL:%.*]] = mul i32 [[ABS]], [[ABS]] +; CHECK-NEXT: [[MUL:%.*]] = mul i32 [[X:%.*]], [[X]] ; CHECK-NEXT: ret i32 [[MUL]] ; %abs = call i32 @llvm.abs.i32(i32 %x, i1 false) @@ -873,8 +872,7 @@ define i32 @combine_mul_abs_intrin(i32 %x) { define i32 @combine_mul_nabs_intrin(i32 %x) { ; CHECK-LABEL: @combine_mul_nabs_intrin( -; CHECK-NEXT: [[ABS:%.*]] = call i32 @llvm.abs.i32(i32 [[X:%.*]], i1 false) -; CHECK-NEXT: [[MUL:%.*]] = mul i32 [[ABS]], [[ABS]] +; CHECK-NEXT: [[MUL:%.*]] = mul i32 [[X:%.*]], [[X]] ; CHECK-NEXT: ret i32 [[MUL]] ; %abs = call i32 @llvm.abs.i32(i32 %x, i1 false) -- 2.7.4