[Beignet] [PATCH] GBE: correct the instruction replacement logic in scalarize pass.

Yang, Rong R rong.r.yang at intel.com
Sun Apr 12 21:59:36 PDT 2015


LGTM, thanks.

> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> Zhigang Gong
> Sent: Thursday, April 2, 2015 07:22
> To: beignet at lists.freedesktop.org
> Cc: Gong, Zhigang
> Subject: [Beignet] [PATCH] GBE: correct the instruction replacement logic in
> scalarize pass.
> 
> When we want to delete an old instruction and replace it with the new one,
> we only call the LLVM IR's replace function which is not sufficient for the
> scalarize pass, as we also keep some local reference int eh vecVals map. We
> need to replace all of those local reference also.
> 
> Otherwise, the deleted values may be used in the subsequent instructions
> which causes fatal error latter.
> 
> Signed-off-by: Zhigang Gong <zhigang.gong at intel.com>
> ---
>  backend/src/llvm/llvm_scalarize.cpp | 43
> +++++++++++++++++++++++++++++--------
>  1 file changed, 34 insertions(+), 9 deletions(-)
> 
> diff --git a/backend/src/llvm/llvm_scalarize.cpp
> b/backend/src/llvm/llvm_scalarize.cpp
> index b657246..694b008 100644
> --- a/backend/src/llvm/llvm_scalarize.cpp
> +++ b/backend/src/llvm/llvm_scalarize.cpp
> @@ -234,6 +234,20 @@ namespace gbe {
>      }
> 
>      DenseMap<Value*, VectorValues> vectorVals;
> +    struct VecValElement{
> +      VecValElement(VectorValues *v, uint32_t i) : vecVals(v), id(i) {}
> +      VectorValues *vecVals;
> +      uint32_t id;
> +    };
> +    DenseMap<Value*, SmallVector<VecValElement, 16>> usedVecVals;
> +
> +    void setComponent(VectorValues &vecVals, uint32_t c, llvm::Value* val) {
> +      vecVals.setComponent(c, val);
> +      usedVecVals[val].push_back(VecValElement(&vecVals, c));
> +    }
> +
> +    void replaceAllUsesOfWith(Instruction* from, Instruction* to);
> +
>      Module* module;
>      IRBuilder<>* builder;
> 
> @@ -448,7 +462,7 @@ namespace gbe {
>        callArgs.push_back(ConstantInt::get(intTy, i));
> 
>        res = builder->CreateCall(f, callArgs);
> -      vVals.setComponent(i, res);
> +      setComponent(vVals, i, res);
>      }
>    }
> 
> @@ -468,7 +482,7 @@ namespace gbe {
> 
>        Instruction* res = createScalarInstruction(inst, callArgs);
> 
> -      vVals.setComponent(i, res);
> +      setComponent(vVals, i, res);
>        builder->Insert(res);
>      }
>    }
> @@ -549,7 +563,7 @@ namespace gbe {
>        int select = sv->getMaskValue(i);
> 
>        if (select < 0) {
> -        vVals.setComponent(i, UndefValue::get(GetBasicType(sv-
> >getOperand(0))));
> +        setComponent(vVals, i,
> + UndefValue::get(GetBasicType(sv->getOperand(0))));
>          continue;
>        }
> 
> @@ -564,7 +578,7 @@ namespace gbe {
>          selectee = sv->getOperand(1);
>        }
> 
> -      vVals.setComponent(i, getComponent(select, selectee));
> +      setComponent(vVals, i, getComponent(select, selectee));
>      }
> 
>      return true;
> @@ -611,7 +625,7 @@ namespace gbe {
>      for (int i = 0; i < GetComponentCount(insn); ++i) {
>        Value *cv = ConstantInt::get(intTy, i);
>        Value *EI = builder->CreateExtractElement(insn, cv);
> -      vVals.setComponent(i, EI);
> +      setComponent(vVals, i, EI);
>      }
>    }
> 
> @@ -680,6 +694,7 @@ namespace gbe {
>        setAppendPoint(bt);
>        extractFromVector(bt);
>      }
> +
>      return false;
>    }
> 
> @@ -695,6 +710,16 @@ namespace gbe {
>      return false;
>    }
> 
> +  void Scalarize::replaceAllUsesOfWith(Instruction* from, Instruction* to) {
> +    GBE_ASSERT(from != NULL);
> +    if (from == to)
> +      return;
> +    for (auto &it : usedVecVals[from])
> +      setComponent(*(it.vecVals), it.id, to);
> +    usedVecVals[from].clear();
> +    from->replaceAllUsesWith(to);
> +  }
> +
>    bool Scalarize::scalarizeExtract(ExtractElementInst* extr)
>    {
>      //     %res = extractelement <n X ty> %foo, %i
> @@ -711,7 +736,7 @@ namespace gbe {
>      Value* v = getComponent(component, extr->getOperand(0));
>      if(extr == v)
>        return false;
> -    extr->replaceAllUsesWith(v);
> +    replaceAllUsesOfWith(dyn_cast<Instruction>(extr),
> + dyn_cast<Instruction>(v));
> 
>      return true;
>    }
> @@ -731,8 +756,8 @@ namespace gbe {
> 
>      VectorValues& vVals = vectorVals[ins];
>      for (int i = 0; i < GetComponentCount(ins); ++i) {
> -      vVals.setComponent(i, i == component ? ins->getOperand(1)
> -                                           : getComponent(i, ins->getOperand(0)));
> +      setComponent(vVals, i, i == component ? ins->getOperand(1)
> +                   : getComponent(i, ins->getOperand(0)));
>      }
> 
>      return true;
> @@ -816,9 +841,9 @@ namespace gbe {
>      }
> 
>      dce();
> -
>      incompletePhis.clear();
>      vectorVals.clear();
> +    usedVecVals.clear();
> 
>      delete builder;
>      builder = 0;
> --
> 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