globalreg-1.c

来自「用于进行gcc测试」· C语言 代码 · 共 55 行

C
55
字号
/* { dg-do run { target sparc*-*-* } } *//* { dg-options "-std=gnu99 -Os" } *//* This is a massively distilled test case based upon   mm/memory.c:unmap_vmas() in the Linux kernel when compiled   on sparc64 for SMP which uses a global register as the   base of the per-cpu variable area.   Because of a bug in global register handling in the dataflow   code, the loop-invariant pass would move 'expression(regval)'   outside of the loop.  */extern void exit(int);extern void abort(void);register unsigned long regval __asm__("g6");extern void cond_resched(void);unsigned int var;static unsigned long expression(unsigned long v){  unsigned long ret;  __asm__("" : "=r" (ret) : "0" (0));  return ret + v;}void func(unsigned long *pp){  int i;  for (i = 0; i < 56; i++) {    cond_resched();    *pp = expression(regval);  }}void __attribute__((noinline)) cond_resched(void){	regval++;}int main(void){  unsigned long val;  regval = 100;  func(&val);  if (val != 156)    abort();  exit(0);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?