[LLVMbugs] [Bug 14955] New: Failure to remove no-op zext, shl, and, or, trunc chain

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Mon Jan 14 14:05:43 PST 2013


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

             Bug #: 14955
           Summary: Failure to remove no-op zext,shl,and,or,trunc chain
           Product: tools
           Version: trunk
          Platform: PC
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: opt
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: jyasskin at google.com
                CC: llvmbugs at cs.uiuc.edu
    Classification: Unclassified


Created attachment 9873
  --> http://llvm.org/bugs/attachment.cgi?id=9873
Benchmark of sentinel-based iterators

The following module fails to optimize with `opt -O3`:

define void @_Z10copy_rangeI13SentinelRangeIPKcEPcEvOT_T0_(i8* nocapture
%sentinel_.i.i, i8* nocapture %tmp, i8* nocapture %dest) nounwind uwtable
noinline ssp {
entry:
  %tmp1 = load i8* %sentinel_.i.i, align 1, !tbaa !0
  %tmp2 = load i8* %tmp, align 1, !tbaa !0
  %cmp.i.i.i.i = icmp eq i8 %tmp2, %tmp1
  br i1 %cmp.i.i.i.i, label %for.end, label %for.body.lr.ph

for.body.lr.ph:                                   ; preds = %entry
  %retval.sroa.1.8.insert.ext.i.i = zext i8 %tmp1 to i64
  br label %for.body

for.body:                                         ; preds = %for.body,
%for.body.lr.ph
  %tmp3 = phi i8 [ %tmp2, %for.body.lr.ph ], [ %tmp4, %for.body ]
  %dest.addr.014 = phi i8* [ %dest, %for.body.lr.ph ], [ %incdec.ptr, %for.body
]
  %first.sroa.0.0.load8913 = phi i8* [ %tmp, %for.body.lr.ph ], [
%incdec.ptr.i, %for.body ]
  %first.sroa.1.9.load1012 = phi i64 [ %retval.sroa.1.8.insert.ext.i.i,
%for.body.lr.ph ], [ %first.sroa.1.9.insert.insert, %for.body ]
  %incdec.ptr = getelementptr inbounds i8* %dest.addr.014, i64 1
  store i8 %tmp3, i8* %dest.addr.014, align 1, !tbaa !0
  %incdec.ptr.i = getelementptr inbounds i8* %first.sroa.0.0.load8913, i64 1
  %tmp4 = load i8* %incdec.ptr.i, align 1, !tbaa !0
  %first.sroa.1.8.extract.trunc = trunc i64 %first.sroa.1.9.load1012 to i8
  %cmp.i = icmp eq i8 %tmp4, %first.sroa.1.8.extract.trunc
  %first.sroa.1.9.insert.ext = zext i1 %cmp.i to i64
  %first.sroa.1.9.insert.shift = shl nuw nsw i64 %first.sroa.1.9.insert.ext, 8
  %first.sroa.1.9.insert.mask = and i64 %first.sroa.1.9.load1012, -65281
  %first.sroa.1.9.insert.insert = or i64 %first.sroa.1.9.insert.shift,
%first.sroa.1.9.insert.mask
  br i1 %cmp.i, label %for.end, label %for.body

for.end:                                          ; preds = %for.body, %entry
  ret void
}
!0 = metadata !{metadata !"omnipotent char", metadata !1}
!1 = metadata !{metadata !"Simple C/C++ TBAA"}



%cmp.i is an i1, which must be 0 for the %for.body loop to continue. If it's 0,
%first.sroa.1.9.insert.ext is 0, so %first.sroa.1.9.insert.shift is 0.
%first.sroa.1.9.load1012 was a zext'ed i8, and -65281 is 0xffffffffffff00ff, so
%first.sroa.1.9.insert.mask == %first.sroa.1.9.load1012. That means
%first.sroa.1.9.insert.insert == %first.sroa.1.9.load1012 ==
%retval.sroa.1.8.insert.ext.i.i, so there's no need to update it across the
loop.

I've attached the original C++ code, which I compiled using `clang++ -std=c++11
-stdlib=libc++ -O2 test2.cc -S -emit-llvm -o -` on OSX 10.8.2

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