forked from OSchip/llvm-project
[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.
This commit is contained in:
parent
c79a366ec0
commit
57f0eed98d
|
@ -4302,6 +4302,11 @@ Value *llvm::SimplifyInsertElementInst(Value *Vec, Value *Val, Value *Idx,
|
||||||
if (isa<UndefValue>(Idx))
|
if (isa<UndefValue>(Idx))
|
||||||
return UndefValue::get(Vec->getType());
|
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<UndefValue>(Val) && isGuaranteedNotToBeUndefOrPoison(Vec))
|
||||||
|
return Vec;
|
||||||
|
|
||||||
// If we are extracting a value from a vector, then inserting it into the same
|
// If we are extracting a value from a vector, then inserting it into the same
|
||||||
// place, that's the input vector:
|
// place, that's the input vector:
|
||||||
// insertelt Vec, (extractelt Vec, Idx), Idx --> Vec
|
// insertelt Vec, (extractelt Vec, Idx), Idx --> Vec
|
||||||
|
|
|
@ -53,10 +53,11 @@ define <4 x i32> @PR1286(<4 x i32> %A) {
|
||||||
ret <4 x i32> %B
|
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) {
|
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-LABEL: @undef_into_constant_vector_with_variable_index(
|
||||||
; CHECK-NEXT: [[B:%.*]] = insertelement <2 x i32> <i32 42, i32 -42>, i32 undef, i32 [[INDEX:%.*]]
|
; CHECK-NEXT: ret <2 x i32> <i32 42, i32 -42>
|
||||||
; CHECK-NEXT: ret <2 x i32> [[B]]
|
|
||||||
;
|
;
|
||||||
%B = insertelement <2 x i32> <i32 42, i32 -42>, i32 undef, i32 %Index
|
%B = insertelement <2 x i32> <i32 42, i32 -42>, i32 undef, i32 %Index
|
||||||
ret <2 x i32> %B
|
ret <2 x i32> %B
|
||||||
|
|
Loading…
Reference in New Issue