[LLVMdev] Cast to SCEVAddRecExpr

Nick Lewycky nicholas at mxc.ca
Wed Mar 18 23:49:12 PDT 2015


Nema, Ashutosh wrote:
> Hi,
> I’m trying to cast one of the SCEV node to “SCEVAddRecExpr”.
> Every time cast return NULL, and I’m unable to do this.
> SCEV Node:
> ((4 * (sext i32 {2,+,2}<%for.body4> to i64))<nsw> + %var)<nsw>
> Casting:
> const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(SCEVNode);
> ‘var’ is of type float pointer (float*).
> Without ‘sext’ it works, but I’m wondering why it not working in above case.
> I’m not sure, is such casting allowed ?

It looks like your node is a SCEVAddExpr whose LHS is "(4 * (sext i32 
{2,+,2}<%for.body4> to i64))<nsw>" and RHS is "%var", instead of a 
SCEVAddRecExpr. Perhaps if the sext weren't there SCEV might simplify 
the whole thing to a single SCEVAddRecExpr.

Can you cast your node to a SCEVAddExpr, then 
dyn_cast<SCEVAddRecExpr>(AddExpr->getOperand(0))?

Note that SCEV does not handle floats as anything but completely opaque 
values.

Nick




More information about the llvm-dev mailing list