/* PR tree-optimization/94920 */
/* { dg-do compile } */
/* { dg-options "-O2 -Wno-psabi -fdump-tree-optimized" } */

typedef int __attribute__((vector_size(4*sizeof(int)))) vint;

/* Same form as PR.  */
__attribute__((noipa)) unsigned int foo(int x) {
    return (x >= 0 ? x : 0) + (x <= 0 ? -x : 0);
}

/* Test for forward propogation.  */
__attribute__((noipa)) unsigned int corge(int x) {
    int w = (x >= 0 ? x : 0);
    int y = -x;
    int z = (y >= 0 ? y : 0);
    return w + z;
}

/* Vector case.  */
__attribute__((noipa)) vint thud(vint x) {
    vint t = (x >= 0 ? x : 0) ;
    vint xx = -x;
    vint t1 =  (xx >= 0 ? xx : 0);
    return t + t1;
}

/* Signed function.  */
__attribute__((noipa)) int bar(int x) {
    return (x >= 0 ? x : 0) + (x <= 0 ? -x : 0);
}

/* Commutative property.  */
__attribute__((noipa)) unsigned int baz(int x) {
    return (x <= 0 ? -x : 0) + (x >= 0 ? x : 0);
}

/* Flipped order for max expressions.  */
__attribute__((noipa)) unsigned int quux(int x) {
    return (0 <= x ? x : 0) + (0 >= x ? -x : 0);
}

/* Not zero so should not optimize.  */
__attribute__((noipa)) unsigned int waldo(int x) {
    return (x >= 4 ? x : 4) + (x <= 4 ? -x : 4);
}

/* Not zero so should not optimize.  */
__attribute__((noipa)) unsigned int fred(int x) {
    return (x >= -4 ? x : -4) + (x <= -4 ? -x : -4);
}

/* Incorrect pattern.  */
__attribute__((noipa)) unsigned int goo(int x) {
    return (x <= 0 ? x : 0) + (x >= 0 ? -x : 0);
}

/* Incorrect pattern.  */
__attribute__((noipa)) int qux(int x) {
    return (x >= 0 ? x : 0) + (x >= 0 ? x : 0);
}

/* { dg-final {scan-tree-dump-times " ABS_EXPR " 6 "optimized" } } */
