[SLP] limit vectorization of Constant subclasses (PR33958)

This is a fix for:
https://bugs.llvm.org/show_bug.cgi?id=33958

It seems universally true that we would not want to transform this kind of
sequence on any target, but if that's not correct, then we could view this
as a target-specific cost model problem. We could also white-list ConstantInt,
ConstantFP, etc. rather than blacklist Global and ConstantExpr.

Differential Revision: https://reviews.llvm.org/D67362

llvm-svn: 371931
This commit is contained in:
Sanjay Patel 2019-09-15 13:03:24 +00:00
parent 06b309d527
commit b6a0faaa0c
2 changed files with 14 additions and 8 deletions

View File

@ -194,10 +194,13 @@ static bool allSameBlock(ArrayRef<Value *> VL) {
return true; return true;
} }
/// \returns True if all of the values in \p VL are constants. /// \returns True if all of the values in \p VL are constants (but not
/// globals/constant expressions).
static bool allConstant(ArrayRef<Value *> VL) { static bool allConstant(ArrayRef<Value *> VL) {
// Constant expressions and globals can't be vectorized like normal integer/FP
// constants.
for (Value *i : VL) for (Value *i : VL)
if (!isa<Constant>(i)) if (!isa<Constant>(i) || isa<ConstantExpr>(i) || isa<GlobalValue>(i))
return false; return false;
return true; return true;
} }

View File

@ -549,14 +549,17 @@ for.body: ; preds = %entry, %for.body
br i1 %cmp, label %for.body, label %for.cond.cleanup br i1 %cmp, label %for.body, label %for.cond.cleanup
} }
; Globals/constant expressions are not normal constants.
; They should not be treated as the usual vectorization candidates.
@g1 = external global i32, align 4 @g1 = external global i32, align 4
@g2 = external global i32, align 4 @g2 = external global i32, align 4
define void @PR33958(i32** nocapture %p) { define void @PR33958(i32** nocapture %p) {
; CHECK-LABEL: @PR33958( ; CHECK-LABEL: @PR33958(
; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32*, i32** [[P:%.*]], i64 1 ; CHECK-NEXT: store i32* @g1, i32** [[P:%.*]], align 8
; CHECK-NEXT: [[TMP1:%.*]] = bitcast i32** [[P]] to <2 x i32*>* ; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32*, i32** [[P]], i64 1
; CHECK-NEXT: store <2 x i32*> <i32* @g1, i32* @g2>, <2 x i32*>* [[TMP1]], align 8 ; CHECK-NEXT: store i32* @g2, i32** [[ARRAYIDX1]], align 8
; CHECK-NEXT: ret void ; CHECK-NEXT: ret void
; ;
store i32* @g1, i32** %p, align 8 store i32* @g1, i32** %p, align 8
@ -567,9 +570,9 @@ define void @PR33958(i32** nocapture %p) {
define void @store_constant_expression(i64* %p) { define void @store_constant_expression(i64* %p) {
; CHECK-LABEL: @store_constant_expression( ; CHECK-LABEL: @store_constant_expression(
; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i64, i64* [[P:%.*]], i64 1 ; CHECK-NEXT: store i64 ptrtoint (i32* @g1 to i64), i64* [[P:%.*]], align 8
; CHECK-NEXT: [[TMP1:%.*]] = bitcast i64* [[P]] to <2 x i64>* ; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i64, i64* [[P]], i64 1
; CHECK-NEXT: store <2 x i64> <i64 ptrtoint (i32* @g1 to i64), i64 ptrtoint (i32* @g2 to i64)>, <2 x i64>* [[TMP1]], align 8 ; CHECK-NEXT: store i64 ptrtoint (i32* @g2 to i64), i64* [[ARRAYIDX1]], align 8
; CHECK-NEXT: ret void ; CHECK-NEXT: ret void
; ;
store i64 ptrtoint (i32* @g1 to i64), i64* %p, align 8 store i64 ptrtoint (i32* @g1 to i64), i64* %p, align 8