On Sun, Jul 10, 2011 at 2:04 PM, H.J. Lu <hjl.to...@gmail.com> wrote: > On Sun, Jul 10, 2011 at 9:36 AM, Paolo Bonzini <bonz...@gnu.org> wrote: >> On Sat, Jul 9, 2011 at 23:31, H.J. Lu <hjl.to...@gmail.com> wrote: >>> On Sat, Jul 9, 2011 at 2:18 PM, Paolo Bonzini <bonz...@gnu.org> wrote: >>>> On 07/05/2011 04:27 PM, H.J. Lu wrote: >>>>>> >>>>>> diff --git a/gcc/explow.c b/gcc/explow.c >>>>>> index 7387dad..b343bf8 100644 >>>>>> --- a/gcc/explow.c >>>>>> +++ b/gcc/explow.c >>>>>> @@ -383,18 +383,13 @@ convert_memory_address_addr_space (enum >>>>>> machine_mode to_mode ATTRIBUTE_UNUSED, >>>>>> >>>>>> case PLUS: >>>>>> case MULT: >>>>>> - /* For addition we can safely permute the conversion and addition >>>>>> - operation if one operand is a constant and converting the >>>>>> constant >>>>>> - does not change it or if one operand is a constant and we are >>>>>> - using a ptr_extend instruction (POINTERS_EXTEND_UNSIGNED< 0). >>>>>> - We can always safely permute them if we are making the address >>>>>> - narrower. */ >>>>>> + /* For addition we safely permute the conversion and addition >>>>>> + operation if one operand is a constant since we can't generate >>>>>> + new instructions. We can always safely permute them if we are >>>>>> + making the address narrower. */ >>>>>> if (GET_MODE_SIZE (to_mode)< GET_MODE_SIZE (from_mode) >>>>>> || (GET_CODE (x) == PLUS >>>>>> -&& CONST_INT_P (XEXP (x, 1)) >>>>>> -&& (XEXP (x, 1) == convert_memory_address_addr_space >>>>>> - (to_mode, XEXP (x, 1), as) >>>>>> - || POINTERS_EXTEND_UNSIGNED< 0))) >>>>>> +&& CONST_INT_P (XEXP (x, 1)))) >>>>>> return gen_rtx_fmt_ee (GET_CODE (x), to_mode, >>>>>> convert_memory_address_addr_space >>>>>> (to_mode, XEXP (x, 0), as), >>>> >>>> This does not seem safe to me. >>> >>> The current code is broken for x32. See: >>> >>> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47727 >>> >>> We can't generate any new instructions. Do you have any suggestions. >> >> By "safe" I mean that the new condition might be too wide and generate >> wrong code. Richard is definitely right in comment 6, generating new >> code in simplify-rtx is a no-no (see its usage of >> gen_lowpart_no_emit). > > Here is a different approach. I added convert_memory_address_addr_space_1 > and convert_modes_1 so that simplify-rtx won't generate new insns. OK > for trunk if there are no regressions on Linux/x86? > > Thanks. > > -- > H.J. > --- > 2011-07-10 H.J. Lu <hongjiu...@intel.com> > > * explow.c (convert_memory_address_addr_space_1): New. > (convert_memory_address_addr_space): Use it. > > * expr.c (convert_modes_1): New. > (convert_modes): Use it. > > * expr.h (convert_modes_1): New. > > * rtl.h (convert_memory_address_addr_space_1): New. > (convert_memory_address_1): Likewise. > > * simplify-rtx.c (simplify_unary_operation_1): Call > convert_memory_address_1 instead of convert_memory_address. >
It doesn't work. I got (gdb) f 2 #2 0x000000000078735a in convert_memory_address_addr_space_1 (to_mode=DImode, x=0x7ffff05ac4e0, as=0 '\000', no_emit=1 '\001') at /export/gnu/import/git/gcc-x32/gcc/explow.c:410 410 return convert_modes_1 (to_mode, from_mode, x, (gdb) call debug_rtx (x) (plus:SI (symbol_ref:SI ("iplane.1577") [flags 0x2] <var_decl 0x7ffff0857960 iplane>) (const_int -4 [0xfffffffffffffffc])) (gdb) bt #0 fancy_abort (file=0x13531a8 "/export/gnu/import/git/gcc-x32/gcc/expr.c", line=798, function=0x1354a00 "convert_modes_1") at /export/gnu/import/git/gcc-x32/gcc/diagnostic.c:893 #1 0x000000000079c60c in convert_modes_1 (mode=DImode, oldmode=SImode, x=0x7ffff05ac4e0, unsignedp=1, no_emit=1 '\001') at /export/gnu/import/git/gcc-x32/gcc/expr.c:798 #2 0x000000000078735a in convert_memory_address_addr_space_1 (to_mode=DImode, x=0x7ffff05ac4e0, as=0 '\000', no_emit=1 '\001') at /export/gnu/import/git/gcc-x32/gcc/explow.c:410 #3 0x0000000000787281 in convert_memory_address_addr_space_1 (to_mode=DImode, x=0x7ffff05616d0, as=0 '\000', no_emit=1 '\001') at /export/gnu/import/git/gcc-x32/gcc/explow.c:381 #4 0x0000000000b0faf4 in simplify_unary_operation_1 (code=ZERO_EXTEND, mode=DImode, op=0x7ffff05616d0) at /export/gnu/import/git/gcc-x32/gcc/simplify-rtx.c:1246 #5 0x0000000000b0d851 in simplify_unary_operation (code=ZERO_EXTEND, mode=DImode, op=0x7ffff05616d0, op_mode=SImode) at /export/gnu/import/git/gcc-x32/gcc/simplify-rtx.c:582 #6 0x0000000000b0d035 in simplify_gen_unary (code=ZERO_EXTEND, mode=DImode, op=0x7ffff05616d0, op_mode=SImode) at /export/gnu/import/git/gcc-x32/gcc/simplify-rtx.c:370 #7 0x000000000117078a in if_then_else_cond (x=0x7ffff02ebb00, ptrue=0x7fffffffd720, pfalse=0x7fffffffd718) ---Type <return> to continue, or q <return> to quit--- at /export/gnu/import/git/gcc-x32/gcc/combine.c:8649 #8 0x00000000011675b5 in combine_simplify_rtx (x=0x7ffff02ebb00, op0_mode=SImode, in_dest=0, in_cond=0) at /export/gnu/import/git/gcc-x32/gcc/combine.c:5316 #9 0x0000000001167315 in subst (x=0x7ffff02ebb00, from=0x7ffff02f8120, to=0x7ffff05ac4f8, in_dest=0, in_cond=0, unique_copy=0) at /export/gnu/import/git/gcc-x32/gcc/combine.c:5253 #10 0x0000000001167104 in subst (x=0x7ffff02f5558, from=0x7ffff02f8120, to=0x7ffff05ac4f8, in_dest=0, in_cond=0, unique_copy=0) at /export/gnu/import/git/gcc-x32/gcc/combine.c:5189 #11 0x00000000011611ae in try_combine (i3=0x7ffff02f4c60, i2=0x7ffff02f4c18, i1=0x0, i0=0x0, new_direct_jump_p=0x7fffffffde14, last_combined_insn=0x7ffff02f4c60) at /export/gnu/import/git/gcc-x32/gcc/combine.c:3178 #12 0x000000000115c487 in combine_instructions (f=0x7ffff07e7700, nregs=3344) at /export/gnu/import/git/gcc-x32/gcc/combine.c:1223 #13 0x000000000117c64e in rest_of_handle_combine () at /export/gnu/import/git/gcc-x32/gcc/combine.c:13879 #14 0x0000000000a500e7 in execute_one_pass (pass=0x190d320) at /export/gnu/import/git/gcc-x32/gcc/passes.c:2062 #15 0x0000000000a502cd in execute_pass_list (pass=0x190d320) at /export/gnu/import/git/gcc-x32/gcc/passes.c:2117 #16 0x0000000000a502ee in execute_pass_list (pass=0x1908180) ---Type <return> to continue, or q <return> to quit--- at /export/gnu/import/git/gcc-x32/gcc/passes.c:2118 #17 0x0000000000be93e0 in tree_rest_of_compilation (fndecl=0x7ffff074c200) at /export/gnu/import/git/gcc-x32/gcc/tree-optimize.c:416 #18 0x00000000006d3ff7 in cgraph_expand_function (node=0x7ffff0792000) at /export/gnu/import/git/gcc-x32/gcc/cgraphunit.c:1804 #19 0x00000000006d41b6 in cgraph_expand_all_functions () at /export/gnu/import/git/gcc-x32/gcc/cgraphunit.c:1863 #20 0x00000000006d48b2 in cgraph_optimize () at /export/gnu/import/git/gcc-x32/gcc/cgraphunit.c:2133 #21 0x00000000006d1b2a in cgraph_finalize_compilation_unit () at /export/gnu/import/git/gcc-x32/gcc/cgraphunit.c:1304 #22 0x00000000009cb7b0 in write_global_declarations () at /export/gnu/import/git/gcc-x32/gcc/langhooks.c:303 #23 0x0000000000559cac in gfc_write_global_declarations () at /export/gnu/import/git/gcc-x32/gcc/fortran/f95-lang.c:322 #24 0x0000000000b4649c in compile_file () at /export/gnu/import/git/gcc-x32/gcc/toplev.c:564 #25 0x0000000000b48686 in do_compile () at /export/gnu/import/git/gcc-x32/gcc/toplev.c:1886 #26 0x0000000000b487ec in toplev_main (argc=19, argv=0x7fffffffe2a8) at /export/gnu/import/git/gcc-x32/gcc/toplev.c:1958 #27 0x000000000060be84 in main (argc=19, argv=0x7fffffffe2a8) at /export/gnu/import/git/gcc-x32/gcc/main.c:36 (gdb) H.J.