From 57f0eed98d02cd684c358a45f68e716179f4bfa3 Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Fri, 1 May 2020 10:34:29 -0400 Subject: [PATCH] [InstSimplify] allow insertelement-with-undef fold if poison-safe The more general fold was not poison-safe, so it was removed: rG5486e00 ...but it is ok to have this transform if analysis can determine the vector contains no poison. The test shows a simple example of that: constant integer elements are not poison. --- llvm/lib/Analysis/InstructionSimplify.cpp | 5 +++++ llvm/test/Transforms/InstSimplify/insertelement.ll | 5 +++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index 6eb995d..7de4a07 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -4302,6 +4302,11 @@ Value *llvm::SimplifyInsertElementInst(Value *Vec, Value *Val, Value *Idx, if (isa(Idx)) return UndefValue::get(Vec->getType()); + // If the scalar is undef, and there is no risk of propagating poison from the + // vector value, simplify to the vector value. + if (isa(Val) && isGuaranteedNotToBeUndefOrPoison(Vec)) + return Vec; + // If we are extracting a value from a vector, then inserting it into the same // place, that's the input vector: // insertelt Vec, (extractelt Vec, Idx), Idx --> Vec diff --git a/llvm/test/Transforms/InstSimplify/insertelement.ll b/llvm/test/Transforms/InstSimplify/insertelement.ll index e54a03f..c0c91b2 100644 --- a/llvm/test/Transforms/InstSimplify/insertelement.ll +++ b/llvm/test/Transforms/InstSimplify/insertelement.ll @@ -53,10 +53,11 @@ define <4 x i32> @PR1286(<4 x i32> %A) { ret <4 x i32> %B } +; Constant is not poison, so this can simplify. + define <2 x i32> @undef_into_constant_vector_with_variable_index(<2 x i32> %A, i32 %Index) { ; CHECK-LABEL: @undef_into_constant_vector_with_variable_index( -; CHECK-NEXT: [[B:%.*]] = insertelement <2 x i32> , i32 undef, i32 [[INDEX:%.*]] -; CHECK-NEXT: ret <2 x i32> [[B]] +; CHECK-NEXT: ret <2 x i32> ; %B = insertelement <2 x i32> , i32 undef, i32 %Index ret <2 x i32> %B -- 2.7.4