C++ g++;使用优化标志时,内联asm未按预期工作

C++ g++;使用优化标志时,内联asm未按预期工作,c++,g++,compiler-optimization,inline-assembly,C++,G++,Compiler Optimization,Inline Assembly,我写了一个关于3x+1问题的简单程序,打算说明跳转指令和条件转移指令之间的区别 使用标志-O0编译代码时,代码运行良好。然而,当我使用-O1或-O2标记编译它时,代码似乎陷入了一个“无限循环” 你有什么想法来纠正我的代码使它工作吗?thx g++版本 $ g++ --version g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 编译命令 g++ -std=c++0x -O1 -Wall -g -o "foo" "foo.cc" 这是我的密码 #includ

我写了一个关于
3x+1
问题的简单程序,打算说明跳转指令和条件转移指令之间的区别

使用标志
-O0
编译代码时,代码运行良好。然而,当我使用
-O1
-O2
标记编译它时,代码似乎陷入了一个“无限循环”

你有什么想法来纠正我的代码使它工作吗?thx

g++版本

$ g++ --version
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
编译命令

g++ -std=c++0x -O1 -Wall -g -o "foo" "foo.cc"
这是我的密码

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <ctime>

using namespace std;

#define print(x) cout << x << endl
#define input(x) cin >> x
#define ENTER "\n\t"

#if defined(__i386__)
static __inline__ unsigned long long rdtsc(void)
{
    unsigned long long int x;
    __asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
    return x;
}
#elif defined(__x86_64__)
static __inline__ unsigned long long rdtsc(void)
{
    unsigned hi, lo;
    __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
    return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
}
#endif

const int SIZE = 100000;

int nums[SIZE];

void down_to_one(int v)
{
    if (v == 1) {
        return;
    } else if (v % 2 == 0) {
        down_to_one(v >> 1);
    } else {
        down_to_one(3 * v + 1);
    }
}

void down_to_one_asm(int v)
{
    if (v == 1) {
        return;
    }
    __asm__ __volatile__(
        "movl %0, %%eax" ENTER
        "sarl %%eax"     ENTER
        "leal 1(%0, %0, 2), %%ebx" ENTER
        "testl $1, %0" ENTER
        "cmovel  %%eax, %0" ENTER
        "cmovnel %%ebx, %0" ENTER
        :"=c"(v)
        :"c"(v)
    );
    down_to_one_asm(v);
}

int main()
{
    unsigned long long start, end;

    start = rdtsc();
    for (int i = 1; i <= SIZE; i++) {
        down_to_one(i);
    }
    end = rdtsc();
    print(end - start);

    ////
    __asm__ ("":::"memory");
    ////

    start = rdtsc();
    for (int i = 1; i <= SIZE; i++) {
        down_to_one_asm(i);
    }
    end = rdtsc();
    print(end - start);

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
#定义打印(x)cout x
#定义并输入“\n\t”
#如果已定义(\uuuui386\uuuuuuuu)
静态uuu内联uuu无符号长-长rdtsc(无效)
{
无符号长整型x;
__asm_uuuuuuuvolatile(.字节0x0f,0x31):“=A”(x));
返回x;
}
#已定义的elif(_x86_64__)
静态uuu内联uuu无符号长-长rdtsc(无效)
{
未签名的hi,lo;
__asm_uuuuuuvolatile_uuuuuu(“rdtsc”):“=a”(lo),“=d”(hi));
返回((无符号长-长)低)|((无符号长-长)高)1);
}否则{
向下至一(3*v+1);
}
}
无效向下至一个组件(int v)
{
如果(v==1){
返回;
}
__asm\uuuuuuuuuuuuuuuuuu挥发性__(
“移动%0,%%eax”输入
“sarl%%eax”输入
“leal 1(%0,%0,2),%%ebx”输入
“testl$1,%0”输入
“cmovel%%eax,%0”输入
“cmovnel%%ebx,%0”输入
:“=c”(五)
:“c”(五)
);
下至下一个组件(v);
}
int main()
{
无符号长-长开始、结束;
start=rdtsc();

对于(int i=1;i您没有指定无限循环发生的位置。问题的一个潜在来源是
down\u to\u One\u asm
函数。您还需要指定已关闭的寄存器,例如

:“=c”(v):“c”(v):%eax”,“%ebx”


您可能会侥幸逃脱
“-O0”
,但更高级别可能正在优化调用堆栈/帧设置,
“-O2”
正在(IIRC)实现尾部调用优化。

非常感谢。我忘了声明“clobbered register”。再次感谢。)