From: Sanjay Patel Date: Thu, 23 May 2019 21:49:47 +0000 (+0000) Subject: [InstSimplify] insertelement V, undef, ? --> V X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8dc3a075f3109c9c7b95f303de654eb689a9a066;p=llvm [InstSimplify] insertelement V, undef, ? --> V This was part of InstCombine, but it's better placed in InstSimplify. InstCombine also had an unreachable but weaker fold for insertelement with undef index, so that is deleted. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@361559 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp index b71841a1607..6e421dcaa73 100644 --- a/lib/Analysis/InstructionSimplify.cpp +++ b/lib/Analysis/InstructionSimplify.cpp @@ -4011,6 +4011,11 @@ Value *llvm::SimplifyInsertElementInst(Value *Vec, Value *Val, Value *Idx, if (isa(Idx)) return UndefValue::get(Vec->getType()); + // Inserting an undef scalar? Assume it is the same value as the existing + // vector element. + if (isa(Val)) + return Vec; + return nullptr; } diff --git a/lib/Transforms/InstCombine/InstCombineVectorOps.cpp b/lib/Transforms/InstCombine/InstCombineVectorOps.cpp index c2ea0733a48..44130d3246b 100644 --- a/lib/Transforms/InstCombine/InstCombineVectorOps.cpp +++ b/lib/Transforms/InstCombine/InstCombineVectorOps.cpp @@ -863,10 +863,6 @@ Instruction *InstCombiner::visitInsertElementInst(InsertElementInst &IE) { VecOp, ScalarOp, IdxOp, SQ.getWithInstruction(&IE))) return replaceInstUsesWith(IE, V); - // Inserting an undef or into an undefined place, remove this. - if (isa(ScalarOp) || isa(IdxOp)) - replaceInstUsesWith(IE, VecOp); - // If the vector and scalar are both bitcast from the same element type, do // the insert in that source type followed by bitcast. Value *VecSrc, *ScalarSrc; diff --git a/test/Transforms/InstCombine/vec_insertelt.ll b/test/Transforms/InstCombine/vec_insertelt.ll deleted file mode 100644 index 3b949209c4d..00000000000 --- a/test/Transforms/InstCombine/vec_insertelt.ll +++ /dev/null @@ -1,8 +0,0 @@ -; RUN: opt < %s -instcombine -S | FileCheck %s -; CHECK: ret <4 x i32> %A - -; PR1286 -define <4 x i32> @test1(<4 x i32> %A) { - %B = insertelement <4 x i32> %A, i32 undef, i32 1 - ret <4 x i32> %B -} diff --git a/test/Transforms/InstSimplify/insertelement.ll b/test/Transforms/InstSimplify/insertelement.ll index 3524f2145ac..c7db869d056 100644 --- a/test/Transforms/InstSimplify/insertelement.ll +++ b/test/Transforms/InstSimplify/insertelement.ll @@ -1,31 +1,51 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -S -instsimplify < %s | FileCheck %s define <4 x i32> @test1(<4 x i32> %A) { +; CHECK-LABEL: @test1( +; CHECK-NEXT: ret <4 x i32> undef +; %I = insertelement <4 x i32> %A, i32 5, i64 4294967296 - ; CHECK: ret <4 x i32> undef ret <4 x i32> %I } define <4 x i32> @test2(<4 x i32> %A) { +; CHECK-LABEL: @test2( +; CHECK-NEXT: ret <4 x i32> undef +; %I = insertelement <4 x i32> %A, i32 5, i64 4 - ; CHECK: ret <4 x i32> undef ret <4 x i32> %I } define <4 x i32> @test3(<4 x i32> %A) { +; CHECK-LABEL: @test3( +; CHECK-NEXT: [[I:%.*]] = insertelement <4 x i32> [[A:%.*]], i32 5, i64 1 +; CHECK-NEXT: ret <4 x i32> [[I]] +; %I = insertelement <4 x i32> %A, i32 5, i64 1 - ; CHECK: ret <4 x i32> %I ret <4 x i32> %I } define <4 x i32> @test4(<4 x i32> %A) { +; CHECK-LABEL: @test4( +; CHECK-NEXT: ret <4 x i32> undef +; %I = insertelement <4 x i32> %A, i32 5, i128 100 - ; CHECK: ret <4 x i32> undef ret <4 x i32> %I } define <4 x i32> @test5(<4 x i32> %A) { +; CHECK-LABEL: @test5( +; CHECK-NEXT: ret <4 x i32> undef +; %I = insertelement <4 x i32> %A, i32 5, i64 undef - ; CHECK: ret <4 x i32> undef ret <4 x i32> %I } + +define <4 x i32> @PR1286(<4 x i32> %A) { +; CHECK-LABEL: @PR1286( +; CHECK-NEXT: ret <4 x i32> [[A:%.*]] +; + %B = insertelement <4 x i32> %A, i32 undef, i32 1 + ret <4 x i32> %B +}