mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-13 22:58:50 +00:00
[SVE] Fix invalid usage of getNumElements() in InstCombineMulDivRem
Summary: getLogBase2 tries to iterate over the number of vector elements. Since the number of elements of a scalable vector is unknown at compile time, we must return null if the input type is scalable. Identified by test LLVM.Transforms/InstCombine::nsw.ll Reviewers: efriedma, fpetrogalli, kmclaughlin, spatel Reviewed By: efriedma, fpetrogalli Subscribers: tschuett, hiraditya, rkruppe, psnobl, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D79197
This commit is contained in:
parent
05620404c0
commit
9628857335
@ -96,19 +96,21 @@ static Value *simplifyValueKnownNonZero(Value *V, InstCombiner &IC,
|
||||
|
||||
/// A helper routine of InstCombiner::visitMul().
|
||||
///
|
||||
/// If C is a scalar/vector of known powers of 2, then this function returns
|
||||
/// a new scalar/vector obtained from logBase2 of C.
|
||||
/// If C is a scalar/fixed width vector of known powers of 2, then this
|
||||
/// function returns a new scalar/fixed width vector obtained from logBase2
|
||||
/// of C.
|
||||
/// Return a null pointer otherwise.
|
||||
static Constant *getLogBase2(Type *Ty, Constant *C) {
|
||||
const APInt *IVal;
|
||||
if (match(C, m_APInt(IVal)) && IVal->isPowerOf2())
|
||||
return ConstantInt::get(Ty, IVal->logBase2());
|
||||
|
||||
if (!Ty->isVectorTy())
|
||||
// FIXME: We can extract pow of 2 of splat constant for scalable vectors.
|
||||
if (!isa<FixedVectorType>(Ty))
|
||||
return nullptr;
|
||||
|
||||
SmallVector<Constant *, 4> Elts;
|
||||
for (unsigned I = 0, E = cast<VectorType>(Ty)->getNumElements(); I != E;
|
||||
for (unsigned I = 0, E = cast<FixedVectorType>(Ty)->getNumElements(); I != E;
|
||||
++I) {
|
||||
Constant *Elt = C->getAggregateElement(I);
|
||||
if (!Elt)
|
||||
|
27
test/Transforms/InstCombine/udiv-pow2-vscale.ll
Normal file
27
test/Transforms/InstCombine/udiv-pow2-vscale.ll
Normal file
@ -0,0 +1,27 @@
|
||||
; RUN: opt -instcombine -S < %s | FileCheck %s
|
||||
|
||||
; This vscale udiv with a power-of-2 spalt on the rhs should not crash opt
|
||||
|
||||
; CHECK: define <vscale x 2 x i32> @udiv_pow2_vscale(<vscale x 2 x i32> %lhs)
|
||||
define <vscale x 2 x i32> @udiv_pow2_vscale(<vscale x 2 x i32> %lhs) {
|
||||
%splatter = insertelement <vscale x 2 x i32> undef, i32 2, i32 0
|
||||
%rhs = shufflevector <vscale x 2 x i32> %splatter,
|
||||
<vscale x 2 x i32> undef,
|
||||
<vscale x 2 x i32> zeroinitializer
|
||||
%res = udiv <vscale x 2 x i32> %lhs, %rhs
|
||||
ret <vscale x 2 x i32> %res
|
||||
}
|
||||
|
||||
; This fixed width udiv with a power-of-2 splat on the rhs should also not
|
||||
; crash, and instcombine should eliminate the udiv
|
||||
|
||||
; CHECK-LABEL: define <2 x i32> @udiv_pow2_fixed(<2 x i32> %lhs)
|
||||
; CHECK-NOT: udiv
|
||||
define <2 x i32> @udiv_pow2_fixed(<2 x i32> %lhs) {
|
||||
%splatter = insertelement <2 x i32> undef, i32 2, i32 0
|
||||
%rhs = shufflevector <2 x i32> %splatter,
|
||||
<2 x i32> undef,
|
||||
<2 x i32> zeroinitializer
|
||||
%res = udiv <2 x i32> %lhs, %rhs
|
||||
ret <2 x i32> %res
|
||||
}
|
Loading…
Reference in New Issue
Block a user