[LLVMbugs] [Bug 6627] New: llvm doesn't merge adjacent cmps

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Tue Mar 16 06:07:30 PDT 2010


           Summary: llvm doesn't merge adjacent cmps
           Product: libraries
           Version: trunk
          Platform: PC
        OS/Version: All
            Status: NEW
          Keywords: code-quality
          Severity: enhancement
          Priority: P
         Component: Common Code Generator Code
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: benny.kra at gmail.com
                CC: llvmbugs at cs.uiuc.edu, rdivacky at freebsd.org

Test case (by rdivacky):

typedef unsigned int uint32_t;
typedef struct {
    unsigned char e_ident[16];
} Elf32_Ehdr;

struct exec {
     uint32_t a_midmag;
     uint32_t a_text;
     uint32_t a_data;
     uint32_t a_bss;
     uint32_t a_syms;
     uint32_t a_entry;
     uint32_t a_trsize;
     uint32_t a_drsize;

foo() {
    union {
 struct exec ex;
 Elf32_Ehdr eh;
    } hdr;

   bar(&hdr);    // pretend to fill something in

   // $CC -std=c99 -Os -S stack-compare.c
   // clang:
   //     callq   bar
   //     cmpb    $127, -32(%rbp)
   //     jne     .LBB1_5
   //     cmpb    $69, -31(%rbp)
   //     jne     .LBB1_5
   //     cmpb    $76, -30(%rbp)
   //     jne     .LBB1_5
   //     cmpb    $70, -29(%rbp)
   //     jne     .LBB1_5
   //     xorb    %al, %al
   //     callq   doo
   // gcc:
   //        call    bar
   //        cmpl    $1179403647, (%esp)
   //        jne     .L5
   // ie. gcc can combine all these into one compare while llvm cant

   if (((hdr.eh).e_ident[0] == 0x7f && (hdr.eh).e_ident[1] == 'E' &&
(hdr.eh).e_ident[2] == 'L' && (hdr.eh).e_ident[3] == 'F')) {


GCC does this transformation because it sees the uint32_t through the union. I
think it could be safely applied to any cmp with a fixed-size stack allocated
array though (GCC doesn't do this).

Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.

More information about the llvm-bugs mailing list