[PATCH] D65151: [InstSimplify] Drop leftover "division-by-zero guard" around `@llvm.umul.with.overflow` inverted overflow bit

Roman Lebedev via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 23 07:32:53 PDT 2019


lebedev.ri created this revision.
lebedev.ri added reviewers: nikic, spatel, xbolva00, RKSimon.
lebedev.ri added a project: LLVM.
Herald added a subscriber: hiraditya.

Now that with D65143 <https://reviews.llvm.org/D65143>/D65144 <https://reviews.llvm.org/D65144> we've produce `@llvm.umul.with.overflow`,
and with D65147 <https://reviews.llvm.org/D65147>+D65148 <https://reviews.llvm.org/D65148> we've flattened the CFG, we now can see that
the guard may have been there to prevent division by zero is redundant.
We can simply drop it:

  ----------------------------------------
  Name: no overflow or zero
    %iszero = icmp eq i4 %y, 0
    %umul = smul_overflow i4 %x, %y
    %umul.ov = extractvalue {i4, i1} %umul, 1
    %umul.ov.not = xor %umul.ov, -1
    %retval.0 = or i1 %iszero, %umul.ov.not
    ret i1 %retval.0
  =>
    %iszero = icmp eq i4 %y, 0
    %umul = smul_overflow i4 %x, %y
    %umul.ov = extractvalue {i4, i1} %umul, 1
    %umul.ov.not = xor %umul.ov, -1
    %retval.0 = or i1 %iszero, %umul.ov.not
    ret i1 %umul.ov.not
  
  Done: 1
  Optimization is correct!

Note that this is inverted from what we have in a previous patch, 
here we are looking for the inverted overflow bit.
And that inversion is kinda problematic - given this particular
pattern we neither hoist that `not` closer to `ret` (then the pattern
would have been identical to the one without inversion,
and would have been handled by the previous patch), neither 
do the opposite transform. But regardless, we should handle this too.
I've filled PR42720 <https://bugs.llvm.org/show_bug.cgi?id=42720>.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D65151

Files:
  llvm/lib/Analysis/InstructionSimplify.cpp
  llvm/test/Transforms/InstSimplify/div-by-0-guard-before-smul_ov-not.ll
  llvm/test/Transforms/InstSimplify/div-by-0-guard-before-umul_ov-not.ll
  llvm/test/Transforms/PhaseOrdering/unsigned-multiply-overflow-check.ll

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D65151.211299.patch
Type: text/x-patch
Size: 8742 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190723/a5ccadd6/attachment.bin>


More information about the llvm-commits mailing list