diff options
author | Jay Foad <jay.foad@gmail.com> | 2019-10-21 15:01:59 +0000 |
---|---|---|
committer | Jay Foad <jay.foad@gmail.com> | 2019-10-21 15:01:59 +0000 |
commit | 609dfcbda9c6f4c5654baca8a24659e6079935f8 (patch) | |
tree | 96c76f2a622d9426b30a6a8dc320be634ce2435d | |
parent | 3edb41654650d5d0ad02e5f6af3c187cf0c59fd0 (diff) | |
download | bcm5719-llvm-609dfcbda9c6f4c5654baca8a24659e6079935f8.tar.gz bcm5719-llvm-609dfcbda9c6f4c5654baca8a24659e6079935f8.zip |
Pre-commit test cases for D64713.
llvm-svn: 375418
-rw-r--r-- | llvm/test/Transforms/InstCombine/fmul.ll | 50 | ||||
-rw-r--r-- | llvm/test/Transforms/InstCombine/mul.ll | 14 |
2 files changed, 64 insertions, 0 deletions
diff --git a/llvm/test/Transforms/InstCombine/fmul.ll b/llvm/test/Transforms/InstCombine/fmul.ll index d53062aa577..adc9381631a 100644 --- a/llvm/test/Transforms/InstCombine/fmul.ll +++ b/llvm/test/Transforms/InstCombine/fmul.ll @@ -1069,3 +1069,53 @@ define <2 x double> @negate_if_true_wrong_constant(<2 x double> %px, i1 %cond) { %r = fmul <2 x double> %x, %sel ret <2 x double> %r } + +; X *fast (C ? 1.0 : 0.0) -> C ? X : 0.0 +define float @fmul_select(float %x, i1 %c) { +; CHECK-LABEL: @fmul_select( +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], float 1.000000e+00, float 0.000000e+00 +; CHECK-NEXT: [[MUL:%.*]] = fmul fast float [[SEL]], [[X:%.*]] +; CHECK-NEXT: ret float [[MUL]] +; + %sel = select i1 %c, float 1.0, float 0.0 + %mul = fmul fast float %sel, %x + ret float %mul +} + +; X *fast (C ? 1.0 : 0.0) -> C ? X : 0.0 +define <2 x float> @fmul_select_vec(<2 x float> %x, i1 %c) { +; CHECK-LABEL: @fmul_select_vec( +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], <2 x float> <float 1.000000e+00, float 1.000000e+00>, <2 x float> zeroinitializer +; CHECK-NEXT: [[MUL:%.*]] = fmul fast <2 x float> [[SEL]], [[X:%.*]] +; CHECK-NEXT: ret <2 x float> [[MUL]] +; + %sel = select i1 %c, <2 x float> <float 1.0, float 1.0>, <2 x float> zeroinitializer + %mul = fmul fast <2 x float> %sel, %x + ret <2 x float> %mul +} + +; Without fast math flags we can't optimize X * (C ? 1.0 : 0.0) -> C ? X : 0.0 +define float @fmul_select_strict(float %x, i1 %c) { +; CHECK-LABEL: @fmul_select_strict( +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], float 1.000000e+00, float 0.000000e+00 +; CHECK-NEXT: [[MUL:%.*]] = fmul float [[SEL]], [[X:%.*]] +; CHECK-NEXT: ret float [[MUL]] +; + %sel = select i1 %c, float 1.0, float 0.0 + %mul = fmul float %sel, %x + ret float %mul +} + +; sqrt(X) *fast (C ? sqrt(X) : 1.0) -> C ? X : sqrt(X) +define double @fmul_sqrt_select(double %x, i1 %c) { +; CHECK-LABEL: @fmul_sqrt_select( +; CHECK-NEXT: [[SQR:%.*]] = call double @llvm.sqrt.f64(double [[X:%.*]]) +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], double [[SQR]], double 1.000000e+00 +; CHECK-NEXT: [[MUL:%.*]] = fmul fast double [[SQR]], [[SEL]] +; CHECK-NEXT: ret double [[MUL]] +; + %sqr = call double @llvm.sqrt.f64(double %x) + %sel = select i1 %c, double %sqr, double 1.0 + %mul = fmul fast double %sqr, %sel + ret double %mul +} diff --git a/llvm/test/Transforms/InstCombine/mul.ll b/llvm/test/Transforms/InstCombine/mul.ll index f106026762b..5064bbae71d 100644 --- a/llvm/test/Transforms/InstCombine/mul.ll +++ b/llvm/test/Transforms/InstCombine/mul.ll @@ -595,3 +595,17 @@ define <2 x i8> @negate_if_true_wrong_constant(<2 x i8> %px, i1 %cond) { %r = mul <2 x i8> %x, %sel ret <2 x i8> %r } + +; (C ? (X /exact Y) : 1) * Y -> C ? X : Y +define i32 @mul_div_select(i32 %x, i32 %y, i1 %c) { +; CHECK-LABEL: @mul_div_select( +; CHECK-NEXT: [[DIV:%.*]] = udiv exact i32 [[X:%.*]], [[Y:%.*]] +; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], i32 [[DIV]], i32 1 +; CHECK-NEXT: [[MUL:%.*]] = mul i32 [[SEL]], [[Y]] +; CHECK-NEXT: ret i32 [[MUL]] +; + %div = udiv exact i32 %x, %y + %sel = select i1 %c, i32 %div, i32 1 + %mul = mul i32 %sel, %y + ret i32 %mul +} |