glsl: Annotate as_foo functions that the this pointer cannot be NULL
authorIan Romanick <ian.d.romanick@intel.com>
Mon, 16 Mar 2015 19:14:10 +0000 (12:14 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Thu, 19 Mar 2015 22:35:42 +0000 (15:35 -0700)
commita44b95cd574ecab4a4c41c6380c82db6029ad114
tree2f9f42da2cf6774b46bb59353ec43213471fcac4
parentbf9d921936305e1514d4ce7a162c4f81eba3e9f5
glsl: Annotate as_foo functions that the this pointer cannot be NULL

We use the idiom

   ir_foo *x = y->as_foo();
   if (x == NULL)
      return;

all over the place.  GCC generates some quite lovely code for this.
One such example:

  340a5b:       83 7d 18 04             cmpl   $0x4,0x18(%rbp)
  340a5f:       0f 85 06 04 00 00       jne    340e6b
  340a65:       48 85 ed                test   %rbp,%rbp
  340a68:       0f 84 fd 03 00 00       je     340e6b

This case used as_expression() (ir_type_expression is 4).  Note that it
checks the ir_type, then checks that the pointer isn't NULL.  There is
some disconnect in GCC around the condition in the as_foo functions.

      return ir_type == ir_type_##TYPE ? (ir_##TYPE *) this : NULL; \

It believes "this" could be NULL, so it emits check outside the function
just for fun.

This patch uses assume() to tell GCC that it need not bother with extra
NULL checking of the pointer returned by the as_foo functions.

   text    data     bss     dec     hex filename
4836430  158688   26248 5021366  4c9eb6 i965_dri-before.so
4836173  158688   26248 5021109  4c9db5 i965_dri-after.so

v2: Replace 'if (this == NULL) unreachable("this cannot be NULL")' with
assume(this != NULL).  Suggested by Ilia Mirkin.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/glsl/ir.h