[llvm-bugs] [Bug 45265] New: wrong code generated for bit field access

via llvm-bugs llvm-bugs at lists.llvm.org
Fri Mar 20 15:06:31 PDT 2020


            Bug ID: 45265
           Summary: wrong code generated for bit field access
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: Backend: X86
          Assignee: unassignedbugs at nondot.org
          Reporter: carrot at google.com
                CC: craig.topper at gmail.com, llvm-bugs at lists.llvm.org,
                    llvm-dev at redking.me.uk, spatel+llvm at rotateright.com

The source code is:

struct S {
  long long f1 : 40;
  long long f2 : 48;
  char f3;
}  __attribute__((__packed__));

extern void foo();

void bar(int i, struct S *p) {
  if (p[i].f2 == i)

Command line:

clang -c bitfield.c -O3 -save-temps


# %bb.0:                                # %entry
        movslq  %edi, %rax
        leaq    (%rax,%rax,2), %rcx
        cmpq    %rax, 5(%rsi,%rcx,4)    
        jne     .LBB0_1
# %bb.2:                                # %if.then
        xorl    %eax, %eax
        jmp     foo                     # TAILCALL
.LBB0_1:                                # %if.end

The access of p[i].f2 should load 48bit value from memory, but instruction
   cmpq    %rax, 5(%rsi,%rcx,4) 
loads 64 bit value from memory and uses it directly. The high 16bit contains
unrelated value, and causes run time error.

You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20200320/94e221da/attachment.html>

More information about the llvm-bugs mailing list