[ConstantFold] fix inconsistent handling of extractelement with undef index (PR42689)
authorSanjay Patel <spatel@rotateright.com>
Sun, 13 Oct 2019 17:34:08 +0000 (17:34 +0000)
committerSanjay Patel <spatel@rotateright.com>
Sun, 13 Oct 2019 17:34:08 +0000 (17:34 +0000)
Any constant other than zero was already folded to undef if the index is undef.
https://bugs.llvm.org/show_bug.cgi?id=42689

llvm-svn: 374729

llvm/lib/IR/ConstantFold.cpp
llvm/test/Transforms/ConstProp/InsertElement.ll

index 54814bb..b60b450 100644 (file)
@@ -787,12 +787,9 @@ Constant *llvm::ConstantFoldSelectInstruction(Constant *Cond,
 
 Constant *llvm::ConstantFoldExtractElementInstruction(Constant *Val,
                                                       Constant *Idx) {
-  if (isa<UndefValue>(Val))  // ee(undef, x) -> undef
-    return UndefValue::get(Val->getType()->getVectorElementType());
-  if (Val->isNullValue())  // ee(zero, x) -> zero
-    return Constant::getNullValue(Val->getType()->getVectorElementType());
-  // ee({w,x,y,z}, undef) -> undef
-  if (isa<UndefValue>(Idx))
+  // extractelt undef, C -> undef
+  // extractelt C, undef -> undef
+  if (isa<UndefValue>(Val) || isa<UndefValue>(Idx))
     return UndefValue::get(Val->getType()->getVectorElementType());
 
   if (ConstantInt *CIdx = dyn_cast<ConstantInt>(Idx)) {
index ba3a9ad..1048b57 100644 (file)
@@ -38,7 +38,7 @@ define <4 x i64> @insertelement_undef() {
 
 define i64 @extract_undef_index_from_zero_vec() {
 ; CHECK-LABEL: @extract_undef_index_from_zero_vec(
-; CHECK-NEXT:    ret i64 0
+; CHECK-NEXT:    ret i64 undef
 ;
   %E = extractelement <2 x i64> zeroinitializer, i64 undef
   ret i64 %E