[PATCH] D108842: [ARMISelLowering] avoid emitting libcalls to __mulodi4()
Craig Topper via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 27 14:42:19 PDT 2021
craig.topper added inline comments.
================
Comment at: llvm/test/CodeGen/ARM/overflow-intrinsic-optimizations.ll:241
+entry:
+ %a.addr = alloca i32, align 4
+ %b.addr = alloca i64, align 8
----------------
craig.topper wrote:
> nickdesaulniers wrote:
> > craig.topper wrote:
> > > Can you run this through mem2reg?
> > If I do, then the test is no longer red before this change. Perhaps there is some other way to make this test less brittle?
> > If I do, then the test is no longer red before this change. Perhaps there is some other way to make this test less brittle?
>
> That's weird it seems to work for me. I just wanted to get rid of the allocas and associate load/stores
>
> ```
> define void @no__mulodi4(i32 %a, i64 %b, i32* %c) {
> entry:
> %0 = sext i32 %a to i64
> %1 = call { i64, i1 } @llvm.smul.with.overflow.i64(i64 %0, i64 %b)
> %2 = extractvalue { i64, i1 } %1, 1
> %3 = extractvalue { i64, i1 } %1, 0
> %4 = trunc i64 %3 to i32
> %5 = sext i32 %4 to i64
> %6 = icmp ne i64 %3, %5
> %7 = or i1 %2, %6
> store i32 %4, i32* %c, align 4
> ret void
> }
> ```
>
> This should be even better since it prevents %10 from being dead code
>
> ```
> define zeroext i1 @no__mulodi4(i32 %a, i64 %b, i32* %c) {
> entry:
> %0 = sext i32 %a to i64
> %1 = call { i64, i1 } @llvm.smul.with.overflow.i64(i64 %0, i64 %b)
> %2 = extractvalue { i64, i1 } %1, 1
> %3 = extractvalue { i64, i1 } %1, 0
> %4 = trunc i64 %3 to i32
> %5 = sext i32 %4 to i64
> %6 = icmp ne i64 %3, %5
> %7 = or i1 %2, %6
> store i32 %4, i32* %c, align 4
> ret i1 %7
> }
> ```
Err that should have said %7. It was %10 before mem2reg.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D108842/new/
https://reviews.llvm.org/D108842
More information about the llvm-commits
mailing list