Messages in this thread | | | Date | Fri, 23 Sep 2005 10:00:27 -0400 | From | Tim Mattox <> | Subject | Re: [PATCH 2/3] netfilter : 3 patches to boost ip_tables performance |
| |
AFAIK, the usual reason gcc can generate better code when you write bool = complex conditional if (bool) ... is because of C's short-circuit conditional evaluation rules for || and &&. By moving the complex expression to an assignment statement, you are telling gcc that it is okay and safe to evaluate every part of the expression. If gcc was smart about being able to prove that all parts of the complex expression where safe (no possibly null pointer references) and had no side effects, then it could generate the same code with if (complex conditional) ...
However, there are many situations where even a magical compiler couldn't prove that there were no possible side effects, etc., and would have to generate multiple conditional branches to properly meet the short-circuit conditional evaluation rules for && and ||.
However, in the specific cases in this thread using FWINV without || and && operators, an optimizing compiler "should" be smart enough to generate more linear code for today's heavily pipelined CPUs. For now, I guess it's still the duty of the programmer to use coding style to force the compiler to generate more linear machine code.
On 9/23/05, Willy Tarreau <willy@w.ods.org> wrote: > On Thu, Sep 22, 2005 at 03:05:50PM +0200, Eric Dumazet wrote: > (...) > > It was necessary to get the best code with gcc-3.4.4 on i386 and > > gcc-4.0.1 on x86_64 > > > > For example : > > > > bool1 = FWINV(ret != 0, IPT_INV_VIA_OUT); > > if (bool1) { > > > > gives a better code than : > > > > if (FWINV(ret != 0, IPT_INV_VIA_OUT)) { > > > > (one less conditional branch) > > > > Dont ask me why, it is shocking but true :( > > I also noticed many times that gcc's optimization of "if (complex condition)" > is rather poor and it's often better to put it in a variable before. I even > remember that if you use an intermediate variable, it can often generate a > CMOV instruction on processors which support it, while it produces cond tests > and jumps without the variable. Generally speaking, if you want fast code, > you have to write it as a long sequence of small instructions, just as if > you were writing assembly. As you said, shocking but true. > > BTW, cheers for your optimizations ! > > Regards, > Willy > > - > To unsubscribe from this list: send the line "unsubscribe netdev" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html >
-- Tim Mattox - tmattox@gmail.com http://homepage.mac.com/tmattox/ I'm a bright... http://www.the-brights.net/ - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |