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
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 >
Yes, I can get "SCEVAddRecExpr" from operands of "(sext i32 {2,+,2}<%for.body4> to i64)". So whenever SCEV cast to "SCEVAddRecExpr" fails, we have drill down for such patterns ? Is that the right way ? Regards, Ashutosh -----Original Message----- From: Nick Lewycky [mailto:nicholas at mxc.ca] Sent: Thursday, March 19, 2015 1:02 PM To: Nema, Ashutosh Cc: llvmdev at cs.uiuc.edu Subject: Re: [LLVMdev] Cast to SCEVAddRecExpr 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 >