Please use GitHub pull requests for new patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
llvm/test/Transforms/InstCombine/fneg-fabs.ll
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py | ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py | ||||
; RUN: opt < %s -instcombine -S | FileCheck %s | ; RUN: opt < %s -instcombine -S | FileCheck %s | ||||
; /////////////////////////////// | ; /////////////////////////////// | ||||
; (X < +/-0.0) ? X : (0.0 - X) --> (0.0 - fabs(X)) | ; (X < +/-0.0) ? X : (0.0 - X) --> (0.0 - fabs(X)) | ||||
; (X < +/-0.0) ? X : -X --> -X FMF on FNEG or on Select | ; (X < +/-0.0) ? X : -X --> -X FMF on FNEG or on Select | ||||
; /////////////////////////////// | ; /////////////////////////////// | ||||
; (X < +/-0.0) ? X : (0.0 - X) --> (0.0 - fabs(X)) | ; (X < +/-0.0) ? X : (0.0 - X) --> (0.0 - fabs(X)) | ||||
define double @olt_fsub(double %x) { | define double @olt_fsub(double %x) { | ||||
; CHECK-LABEL: @olt_fsub( | ; CHECK-LABEL: @olt_fsub( | ||||
; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+00 | ; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.fabs.f64(double [[X:%.*]]) | ||||
; CHECK-NEXT: [[NEGX:%.*]] = fsub double 0.000000e+00, [[X]] | ; CHECK-NEXT: [[RETVAL:%.*]] = fsub double 0.000000e+00, [[TMP1]] | ||||
; CHECK-NEXT: [[RETVAL:%.*]] = select i1 [[CMP]], double [[X]], double [[NEGX]] | |||||
; CHECK-NEXT: ret double [[RETVAL]] | ; CHECK-NEXT: ret double [[RETVAL]] | ||||
; | ; | ||||
%cmp = fcmp olt double %x, 0.000000e+00 | %cmp = fcmp olt double %x, 0.000000e+00 | ||||
%negX = fsub double 0.000000e+00, %x | %negX = fsub double 0.000000e+00, %x | ||||
%retval = select i1 %cmp, double %x, double %negX | %retval = select i1 %cmp, double %x, double %negX | ||||
ret double %retval | ret double %retval | ||||
} | } | ||||
define double @ult_fsub(double %x) { | define double @ult_fsub(double %x) { | ||||
; CHECK-LABEL: @ult_fsub( | ; CHECK-LABEL: @ult_fsub( | ||||
; CHECK-NEXT: [[CMP:%.*]] = fcmp ult double [[X:%.*]], 0.000000e+00 | ; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.fabs.f64(double [[X:%.*]]) | ||||
; CHECK-NEXT: [[NEGX:%.*]] = fsub double 0.000000e+00, [[X]] | ; CHECK-NEXT: [[RETVAL:%.*]] = fsub double 0.000000e+00, [[TMP1]] | ||||
; CHECK-NEXT: [[RETVAL:%.*]] = select i1 [[CMP]], double [[X]], double [[NEGX]] | |||||
; CHECK-NEXT: ret double [[RETVAL]] | ; CHECK-NEXT: ret double [[RETVAL]] | ||||
; | ; | ||||
%cmp = fcmp ult double %x, 0.000000e+00 | %cmp = fcmp ult double %x, 0.000000e+00 | ||||
arsenm: Missing some cases where the compared value is -0? | |||||
mnadeemAuthorUnsubmitted Any specific cases? Or should I duplicate all tests and set the compared value as -0? mnadeem: Any specific cases? Or should I duplicate all tests and set the compared value as `-0`? | |||||
spatelUnsubmitted Not Done ReplyInline ActionsWe canonicalize fcmp to +0.0, so I think it would be enough to just switch any one of these tests to confirm that. spatel: We canonicalize fcmp to +0.0, so I think it would be enough to just switch any one of these… | |||||
%negX = fsub double 0.000000e+00, %x | %negX = fsub double 0.000000e+00, %x | ||||
%retval = select i1 %cmp, double %x, double %negX | %retval = select i1 %cmp, double %x, double %negX | ||||
ret double %retval | ret double %retval | ||||
} | } | ||||
; Negative tests <= needs nsz on select. | ; Negative tests <= needs nsz on select. | ||||
define double @ole_fsub_nofmf(double %x) { | define double @ole_fsub_nofmf(double %x) { | ||||
; CHECK-LABEL: @ole_fsub_nofmf( | ; CHECK-LABEL: @ole_fsub_nofmf( | ||||
▲ Show 20 Lines • Show All 56 Lines • ▼ Show 20 Lines | ; | ||||
%cmp = fcmp ult double %x, 0.000000e+00 | %cmp = fcmp ult double %x, 0.000000e+00 | ||||
%negX = fneg double %x | %negX = fneg double %x | ||||
%retval = select i1 %cmp, double %x, double %negX | %retval = select i1 %cmp, double %x, double %negX | ||||
ret double %retval | ret double %retval | ||||
} | } | ||||
define double @ult_fneg1(double %x) { | define double @ult_fneg1(double %x) { | ||||
; CHECK-LABEL: @ult_fneg1( | ; CHECK-LABEL: @ult_fneg1( | ||||
; CHECK-NEXT: [[CMP:%.*]] = fcmp ult double [[X:%.*]], 0.000000e+00 | ; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.fabs.f64(double [[X:%.*]]) | ||||
; CHECK-NEXT: [[NEGX:%.*]] = fneg nsz double [[X]] | ; CHECK-NEXT: [[RETVAL:%.*]] = fneg nsz double [[TMP1]] | ||||
; CHECK-NEXT: [[RETVAL:%.*]] = select i1 [[CMP]], double [[X]], double [[NEGX]] | |||||
; CHECK-NEXT: ret double [[RETVAL]] | ; CHECK-NEXT: ret double [[RETVAL]] | ||||
; | ; | ||||
%cmp = fcmp ult double %x, 0.000000e+00 | %cmp = fcmp ult double %x, 0.000000e+00 | ||||
%negX = fneg nsz double %x | %negX = fneg nsz double %x | ||||
%retval = select i1 %cmp, double %x, double %negX | %retval = select i1 %cmp, double %x, double %negX | ||||
ret double %retval | ret double %retval | ||||
} | } | ||||
define double @ult_fneg2(double %x) { | define double @ult_fneg2(double %x) { | ||||
; CHECK-LABEL: @ult_fneg2( | ; CHECK-LABEL: @ult_fneg2( | ||||
; CHECK-NEXT: [[CMP:%.*]] = fcmp ult double [[X:%.*]], 0.000000e+00 | ; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]]) | ||||
; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]] | ; CHECK-NEXT: [[RETVAL:%.*]] = fneg double [[TMP1]] | ||||
; CHECK-NEXT: [[RETVAL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]] | |||||
; CHECK-NEXT: ret double [[RETVAL]] | ; CHECK-NEXT: ret double [[RETVAL]] | ||||
; | ; | ||||
%cmp = fcmp ult double %x, 0.000000e+00 | %cmp = fcmp ult double %x, 0.000000e+00 | ||||
%negX = fneg double %x | %negX = fneg double %x | ||||
%retval = select nsz i1 %cmp, double %x, double %negX | %retval = select nsz i1 %cmp, double %x, double %negX | ||||
ret double %retval | ret double %retval | ||||
} | } | ||||
define double @olt_fneg1(double %x) { | define double @olt_fneg1(double %x) { | ||||
; CHECK-LABEL: @olt_fneg1( | ; CHECK-LABEL: @olt_fneg1( | ||||
; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+00 | ; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.fabs.f64(double [[X:%.*]]) | ||||
; CHECK-NEXT: [[NEGX:%.*]] = fneg nsz double [[X]] | ; CHECK-NEXT: [[RETVAL:%.*]] = fneg nsz double [[TMP1]] | ||||
; CHECK-NEXT: [[RETVAL:%.*]] = select i1 [[CMP]], double [[X]], double [[NEGX]] | |||||
; CHECK-NEXT: ret double [[RETVAL]] | ; CHECK-NEXT: ret double [[RETVAL]] | ||||
; | ; | ||||
%cmp = fcmp olt double %x, 0.000000e+00 | %cmp = fcmp olt double %x, 0.000000e+00 | ||||
%negX = fneg nsz double %x | %negX = fneg nsz double %x | ||||
%retval = select i1 %cmp, double %x, double %negX | %retval = select i1 %cmp, double %x, double %negX | ||||
ret double %retval | ret double %retval | ||||
} | } | ||||
define double @olt_fneg2(double %x) { | define double @olt_fneg2(double %x) { | ||||
; CHECK-LABEL: @olt_fneg2( | ; CHECK-LABEL: @olt_fneg2( | ||||
; CHECK-NEXT: [[CMP:%.*]] = fcmp olt double [[X:%.*]], 0.000000e+00 | ; CHECK-NEXT: [[TMP1:%.*]] = call nsz double @llvm.fabs.f64(double [[X:%.*]]) | ||||
; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X]] | ; CHECK-NEXT: [[RETVAL:%.*]] = fneg double [[TMP1]] | ||||
; CHECK-NEXT: [[RETVAL:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[NEGX]] | |||||
; CHECK-NEXT: ret double [[RETVAL]] | ; CHECK-NEXT: ret double [[RETVAL]] | ||||
; | ; | ||||
%cmp = fcmp olt double %x, 0.000000e+00 | %cmp = fcmp olt double %x, 0.000000e+00 | ||||
%negX = fneg double %x | %negX = fneg double %x | ||||
%retval = select nsz i1 %cmp, double %x, double %negX | %retval = select nsz i1 %cmp, double %x, double %negX | ||||
ret double %retval | ret double %retval | ||||
} | } |
Missing some cases where the compared value is -0?