/* PR tree-optimization/110726 */

#define DECLS(n, VOL)			\
__attribute__((noinline,noclone))	\
int h##n(VOL int A, VOL int B){		\
    return (A | B) & (A == B);		\
}					\
__attribute__((noinline,noclone))	\
int i##n(VOL int A, VOL int B){		\
    return A | (A == B);		\
}					\
__attribute__((noinline,noclone))	\
int k##n(VOL int A, VOL int B){		\
    return (A & B) | (A == B);		\
}

DECLS(0, )
DECLS(1, volatile)

int values[] = {0, 1, 2, 3, -1, -2, -3, 0x10080};
int numvalues = sizeof(values) / sizeof(values[0]);

int main() {
    for (int A = 0; A < numvalues; A++)
        for (int B = 0; B < numvalues; B++) {
            int a = values[A];
            int b = values[B];
            if (h0(a, b) != h1(a, b)) __builtin_abort();
            if (i0(a, b) != i1(a, b)) __builtin_abort();
            if (k0(a, b) != k1(a, b)) __builtin_abort();
        }
}
