[llvm-bugs] [Bug 47765] New: InstCombine unable to optimize away unnecessary sign extension having multiple use

via llvm-bugs llvm-bugs at lists.llvm.org
Thu Oct 8 04:31:39 PDT 2020


https://bugs.llvm.org/show_bug.cgi?id=47765

            Bug ID: 47765
           Summary: InstCombine unable to optimize away unnecessary sign
                    extension having multiple use
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: Windows NT
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: Scalar Optimizations
          Assignee: unassignedbugs at nondot.org
          Reporter: bhramar.vatsa at synopsys.com
                CC: llvm-bugs at lists.llvm.org

The following code (shortened/adapted from real code):

long long foo(const long long a, int b, short c, int d)
{
    const bool odd = b % 2;

    d = (short)d;
    if (odd) {
        d = (d & 0x03ff) | (c << 8);
        d += (d * 3) + 45333;
    } else {
        d = (d & 0x3fc0) | (c << 12);
        d += (d * 4) + 65333;
    }

    return a & d;
}

Results in following IR:

...
  %7 = shl i32 %3, 16, !dbg !26               <-- Can be removed
  %8 = ashr exact i32 %7, 16, !dbg !26        <-- Can be removed
  br i1 %6, label %16, label %9, !dbg !28

9:                                                ; preds = %4
  %10 = and i32 %8, 1023, !dbg !29
  ...
16:                                               ; preds = %4
  %17 = and i32 %8, 16320, !dbg !37

It can also be seen at: https://godbolt.org/z/PoqM67

Here, the truncation/sign-extension code (%3 -> %8) has use within the
then-else blocks (Labels 9 & 16). However, the 'and' instructions only results
in usage of lower 16 bits (actually maximum 14 LSBs). So, the 'shl' and 'ashr'
instructions can be optimized away without any impact whatsoever on the
functionality.

The place for such an optimization is within InstCombine pass
(InstCombiner::visitAnd() -> InstCombiner::SimplifyDemandedUseBits()). It
doesn't happen though, due to the fact that when the information about the
demanded bits is passed onto 'ashr' instruction (through the worklist), it
finds that the 'ashr' instruction has multiple use and that restricts it from
making an optimization (removal of trunc/sext operation).

It should be noted that if the code to trunc/sext ('(short)d') is pushed within
then/else block, (post-bb7d3af11 commit) the optimization takes place. So, the
same 'InstCombine' transformation is able to optimize away these operations
from then/else blocks.

Since the optimization happens with the non-hoisted example, it should be
possible in some way to make it work even with hoisted code.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20201008/11230637/attachment.html>


More information about the llvm-bugs mailing list