diff options
author | Joel Galenson <jgalenson@google.com> | 2018-01-17 19:19:05 +0000 |
---|---|---|
committer | Joel Galenson <jgalenson@google.com> | 2018-01-17 19:19:05 +0000 |
commit | bbcaf4ac5caadf71593cdd1bee8d0697ac190aaf (patch) | |
tree | 3481c74fe134d41904cd3467f8c3b45089c4868a /llvm/test | |
parent | fe7fa40869b5b85cf7a99e7ecd13468ddfd955b1 (diff) | |
download | bcm5719-llvm-bbcaf4ac5caadf71593cdd1bee8d0697ac190aaf.tar.gz bcm5719-llvm-bbcaf4ac5caadf71593cdd1bee8d0697ac190aaf.zip |
[ARM] Optimize {s,u}mul.with.overflow.
This extends my previous patches to also optimize overflow-checked multiplies during SelectionDAG.
Differential revision: https://reviews.llvm.org/D40922
llvm-svn: 322738
Diffstat (limited to 'llvm/test')
-rw-r--r-- | llvm/test/CodeGen/ARM/overflow-intrinsic-optimizations.ll (renamed from llvm/test/CodeGen/ARM/su-addsub-overflow.ll) | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/ARM/su-addsub-overflow.ll b/llvm/test/CodeGen/ARM/overflow-intrinsic-optimizations.ll index 04e59e05b6d..2bfd18720bc 100644 --- a/llvm/test/CodeGen/ARM/su-addsub-overflow.ll +++ b/llvm/test/CodeGen/ARM/overflow-intrinsic-optimizations.ll @@ -76,6 +76,44 @@ cont: } +define i32 @smul(i32 %a, i32 %b) local_unnamed_addr #0 { +; CHECK-LABEL: smul: +; CHECK: smull r0, r[[RHI:[0-9]+]], {{r[0-9]+}}, {{r[0-9]+}} +; CHECK-NEXT: cmp r[[RHI]], r0, asr #31 +; CHECK-NEXT: moveq pc, lr +entry: + %0 = tail call { i32, i1 } @llvm.smul.with.overflow.i32(i32 %a, i32 %b) + %1 = extractvalue { i32, i1 } %0, 1 + br i1 %1, label %trap, label %cont + +trap: + tail call void @llvm.trap() #2 + unreachable + +cont: + %2 = extractvalue { i32, i1 } %0, 0 + ret i32 %2 +} + +define i32 @umul(i32 %a, i32 %b) local_unnamed_addr #0 { +; CHECK-LABEL: umul: +; CHECK: umull r0, r[[RHI:[0-9]+]], {{r[0-9]+}}, {{r[0-9]+}} +; CHECK-NEXT: cmp r[[RHI]], #0 +; CHECK-NEXT: moveq pc, lr +entry: + %0 = tail call { i32, i1 } @llvm.umul.with.overflow.i32(i32 %a, i32 %b) + %1 = extractvalue { i32, i1 } %0, 1 + br i1 %1, label %trap, label %cont + +trap: + tail call void @llvm.trap() #2 + unreachable + +cont: + %2 = extractvalue { i32, i1 } %0, 0 + ret i32 %2 +} + define void @sum(i32* %a, i32* %b, i32 %n) local_unnamed_addr #0 { ; CHECK-LABEL: sum: ; CHECK: ldr [[R0:r[0-9]+]], @@ -164,3 +202,5 @@ declare { i32, i1 } @llvm.sadd.with.overflow.i32(i32, i32) #1 declare { i32, i1 } @llvm.uadd.with.overflow.i32(i32, i32) #1 declare { i32, i1 } @llvm.ssub.with.overflow.i32(i32, i32) #1 declare { i32, i1 } @llvm.usub.with.overflow.i32(i32, i32) #1 +declare { i32, i1 } @llvm.smul.with.overflow.i32(i32, i32) #1 +declare { i32, i1 } @llvm.umul.with.overflow.i32(i32, i32) #1 |