[PATCH] fix for bug 18319

Nick Lewycky nicholas at mxc.ca
Tue Dec 24 16:45:08 PST 2013


On 12/24/2013 07:18 AM, Ilia Filippov wrote:
> Hello,
>
> Could somebody please review and commit my fix to bug
> http://llvm.org/bugs/show_bug.cgi?id=18319 ?
> (patch is attached).
>
> The fix handles the case of vector select constant expression containing
> "undef" values in ConstantFoldSelectInstruction function.

Index: lib/IR/ConstantFold.cpp
===================================================================
--- lib/IR/ConstantFold.cpp	(revision 197903)
+++ lib/IR/ConstantFold.cpp	(working copy)
@@ -706,9 +706,15 @@
      Type *Ty = IntegerType::get(CondV->getContext(), 32);
      for (unsigned i = 0, e = V1->getType()->getVectorNumElements(); i 
!= e;++i){
        ConstantInt *Cond = dyn_cast<ConstantInt>(CondV->getOperand(i));
-      if (Cond == 0) break;
-
-      Constant *V = Cond->isNullValue() ? V2 : V1;
+      Constant *V;
+      if (Cond == 0) {
+        if (isa<UndefValue>(CondV->getOperand(i)))

Instead of re-getting from CondV, make Cond a Constant* instead of a 
ConstantInt*, and have it do "if (!isa<ConstantInt>(Cond)) break;" after 
handling the undef case.

There's some other logic missing here though. If 
cast<ConstantVector>(V1)->getOperand(n) is equal to 
cast<ConstantVector>(V2)->getOperand(n), then we don't care what Cond is 
at all, we should just pick that element.

Since we're going to look at each element this way, why not check if one 
of the elements is better than the other (ie., is an undef) and then 
pick that element when the condition is undef?

Nick

+          V = V2;
+        else
+          break;
+      }
+      else
+        V = Cond->isNullValue() ? V2 : V1;
        Constant *Res = ConstantExpr::getExtractElement(V, 
ConstantInt::get(Ty, i));
        Result.push_back(Res);
      }




More information about the llvm-commits mailing list