[Beignet] [PATCH] GBE: expand constant expressions in constant vector

Song, Ruiling ruiling.song at intel.com
Thu Feb 26 23:10:23 PST 2015


It is really weird LLVM would embed some constantExpr in constantVector!
Anyway, the patch LGTM.

> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> Zhigang Gong
> Sent: Friday, February 27, 2015 9:51 AM
> To: beignet at lists.freedesktop.org
> Cc: Gong, Zhigang
> Subject: [Beignet] [PATCH] GBE: expand constant expressions in constant
> vector
> 
> The previous expand constant pass will not expand a constant expression
> within a constant vector. So after adding the expand constant pass, we still
> get some constant expressions at gen writter pass and the worse case is
> there are some large integer hid in those constant expressions which are not
> supported in gen writter pass and will cause assertions.
> 
> This patch will identify those constant vectors and expand all the possible
> constant expression elements.
> 
> Signed-off-by: Zhigang Gong <zhigang.gong at intel.com>
> ---
>  backend/src/llvm/ExpandConstantExpr.cpp | 47
> +++++++++++++++++++++++++++++++++
>  1 file changed, 47 insertions(+)
> 
> diff --git a/backend/src/llvm/ExpandConstantExpr.cpp
> b/backend/src/llvm/ExpandConstantExpr.cpp
> index 54b8b16..f80dd3c 100644
> --- a/backend/src/llvm/ExpandConstantExpr.cpp
> +++ b/backend/src/llvm/ExpandConstantExpr.cpp
> @@ -78,6 +78,7 @@
> 
>  #include <map>
> 
> +#include "llvm/IR/IRBuilder.h"
>  #include "llvm/IR/Constants.h"
>  #include "llvm/IR/Function.h"
>  #include "llvm/IR/Instructions.h"
> @@ -110,6 +111,44 @@ static Value *expandConstantExpr(Instruction
> *InsertPt, ConstantExpr *Expr) {
>    return NewInst;
>  }
> 
> +// For a constant vector, it may contain some constant expressions.
> +// We need to expand each expressions then recreate this vector by //
> +using InsertElement instruction. Thus we can eliminate all the //
> +constant expressions.
> +static Value *expandConstantVector(Instruction *InsertPt,
> +ConstantVector *CV) {
> +  int elemNum = CV->getType()->getNumElements();
> +  Type *IntTy = IntegerType::get(CV->getContext(), 32);
> +
> +  BasicBlock::iterator InsertPos(InsertPt);
> +  IRBuilder<> IRB(--InsertPos);
> +  Value *tmp = UndefValue::get(CV->getType());
> +  Value *vec = tmp;
> +  for (int i = 0; i < elemNum; i++) {
> +    Value *idx = ConstantInt::get(IntTy, i);
> +    if (dyn_cast<ConstantVector>(CV->getOperand(i)))
> +      vec = IRB.CreateInsertElement(vec, expandConstantVector(InsertPt,
> dyn_cast<ConstantVector>(CV->getOperand(i))), idx);
> +    else if (dyn_cast<ConstantExpr>(CV->getOperand(i)))
> +      vec = IRB.CreateInsertElement(vec, expandConstantExpr(InsertPt,
> dyn_cast<ConstantExpr>(CV->getOperand(i))), idx);
> +    else
> +      vec = IRB.CreateInsertElement(vec, CV->getOperand(i), idx);
> +  }
> +  return vec;
> +}
> +
> +// Whether a constant vector contains constant expression which need to
> expand.
> +static bool needExpand(ConstantVector *CV) {
> +  int elemNum = CV->getType()->getNumElements();
> +  for (int i = 0; i < elemNum; i++) {
> +    Constant *C = CV->getOperand(i);
> +    if (dyn_cast<ConstantExpr>(C))
> +      return true;
> +    if (dyn_cast<ConstantVector>(C))
> +      if (needExpand(dyn_cast<ConstantVector>(C)))
> +        return true;
> +  }
> +  return false;
> +}
> +
>  static bool expandInstruction(Instruction *Inst) {
>    // A landingpad can only accept ConstantExprs, so it should remain
>    // unmodified.
> @@ -124,6 +163,14 @@ static bool expandInstruction(Instruction *Inst) {
>        Use *U = &Inst->getOperandUse(OpNum);
>        PhiSafeReplaceUses(U, expandConstantExpr(PhiSafeInsertPt(U),
> Expr));
>      }
> +    else {
> +      ConstantVector *CV =
> dyn_cast<ConstantVector>(Inst->getOperand(OpNum));
> +      if (CV && needExpand(CV)) {
> +        Modified = true;
> +        Use *U = &Inst->getOperandUse(OpNum);
> +        PhiSafeReplaceUses(U, expandConstantVector(PhiSafeInsertPt(U),
> CV));
> +      }
> +    }
>    }
>    return Modified;
>  }
> --
> 1.9.1
> 
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet


More information about the Beignet mailing list