static tree create_mem_ref_raw (tree type, tree alias_ptr_type, struct mem_address *addr) { if (!valid_mem_ref_p (TYPE_MODE (type), TYPE_ADDR_SPACE (type), addr)) return NULL_TREE; if (addr->step && integer_onep (addr->step)) addr->step = NULL_TREE; if (addr->offset && integer_zerop (addr->offset)) addr->offset = NULL_TREE; /* If possible use a plain MEM_REF instead of a TARGET_MEM_REF. */ if (alias_ptr_type && !addr->index && !addr->step && (!addr->base || POINTER_TYPE_P (TREE_TYPE (addr->base)))) { tree base, offset; gcc_assert (!addr->symbol ^ !addr->base); if (addr->symbol) base = build_fold_addr_expr (addr->symbol); else base = addr->base; if (addr->offset) offset = fold_convert (alias_ptr_type, addr->offset); else offset = build_int_cst (alias_ptr_type, 0); return fold_build2 (MEM_REF, type, base, offset); } return build6 (TARGET_MEM_REF, type, addr->symbol, addr->base, addr->index, addr->step, addr->offset, NULL); }
static tree create_mem_ref_raw (tree type, tree alias_ptr_type, struct mem_address *addr, bool verify) { tree base, index2; if (verify && !valid_mem_ref_p (TYPE_MODE (type), TYPE_ADDR_SPACE (type), addr)) return NULL_TREE; if (addr->step && integer_onep (addr->step)) addr->step = NULL_TREE; if (addr->offset) addr->offset = fold_convert (alias_ptr_type, addr->offset); else addr->offset = build_int_cst (alias_ptr_type, 0); if (addr->symbol) { base = addr->symbol; index2 = addr->base; } else if (addr->base && POINTER_TYPE_P (TREE_TYPE (addr->base))) { base = addr->base; index2 = NULL_TREE; } else { base = build_int_cst (ptr_type_node, 0); index2 = addr->base; } /* If possible use a plain MEM_REF instead of a TARGET_MEM_REF. ??? As IVOPTs does not follow restrictions to where the base pointer may point to create a MEM_REF only if we know that base is valid. */ if ((TREE_CODE (base) == ADDR_EXPR || TREE_CODE (base) == INTEGER_CST) && (!index2 || integer_zerop (index2)) && (!addr->index || integer_zerop (addr->index))) return fold_build2 (MEM_REF, type, base, addr->offset); return build5 (TARGET_MEM_REF, type, base, addr->offset, addr->index, addr->step, index2); }
static tree create_mem_ref_raw (tree type, tree alias_ptr_type, struct mem_address *addr, bool verify) { tree base, index2; if (verify && !valid_mem_ref_p (TYPE_MODE (type), TYPE_ADDR_SPACE (type), addr)) return NULL_TREE; if (addr->step && integer_onep (addr->step)) addr->step = NULL_TREE; if (addr->offset) addr->offset = fold_convert (alias_ptr_type, addr->offset); else addr->offset = build_int_cst (alias_ptr_type, 0); if (addr->symbol) { base = addr->symbol; index2 = addr->base; } else if (addr->base && POINTER_TYPE_P (TREE_TYPE (addr->base))) { base = addr->base; index2 = NULL_TREE; } else { base = build_int_cst (ptr_type_node, 0); index2 = addr->base; } /* If possible use a plain MEM_REF instead of a TARGET_MEM_REF. */ if (alias_ptr_type && (!index2 || integer_zerop (index2)) && (!addr->index || integer_zerop (addr->index))) return fold_build2 (MEM_REF, type, base, addr->offset); return build5 (TARGET_MEM_REF, type, base, addr->offset, addr->index, addr->step, index2); }