Hi, sorry for late reply, I've been on vacation and then preparing for Cauldron. Anyway...
On Mon, Jun 30, 2014 at 05:13:13PM +0200, Bernd Schmidt wrote: > On 06/17/2014 04:54 PM, Martin Jambor wrote: > >Weird... does the following (untested) patch help? > > > >diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c > >index 0afa197..747b1b6 100644 > >--- a/gcc/tree-sra.c > >+++ b/gcc/tree-sra.c > >@@ -3277,6 +3277,8 @@ sra_modify_assign (gimple *stmt, gimple_stmt_iterator > >*gsi) > > > > if (modify_this_stmt > > || gimple_has_volatile_ops (*stmt) > >+ || is_gimple_reg (lhs) > >+ || is_gimple_reg (rhs) > > || contains_vce_or_bfcref_p (rhs) > > || contains_vce_or_bfcref_p (lhs) > > || stmt_ends_bb_p (*stmt)) > > Unfortunately not. > > >It is just a quick thought though. If it does not, could you post the > >access trees dumped by -fdump-tree-esra-details or > >-fdump-tree-sra-details (depending on whether this is early or late > >SRA)? Or is it simple to set it up locally? > > Not really. It needs a whole patch tree for the ptx port. I'm > attaching the last two dump files. > > > Bernd > > > ;; Function bar (bar, funcdef_no=0, decl_uid=1376, symbol_order=0) > > > Pass statistics: > ---------------- > > > Pass statistics: > ---------------- > > bar (struct S xD.1375) > { > struct S D.1385; > struct S aD.1378; > struct S D.1379; > struct S D.1381; > > ;; basic block 2, loop depth 0, count 0, freq 10000, maybe hot > ;; prev block 0, next block 1, flags: (NEW, REACHABLE) > ;; pred: ENTRY [100.0%] (FALLTHRU,EXECUTABLE) > # .MEM_2 = VDEF <.MEM_1(D)> > aD.1378 = xD.1375; > # .MEM_3 = VDEF <.MEM_2> > # USE = nonlocal > # CLB = nonlocal > _6 = fooD.1374 (aD.1378); > # .MEM_7 = VDEF <.MEM_3> > D.1379 = _6; This seems to be the statement which has its RHS converted to to a MEM_REF[&_6], am I right? I wonder whether it is correct input though, because it looks like it has mismatched types. The LHS is clearly an aggregate of type struct S while the RHS is an SSA name, meaning it cannot be of an aggregate type. Does this pass gimple checking? What creates that statement? Thanks, Martin > # .MEM_4 = VDEF <.MEM_7> > aD.1378 ={v} {CLOBBER}; > # .MEM_5 = VDEF <.MEM_4> > D.1381 = D.1379; > # VUSE <.MEM_5> > return D.1381; > ;; succ: EXIT [100.0%] > > } > > > > ;; Function bar (bar, funcdef_no=0, decl_uid=1376, symbol_order=0) > > > Pass statistics: > ---------------- > > Candidate (1375): x > Candidate (1385): D.1385 > Candidate (1378): a > Candidate (1379): D.1379 > Candidate (1381): D.1381 > Will attempt to totally scalarize D.1379 (UID: 1379): > ! Disqualifying D.1385 - No or inhibitingly overlapping accesses. > ! Disqualifying x - No scalar replacements to be created. > ! Disqualifying a - No scalar replacements to be created. > Created a replacement for D.1379 offset: 0, size: 32: SR$2 > > Access trees for D.1379 (UID: 1379): > access { base = (1379)'D.1379', offset = 0, size = 32, expr = D.1379.len, > type = unsigned int, grp_read = 1, grp_write = 1, grp_assignment_read = 1, > grp_assignment_write = 1, grp_scalar_read = 1, grp_scalar_write = 0, > grp_total_scalarization = 1, grp_hint = 1, grp_covered = 1, > grp_unscalarizable_region = 0, grp_unscalarized_data = 0, grp_partial_lhs = > 0, grp_to_be_replaced = 1, grp_to_be_debug_replaced = 0, grp_maybe_modified = > 0, grp_not_necessarilly_dereferenced = 0 > > ! Disqualifying D.1381 - No scalar replacements to be created. > > Pass statistics: > ---------------- > Scalarized aggregates: 1 > Modified expressions: 2 > Separate LHS and RHS handling: 2 > Scalar replacements created: 1 > > > Updating SSA: > Registering new PHI nodes in block #0 > Registering new PHI nodes in block #2 > Updating SSA information for statement SR$2 = MEM[(struct S *)&_6]; > Updating SSA information for statement MEM[(struct S *)&D.1381] = SR$2; > > DFA Statistics for bar > > --------------------------------------------------------- > Number of Memory > instances used > --------------------------------------------------------- > USE operands 1 8b > DEF operands 2 16b > VUSE operands 6 48b > VDEF operands 4 32b > PHI nodes 0 0b > PHI arguments 0 0b > --------------------------------------------------------- > Total memory used by DFA/SSA data 104b > --------------------------------------------------------- > > > > Hash table statistics: > var_infos: size 61, 1 elements, 0.000000 collision/search ratio > > > Symbols to be put in SSA form > { D.1387 } > Incremental SSA update started at block: 0 > Number of blocks in CFG: 3 > Number of blocks to update: 2 ( 67%) > Affected blocks: 0 2 > >