[PATCH] Generalize getExtendAddRecStart to work with both sign and zero extensions.

Andrew Trick atrick at apple.com
Tue Feb 17 23:00:57 PST 2015


I can see how my comment about duplicating the typedef would seem silly. I was actually thinking about bringing the members defined by that type into the base, as shown below. But I didn't think it through because now that I write it out, the out-of-line static definitions are utterly horrid:

template <SCEV::NoWrapFlags W, GetExtendExprTy ExtendF,

  GetOverflowLimitForStepTy OverflowF>

struct ExtendOpTraitsBase {

  static const SCEV::NoWrapFlags WrapType = W;
  static const GetExtendExprTy GetExtendExpr;
  static const GetOverflowLimitForStepTy GetOverflowLimitForStep;

};

template <SCEV::NoWrapFlags W, GetExtendExprTy ExtendF,

  GetOverflowLimitForStepTy OverflowF>

const GetExtendExprTy ExtendOpTraitsBase<W, ExtendF, OverflowF>::
GetExtendExpr = ExtendF;

template <SCEV::NoWrapFlags W, GetExtendExprTy ExtendF,

  GetOverflowLimitForStepTy OverflowF>

const GetOverflowLimitForStepTy ExtendOpTraitsBase<W, ExtendF, OverflowF>::
GetOverflowLimitForStep = OverflowF;

template <typename ExtendOp> struct ExtendOpTraits {};

template <>
struct ExtendOpTraits<SCEVSignExtendExpr>

  : public ExtendOpTraitsBase<SCEV::FlagNSW, getSignExtendExpr,
                              getSignedOverflowLimitForStep>

{};

template <>
struct ExtendOpTraits<SCEVZeroExtendExpr>

  : public ExtendOpTraitsBase<SCEV::FlagNUW, getZeroExtendExpr,
                              getUnsignedOverflowLimitForStep>

{};
---

Oh well, at any rate, you shouldn't need to refer to the type like this anymore:
ExtendOpTraits<SCEVSignExtendExpr>::GetExtendExprTy


REPOSITORY
  rL LLVM

http://reviews.llvm.org/D7645

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/






More information about the llvm-commits mailing list