diff --git a/llvm/test/Transforms/InstCombine/fneg.ll b/llvm/test/Transforms/InstCombine/fneg.ll index b8df66ee74aa..2af1e6ea26b5 100644 --- a/llvm/test/Transforms/InstCombine/fneg.ll +++ b/llvm/test/Transforms/InstCombine/fneg.ll @@ -674,6 +674,58 @@ define float @select_fneg_false_nsz(float %x, float %y, i1 %b) { ret float %r } +define float @select_common_op_fneg_true(float %x, i1 %b) { +; CHECK-LABEL: @select_common_op_fneg_true( +; CHECK-NEXT: [[X_NEG:%.*]] = fneg nnan ninf nsz float [[X:%.*]] +; CHECK-NEXT: [[R:%.*]] = select nnan ninf i1 [[B:%.*]], float [[X_NEG]], float [[X]] +; CHECK-NEXT: ret float [[R]] +; + %nx = fneg float %x + %s = select i1 %b, float %x, float %nx + %r = fneg nsz ninf nnan float %s + ret float %r +} + +define float @select_common_op_fneg_false(float %x, i1 %b) { +; CHECK-LABEL: @select_common_op_fneg_false( +; CHECK-NEXT: [[X_NEG:%.*]] = fneg nnan ninf nsz float [[X:%.*]] +; CHECK-NEXT: [[R:%.*]] = select nnan ninf i1 [[B:%.*]], float [[X_NEG]], float [[X]] +; CHECK-NEXT: ret float [[R]] +; + %nx = fneg float %x + %s = select i1 %b, float %x, float %nx + %r = fneg nsz ninf nnan float %s + ret float %r +} + +define float @fabs(float %a) { +; CHECK-LABEL: @fabs( +; CHECK-NEXT: [[CMP:%.*]] = fcmp ogt float [[A:%.*]], 0.000000e+00 +; CHECK-NEXT: [[A_NEG:%.*]] = fneg nnan ninf nsz float [[A]] +; CHECK-NEXT: [[FNEG1:%.*]] = select nnan ninf i1 [[CMP]], float [[A]], float [[A_NEG]] +; CHECK-NEXT: ret float [[FNEG1]] +; + %fneg = fneg float %a + %cmp = fcmp ogt float %a, %fneg + %sel = select i1 %cmp, float %fneg, float %a + %fneg1 = fneg nnan ninf nsz float %sel + ret float %fneg1 +} + +define float @fnabs(float %a) { +; CHECK-LABEL: @fnabs( +; CHECK-NEXT: [[CMP:%.*]] = fcmp olt float [[A:%.*]], 0.000000e+00 +; CHECK-NEXT: [[A_NEG:%.*]] = fneg fast float [[A]] +; CHECK-NEXT: [[FNEG1:%.*]] = select reassoc nnan ninf arcp contract afn i1 [[CMP]], float [[A]], float [[A_NEG]] +; CHECK-NEXT: ret float [[FNEG1]] +; + %fneg = fneg float %a + %cmp = fcmp olt float %a, %fneg + %sel = select i1 %cmp, float %fneg, float %a + %fneg1 = fneg fast float %sel + ret float %fneg1 +} + define float @select_fneg_both(float %x, float %y, i1 %b) { ; CHECK-LABEL: @select_fneg_both( ; CHECK-NEXT: [[S_V:%.*]] = select i1 [[B:%.*]], float [[X:%.*]], float [[Y:%.*]]