RTL Expand pass - Difference in float and int datatypes

Ian Lance Taylor iant@google.com
Wed Feb 9 15:05:00 GMT 2011


Anitha Boyapati <anitha.boyapati@gmail.com> writes:

> int main() {
>         volatile int a, b;
>         if(a>b) return 1;
>         else return 2;
>
> }
>
> Expand  pass shows that "le"operator  is chosen.
>
> (jump_insn 9 8 10 3 gt_int.c:4 (set (pc)
>         (if_then_else (le:CC (cc0)
>                 (const_int 0 [0x0]))
>             (label_ref 14)
>             (pc))) -1 (nil))
>
>
> If I modify the same testcase to use 'float' datatype instead of
> 'int', "gt" operator is picked up.
>
> (jump_insn 9 8 34 3 gt.c:4 (set (pc)
>         (if_then_else (gt:CC (cc0)
>                 (const_int 0 [0x0]))
>             (label_ref 12)
>             (pc))) -1 (nil))
>
>
> I would like to know what prompts gcc to decide if "le" can be used in
> the expand pass rather than "gt" operator. Or more precisely why it
> differs incase of float.

The choice of LE when using int is just a happenstance of the way that
gcc generates code.  When gcc comes to RTL generation it happens to be
looking at an if statement that falls through on true and branches on
else.  So it flips the condition to branch on true (in
do_compare_rtx_and_jump).  The use of volatile doesn't affect this: it
will still only load the variables precisely as described in the
program.

The condition can not be flipped for float because that would be an
invalid transformation if one of the values is NaN.

Ian



More information about the Gcc mailing list