On 09/19/14 10:21, Uros Bizjak wrote:
+static tree
+ix86_make_bounds_constant (HOST_WIDE_INT lb, HOST_WIDE_INT ub)
+{
+ tree low = lb ? build_minus_one_cst (pointer_sized_int_node)
+ : build_zero_cst (pointer_sized_int_node);
+ tree high = ub ? build_zero_cst (pointer_sized_int_node)
+ : build_minus_one_cst (pointer_sized_int_node);
+
+ /* This function is supposed to be used to create zero and
+ none bounds only. */
+ gcc_assert (lb == 0 || lb == -1);
+ gcc_assert (ub == 0 || ub == -1);
+
+ return build_complex (NULL, low, high);
Needs a comment, even more so than normal given the restrictive nature
of the input values. One could bikeshed on using true/false vs 0/-1
since it appears that lb/ub are really boolean values.
+}
+
+static int
+ix86_initialize_bounds (tree var, tree lb, tree ub, tree *stmts)
+{
+ tree size_ptr = build_pointer_type (size_type_node);
+ tree lhs, modify, var_p;
+
+ ub = build1 (BIT_NOT_EXPR, size_type_node, ub);
+ var_p = build1 (CONVERT_EXPR, size_ptr,
+ build_fold_addr_expr (var));
+
+ lhs = build1 (INDIRECT_REF, size_type_node, var_p);
+ modify = build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, lb);
+ append_to_statement_list (modify, stmts);
+
+ lhs = build1 (INDIRECT_REF, size_type_node,
+ build2 (POINTER_PLUS_EXPR, size_ptr, var_p,
+ TYPE_SIZE_UNIT (size_type_node)));
+ modify = build2 (MODIFY_EXPR, TREE_TYPE (lhs), lhs, ub);
+ append_to_statement_list (modify, stmts);
+
+ return 2;
+}
Are we supposed to be emitting gimple or generic here? I don't think
this is valid gimple as we have a CONVERT_EXPR embedded in the
INDIRECT_REF's argument.
I think it's valid generic and does the obvious thing. I just Ilya to
make sure what we create does get gimplified.
jeff