]> granicus.if.org Git - llvm/commit
[InstSimplify] Drop leftover "division-by-zero guard" around `@llvm.umul.with.overflo...
authorRoman Lebedev <lebedev.ri@gmail.com>
Thu, 29 Aug 2019 12:48:04 +0000 (12:48 +0000)
committerRoman Lebedev <lebedev.ri@gmail.com>
Thu, 29 Aug 2019 12:48:04 +0000 (12:48 +0000)
commitf7bbb0f66951f6a52e74a36e3ebfd80385d438ca
tree64b47615df3fbad8db3a9f644199a2682485b8c6
parentee2422df6a03ac2a0585827770ae304fc2487585
[InstSimplify] Drop leftover "division-by-zero guard" around `@llvm.umul.with.overflow` inverted overflow bit

Summary:
Now that with D65143/D65144 we've produce `@llvm.umul.with.overflow`,
and with D65147 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 [[ https://bugs.llvm.org/show_bug.cgi?id=42720 | PR42720 ]].

Reviewers: nikic, spatel, xbolva00, RKSimon

Reviewed By: spatel

Subscribers: hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D65151

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@370351 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Analysis/InstructionSimplify.cpp
test/Transforms/InstSimplify/div-by-0-guard-before-smul_ov-not.ll
test/Transforms/InstSimplify/div-by-0-guard-before-umul_ov-not.ll
test/Transforms/PhaseOrdering/unsigned-multiply-overflow-check.ll