<html><body><p><font size="2">For this specific case, modifying source code (or the frontend) to use a struct instead of </font><br><font size="2">bitfield seems to be an easy way since all sizes of bitfields are 8 bits. But you cannot?</font><br><font size="2">For general cases, you may want to enhance backend to emit bitextract/bitset.</font><br><font size="2"><br>-----<br>Hiroshi Inoue <inouehrs@jp.ibm.com><br>IBM Research - Tokyo<br></font><br><br><tt><font size="2">"llvm-dev" <llvm-dev-bounces@lists.llvm.org> wrote on 2017/06/15 20:06:49:<br><br>> From: 陳韋任 via llvm-dev <llvm-dev@lists.llvm.org></font></tt><br><tt><font size="2">> To: mats petersson <mats@planetcatfish.com></font></tt><br><tt><font size="2">> Cc: LLVM Developers Mailing List <llvm-dev@lists.llvm.org></font></tt><br><tt><font size="2">> Date: 2017/06/15 20:07</font></tt><br><tt><font size="2">> Subject: Re: [llvm-dev] About CodeGen quality</font></tt><br><tt><font size="2">> Sent by: "llvm-dev" <llvm-dev-bounces@lists.llvm.org></font></tt><br><tt><font size="2">> <br>> Hi Mats,</font></tt><br><tt><font size="2">> <br>>   It's private backend. I will try describing what I am dealing with.</font></tt><br><tt><font size="2">> <br>>     struct S {</font></tt><br><tt><font size="2">>       unsigned int a : 8;</font></tt><br><tt><font size="2">>       unsigned int b : 8;</font></tt><br><tt><font size="2">>       unsigned int c : 8;</font></tt><br><tt><font size="2">>       unsigned int d : 8;</font></tt><br><tt><font size="2">> <br>>       unsigned int e;</font></tt><br><tt><font size="2">>     }</font></tt><br><tt><font size="2">> <br>> We want to read S->b for example. The size of struct S is 64 bits, <br>> and seems LLVM treats it as i64.</font></tt><br><tt><font size="2">> Below is the IR corresponding to S->b, IIRC. </font></tt><br><tt><font size="2">> <br>>     %0 = load i64, *i64 ptr, align 4;</font></tt><br><tt><font size="2">>     %1 = %0 lshr 8;</font></tt><br><tt><font size="2">>     %2 = %1 and 255;</font></tt><br><tt><font size="2">> <br>> Our target doesn't support load i64, so we have following code <br>> in XXXISelLowering.cpp</font></tt><br><tt><font size="2">> <br>>     setOperationAction(ISD::LOAD, MVT::i64, Custom);</font></tt><br><tt><font size="2">>   </font></tt><br><tt><font size="2">> Transform load i64 to load v2i32 during type legalization. During op<br>> legalization, load v2i32</font></tt><br><tt><font size="2">> is found unaligned (4 v.s. 8), so stack load/store instructions are <br>> generated. This is one problem.</font></tt><br><tt><font size="2">> <br>> Besides of that, our target has bitset/bitextract instructions, we <br>> want to use them on bitfield</font></tt><br><tt><font size="2">> access, too. But don't know how to do that.</font></tt><br><tt><font size="2">> <br>> Thanks.</font></tt><br><tt><font size="2">> <br>> Regards,</font></tt><br><tt><font size="2">> chenwj</font></tt><br><tt><font size="2">> <br>> 2017-06-15 0:10 GMT+08:00 mats petersson <mats@planetcatfish.com>:</font></tt><br><tt><font size="2">> Would probably help if you explained which backend you are working <br>> on (assuming it's a publicly available one). An example, with source<br>> that can be compiled by "anyone", along with the generated "bad <br>> code" and what you expect to see as "good code" would also help a lot.<br></font></tt><br><tt><font size="2">> From the things I've seen, it's not noticeably worse (or better) <br>> than other compilers. But it's not an area that I've spent a LOT of <br>> time on, and the combination of generic LLVM operations and the <br>> target implementation will determine the outcome - there are lots of<br>> clever tricks one can do at the machine-code level, that LLVM can't <br>> "know" in generic ways, since it's dependent on specific <br>> instructions. Most of my experience comes from x86 and ARM, both of <br>> which are fairly well established architectures with a good amount <br>> of people supporting the code-gen part. If you are using a different<br>> target, there may be missing target optimisations that the compiler could do.<br></font></tt><br><tt><font size="2">> I probably can't really help, just trying to help you make the <br>> question as clear as possible, so that those who may be able to help<br>> have enough information to work on.</font></tt><br><tt><font size="2">> <br>> --</font></tt><br><tt><font size="2">> Mats</font></tt><br><tt><font size="2">> <br>> On 14 June 2017 at 13:57, 陳韋任 via llvm-dev <llvm-dev@lists.llvm.org> wrote:</font></tt><br><tt><font size="2">> Hi All,</font></tt><br><tt><font size="2">> <br>>   Is there known issue that LLVM is bad at codegen for some language<br>> structure, say C bitfield?</font></tt><br><tt><font size="2">> Our custom backend generates inefficient code for bitfield access, <br>> so I am wondering where</font></tt><br><tt><font size="2">> should I look into first.</font></tt><br><tt><font size="2">> <br>>   Thanks.</font></tt><br><tt><font size="2">> <br>> Regards,</font></tt><br><tt><font size="2">> chenwj</font></tt><br><tt><font size="2">> <br>> -- </font></tt><br><tt><font size="2">> Wei-Ren Chen (陳韋任)<br>> Homepage: <a href="https://people.cs.nctu.edu.tw/~chenwj">https://people.cs.nctu.edu.tw/~chenwj</a></font></tt><br><tt><font size="2">> <br>> _______________________________________________<br>> LLVM Developers mailing list<br>> llvm-dev@lists.llvm.org<br>> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br></font></tt><br><tt><font size="2">> <br>> <br></font></tt><br><tt><font size="2">> <br>> -- </font></tt><br><tt><font size="2">> Wei-Ren Chen (陳韋任)<br>> Homepage: <a href="https://people.cs.nctu.edu.tw/~chenwj">https://people.cs.nctu.edu.tw/~chenwj</a><br>> _______________________________________________<br>> LLVM Developers mailing list<br>> llvm-dev@lists.llvm.org<br>> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br></font></tt><BR>
</body></html>