if (gimplify_expr (&a, pre_p, post_p, is_gimple_val, fb_rvalue)
== GS_ERROR)
return GS_ERROR;
+ tree b = CALL_EXPR_ARG (*expr_p, 1);
+ if (gimplify_expr (&b, pre_p, post_p, is_gimple_val, fb_rvalue)
+ == GS_ERROR)
+ return GS_ERROR;
tree c = build_call_expr_loc (EXPR_LOCATION (*expr_p),
fndecl, 1, a);
*expr_p = build3_loc (EXPR_LOCATION (*expr_p), COND_EXPR,
build2_loc (EXPR_LOCATION (*expr_p),
NE_EXPR, boolean_type_node, a,
build_zero_cst (TREE_TYPE (a))),
- c, CALL_EXPR_ARG (*expr_p, 1));
+ c, b);
return GS_OK;
}
break;
--- /dev/null
+/* PR c/122188 */
+/* { dg-do run } */
+
+int
+foo (unsigned x, int y)
+{
+ unsigned a = x;
+ int b = y;
+ int ret = __builtin_ctzg (x++, y++);
+ if (x != a + 1 || y != b + 1)
+ __builtin_abort ();
+ return ret;
+}
+
+int
+bar (unsigned x, int y)
+{
+ unsigned a = x;
+ int b = y;
+ int ret = __builtin_clzg (x++, y++);
+ if (x != a + 1 || y != b + 1)
+ __builtin_abort ();
+ return ret;
+}
+
+int
+main ()
+{
+ if (foo (0, 42) != 42 || foo (1, 5) != 0 || foo (4, 17) != 2)
+ __builtin_abort ();
+ if (bar (0, 42) != 42 || bar (~0U, 5) != 0 || bar (~0U >> 4, 17) != 4)
+ __builtin_abort ();
+}