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))
|
||||
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
|
||||
// place, that's the input vector:
|
||||
// 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
|
||||
}
|
||||
|
||||
; 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 42, i32 -42>, i32 undef, i32 [[INDEX:%.*]]
|
||||
; CHECK-NEXT: ret <2 x i32> [[B]]
|
||||
; CHECK-NEXT: ret <2 x i32> <i32 42, i32 -42>
|
||||
;
|
||||
%B = insertelement <2 x i32> <i32 42, i32 -42>, i32 undef, i32 %Index
|
||||
ret <2 x i32> %B
|
||||
|
|
Loading…
Reference in New Issue