[LLVMbugs] [Bug 11687] New: jump-threading misses constant GEP

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Sun Jan 1 11:47:44 PST 2012


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

             Bug #: 11687
           Summary: jump-threading misses constant GEP
           Product: libraries
           Version: trunk
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: Scalar Optimizations
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: nicholas at mxc.ca
                CC: llvmbugs at cs.uiuc.edu
    Classification: Unclassified


This is a missed optimization in std::vector _M_insert_aux, the function in
push_back() that doesn't get optimized enough to get inlined. Testcase:

declare i8** @something()

declare void @use(i8)

define void @test(i64 %a) {
entry:
  %cmp = icmp eq i64 %a, 0
  br i1 %cmp, label %brtrue, label %brfalse
brfalse:
  %ptr = call i8** @something()
  br label %brtrue
brtrue:
  %phi = phi i8** [ %ptr, %brfalse ], [ null, %entry ]
  %gep = getelementptr inbounds i8** %phi, i64 %a
  %isnull = icmp eq i8** %gep, null
  br i1 %isnull, label %brtrue2, label %brfalse2
brtrue2:
  call void @use(i8 1)
  ret void
brfalse2:
  call void @use(i8 2)
  ret void
}

The important missed optimization is the case where %a is zero. Then, %phi is
null, and %gep is "gep inbounds (null, 0)" which is then compared against null
(true) and we should thread the edge directly from %entry to %brtrue2.

This probably belongs in -jump-threading.

There may be a second missed optimization, but I'm not entirely sure. We may be
able to remove the edge from %brtrue to %brtrue2, making it branch directly to
%brfalse2. The matter at hand is whether %gep could be null, given that the GEP
is inbounds and %a is non-zero. Can we have %ptr = inttoptr(10*sizeof(i8**))
and %a = -10 without violating inbounds? I don't think so, in address space
zero. Is the only inbounds gep allowed to return null "gep inbounds (null,
all-zeros)"? Or is even that not legal? If not, then std::vector push_back() is
already being miscompiled...

-- 
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