spetrovic added a comment.
I was looking if I can reslove this problem in backend. Example:
C code:
typedef struct {
unsigned int f1 : 28;
unsigned int f2 : 4;
unsigned int f3 : 12;
} S5;
void foo(S5 *cmd) {
cmd->f3 = 5;
}
. ll file (without the patch):
%struct.S5 = type { i48 }
define void @foo(%struct.S5* nocapture %cmd) local_unnamed_addr #0 {
entry:
%0 = bitcast %struct.S5* %cmd to i64*
%bf.load = load i64, i64* %0, align 4
%bf.clear = and i64 %bf.load, -4293918721
%bf.set = or i64 %bf.clear, 5242880
store i64 %bf.set, i64* %0, align 4
ret void
}
The load (%bf.load = load i64, i64* %0, align 4) is NON_EXTLOAD, and backend
handles it later as unaligned load. So, maybe one of possible solutions in
backend is for each architecture to try to catch node pattern and replace
unaligned loads with normal loads in specific cases, but I'm not sure how
feasible that is. At the moment, the solution in frontend seems better to me.
What do you think?
https://reviews.llvm.org/D39053
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits