[LLVMdev] Cast to SCEVAddRecExpr

Nick Lewycky nicholas at mxc.ca
Thu Mar 19 00:32:10 PDT 2015


Nema, Ashutosh wrote:
> Hi Nick,
>
> Thanks for looking into it.
>
> I have tried that as well but it didn't worked.
>
> "AddExpr->getOperand(0))" node is:
> " (4 * (sext i32 {2,+,2}<%for.body4>  to i64))<nsw>"
>
> When I cast this to "SCEVAddRecExpr" it returns NULL.

Oh. Yeah, that's because it's a multiply with a 4 on the left. On the 
right is an sext, and if you grab its operand, then *that* is a 
SCEVAddRecExpr.

>
> Regards,
> Ashutosh
>
> -----Original Message-----
> From: Nick Lewycky [mailto:nicholas at mxc.ca]
> Sent: Thursday, March 19, 2015 12:19 PM
> To: Nema, Ashutosh
> Cc: llvmdev at cs.uiuc.edu
> Subject: Re: [LLVMdev] Cast to SCEVAddRecExpr
>
> 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