forked from OSchip/llvm-project
[NFC][InstCombine] Add unary fneg tests to maxnum.ll/minnum.ll
llvm-svn: 361415
This commit is contained in:
parent
c44cd1e4ed
commit
adea0b6b40
|
@ -246,6 +246,18 @@ define float @neg_neg_vec_fmf(float %x, float %y) {
|
||||||
ret float %r
|
ret float %r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
define float @unary_neg_neg_vec_fmf(float %x, float %y) {
|
||||||
|
; CHECK-LABEL: @unary_neg_neg_vec_fmf(
|
||||||
|
; CHECK-NEXT: [[TMP1:%.*]] = call fast float @llvm.minnum.f32(float [[X:%.*]], float [[Y:%.*]])
|
||||||
|
; CHECK-NEXT: [[R:%.*]] = fsub fast float -0.000000e+00, [[TMP1]]
|
||||||
|
; CHECK-NEXT: ret float [[R]]
|
||||||
|
;
|
||||||
|
%negx = fneg arcp float %x
|
||||||
|
%negy = fneg afn float %y
|
||||||
|
%r = call fast float @llvm.maxnum.f32(float %negx, float %negy)
|
||||||
|
ret float %r
|
||||||
|
}
|
||||||
|
|
||||||
; 1 extra use of an intermediate value should still allow the fold,
|
; 1 extra use of an intermediate value should still allow the fold,
|
||||||
; but 2 would require more instructions than we started with.
|
; but 2 would require more instructions than we started with.
|
||||||
|
|
||||||
|
@ -265,6 +277,21 @@ define float @neg_neg_extra_use_x(float %x, float %y) {
|
||||||
ret float %r
|
ret float %r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
define float @unary_neg_neg_extra_use_x(float %x, float %y) {
|
||||||
|
; CHECK-LABEL: @unary_neg_neg_extra_use_x(
|
||||||
|
; CHECK-NEXT: [[NEGX:%.*]] = fneg float [[X:%.*]]
|
||||||
|
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.minnum.f32(float [[X]], float [[Y:%.*]])
|
||||||
|
; CHECK-NEXT: [[R:%.*]] = fsub float -0.000000e+00, [[TMP1]]
|
||||||
|
; CHECK-NEXT: call void @use(float [[NEGX]])
|
||||||
|
; CHECK-NEXT: ret float [[R]]
|
||||||
|
;
|
||||||
|
%negx = fneg float %x
|
||||||
|
%negy = fneg float %y
|
||||||
|
%r = call float @llvm.maxnum.f32(float %negx, float %negy)
|
||||||
|
call void @use(float %negx)
|
||||||
|
ret float %r
|
||||||
|
}
|
||||||
|
|
||||||
define float @neg_neg_extra_use_y(float %x, float %y) {
|
define float @neg_neg_extra_use_y(float %x, float %y) {
|
||||||
; CHECK-LABEL: @neg_neg_extra_use_y(
|
; CHECK-LABEL: @neg_neg_extra_use_y(
|
||||||
; CHECK-NEXT: [[NEGY:%.*]] = fsub float -0.000000e+00, [[Y:%.*]]
|
; CHECK-NEXT: [[NEGY:%.*]] = fsub float -0.000000e+00, [[Y:%.*]]
|
||||||
|
@ -280,6 +307,21 @@ define float @neg_neg_extra_use_y(float %x, float %y) {
|
||||||
ret float %r
|
ret float %r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
define float @unary_neg_neg_extra_use_y(float %x, float %y) {
|
||||||
|
; CHECK-LABEL: @unary_neg_neg_extra_use_y(
|
||||||
|
; CHECK-NEXT: [[NEGY:%.*]] = fneg float [[Y:%.*]]
|
||||||
|
; CHECK-NEXT: [[TMP1:%.*]] = call float @llvm.minnum.f32(float [[X:%.*]], float [[Y]])
|
||||||
|
; CHECK-NEXT: [[R:%.*]] = fsub float -0.000000e+00, [[TMP1]]
|
||||||
|
; CHECK-NEXT: call void @use(float [[NEGY]])
|
||||||
|
; CHECK-NEXT: ret float [[R]]
|
||||||
|
;
|
||||||
|
%negx = fneg float %x
|
||||||
|
%negy = fneg float %y
|
||||||
|
%r = call float @llvm.maxnum.f32(float %negx, float %negy)
|
||||||
|
call void @use(float %negy)
|
||||||
|
ret float %r
|
||||||
|
}
|
||||||
|
|
||||||
define float @neg_neg_extra_use_x_and_y(float %x, float %y) {
|
define float @neg_neg_extra_use_x_and_y(float %x, float %y) {
|
||||||
; CHECK-LABEL: @neg_neg_extra_use_x_and_y(
|
; CHECK-LABEL: @neg_neg_extra_use_x_and_y(
|
||||||
; CHECK-NEXT: [[NEGX:%.*]] = fsub float -0.000000e+00, [[X:%.*]]
|
; CHECK-NEXT: [[NEGX:%.*]] = fsub float -0.000000e+00, [[X:%.*]]
|
||||||
|
@ -297,3 +339,19 @@ define float @neg_neg_extra_use_x_and_y(float %x, float %y) {
|
||||||
ret float %r
|
ret float %r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
define float @unary_neg_neg_extra_use_x_and_y(float %x, float %y) {
|
||||||
|
; CHECK-LABEL: @unary_neg_neg_extra_use_x_and_y(
|
||||||
|
; CHECK-NEXT: [[NEGX:%.*]] = fneg float [[X:%.*]]
|
||||||
|
; CHECK-NEXT: [[NEGY:%.*]] = fneg float [[Y:%.*]]
|
||||||
|
; CHECK-NEXT: [[R:%.*]] = call float @llvm.maxnum.f32(float [[NEGX]], float [[NEGY]])
|
||||||
|
; CHECK-NEXT: call void @use(float [[NEGX]])
|
||||||
|
; CHECK-NEXT: call void @use(float [[NEGY]])
|
||||||
|
; CHECK-NEXT: ret float [[R]]
|
||||||
|
;
|
||||||
|
%negx = fneg float %x
|
||||||
|
%negy = fneg float %y
|
||||||
|
%r = call float @llvm.maxnum.f32(float %negx, float %negy)
|
||||||
|
call void @use(float %negx)
|
||||||
|
call void @use(float %negy)
|
||||||
|
ret float %r
|
||||||
|
}
|
||||||
|
|
|
@ -256,6 +256,18 @@ define double @neg_neg(double %x, double %y) {
|
||||||
ret double %r
|
ret double %r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
define double @unary_neg_neg(double %x, double %y) {
|
||||||
|
; CHECK-LABEL: @unary_neg_neg(
|
||||||
|
; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.maxnum.f64(double [[X:%.*]], double [[Y:%.*]])
|
||||||
|
; CHECK-NEXT: [[R:%.*]] = fsub double -0.000000e+00, [[TMP1]]
|
||||||
|
; CHECK-NEXT: ret double [[R]]
|
||||||
|
;
|
||||||
|
%negx = fneg double %x
|
||||||
|
%negy = fneg double %y
|
||||||
|
%r = call double @llvm.minnum.f64(double %negx, double %negy)
|
||||||
|
ret double %r
|
||||||
|
}
|
||||||
|
|
||||||
; FMF is not required, but it should be propagated from the intrinsic (not the fnegs).
|
; FMF is not required, but it should be propagated from the intrinsic (not the fnegs).
|
||||||
; Also, make sure this works with vectors.
|
; Also, make sure this works with vectors.
|
||||||
|
|
||||||
|
@ -271,6 +283,18 @@ define <2 x double> @neg_neg_vec_fmf(<2 x double> %x, <2 x double> %y) {
|
||||||
ret <2 x double> %r
|
ret <2 x double> %r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
define <2 x double> @unary_neg_neg_vec_fmf(<2 x double> %x, <2 x double> %y) {
|
||||||
|
; CHECK-LABEL: @unary_neg_neg_vec_fmf(
|
||||||
|
; CHECK-NEXT: [[TMP1:%.*]] = call nnan ninf <2 x double> @llvm.maxnum.v2f64(<2 x double> [[X:%.*]], <2 x double> [[Y:%.*]])
|
||||||
|
; CHECK-NEXT: [[R:%.*]] = fsub nnan ninf <2 x double> <double -0.000000e+00, double -0.000000e+00>, [[TMP1]]
|
||||||
|
; CHECK-NEXT: ret <2 x double> [[R]]
|
||||||
|
;
|
||||||
|
%negx = fneg reassoc <2 x double> %x
|
||||||
|
%negy = fneg fast <2 x double> %y
|
||||||
|
%r = call nnan ninf <2 x double> @llvm.minnum.v2f64(<2 x double> %negx, <2 x double> %negy)
|
||||||
|
ret <2 x double> %r
|
||||||
|
}
|
||||||
|
|
||||||
; 1 extra use of an intermediate value should still allow the fold,
|
; 1 extra use of an intermediate value should still allow the fold,
|
||||||
; but 2 would require more instructions than we started with.
|
; but 2 would require more instructions than we started with.
|
||||||
|
|
||||||
|
@ -290,6 +314,21 @@ define double @neg_neg_extra_use_x(double %x, double %y) {
|
||||||
ret double %r
|
ret double %r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
define double @unary_neg_neg_extra_use_x(double %x, double %y) {
|
||||||
|
; CHECK-LABEL: @unary_neg_neg_extra_use_x(
|
||||||
|
; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X:%.*]]
|
||||||
|
; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.maxnum.f64(double [[X]], double [[Y:%.*]])
|
||||||
|
; CHECK-NEXT: [[R:%.*]] = fsub double -0.000000e+00, [[TMP1]]
|
||||||
|
; CHECK-NEXT: call void @use(double [[NEGX]])
|
||||||
|
; CHECK-NEXT: ret double [[R]]
|
||||||
|
;
|
||||||
|
%negx = fneg double %x
|
||||||
|
%negy = fneg double %y
|
||||||
|
%r = call double @llvm.minnum.f64(double %negx, double %negy)
|
||||||
|
call void @use(double %negx)
|
||||||
|
ret double %r
|
||||||
|
}
|
||||||
|
|
||||||
define double @neg_neg_extra_use_y(double %x, double %y) {
|
define double @neg_neg_extra_use_y(double %x, double %y) {
|
||||||
; CHECK-LABEL: @neg_neg_extra_use_y(
|
; CHECK-LABEL: @neg_neg_extra_use_y(
|
||||||
; CHECK-NEXT: [[NEGY:%.*]] = fsub double -0.000000e+00, [[Y:%.*]]
|
; CHECK-NEXT: [[NEGY:%.*]] = fsub double -0.000000e+00, [[Y:%.*]]
|
||||||
|
@ -305,6 +344,21 @@ define double @neg_neg_extra_use_y(double %x, double %y) {
|
||||||
ret double %r
|
ret double %r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
define double @unary_neg_neg_extra_use_y(double %x, double %y) {
|
||||||
|
; CHECK-LABEL: @unary_neg_neg_extra_use_y(
|
||||||
|
; CHECK-NEXT: [[NEGY:%.*]] = fneg double [[Y:%.*]]
|
||||||
|
; CHECK-NEXT: [[TMP1:%.*]] = call double @llvm.maxnum.f64(double [[X:%.*]], double [[Y]])
|
||||||
|
; CHECK-NEXT: [[R:%.*]] = fsub double -0.000000e+00, [[TMP1]]
|
||||||
|
; CHECK-NEXT: call void @use(double [[NEGY]])
|
||||||
|
; CHECK-NEXT: ret double [[R]]
|
||||||
|
;
|
||||||
|
%negx = fneg double %x
|
||||||
|
%negy = fneg double %y
|
||||||
|
%r = call double @llvm.minnum.f64(double %negx, double %negy)
|
||||||
|
call void @use(double %negy)
|
||||||
|
ret double %r
|
||||||
|
}
|
||||||
|
|
||||||
define double @neg_neg_extra_use_x_and_y(double %x, double %y) {
|
define double @neg_neg_extra_use_x_and_y(double %x, double %y) {
|
||||||
; CHECK-LABEL: @neg_neg_extra_use_x_and_y(
|
; CHECK-LABEL: @neg_neg_extra_use_x_and_y(
|
||||||
; CHECK-NEXT: [[NEGX:%.*]] = fsub double -0.000000e+00, [[X:%.*]]
|
; CHECK-NEXT: [[NEGX:%.*]] = fsub double -0.000000e+00, [[X:%.*]]
|
||||||
|
@ -322,3 +376,20 @@ define double @neg_neg_extra_use_x_and_y(double %x, double %y) {
|
||||||
ret double %r
|
ret double %r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
define double @unary_neg_neg_extra_use_x_and_y(double %x, double %y) {
|
||||||
|
; CHECK-LABEL: @unary_neg_neg_extra_use_x_and_y(
|
||||||
|
; CHECK-NEXT: [[NEGX:%.*]] = fneg double [[X:%.*]]
|
||||||
|
; CHECK-NEXT: [[NEGY:%.*]] = fneg double [[Y:%.*]]
|
||||||
|
; CHECK-NEXT: [[R:%.*]] = call double @llvm.minnum.f64(double [[NEGX]], double [[NEGY]])
|
||||||
|
; CHECK-NEXT: call void @use(double [[NEGX]])
|
||||||
|
; CHECK-NEXT: call void @use(double [[NEGY]])
|
||||||
|
; CHECK-NEXT: ret double [[R]]
|
||||||
|
;
|
||||||
|
%negx = fneg double %x
|
||||||
|
%negy = fneg double %y
|
||||||
|
%r = call double @llvm.minnum.f64(double %negx, double %negy)
|
||||||
|
call void @use(double %negx)
|
||||||
|
call void @use(double %negy)
|
||||||
|
ret double %r
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue