[LLVMbugs] [Bug 10293] New: Load not hoisted out of loop with multiple exits

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Thu Jul 7 04:46:40 PDT 2011


http://llvm.org/bugs/show_bug.cgi?id=10293

           Summary: Load not hoisted out of loop with multiple exits
           Product: libraries
           Version: trunk
          Platform: PC
        OS/Version: All
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: Loop Optimizer
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: benny.kra at gmail.com
                CC: llvmbugs at cs.uiuc.edu


We compile this C code:

===
bool foo(const char *CurPtr) {
  for (unsigned i = 1; i != 7; ++i)
    if (CurPtr[i] != CurPtr[0])
      return false;
  return true;
}
===

into

===
define zeroext i1 @foo(i8* nocapture %CurPtr) nounwind readonly ssp {
entry:
  br label %for.cond

for.cond:                                         ; preds = %for.inc, %entry
  %indvar = phi i32 [ %phitmp, %for.inc ], [ 1, %entry ]
  %cmp = icmp eq i32 %indvar, 7
  br i1 %cmp, label %return, label %for.body

for.body:                                         ; preds = %for.cond
  %arrayidx = getelementptr i8* %CurPtr, i32 %indvar
  %tmp3 = load i8* %arrayidx, align 1, !tbaa !0
  %tmp6 = load i8* %CurPtr, align 1, !tbaa !0
  %cmp8 = icmp eq i8 %tmp3, %tmp6
  br i1 %cmp8, label %for.inc, label %return

for.inc:                                          ; preds = %for.body
  %phitmp = add i32 %indvar, 1
  br label %for.cond

return:                                           ; preds = %for.cond,
%for.body
  %retval.0 = phi i1 [ false, %for.body ], [ true, %for.cond ]
  ret i1 %retval.0
}
===

The load of CurPtr[0] should be moved out of the loop. Recent versions of GCC
seem to be able to 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