Hi Cameron, On 07/04/13 18:20, Cameron McInally wrote:> Hey Duncan, > > On Sun, Apr 7, 2013 at 11:22 AM, Duncan Sands <baldrick at free.fr > <mailto:baldrick at free.fr>> wrote: > ... > > can't front-ends implement this themselves using the "select" constant > expression? For example, rather than dividing by "x" you can divide by > "x == 0 ? 1 : x". > > > I'm not sure that I follow. I would like to see the division by zero execute and > trap at runtime. > > For example, x = 2/0. It looks like your suggestion would generate the > expression 2/1, which wouldn't trap as expected. > > Am I misinterpreting your suggestion?I didn't realize you wanted a trap, I just thought you wanted to avoid undefined behaviour. If you want a trap you are going to have to (IMO) output IR instructions rather than a constant expression. For example you can output the equivalent of if (x == 0) llvm.trap() // or maybe some special trap routine y = whatever/x ... use y ... rather than the constant expression "whatever/x". If the optimizers can prove that x is never zero then this will be sunk back into a constant expression (if "whatever" is a constant expression). Ciao, Duncan.> > Thanks, > Cameron > > P.S. Is it your intention to hide the simple constant expression from the > constant folder? I.e. (x == 0) ? 0 : x.
On Sun, Apr 7, 2013 at 1:23 PM, Duncan Sands <baldrick at free.fr> wrote: ...> If you want a trap you are going to have to (IMO) output IR > instructions rather than a constant expression. For example you can > output the > equivalent of > if (x == 0) > llvm.trap() // or maybe some special trap routine > y = whatever/x > ... use y ... > rather than the constant expression "whatever/x". If the optimizers can > prove > that x is never zero then this will be sunk back into a constant > expression (if > "whatever" is a constant expression). >Ah, that's super interesting. I'll have to give it some more thought. Thanks for this, Duncan. My knee-jerk reaction is that emulating hardware behaviour in software should be avoided. At least in this specific case. Thanks again, Cameron -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130407/d59f1117/attachment.html>
Hi Cameron, On 07/04/13 19:42, Cameron McInally wrote:> On Sun, Apr 7, 2013 at 1:23 PM, Duncan Sands <baldrick at free.fr > <mailto:baldrick at free.fr>> wrote: > ... > > If you want a trap you are going to have to (IMO) output IR > instructions rather than a constant expression. For example you can output the > equivalent of > if (x == 0) > llvm.trap() // or maybe some special trap routine > y = whatever/x > ... use y ... > rather than the constant expression "whatever/x". If the optimizers can prove > that x is never zero then this will be sunk back into a constant expression (if > "whatever" is a constant expression). > > > Ah, that's super interesting. I'll have to give it some more thought. Thanks for > this, Duncan. > > My knee-jerk reaction is that emulating hardware behaviour in software should be > avoided. At least in this specific case.I reckon it shouldn't be too hard to teach the code generators to turn this IR sequence into "y = target-divide whatever/x" on targets for which dividing by 0 traps in a satisfactory way, so it turns into something efficient. Ciao, Duncan.