@@ -706,11 +706,10 @@ define i32 @select_lshr_icmp_const_different_values(i32 %x, i32 %y) {
706706 ret i32 %C
707707}
708708
709- ; Invalid identity constant for FP op
710- define float @select_fadd_fcmp_bad (float %x , float %y , float %z ) {
711- ; CHECK-LABEL: @select_fadd_fcmp_bad(
709+ define float @select_fadd_fcmp_equiv (float %x , float %y , float %z ) {
710+ ; CHECK-LABEL: @select_fadd_fcmp_equiv(
712711; CHECK-NEXT: [[A:%.*]] = fcmp oeq float [[X:%.*]], -1.000000e+00
713- ; CHECK-NEXT: [[B:%.*]] = fadd nsz float [[X]], [[ Z:%.*]]
712+ ; CHECK-NEXT: [[B:%.*]] = fadd nsz float [[Z:%.*]], -1.000000e+00
714713; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]]
715714; CHECK-NEXT: ret float [[C]]
716715;
@@ -720,6 +719,19 @@ define float @select_fadd_fcmp_bad(float %x, float %y, float %z) {
720719 ret float %C
721720}
722721
722+ define float @select_fadd_fcmp_equiv2 (float %x , float %y , float %z ) {
723+ ; CHECK-LABEL: @select_fadd_fcmp_equiv2(
724+ ; CHECK-NEXT: [[A:%.*]] = fcmp une float [[X:%.*]], -1.000000e+00
725+ ; CHECK-NEXT: [[B:%.*]] = fadd nsz float [[Z:%.*]], -1.000000e+00
726+ ; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[B]]
727+ ; CHECK-NEXT: ret float [[C]]
728+ ;
729+ %A = fcmp une float %x , -1 .0
730+ %B = fadd nsz float %x , %z
731+ %C = select i1 %A , float %y , float %B
732+ ret float %C
733+ }
734+
723735; Invalid comparison type
724736define float @select_fadd_fcmp_bad_2 (float %x , float %y , float %z ) {
725737; CHECK-LABEL: @select_fadd_fcmp_bad_2(
@@ -893,24 +905,10 @@ define float @select_fadd_fcmp_bad_13(float %x, float %y, float %z) {
893905 ret float %C
894906}
895907
896- ; Invalid identity constant for FP op
897- define float @select_fadd_fcmp_bad_14 (float %x , float %y , float %z ) {
898- ; CHECK-LABEL: @select_fadd_fcmp_bad_14(
899- ; CHECK-NEXT: [[A:%.*]] = fcmp une float [[X:%.*]], -1.000000e+00
900- ; CHECK-NEXT: [[B:%.*]] = fadd nsz float [[X]], [[Z:%.*]]
901- ; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[Y:%.*]], float [[B]]
902- ; CHECK-NEXT: ret float [[C]]
903- ;
904- %A = fcmp une float %x , -1 .0
905- %B = fadd nsz float %x , %z
906- %C = select i1 %A , float %y , float %B
907- ret float %C
908- }
909-
910- define float @select_fmul_fcmp_bad (float %x , float %y , float %z ) {
911- ; CHECK-LABEL: @select_fmul_fcmp_bad(
908+ define float @select_fmul_fcmp_equiv (float %x , float %y , float %z ) {
909+ ; CHECK-LABEL: @select_fmul_fcmp_equiv(
912910; CHECK-NEXT: [[A:%.*]] = fcmp oeq float [[X:%.*]], 3.000000e+00
913- ; CHECK-NEXT: [[B:%.*]] = fmul nsz float [[X]], [[ Z:%.*]]
911+ ; CHECK-NEXT: [[B:%.*]] = fmul nsz float [[Z:%.*]], 3.000000e+00
914912; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]]
915913; CHECK-NEXT: ret float [[C]]
916914;
@@ -920,11 +918,10 @@ define float @select_fmul_fcmp_bad(float %x, float %y, float %z) {
920918 ret float %C
921919}
922920
923- define float @select_fmul_fcmp_bad_2 (float %x , float %y , float %z ) {
924- ; CHECK-LABEL: @select_fmul_fcmp_bad_2 (
921+ define float @select_fmul_fcmp_equiv2 (float %x , float %y , float %z ) {
922+ ; CHECK-LABEL: @select_fmul_fcmp_equiv2 (
925923; CHECK-NEXT: [[A:%.*]] = fcmp oeq float [[X:%.*]], 1.000000e+00
926- ; CHECK-NEXT: [[B:%.*]] = fmul float [[X]], [[Z:%.*]]
927- ; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]]
924+ ; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[B:%.*]], float [[Y:%.*]]
928925; CHECK-NEXT: ret float [[C]]
929926;
930927 %A = fcmp oeq float %x , 1 .0
@@ -959,10 +956,10 @@ define float @select_fmul_icmp_bad_2(float %x, float %y, float %z, i32 %k) {
959956 ret float %C
960957}
961958
962- define float @select_fdiv_fcmp_bad (float %x , float %y , float %z ) {
963- ; CHECK-LABEL: @select_fdiv_fcmp_bad (
959+ define float @select_fdiv_fcmp_equiv (float %x , float %y , float %z ) {
960+ ; CHECK-LABEL: @select_fdiv_fcmp_equiv (
964961; CHECK-NEXT: [[A:%.*]] = fcmp oeq float [[X:%.*]], 1.000000e+00
965- ; CHECK-NEXT: [[B:%.*]] = fdiv float [[X]] , [[Z:%.*]]
962+ ; CHECK-NEXT: [[B:%.*]] = fdiv float 1.000000e+00 , [[Z:%.*]]
966963; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]]
967964; CHECK-NEXT: ret float [[C]]
968965;
@@ -972,10 +969,10 @@ define float @select_fdiv_fcmp_bad(float %x, float %y, float %z) {
972969 ret float %C
973970}
974971
975- define float @select_fdiv_fcmp_bad_2 (float %x , float %y , float %z ) {
976- ; CHECK-LABEL: @select_fdiv_fcmp_bad_2 (
972+ define float @select_fdiv_fcmp_equiv2 (float %x , float %y , float %z ) {
973+ ; CHECK-LABEL: @select_fdiv_fcmp_equiv2 (
977974; CHECK-NEXT: [[A:%.*]] = fcmp oeq float [[X:%.*]], 3.000000e+00
978- ; CHECK-NEXT: [[B:%.*]] = fdiv nsz float [[X]] , [[Z:%.*]]
975+ ; CHECK-NEXT: [[B:%.*]] = fdiv nsz float 3.000000e+00 , [[Z:%.*]]
979976; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]]
980977; CHECK-NEXT: ret float [[C]]
981978;
@@ -1001,10 +998,10 @@ define float @select_fsub_fcmp_bad(float %x, float %y, float %z) {
1001998 ret float %C
1002999}
10031000
1004- define float @select_fsub_fcmp_bad_2 (float %x , float %y , float %z ) {
1005- ; CHECK-LABEL: @select_fsub_fcmp_bad_2 (
1001+ define float @select_fsub_fcmp_equiv (float %x , float %y , float %z ) {
1002+ ; CHECK-LABEL: @select_fsub_fcmp_equiv (
10061003; CHECK-NEXT: [[A:%.*]] = fcmp oeq float [[X:%.*]], 1.000000e+00
1007- ; CHECK-NEXT: [[B:%.*]] = fsub nsz float [[Z:%.*]], [[X]]
1004+ ; CHECK-NEXT: [[B:%.*]] = fadd nsz float [[Z:%.*]], -1.000000e+00
10081005; CHECK-NEXT: [[C:%.*]] = select i1 [[A]], float [[B]], float [[Y:%.*]]
10091006; CHECK-NEXT: ret float [[C]]
10101007;
0 commit comments