summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Analysis/InstructionSimplify.cpp5
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp4
-rw-r--r--llvm/test/Transforms/InstCombine/vec_insertelt.ll8
-rw-r--r--llvm/test/Transforms/InstSimplify/insertelement.ll30
4 files changed, 30 insertions, 17 deletions
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index b71841a1607..6e421dcaa73 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -4011,6 +4011,11 @@ Value *llvm::SimplifyInsertElementInst(Value *Vec, Value *Val, Value *Idx,
if (isa<UndefValue>(Idx))
return UndefValue::get(Vec->getType());
+ // Inserting an undef scalar? Assume it is the same value as the existing
+ // vector element.
+ if (isa<UndefValue>(Val))
+ return Vec;
+
return nullptr;
}
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp b/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
index c2ea0733a48..44130d3246b 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
+++ b/llvm/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<UndefValue>(ScalarOp) || isa<UndefValue>(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/llvm/test/Transforms/InstCombine/vec_insertelt.ll b/llvm/test/Transforms/InstCombine/vec_insertelt.ll
deleted file mode 100644
index 3b949209c4d..00000000000
--- a/llvm/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/llvm/test/Transforms/InstSimplify/insertelement.ll b/llvm/test/Transforms/InstSimplify/insertelement.ll
index 3524f2145ac..c7db869d056 100644
--- a/llvm/test/Transforms/InstSimplify/insertelement.ll
+++ b/llvm/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
+}
OpenPOWER on IntegriCloud