/* PR target/67089 */ /* { dg-do run } */ /* { dg-options "-O2 -ftree-loop-if-convert" } */ extern void abort (void); int cnt; unsigned int a[16], b[16], c[16]; __attribute__((noinline, noclone)) void foo (int x) { asm volatile ("" : : "g" (x) : "memory"); cnt++; } __attribute__((noinline, noclone)) void f0 (unsigned int x) { for (int i = 0; i < 16; i++) { unsigned int r = x - a[i]; b[i] = r; c[i] = r > x ? 7 : x; } } #define T(n, type, op, cond) \ __attribute__((noinline, noclone)) \ type \ f##n (type x) \ { \ type r = op; \ cond; \ return r; \ } T (1, unsigned int, x - 2U, if (r > x) foo (0)) T (2, unsigned long, x - 2U, if (r <= x) foo (0)) T (3, unsigned short, 2U - x, if (r > 2U) foo (0)) T (4, unsigned char, 2U - x, if (r <= 2U) foo (0)) T (5, unsigned int, x + -2U, if (r > x) foo (0)) T (6, unsigned long, x + -2UL, if (r <= x) foo (0)) T (7, unsigned short, (unsigned short) -2 + x, if (r > (unsigned short) -2) foo (0)) T (8, unsigned char, (unsigned char) -2 + x, if (r <= (unsigned char) -2) foo (0)) int main () { int i; for (i = 0; i < 16; i++) a[i] = i - 7; f0 (5); for (i = 0; i < 16; i++) if (b[i] != 12U - i || c[i] != 7 - 2 * (i >= 7 && i < 13)) abort (); if (f1 (3) != 1 || cnt != 0) abort (); if (f1 (2) != 0 || cnt != 0) abort (); if (f1 (1) != -1U || cnt != 1) abort (); if (f2 (3) != 1 || cnt != 2) abort (); if (f2 (2) != 0 || cnt != 3) abort (); if (f2 (1) != -1UL || cnt != 3) abort (); if (f3 (3) != (unsigned short) -1 || cnt != 4) abort (); if (f3 (2) != 0 || cnt != 4) abort (); if (f3 (1) != 1 || cnt != 4) abort (); if (f4 (3) != (unsigned char) -1 || cnt != 4) abort (); if (f4 (2) != 0 || cnt != 5) abort (); if (f4 (1) != 1 || cnt != 6) abort (); if (f5 (3) != 1 || cnt != 6) abort (); if (f5 (2) != 0 || cnt != 6) abort (); if (f5 (1) != -1U || cnt != 7) abort (); if (f6 (3) != 1 || cnt != 8) abort (); if (f6 (2) != 0 || cnt != 9) abort (); if (f6 (1) != -1UL || cnt != 9) abort (); if (f7 (3) != 1 || cnt != 9) abort (); if (f7 (2) != 0 || cnt != 9) abort (); if (f7 (1) != (unsigned short) -1 || cnt != 10) abort (); if (f8 (3) != 1 || cnt != 11) abort (); if (f8 (2) != 0 || cnt != 12) abort (); if (f8 (1) != (unsigned char) -1 || cnt != 12) abort (); return 0; }