什么是特定的GCC标志,它为内联汇编参数打开立即值传播?

gby*_*gby 4 c gcc inline-assembly compiler-optimization compiler-options

请考虑以下x86代码示例:

#include <stdlib.h>

static int i;

static inline __attribute__((always_inline)) test(int x)
{
    asm volatile("mov %1, %0" : "=r"(i): "i"(x));
}

int main(void)
{
    test(5);

    return i;
}
Run Code Online (Sandbox Code Playgroud)

如果我用它构建它:

gcc -O test.c
Run Code Online (Sandbox Code Playgroud)

它建立得很好.

如果我用它构建它(没有优化):

gcc test.c
Run Code Online (Sandbox Code Playgroud)

它在组装阶段失败,因为该值'5'不会作为直接值传播到内联函数测试,因此我们使约束失败.

我希望能够在不启用其他非相关优化的情况下编译此代码,以便更轻松地进行调试.

从理论上讲,-O它只是一个捷径,可以在GCC手册中记录一系列GCC优化选项.不幸的是,我无法找到打开此行为的特定GCC标志.

有任何想法吗?

澄清:为了减轻任何疑问,代码片段只是一个例子.除了展示我想要做的事情之外,它本身并没有多大意义.实际的用例涉及一个自定义处理器上的指令,该指令只能立即作为我试图在C结构中包装的参数.一个宏确实可以做到这一点,但是遭受了宏的所有通常的缺点,因此我试图避免它.

更新:对于那些想知道的人,一个宏也不会工作.似乎内联函数根本不起作用.例如,这也不起作用:

void foo (void)
{
  int i = 6;

  asm volatile ("" : : "i" (i));
}
Run Code Online (Sandbox Code Playgroud)

我还修正了问题标题以反映这一点.

Mic*_*urr 6

看起来像 -ftree-ter (替换SSA中的临时表达式 - >正常传递 - 无论是什么)可以解决问题:

gcc -ftree-ter test.c   # no errors
Run Code Online (Sandbox Code Playgroud)

以下是我如何确定:

  1. gcc -Q --help=optimizers 告诉您默认启用/禁用哪些优化(一些已启用)
  2. gcc -O -Q --help=optimizers 告诉您启用/禁用哪些优化 -O
  3. 将这些命令的输出重定向到文件并进行区分.
  4. 尝试仅在-O指定的情况下启用的优化,直到一个工作.