spetrovic added a comment.

Well, basically I'm just expanding the existing algorithm, why should we split 
fields just in case when current field is integer,
I'm not resolving specific problem with unaligned loads/stores on MIPS.

In this example:

typedef struct {

  unsigned int f1 : 28;
  unsigned int f2 : 4;
  unsigned int f3 : 12;

} S5;

S5 *cmd;

void foo() {
        cmd->f3 = 5;
}

With this patch there is improvement in code size not just on MIPS 
architecture, on X86 and ARM is also improved code size. If structure S5 is 
treated as i48 type there are extra instructions for reading it not just on 
MIPS. We can take results for MIPS just for example:

Output without the patch:

0000000000000000 <foo>:

   0:   3c010000        lui     at,0x0
   4:   0039082d        daddu   at,at,t9
   8:   64210000        daddiu  at,at,0
   c:   dc210000        ld      at,0(at)
  10:   dc210000        ld      at,0(at)
  14:   68220000        ldl     v0,0(at)
  18:   6c220007        ldr     v0,7(at)
  1c:   64030005        daddiu  v1,zero,5
  20:   7c62fd07        dins    v0,v1,0x14,0xc
  24:   b0220000        sdl     v0,0(at)
  28:   03e00008        jr      ra
  2c:   b4220007        sdr     v0,7(at)

Output with the patch:

0000000000000000 <foo>:

   0:   3c010000        lui     at,0x0
   4:   0039082d        daddu   at,at,t9
   8:   64210000        daddiu  at,at,0
   c:   dc210000        ld      at,0(at)
  10:   dc210000        ld      at,0(at)
  14:   94220004        lhu     v0,4(at)
  18:   24030005        li      v1,5
  1c:   7c62f904        ins     v0,v1,0x4,0x1c
  20:   03e00008        jr      ra
  24:   a4220004        sh      v0,4(at)

This is simple example, in more complicated examples there is more improvement.


https://reviews.llvm.org/D39053



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to