summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/AArch64/urem-seteq-optsize.ll
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/CodeGen/AArch64/urem-seteq-optsize.ll')
-rw-r--r--llvm/test/CodeGen/AArch64/urem-seteq-optsize.ll41
1 files changed, 41 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/AArch64/urem-seteq-optsize.ll b/llvm/test/CodeGen/AArch64/urem-seteq-optsize.ll
new file mode 100644
index 00000000000..0d3f0faad73
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/urem-seteq-optsize.ll
@@ -0,0 +1,41 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s
+
+; On AArch64, division in expensive. BuildRemEqFold should therefore run even
+; when optimizing for size. Only optimizing for minimum size retains a plain div.
+
+define i32 @test_minsize(i32 %X) optsize minsize nounwind readnone {
+; CHECK-LABEL: test_minsize:
+; CHECK: // %bb.0:
+; CHECK-NEXT: mov w8, #5
+; CHECK-NEXT: udiv w8, w0, w8
+; CHECK-NEXT: add w8, w8, w8, lsl #2
+; CHECK-NEXT: mov w9, #-10
+; CHECK-NEXT: cmp w0, w8
+; CHECK-NEXT: mov w8, #42
+; CHECK-NEXT: csel w0, w8, w9, eq
+; CHECK-NEXT: ret
+ %rem = urem i32 %X, 5
+ %cmp = icmp eq i32 %rem, 0
+ %ret = select i1 %cmp, i32 42, i32 -10
+ ret i32 %ret
+}
+
+define i32 @test_optsize(i32 %X) optsize nounwind readnone {
+; CHECK-LABEL: test_optsize:
+; CHECK: // %bb.0:
+; CHECK-NEXT: mov w8, #52429
+; CHECK-NEXT: movk w8, #52428, lsl #16
+; CHECK-NEXT: umull x8, w0, w8
+; CHECK-NEXT: lsr x8, x8, #34
+; CHECK-NEXT: add w8, w8, w8, lsl #2
+; CHECK-NEXT: mov w9, #-10
+; CHECK-NEXT: cmp w0, w8
+; CHECK-NEXT: mov w8, #42
+; CHECK-NEXT: csel w0, w8, w9, eq
+; CHECK-NEXT: ret
+ %rem = urem i32 %X, 5
+ %cmp = icmp eq i32 %rem, 0
+ %ret = select i1 %cmp, i32 42, i32 -10
+ ret i32 %ret
+}
OpenPOWER on IntegriCloud