2010-08-26 Paul Brook Merge from Sourcery G++ 4.3/4.4: 2007-03-30 Paul Brook gcc/ * calls.c (store_one_arg): Check alignment of mode used for save. 2010-08-26 Maciej Rozycki Merge from Sourcery G++ 4.4: === modified file 'gcc/calls.c' --- old/gcc/calls.c 2010-08-13 10:50:45 +0000 +++ new/gcc/calls.c 2010-08-26 15:44:20 +0000 @@ -4048,8 +4048,17 @@ /* We need to make a save area. */ unsigned int size = arg->locate.size.constant * BITS_PER_UNIT; enum machine_mode save_mode = mode_for_size (size, MODE_INT, 1); - rtx adr = memory_address (save_mode, XEXP (arg->stack_slot, 0)); - rtx stack_area = gen_rtx_MEM (save_mode, adr); + rtx adr; + rtx stack_area; + + /* We can only use save_mode if the arg is sufficiently + aligned. */ + if (STRICT_ALIGNMENT + && GET_MODE_ALIGNMENT (save_mode) > arg->locate.boundary) + save_mode = BLKmode; + + adr = memory_address (save_mode, XEXP (arg->stack_slot, 0)); + stack_area = gen_rtx_MEM (save_mode, adr); if (save_mode == BLKmode) {