From 7b8d50b141bbf223eab33a75f468be4ee92ad052 Mon Sep 17 00:00:00 2001 From: Cullen Rhodes Date: Tue, 24 Nov 2020 18:07:13 +0000 Subject: [PATCH] [InstSimplify] Clarify use of FixedVectorType in SimplifySelectInst Folding a select of vector constants that include undef elements only applies to fixed vectors, but there's no earlier check the type is not scalable so it crashes for scalable vectors. This adds a check so this optimization is only attempted for fixed vectors. Reviewed By: sdesmalen Differential Revision: https://reviews.llvm.org/D92046 --- llvm/lib/Analysis/InstructionSimplify.cpp | 3 ++- llvm/test/Transforms/InstSimplify/select.ll | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index 813fb6c..6b116eb 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -4136,7 +4136,8 @@ static Value *SimplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal, // Deal with partial undef vector constants: select ?, VecC, VecC' --> VecC'' Constant *TrueC, *FalseC; - if (TrueVal->getType()->isVectorTy() && match(TrueVal, m_Constant(TrueC)) && + if (isa(TrueVal->getType()) && + match(TrueVal, m_Constant(TrueC)) && match(FalseVal, m_Constant(FalseC))) { unsigned NumElts = cast(TrueC->getType())->getNumElements(); diff --git a/llvm/test/Transforms/InstSimplify/select.ll b/llvm/test/Transforms/InstSimplify/select.ll index 2dcd297..4cbc583 100644 --- a/llvm/test/Transforms/InstSimplify/select.ll +++ b/llvm/test/Transforms/InstSimplify/select.ll @@ -957,3 +957,14 @@ define i32 @pr47322_more_poisonous_replacement(i32 %arg) { ret i32 %r1.sroa.0.1 } declare i32 @llvm.cttz.i32(i32, i1 immarg) + +; Partial undef scalable vectors should be ignored. +define @ignore_scalable_undef( %cond) { +; CHECK-LABEL: @ignore_scalable_undef( +; CHECK-NEXT: [[S:%.*]] = select [[COND:%.*]], undef, insertelement ( undef, i1 true, i32 0) +; CHECK-NEXT: ret [[S]] +; + %vec = insertelement undef, i1 true, i32 0 + %s = select %cond, undef, %vec + ret %s +} -- 2.7.4