/* { dg-do compile } */ /* { dg-options "-O2 -fdump-tree-dom2-details -w --param logical-op-non-short-circuit=1" } */ /* { dg-additional-options "-fdisable-tree-thread1 -fdisable-tree-ethread -fdisable-tree-threadfull1" } */ enum optab_methods { OPTAB_DIRECT, OPTAB_LIB, OPTAB_WIDEN, OPTAB_LIB_WIDEN, OPTAB_MUST_WIDEN }; struct optab_d { }; typedef struct optab_d *optab; void expand_binop (optab, int, enum optab_methods); void expand_shift_1 (int code, int unsignedp, int rotate, optab lshift_optab, optab rshift_arith_optab) { int left = (code == 42 || code == 0xde); int attempt; enum optab_methods methods; if (attempt == 0) methods = OPTAB_DIRECT; else if (attempt == 1) methods = OPTAB_WIDEN; if ((!unsignedp || (!left && methods == OPTAB_WIDEN))) { enum optab_methods methods1 = methods; if (unsignedp) methods1 = OPTAB_MUST_WIDEN; expand_binop (left ? lshift_optab : rshift_arith_optab, unsignedp, methods1); } } /* When UNSIGNEDP is true, LEFT is false and METHOD == OPTAB_WIDEN we will enter the TRUE arm of the conditional and we can thread the test to compute the first first argument of the expand_binop call if we look backwards through the boolean logicals. */ /* { dg-final { scan-tree-dump-times "Threaded" 2 "dom2"} } */