GCC内部:哪里删除了伪引用?

GCC内部:哪里删除了伪引用?,gcc,internals,Gcc,Internals,表达式&ptr->fld不表示解引用,而是应将其视为(uint32_t)ptr+offsetof(ptr,fld)。我确信GCC会进行这种简化,但我找不到代码中的位置 上述内容在AST中以ADDR\u EXPR(COMPONENT\u REF(INDIRECT\u REF(ptr),fld))结尾,但在某些情况下,它应该经过检查并简化。在gcc树中查找了几乎所有的ADDR_EXPR、COMPONENT_REF和INDIRECT_REF之后,我很难找到它们的位置。有什么想法吗 请注意,我曾尝试从G

表达式
&ptr->fld
不表示解引用,而是应将其视为
(uint32_t)ptr+offsetof(ptr,fld)
。我确信GCC会进行这种简化,但我找不到代码中的位置

上述内容在AST中以
ADDR\u EXPR(COMPONENT\u REF(INDIRECT\u REF(ptr),fld))
结尾,但在某些情况下,它应该经过检查并简化。在gcc树中查找了几乎所有的ADDR_EXPR、COMPONENT_REF和INDIRECT_REF之后,我很难找到它们的位置。有什么想法吗


请注意,我曾尝试从GCC人员那里寻求帮助。总的来说,他们帮不了什么忙,但这里的人可能知道答案。如果这是一个糟糕的问题,我会理解它是否关闭。

因为您已经熟悉GCC的AST,找到答案的一种方法是使用
gcc-fdump tree all-fdump RTL all
生成所有树和RTL转储,然后对它们进行二元搜索,以定位进行转换的过程。

我想应该将其关闭为“过于本地化”,但我仍然认为这样做没有好处这是一个好建议,但目前还不清楚不同的转储是如何工作的,也不清楚如何比较它们。不管怎样,我还没有看到任何证据表明这种优化发生在前端或中间端,所以可能会推迟到代码生成。