[PATCH] D39053: [Bitfield] Add more cases to making the bitfield a separate location
Strahinja Petrovic via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Oct 25 07:02:47 PDT 2017
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
More information about the cfe-commits
mailing list