<html>
    <head>
      <base href="http://llvm.org/bugs/" />
    </head>
    <body><table border="1" cellspacing="0" cellpadding="8">
        <tr>
          <th>Bug ID</th>
          <td><a class="bz_bug_link 
          bz_status_NEW "
   title="NEW --- - Redundant loads not removed"
   href="http://llvm.org/bugs/show_bug.cgi?id=20074">20074</a>
          </td>
        </tr>

        <tr>
          <th>Summary</th>
          <td>Redundant loads not removed
          </td>
        </tr>

        <tr>
          <th>Product</th>
          <td>tools
          </td>
        </tr>

        <tr>
          <th>Version</th>
          <td>trunk
          </td>
        </tr>

        <tr>
          <th>Hardware</th>
          <td>PC
          </td>
        </tr>

        <tr>
          <th>OS</th>
          <td>Linux
          </td>
        </tr>

        <tr>
          <th>Status</th>
          <td>NEW
          </td>
        </tr>

        <tr>
          <th>Severity</th>
          <td>normal
          </td>
        </tr>

        <tr>
          <th>Priority</th>
          <td>P
          </td>
        </tr>

        <tr>
          <th>Component</th>
          <td>opt
          </td>
        </tr>

        <tr>
          <th>Assignee</th>
          <td>unassignedbugs@nondot.org
          </td>
        </tr>

        <tr>
          <th>Reporter</th>
          <td>ssijaric@codeaurora.org
          </td>
        </tr>

        <tr>
          <th>CC</th>
          <td>llvmbugs@cs.uiuc.edu
          </td>
        </tr>

        <tr>
          <th>Classification</th>
          <td>Unclassified
          </td>
        </tr></table>
      <p>
        <div>
        <pre>Compiling the following using "clang --target=aarch64-linux-gnu  a.c -O3 -c -S"

typedef struct AStruct {
  char a;
  char b;
  char c[10];
} * AS;

extern AS aStruct;

int
main()
{
  aStruct->a = 'a';
  aStruct->c[2] = 'c';
  aStruct->b = 'b';
  return 0;
}


results in:

main:                                   // @main
// BB#0:                                // %entry
        adrp    x8, aStruct
        ldr     x9, [x8, :lo12:aStruct]  <====
        movz    w10, #0x61
        movz    w11, #0x63
        strb     w10, [x9]
        strb    w11, [x9, #4]
        ldr     x8, [x8, :lo12:aStruct]  <===== redundant load
        movz    w9, #0x62
        strb    w9, [x8, #1]
        mov      w0, wzr
        ret


GVN sees the following:

define i32 @main() #0 {
entry:
  %0 = load %struct.AStruct** @aStruct, align 8, !tbaa !1
  %a = getelementptr inbounds %struct.AStruct* %0, i64 0, i32 0
  store i8 97, i8* %a, align 1, !tbaa !5
  %1 = load %struct.AStruct** @aStruct, align 8, !tbaa !1
  %arrayidx = getelementptr inbounds %struct.AStruct* %1, i64 0, i32 2, i64 2
  store i8 99, i8* %arrayidx, align 1, !tbaa !7
  %2 = load %struct.AStruct** @aStruct, align 8, !tbaa !1
  %b = getelementptr inbounds %struct.AStruct* %2, i64 0, i32 1
  store i8 98, i8* %b, align 1, !tbaa !8
  ret i32 0
}



with 

!0 = metadata !{metadata !"clang version 3.5.0 "}
!1 = metadata !{metadata !2, metadata !2, i64 0}
!2 = metadata !{metadata !"any pointer", metadata !3, i64 0}
!3 = metadata !{metadata !"omnipotent char", metadata !4, i64 0}
!4 = metadata !{metadata !"Simple C/C++ TBAA"}
!5 = metadata !{metadata !6, metadata !3, i64 0}
!6 = metadata !{metadata !"AStruct", metadata !3, i64 0, metadata !3, i64 1,
metadata !3, i64 2}
!7 = metadata !{metadata !3, metadata !3, i64 0}
!8 = metadata !{metadata !6, metadata !3, i64 1}



where alias analysis tells it that 


store i8 99, i8* %arrayidx, align 1, !tbaa !7

clobbers

%2 = load %struct.AStruct** @aStruct, align 8, !tbaa !1


Changing the above example to

typedef struct AStruct {
  char a;
  char b;
  char c;
} * AS;

extern AS aStruct;

int
main()
{
  aStruct->a = 'a';
  aStruct->c = 'c';
  aStruct->b = 'b';
  return 0;
}


results in all redundant loads being removed.

Gcc 4.9 removes all redundant loads in the first case.</pre>
        </div>
      </p>
      <hr>
      <span>You are receiving this mail because:</span>
      
      <ul>
          <li>You are on the CC list for the bug.</li>
      </ul>
    </body>
</html>