From 9b19e58007c2a4a20a79add9d41f0eb5f5135aff Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 27 Feb 2019 16:18:29 +0000 Subject: [PATCH] [InstCombine] Add additional add.sat overflow tests; NFC Baseline for D58593. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@354996 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../InstCombine/saturating-add-sub.ll | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/test/Transforms/InstCombine/saturating-add-sub.ll b/test/Transforms/InstCombine/saturating-add-sub.ll index 3bc2c377efb..6f616bfe1ee 100644 --- a/test/Transforms/InstCombine/saturating-add-sub.ll +++ b/test/Transforms/InstCombine/saturating-add-sub.ll @@ -230,6 +230,50 @@ define <2 x i8> @test_vector_uadd_neg_nneg(<2 x i8> %a) { ret <2 x i8> %r } +define i8 @test_scalar_uadd_never_overflows(i8 %a) { +; CHECK-LABEL: @test_scalar_uadd_never_overflows( +; CHECK-NEXT: [[A_MASKED:%.*]] = and i8 [[A:%.*]], -127 +; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[A_MASKED]], i8 1) +; CHECK-NEXT: ret i8 [[R]] +; + %a_masked = and i8 %a, 129 + %r = call i8 @llvm.uadd.sat.i8(i8 %a_masked, i8 1) + ret i8 %r +} + +define <2 x i8> @test_vector_uadd_never_overflows(<2 x i8> %a) { +; CHECK-LABEL: @test_vector_uadd_never_overflows( +; CHECK-NEXT: [[A_MASKED:%.*]] = and <2 x i8> [[A:%.*]], +; CHECK-NEXT: [[R:%.*]] = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> [[A_MASKED]], <2 x i8> ) +; CHECK-NEXT: ret <2 x i8> [[R]] +; + %a_masked = and <2 x i8> %a, + %r = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> %a_masked, <2 x i8> ) + ret <2 x i8> %r +} + +define i8 @test_scalar_uadd_always_overflows(i8 %a) { +; CHECK-LABEL: @test_scalar_uadd_always_overflows( +; CHECK-NEXT: [[A_MASKED:%.*]] = or i8 [[A:%.*]], -64 +; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.uadd.sat.i8(i8 [[A_MASKED]], i8 64) +; CHECK-NEXT: ret i8 [[R]] +; + %a_masked = or i8 %a, 192 + %r = call i8 @llvm.uadd.sat.i8(i8 %a_masked, i8 64) + ret i8 %r +} + +define <2 x i8> @test_vector_uadd_always_overflows(<2 x i8> %a) { +; CHECK-LABEL: @test_vector_uadd_always_overflows( +; CHECK-NEXT: [[A_MASKED:%.*]] = or <2 x i8> [[A:%.*]], +; CHECK-NEXT: [[R:%.*]] = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> [[A_MASKED]], <2 x i8> ) +; CHECK-NEXT: ret <2 x i8> [[R]] +; + %a_masked = or <2 x i8> %a, + %r = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> %a_masked, <2 x i8> ) + ret <2 x i8> %r +} + ; neg sadd nneg never overflows. define i8 @test_scalar_sadd_neg_nneg(i8 %a) { ; CHECK-LABEL: @test_scalar_sadd_neg_nneg( @@ -568,6 +612,50 @@ define <2 x i8> @test_vector_usub_nneg_nneg(<2 x i8> %a) { ret <2 x i8> %r } +define i8 @test_scalar_usub_never_overflows(i8 %a) { +; CHECK-LABEL: @test_scalar_usub_never_overflows( +; CHECK-NEXT: [[A_MASKED:%.*]] = or i8 [[A:%.*]], 64 +; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[A_MASKED]], i8 10) +; CHECK-NEXT: ret i8 [[R]] +; + %a_masked = or i8 %a, 64 + %r = call i8 @llvm.usub.sat.i8(i8 %a_masked, i8 10) + ret i8 %r +} + +define <2 x i8> @test_vector_usub_never_overflows(<2 x i8> %a) { +; CHECK-LABEL: @test_vector_usub_never_overflows( +; CHECK-NEXT: [[A_MASKED:%.*]] = or <2 x i8> [[A:%.*]], +; CHECK-NEXT: [[R:%.*]] = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> [[A_MASKED]], <2 x i8> ) +; CHECK-NEXT: ret <2 x i8> [[R]] +; + %a_masked = or <2 x i8> %a, + %r = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> %a_masked, <2 x i8> ) + ret <2 x i8> %r +} + +define i8 @test_scalar_usub_always_overflows(i8 %a) { +; CHECK-LABEL: @test_scalar_usub_always_overflows( +; CHECK-NEXT: [[A_MASKED:%.*]] = and i8 [[A:%.*]], 64 +; CHECK-NEXT: [[R:%.*]] = call i8 @llvm.usub.sat.i8(i8 [[A_MASKED]], i8 100) +; CHECK-NEXT: ret i8 [[R]] +; + %a_masked = and i8 %a, 64 + %r = call i8 @llvm.usub.sat.i8(i8 %a_masked, i8 100) + ret i8 %r +} + +define <2 x i8> @test_vector_usub_always_overflows(<2 x i8> %a) { +; CHECK-LABEL: @test_vector_usub_always_overflows( +; CHECK-NEXT: [[A_MASKED:%.*]] = and <2 x i8> [[A:%.*]], +; CHECK-NEXT: [[R:%.*]] = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> [[A_MASKED]], <2 x i8> ) +; CHECK-NEXT: ret <2 x i8> [[R]] +; + %a_masked = and <2 x i8> %a, + %r = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> %a_masked, <2 x i8> ) + ret <2 x i8> %r +} + ; neg ssub neg never overflows. define i8 @test_scalar_ssub_neg_neg(i8 %a) { ; CHECK-LABEL: @test_scalar_ssub_neg_neg( -- 2.50.1