From 871d4c41659b3d2721d7d890d1e5bfb467079843 Mon Sep 17 00:00:00 2001 From: Juneyoung Lee Date: Mon, 4 Jan 2021 02:02:19 +0900 Subject: [PATCH] [InstSimplify] Fold insertelement vec, poison, idx into vec This is a simple patch that adds folding from `insertelement vec, poison, idx` into `vec`. Alive2 proof: https://alive2.llvm.org/ce/z/2y2vbC Reviewed By: nikic Differential Revision: https://reviews.llvm.org/D93994 --- lib/Analysis/InstructionSimplify.cpp | 8 ++++---- .../Transforms/InstCombine/extractelement-inseltpoison.ll | 3 +-- test/Transforms/InstCombine/extractelement.ll | 3 +-- test/Transforms/InstSimplify/insertelement.ll | 3 +-- test/Transforms/SLPVectorizer/X86/alternate-int.ll | 8 ++++---- 5 files changed, 11 insertions(+), 14 deletions(-) diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp index 5c251452e96..96a3ada89db 100644 --- a/lib/Analysis/InstructionSimplify.cpp +++ b/lib/Analysis/InstructionSimplify.cpp @@ -4401,10 +4401,10 @@ Value *llvm::SimplifyInsertElementInst(Value *Vec, Value *Val, Value *Idx, if (Q.isUndefValue(Idx)) return PoisonValue::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 (Q.isUndefValue(Val) && - isGuaranteedNotToBeUndefOrPoison(Vec)) + // If the scalar is poison, or it is undef and there is no risk of + // propagating poison from the vector value, simplify to the vector value. + if (isa(Val) || + (Q.isUndefValue(Val) && isGuaranteedNotToBePoison(Vec))) return Vec; // If we are extracting a value from a vector, then inserting it into the same diff --git a/test/Transforms/InstCombine/extractelement-inseltpoison.ll b/test/Transforms/InstCombine/extractelement-inseltpoison.ll index f3fad9bb375..0792e7aff51 100644 --- a/test/Transforms/InstCombine/extractelement-inseltpoison.ll +++ b/test/Transforms/InstCombine/extractelement-inseltpoison.ll @@ -319,8 +319,7 @@ define <4 x double> @invalid_extractelement(<2 x double> %a, <4 x double> %b, do ; ANY-NEXT: [[T4:%.*]] = shufflevector <4 x double> [[B:%.*]], <4 x double> [[TMP1]], <4 x i32> ; ANY-NEXT: [[E:%.*]] = extractelement <4 x double> [[B]], i32 1 ; ANY-NEXT: store double [[E]], double* [[P:%.*]], align 8 -; ANY-NEXT: [[R:%.*]] = insertelement <4 x double> [[T4]], double poison, i64 0 -; ANY-NEXT: ret <4 x double> [[R]] +; ANY-NEXT: ret <4 x double> [[T4]] ; %t3 = extractelement <2 x double> %a, i32 0 %t4 = insertelement <4 x double> %b, double %t3, i32 2 diff --git a/test/Transforms/InstCombine/extractelement.ll b/test/Transforms/InstCombine/extractelement.ll index 7d36618452f..4bb2a32681e 100644 --- a/test/Transforms/InstCombine/extractelement.ll +++ b/test/Transforms/InstCombine/extractelement.ll @@ -319,8 +319,7 @@ define <4 x double> @invalid_extractelement(<2 x double> %a, <4 x double> %b, do ; ANY-NEXT: [[T4:%.*]] = shufflevector <4 x double> [[B:%.*]], <4 x double> [[TMP1]], <4 x i32> ; ANY-NEXT: [[E:%.*]] = extractelement <4 x double> [[B]], i32 1 ; ANY-NEXT: store double [[E]], double* [[P:%.*]], align 8 -; ANY-NEXT: [[R:%.*]] = insertelement <4 x double> [[T4]], double poison, i64 0 -; ANY-NEXT: ret <4 x double> [[R]] +; ANY-NEXT: ret <4 x double> [[T4]] ; %t3 = extractelement <2 x double> %a, i32 0 %t4 = insertelement <4 x double> %b, double %t3, i32 2 diff --git a/test/Transforms/InstSimplify/insertelement.ll b/test/Transforms/InstSimplify/insertelement.ll index 580670844f2..8cb3312cf9e 100644 --- a/test/Transforms/InstSimplify/insertelement.ll +++ b/test/Transforms/InstSimplify/insertelement.ll @@ -52,8 +52,7 @@ define <4 x i32> @test5_poison(<4 x i32> %A) { define <4 x i32> @elem_poison(<4 x i32> %A) { ; CHECK-LABEL: @elem_poison( -; CHECK-NEXT: [[B:%.*]] = insertelement <4 x i32> [[A:%.*]], i32 poison, i32 1 -; CHECK-NEXT: ret <4 x i32> [[B]] +; CHECK-NEXT: ret <4 x i32> [[A:%.*]] ; %B = insertelement <4 x i32> %A, i32 poison, i32 1 ret <4 x i32> %B diff --git a/test/Transforms/SLPVectorizer/X86/alternate-int.ll b/test/Transforms/SLPVectorizer/X86/alternate-int.ll index a71379791f2..176b2a3c49a 100644 --- a/test/Transforms/SLPVectorizer/X86/alternate-int.ll +++ b/test/Transforms/SLPVectorizer/X86/alternate-int.ll @@ -425,10 +425,10 @@ define <8 x i32> @sdiv_v8i32_undefs(<8 x i32> %a) { ; CHECK-NEXT: [[AB5:%.*]] = sdiv i32 [[A5]], 4 ; CHECK-NEXT: [[AB6:%.*]] = sdiv i32 [[A6]], 8 ; CHECK-NEXT: [[AB7:%.*]] = sdiv i32 [[A7]], 16 -; CHECK-NEXT: [[TMP1:%.*]] = insertelement <8 x i32> poison, i32 [[AB1]], i32 1 -; CHECK-NEXT: [[TMP2:%.*]] = insertelement <8 x i32> [[TMP1]], i32 [[AB2]], i32 2 -; CHECK-NEXT: [[R4:%.*]] = insertelement <8 x i32> [[TMP2]], i32 [[AB3]], i32 3 -; CHECK-NEXT: [[R5:%.*]] = insertelement <8 x i32> [[R4]], i32 [[AB5]], i32 5 +; CHECK-NEXT: [[R1:%.*]] = insertelement <8 x i32> , i32 [[AB1]], i32 1 +; CHECK-NEXT: [[R2:%.*]] = insertelement <8 x i32> [[R1]], i32 [[AB2]], i32 2 +; CHECK-NEXT: [[R3:%.*]] = insertelement <8 x i32> [[R2]], i32 [[AB3]], i32 3 +; CHECK-NEXT: [[R5:%.*]] = insertelement <8 x i32> [[R3]], i32 [[AB5]], i32 5 ; CHECK-NEXT: [[R6:%.*]] = insertelement <8 x i32> [[R5]], i32 [[AB6]], i32 6 ; CHECK-NEXT: [[R7:%.*]] = insertelement <8 x i32> [[R6]], i32 [[AB7]], i32 7 ; CHECK-NEXT: ret <8 x i32> [[R7]]