[Bug c/84240] Error in extract_constrain_insn, at recog.c:2246

xvl5190 at psu dot edu gcc-bugzilla@gcc.gnu.org
Wed Feb 7 15:34:00 GMT 2018


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84240

--- Comment #2 from xvl5190 at psu dot edu ---
Please try this example with optimization level -O1/-O2/-O3:

/* Executable testcase for 'output flags.' */
/* { dg-do rund *nbum; } */
char TestC() {
  char r;
  __asm__("stc": "=@ccc" (r));
  if (r) {
    __asm__("clc": "=@ccnc" (r));
    if (r) return 1;
  }
  return 0;
}
char TestE() {
  char r; /* 1 equals 1. */
  __asm__("cmp $1, %1": "=@cce" (r): "r" (1));
  if (r) { /* 1 not equals 2. */
    __asm__("cmp $2, %1": "=@ccne" (r): "r" (1));
    if (r) return 1;
  }
  return 0;
}
char TestZ() {
  char r; /* 1 equals 1. */
  __asm__("cmp $1, %1": "=@ccz" (r): "r" (1));
  if (r) { /* 1 not equals 2. */
    __asm__("cmp $2, %1": "=@ccnz" (r): "r" (1));
    if (r) return 1;
  }
  return 0;
}
char TestA() {
  char r; /* 1 a 0. */
  __asm__("cmp $0, %1": "=@cca" (r): "r" (1));
  if (r) { /* 1 na 2. */
    __asm__("cmp $2, %1": "=@ccna" (r): "r" (1));
    if (r) { /* 1 na 1. */
      __asm__("cmp $1, %1": "=@ccna" (r): "r" (1));
      if (r) return 1;
    }
  }
  return 0;
}
char TestAE() {
  char r; /* 1 ae 0. */
  __asm__("cmp $0, %1": "=@ccae" (r): "r" (1));
  if (r) { /* 1 nae 2. */
    __asm__("cmp $2, %1": "=@ccnae" (r): "r" (1));
    if (r) { /* 1 ae 1. */
      __asm__("cmp $1, %1": "=@ccae" (r): "r" (1));
      if (r) return 1;
    }
  }
  return 0;
}
char TestB() {
  char r; /* 1 b 2. */
  __asm__("cmp $2, %1": "=@ccb" (r): "r" (1));
  if (r) { /* 1 nb 0. */
    __asm__("cmp $0, %1": "=@ccnb" (r): "r" (1));
    if (r) { /* 1 nb 1. */
      __asm__("cmp $1, %1": "=@ccnb" (r): "r" (1));
      if (r) return 1;
    }
  }
  return 0;
}
char TestBE() {
  char r; /* 1 be 2. */
  __asm__("cmp $2, %1": "=@ccbe" (r): "r" (1));
  if (r) { /* 1 nbe 0. */
    __asm__("cmp $0, %1": "=@ccnbe" (r): "r" (1));
    if (r) { /* 1 be 1. */
      __asm__("cmp $1, %1": "=@ccbe" (r): "r" (1));
      if (r) return 1;
    }
  }
  return 0;
}
char TestG() {
  char r; /* 1 g 0. */
  __asm__("cmp $0, %1": "=@ccg" (r): "r" (1));
  if (r) { /* 1 ng 2. */
    __asm__("cmp $2, %1": "=@ccng" (r): "r" (1));
    if (r) { /* 1 ng 1. */
      __asm__("cmp $1, %1": "=@ccng" (r): "r" (1));
      if (r) return 1;
    }
  }
  return 0;
}
char TestGE() {
  char r; /* 1 ge 0. */
  __asm__("cmp $0, %1": "=@ccge" (r): "r" (1));
  if (r) { /* 1 nge 2. */
    __asm__("cmp $2, %1": "=@ccnge" (r): "r" (1));
    if (r) { /* 1 ge 1. */
      __asm__("cmp $1, %1": "=@ccge" (r): "r" (1));
      if (r) return 1;
    }
  }
  return 0;
}
char TestL() {
  char r; /* 1 l 2. */
  __asm__("cmp $2, %1": "=@ccl" (r): "r" (1));
  if (r) { /* 1 nl 0. */
    __asm__("cmp $0, %1": "=@ccnl" (r): "r" (1));
    if (r) { /* 1 nl 1. */
      __asm__("cmp $1, %1": "=@ccnl" (r): "r" (1));
      if (r) return 1;
    }
  }
  return 0;
}
char TestLE() {
  char r; /* 1 le 2. */
  __asm__("cmp $2, %1": "=@ccle" (r): "r" (1));
  if (r) { /* 1 nle 0. */
    __asm__("cmp $0, %1": "=@ccnle" (r): "r" (1));
    if (r) { /* 1 le 1. */
      __asm__("cmp $1, %1": "=@ccle" (r): "r" (1));
      if (r) return 1;
    }
  }
  return 0;
}
char TestO() {
  char r;
  unsigned char res = 128; /* overflow. */
  __asm__("addb $128, %1": "=@cco" (r), "+r" (res));
  if (r) { /* not overflow. */
    __asm__("addb $1, %1": "=@ccno" (r), "+r" (res));
    if (r) return 1;
  }
  return 0;
}
char TestP() {
  char r, res = 1;
  /* even 
# bits. */
  __asm__("addb $2, %1": "=@ccp" (r), "+r" (res));
  if (r) {
    /* odd 
# bits. */
    __asm__("addb $1, %1": "=@ccnp" (r), "+r" (res));
    if (r) return 1;
  }
  return 0;
}
char TestS() {
  char r, res = 1; /* sign bit set. */
  __asm__("addb $128, %1": "=@ccs" (r), "+r" (res));
  if (r) { /* sign bit not set. */
    __asm__("subb $128, %1": "=@ccns" (r), "+r" (res));
    if (r) return 1;
  }
  return 0;
} /* dg-do treats exit code of 0 as success. */
int main() {
  if (TestC() && TestE() && TestZ() && TestA() && TestAE() && TestB() &&
TestBE() && TestG() && TestGE() && TestL() && TestLE() && TestO() && TestP() &&
TestS()) return 0;
  __builtin_abort();
}


More information about the Gcc-bugs mailing list