On Tuesday, 17 December 2013 at 00:53:07 UTC, Walter Bright wrote:
It definitely is a good idea for the compiler to recognize:

   if (s == "foo" || s == "bar" || s == "baz")

and generate special code for it.

I guess that would work in this case if among() is inlined since
the integer is then used as a boolean and can be reduced to the
same value (true). If it isn't inlined you would deal with (pseudo):

r=0;
if(s=="foo"){ r=1; goto e;}
if(s=="bar"){ r=2; goto e;}
if(s=="baz"){ r=3; goto e;}
e:
return r

So it would be more general to optimize conditionals that test
the same (unchanged) variable into a switch() and then if
possible reduce that to a table lookup if each basic block in the
switch sets the same variables to a constant value…

I guess a fast bool variation could be something like (pseudo):

// skip the length test if s[2] on an empty string doesn't core-dump.
if(s.length<3) return false;
return lut[ (s[2]-'o') & MASK] == s;


(the NNTP server or the web-interface seemed to be dead for 12 hours?)

Reply via email to