Author: Nikita Popov Date: 2021-01-03T18:15:58+01:00 New Revision: c6ad00d709853e378cd70e34e755942f9d6f0c8f
URL: https://github.com/llvm/llvm-project/commit/c6ad00d709853e378cd70e34e755942f9d6f0c8f DIFF: https://github.com/llvm/llvm-project/commit/c6ad00d709853e378cd70e34e755942f9d6f0c8f.diff LOG: [InstSimplify] Return poison for out of bounds extractelement This is the same change as D93990, but for extractelement rather than insertelement. > If idx exceeds the length of val for a fixed-length vector, the > result is a poison value. For a scalable vector, if the value of > idx exceeds the runtime length of the vector, the result is a > poison value. Added: Modified: llvm/lib/Analysis/InstructionSimplify.cpp llvm/test/Transforms/InstCombine/extractelement-inseltpoison.ll llvm/test/Transforms/InstCombine/extractelement.ll llvm/test/Transforms/InstSimplify/2011-09-05-InsertExtractValue.ll llvm/test/Transforms/InstSimplify/extract-element.ll llvm/test/Transforms/InstSimplify/undef.ll llvm/test/Transforms/InstSimplify/vscale-inseltpoison.ll llvm/test/Transforms/InstSimplify/vscale.ll Removed: ################################################################################ diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index eb945c60cf94..16b5fd5436f9 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -4464,15 +4464,15 @@ static Value *SimplifyExtractElementInst(Value *Vec, Value *Idx, // For fixed-length vector, fold into undef if index is out of bounds. if (isa<FixedVectorType>(VecVTy) && IdxC->getValue().uge(cast<FixedVectorType>(VecVTy)->getNumElements())) - return UndefValue::get(VecVTy->getElementType()); + return PoisonValue::get(VecVTy->getElementType()); if (Value *Elt = findScalarElement(Vec, IdxC->getZExtValue())) return Elt; } // An undef extract index can be arbitrarily chosen to be an out-of-range - // index value, which would result in the instruction being undef. + // index value, which would result in the instruction being poison. if (Q.isUndefValue(Idx)) - return UndefValue::get(VecVTy->getElementType()); + return PoisonValue::get(VecVTy->getElementType()); return nullptr; } diff --git a/llvm/test/Transforms/InstCombine/extractelement-inseltpoison.ll b/llvm/test/Transforms/InstCombine/extractelement-inseltpoison.ll index 82c1a5c98294..f3fad9bb375c 100644 --- a/llvm/test/Transforms/InstCombine/extractelement-inseltpoison.ll +++ b/llvm/test/Transforms/InstCombine/extractelement-inseltpoison.ll @@ -4,7 +4,7 @@ define i32 @extractelement_out_of_range(<2 x i32> %x) { ; ANY-LABEL: @extractelement_out_of_range( -; ANY-NEXT: ret i32 undef +; ANY-NEXT: ret i32 poison ; %E1 = extractelement <2 x i32> %x, i8 16 ret i32 %E1 @@ -319,7 +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> <i32 undef, i32 1, i32 4, i32 3> ; 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 undef, i64 0 +; ANY-NEXT: [[R:%.*]] = insertelement <4 x double> [[T4]], double poison, i64 0 ; ANY-NEXT: ret <4 x double> [[R]] ; %t3 = extractelement <2 x double> %a, i32 0 diff --git a/llvm/test/Transforms/InstCombine/extractelement.ll b/llvm/test/Transforms/InstCombine/extractelement.ll index 76b7d28b2c09..7d36618452f5 100644 --- a/llvm/test/Transforms/InstCombine/extractelement.ll +++ b/llvm/test/Transforms/InstCombine/extractelement.ll @@ -4,7 +4,7 @@ define i32 @extractelement_out_of_range(<2 x i32> %x) { ; ANY-LABEL: @extractelement_out_of_range( -; ANY-NEXT: ret i32 undef +; ANY-NEXT: ret i32 poison ; %E1 = extractelement <2 x i32> %x, i8 16 ret i32 %E1 @@ -319,7 +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> <i32 undef, i32 1, i32 4, i32 3> ; 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 undef, i64 0 +; ANY-NEXT: [[R:%.*]] = insertelement <4 x double> [[T4]], double poison, i64 0 ; ANY-NEXT: ret <4 x double> [[R]] ; %t3 = extractelement <2 x double> %a, i32 0 diff --git a/llvm/test/Transforms/InstSimplify/2011-09-05-InsertExtractValue.ll b/llvm/test/Transforms/InstSimplify/2011-09-05-InsertExtractValue.ll index a0896b4880bd..78acdf27de1a 100644 --- a/llvm/test/Transforms/InstSimplify/2011-09-05-InsertExtractValue.ll +++ b/llvm/test/Transforms/InstSimplify/2011-09-05-InsertExtractValue.ll @@ -64,7 +64,7 @@ define i8 @test4(<8 x i8> %V) { define i32 @test5(<4 x i32> %V) { ; CHECK-LABEL: @test5( -; CHECK-NEXT: ret i32 undef +; CHECK-NEXT: ret i32 poison ; %extract = extractelement <4 x i32> %V, i32 undef ret i32 %extract diff --git a/llvm/test/Transforms/InstSimplify/extract-element.ll b/llvm/test/Transforms/InstSimplify/extract-element.ll index 38e4fd9a2af7..3a9abf63b09d 100644 --- a/llvm/test/Transforms/InstSimplify/extract-element.ll +++ b/llvm/test/Transforms/InstSimplify/extract-element.ll @@ -5,7 +5,7 @@ define i129 @vec_extract_negidx(<3 x i129> %a) { ; CHECK-LABEL: @vec_extract_negidx( -; CHECK-NEXT: ret i129 undef +; CHECK-NEXT: ret i129 poison ; %E1 = extractelement <3 x i129> %a, i129 -1 ret i129 %E1 @@ -13,7 +13,7 @@ define i129 @vec_extract_negidx(<3 x i129> %a) { define i129 @vec_extract_out_of_bounds(<3 x i129> %a) { ; CHECK-LABEL: @vec_extract_out_of_bounds( -; CHECK-NEXT: ret i129 undef +; CHECK-NEXT: ret i129 poison ; %E1 = extractelement <3 x i129> %a, i129 3 ret i129 %E1 @@ -21,7 +21,7 @@ define i129 @vec_extract_out_of_bounds(<3 x i129> %a) { define i129 @vec_extract_out_of_bounds2(<3 x i129> %a) { ; CHECK-LABEL: @vec_extract_out_of_bounds2( -; CHECK-NEXT: ret i129 undef +; CHECK-NEXT: ret i129 poison ; %E1 = extractelement <3 x i129> %a, i129 999999999999999 ret i129 %E1 @@ -30,7 +30,7 @@ define i129 @vec_extract_out_of_bounds2(<3 x i129> %a) { define i129 @vec_extract_undef_index(<3 x i129> %a) { ; CHECK-LABEL: @vec_extract_undef_index( -; CHECK-NEXT: ret i129 undef +; CHECK-NEXT: ret i129 poison ; %E1 = extractelement <3 x i129> %a, i129 undef ret i129 %E1 @@ -39,7 +39,7 @@ define i129 @vec_extract_undef_index(<3 x i129> %a) { define i129 @vec_extract_poison_index(<3 x i129> %a) { ; CHECK-LABEL: @vec_extract_poison_index( -; CHECK-NEXT: ret i129 undef +; CHECK-NEXT: ret i129 poison ; %E1 = extractelement <3 x i129> %a, i129 poison ret i129 %E1 diff --git a/llvm/test/Transforms/InstSimplify/undef.ll b/llvm/test/Transforms/InstSimplify/undef.ll index b7c69a5b4e7f..80780899e848 100644 --- a/llvm/test/Transforms/InstSimplify/undef.ll +++ b/llvm/test/Transforms/InstSimplify/undef.ll @@ -324,7 +324,7 @@ define i32 @test34(i32 %a) { define i32 @test35(<4 x i32> %V) { ; CHECK-LABEL: @test35( -; CHECK-NEXT: ret i32 undef +; CHECK-NEXT: ret i32 poison ; %b = extractelement <4 x i32> %V, i32 4 ret i32 %b diff --git a/llvm/test/Transforms/InstSimplify/vscale-inseltpoison.ll b/llvm/test/Transforms/InstSimplify/vscale-inseltpoison.ll index c45e6062fde1..6ad1a2dca33e 100644 --- a/llvm/test/Transforms/InstSimplify/vscale-inseltpoison.ll +++ b/llvm/test/Transforms/InstSimplify/vscale-inseltpoison.ll @@ -72,7 +72,7 @@ define <vscale x 4 x i32> @insertelement_shufflevector_inline_to_ret() { define i32 @extractelement_idx_undef(<vscale x 4 x i32> %a) { ; CHECK-LABEL: @extractelement_idx_undef( -; CHECK-NEXT: ret i32 undef +; CHECK-NEXT: ret i32 poison ; %r = extractelement <vscale x 4 x i32> %a, i64 undef ret i32 %r diff --git a/llvm/test/Transforms/InstSimplify/vscale.ll b/llvm/test/Transforms/InstSimplify/vscale.ll index 8533d40bf4af..4cf6f5dc5828 100644 --- a/llvm/test/Transforms/InstSimplify/vscale.ll +++ b/llvm/test/Transforms/InstSimplify/vscale.ll @@ -72,7 +72,7 @@ define <vscale x 4 x i32> @insertelement_shufflevector_inline_to_ret() { define i32 @extractelement_idx_undef(<vscale x 4 x i32> %a) { ; CHECK-LABEL: @extractelement_idx_undef( -; CHECK-NEXT: ret i32 undef +; CHECK-NEXT: ret i32 poison ; %r = extractelement <vscale x 4 x i32> %a, i64 undef ret i32 %r _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits