Hi! My recent PR debug/48043 fix regressed on the following testcase on s390 apparently, the problem is that the clc insn has BLKmode arguments and when var-tracking tries to canonicalize insns, it will try to delegitimize even that BLKmode mem/u/c from (insn 39 45 10 2 (parallel [ (set (reg:CCZ 33 %cc) (compare:CCZ (mem/s/f:BLK (reg:SI 2 %r2 [ x ]) [3 x_1(D)->s+0 S4 A32]) (mem/u/c:BLK (plus:SI (reg:SI 12 %r12) (const:SI (unspec:SI [ (symbol_ref:SI ("bar") [flags 0x41] <function_decl 0x7f9b36c2c200 bar>) ] 111))) [0 S4 A8]))) (use (const_int 4 [0x4])) ]) rh689266.i:12 41 {*clc} (expr_list:REG_DEAD (reg:SI 2 %r2 [ x ]) (nil))) which crashes because BLKmode subregs aren't allowed. Fixed thusly, it shouldn't be a big deal for the checking note in dwarf2out, because generally BLKmode isn't VALUE tracked.
Ok for trunk/4.6? 2011-03-20 Jakub Jelinek <ja...@redhat.com> PR target/48213 * config/s390/s390.c (s390_delegitimize_address): Don't call lowpart_subreg if orig_x has BLKmode. * gcc.dg/pr48213.c: New test. --- gcc/config/s390/s390.c.jj 2011-03-14 14:11:52.000000000 +0100 +++ gcc/config/s390/s390.c 2011-03-20 20:08:28.000000000 +0100 @@ -5045,6 +5045,8 @@ s390_delegitimize_address (rtx orig_x) if (GET_MODE (orig_x) != Pmode) { + if (GET_MODE (orig_x) == BLKmode) + return orig_x; y = lowpart_subreg (GET_MODE (orig_x), y, Pmode); if (y == NULL_RTX) return orig_x; --- gcc/testsuite/gcc.dg/pr48213.c.jj 2011-03-20 20:31:14.000000000 +0100 +++ gcc/testsuite/gcc.dg/pr48213.c 2011-03-20 20:30:34.000000000 +0100 @@ -0,0 +1,14 @@ +/* PR target/48213 */ +/* { dg-do compile } */ +/* { dg-options "-g -O2" } */ +/* { dg-options "-g -O2 -fpic" { target fpic } } */ + +struct S { int (*s) (void); }; +int bar (void); + +void +foo (struct S *x) +{ + if (x->s != bar) + bar (); +} Jakub