diff options
author | Alexey Bataev <a.bataev@hotmail.com> | 2015-07-15 08:39:35 +0000 |
---|---|---|
committer | Alexey Bataev <a.bataev@hotmail.com> | 2015-07-15 08:39:35 +0000 |
commit | a01809966911a7614e877c0a7e08a5ab507e2f60 (patch) | |
tree | e38abbe20c443cfcb4240d478584b35b87713ba3 /test/CodeGen/Thumb2 | |
parent | 8913d18fb1f694c7ea363a8f2ea002673d025202 (diff) |
[SDAG] Optimize unordered comparison in soft-float mode (patch by Anton Nadolskiy)
Current implementation handles unordered comparison poorly in soft-float mode.
Consider (a ULE b) which is a <= b. It is lowered to (ledf2(a, b) <= 0 || unorddf2(a, b) != 0) (in general). We can do better job by lowering it to (__gtdf2(a, b) <= 0).
Such replacement is true for other CMP's (ult, ugt, uge). In general, we just call same function as for ordered case but negate comparison against zero.
Differential Revision: http://reviews.llvm.org/D10804
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242280 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGen/Thumb2')
-rw-r--r-- | test/CodeGen/Thumb2/float-cmp.ll | 44 | ||||
-rw-r--r-- | test/CodeGen/Thumb2/float-intrinsics-double.ll | 3 |
2 files changed, 21 insertions, 26 deletions
diff --git a/test/CodeGen/Thumb2/float-cmp.ll b/test/CodeGen/Thumb2/float-cmp.ll index 88d6c3b0adb..77b0999337c 100644 --- a/test/CodeGen/Thumb2/float-cmp.ll +++ b/test/CodeGen/Thumb2/float-cmp.ll @@ -81,8 +81,9 @@ define i1 @cmp_f_ord(float %a, float %b) { } define i1 @cmp_f_ugt(float %a, float %b) { ; CHECK-LABEL: cmp_f_ugt: -; NONE: bl __aeabi_fcmpgt -; NONE: bl __aeabi_fcmpun +; NONE: bl __aeabi_fcmple +; NONE: cmp r0, #0 +; NONE-NEXT: it eq ; HARD: vcmpe.f32 ; HARD: movhi r0, #1 %1 = fcmp ugt float %a, %b @@ -90,8 +91,9 @@ define i1 @cmp_f_ugt(float %a, float %b) { } define i1 @cmp_f_uge(float %a, float %b) { ; CHECK-LABEL: cmp_f_uge: -; NONE: bl __aeabi_fcmpge -; NONE: bl __aeabi_fcmpun +; NONE: bl __aeabi_fcmplt +; NONE: cmp r0, #0 +; NONE-NEXT: it eq ; HARD: vcmpe.f32 ; HARD: movpl r0, #1 %1 = fcmp uge float %a, %b @@ -99,8 +101,9 @@ define i1 @cmp_f_uge(float %a, float %b) { } define i1 @cmp_f_ult(float %a, float %b) { ; CHECK-LABEL: cmp_f_ult: -; NONE: bl __aeabi_fcmplt -; NONE: bl __aeabi_fcmpun +; NONE: bl __aeabi_fcmpge +; NONE: cmp r0, #0 +; NONE-NEXT: it eq ; HARD: vcmpe.f32 ; HARD: movlt r0, #1 %1 = fcmp ult float %a, %b @@ -108,8 +111,9 @@ define i1 @cmp_f_ult(float %a, float %b) { } define i1 @cmp_f_ule(float %a, float %b) { ; CHECK-LABEL: cmp_f_ule: -; NONE: bl __aeabi_fcmple -; NONE: bl __aeabi_fcmpun +; NONE: bl __aeabi_fcmpgt +; NONE: cmp r0, #0 +; NONE-NEXT: it eq ; HARD: vcmpe.f32 ; HARD: movle r0, #1 %1 = fcmp ule float %a, %b @@ -214,10 +218,8 @@ define i1 @cmp_d_ord(double %a, double %b) { } define i1 @cmp_d_ugt(double %a, double %b) { ; CHECK-LABEL: cmp_d_ugt: -; NONE: bl __aeabi_dcmpgt -; NONE: bl __aeabi_dcmpun -; SP: bl __aeabi_dcmpgt -; SP: bl __aeabi_dcmpun +; NONE: bl __aeabi_dcmple +; SP: bl __aeabi_dcmple ; DP: vcmpe.f64 ; DP: movhi r0, #1 %1 = fcmp ugt double %a, %b @@ -226,10 +228,8 @@ define i1 @cmp_d_ugt(double %a, double %b) { define i1 @cmp_d_ult(double %a, double %b) { ; CHECK-LABEL: cmp_d_ult: -; NONE: bl __aeabi_dcmplt -; NONE: bl __aeabi_dcmpun -; SP: bl __aeabi_dcmplt -; SP: bl __aeabi_dcmpun +; NONE: bl __aeabi_dcmpge +; SP: bl __aeabi_dcmpge ; DP: vcmpe.f64 ; DP: movlt r0, #1 %1 = fcmp ult double %a, %b @@ -268,10 +268,8 @@ define i1 @cmp_d_ueq(double %a, double %b) { define i1 @cmp_d_uge(double %a, double %b) { ; CHECK-LABEL: cmp_d_uge: -; NONE: bl __aeabi_dcmpge -; NONE: bl __aeabi_dcmpun -; SP: bl __aeabi_dcmpge -; SP: bl __aeabi_dcmpun +; NONE: bl __aeabi_dcmplt +; SP: bl __aeabi_dcmplt ; DP: vcmpe.f64 ; DP: movpl r0, #1 %1 = fcmp uge double %a, %b @@ -280,10 +278,8 @@ define i1 @cmp_d_uge(double %a, double %b) { define i1 @cmp_d_ule(double %a, double %b) { ; CHECK-LABEL: cmp_d_ule: -; NONE: bl __aeabi_dcmple -; NONE: bl __aeabi_dcmpun -; SP: bl __aeabi_dcmple -; SP: bl __aeabi_dcmpun +; NONE: bl __aeabi_dcmpgt +; SP: bl __aeabi_dcmpgt ; DP: vcmpe.f64 ; DP: movle r0, #1 %1 = fcmp ule double %a, %b diff --git a/test/CodeGen/Thumb2/float-intrinsics-double.ll b/test/CodeGen/Thumb2/float-intrinsics-double.ll index 01a23bd0fe6..38d04d30b87 100644 --- a/test/CodeGen/Thumb2/float-intrinsics-double.ll +++ b/test/CodeGen/Thumb2/float-intrinsics-double.ll @@ -109,9 +109,8 @@ declare double @llvm.fabs.f64(double %Val) define double @abs_d(double %a) { ; CHECK-LABEL: abs_d: ; NONE: bic r1, r1, #-2147483648 -; SP: bl __aeabi_dcmpgt -; SP: bl __aeabi_dcmpun ; SP: bl __aeabi_dsub +; SP: bl __aeabi_dcmple ; DP: vabs.f64 d0, d0 %1 = call double @llvm.fabs.f64(double %a) ret double %1 |