<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Apr 20, 2009, at 1:13 PM, Greg McGary wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"> <div bgcolor="#ffffff" text="#000000"> <font size="+1">My target has only logical shifts and lacks an arithmetic right shift instruction.<br> I have a custom LowerSRA function that rewrites SRA as SHL + SIGN_EXTEND<br> when the shift width is either constant 16 or 24.  Unfortunately, I observe that a<br> later pass combines the SHL + SIGN_EXTEND back into SRA so we crash.<br> <br> The idea I had for defeating this behavior is lower to a target-specific<br> version of SHL and/or SIGN_EXTEND, rather than using the generic ISD::SHL<br> and/or ISD::SIGN_EXTEND.  Is that the recommended way to do it?<br></font></div></blockquote></div><br><div>Hi Greg,</div><div><br></div><div>It would be better to teach dag combine and legalize that SRA can be illegal.  Everything that creates SRA (after legalize) should check to make sure it is legal before doing so.  Also, it would be nice to put the logic to legalize SRA -> SHL + SEXT_IN_REG into legalize itself.  It is conceivable that other targets will have illegal SRAs.</div><div><br></div><div>-Chris</div></body></html>