[LLVMdev] Cast to SCEVAddRecExpr

Nema, Ashutosh Ashutosh.Nema at amd.com
Thu Mar 19 00:08:13 PDT 2015


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.

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