GCC如何进出GIMPLE中间表示

GIMPLE中间表示,是GCC中机器无关的中间表示,机器无关的优化基本都在这个层次上做。
本文先来看看GCC是如何进、出GIMPLE中间表示的。

1 从 GENERIC 到GIMPLE

GENERIC是GCC最顶层的语言无关中间表示。
GCC 利用 “gimplifier” 将 GENERIC 中间表示转换为 GIMPLE中间表示。
因为GENERIC 是语法树形式的,所以这个转换过程是递归的。

对于一个函数,GENERIC中间表示将其存储在FUNCTION_DECL树节点中的DECL_SAVED_TREE域中。
然后通过调用函数gimplify_function_tree将其转换为GIMPLE.
具体的转换过程一般是 gimplify.c: gimplify_function_tree -> gimplify_body -> gimplify_stmt -> gimplify_expr .

GIMPLE中有一个lower的动作,用于将高层次的GIMPLE表示,解析成低层次的,这个lower动作在pass_lower_cf中完成。
比如,嵌套的作用域和表达式。 可以使用选项 -fdump-tree-gimple得到类C的GIMPLE表达形式

如下面程序:

int main()
{
  int a;
  if (a)
    {
      int b;
      b = 2 + a + b;
    }
  return 0;
}

使用该选项得到的转换成C语言形式的GIMPLE中间表示为:

main ()
{
  int D.1593;
  int D.1594;
  int a;

  if (a != 0) goto <D.1591>; else goto <D.1592>;
  <D.1591>:
  {
    int b;

    D.1593 = a + 2;
    b = D.1593 + b;
  }
  <D.1592>:
  D.1594 = 0;
  return D.1594;
}

2 从 GIMPLE 到 RTL

做完机器无关优化之后,GCC会将GIMPLE转换为RTL中间表示。
在RTL上,基本都是机器相关的优化,以及寄存器分配,指令调度等功能。
从GIMPLE到RTL中间表示,则是在expr.c:expand_expr_real中,

posted @ 2012-07-18 10:50  springbarley  阅读(2893)  评论(0)    收藏  举报