[InstCombine] Erase old mul when creating umulo
authorNikita Popov <nikita.ppv@gmail.com>
Sun, 29 Mar 2020 17:20:11 +0000 (19:20 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Sun, 29 Mar 2020 18:46:08 +0000 (20:46 +0200)
As we don't return the result of replaceInstUsesWith(), we are
responsible for erasing the instruction.

There is a small subtlety here in that we need to do this after
the other uses of Builder, which uses the original multiply as
the insertion point.

NFC apart from worklist order changes.

llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp

index 2594810..31dfd46 100644 (file)
@@ -3671,6 +3671,11 @@ Value *InstCombiner::foldUnsignedMultiplicationOverflowCheck(ICmpInst &I) {
   if (NeedNegation) // This technically increases instruction count.
     Res = Builder.CreateNot(Res, "umul.not.ov");
 
+  // If we replaced the mul, erase it. Do this after all uses of Builder,
+  // as the mul is used as insertion point.
+  if (MulHadOtherUses)
+    eraseInstFromFunction(*Mul);
+
   return Res;
 }