From 0ace13fe01a34c7e3aede0e2ec7954a690374e74 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 20 Dec 2018 19:46:35 +0000 Subject: [PATCH] [ConstantFolding] Add tests for sat add/sub with undefs; NFC llvm-svn: 349802 --- .../ConstantFolding/saturating-add-sub.ll | 218 ++++++++++++++++++ 1 file changed, 218 insertions(+) diff --git a/test/Analysis/ConstantFolding/saturating-add-sub.ll b/test/Analysis/ConstantFolding/saturating-add-sub.ll index 82fceb5e972..269bb9a15e4 100644 --- a/test/Analysis/ConstantFolding/saturating-add-sub.ll +++ b/test/Analysis/ConstantFolding/saturating-add-sub.ll @@ -170,3 +170,221 @@ define <2 x i8> @test_ssub_vector_sat_neg(<2 x i8> %a) { %x = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> , <2 x i8> ) ret <2 x i8> %x } + +; Tests for undef handling + +define i8 @test_uadd_scalar_both_undef() { +; CHECK-LABEL: @test_uadd_scalar_both_undef( +; CHECK-NEXT: [[X:%.*]] = call i8 @llvm.uadd.sat.i8(i8 undef, i8 undef) +; CHECK-NEXT: ret i8 [[X]] +; + %x = call i8 @llvm.uadd.sat.i8(i8 undef, i8 undef) + ret i8 %x +} + +define i8 @test_sadd_scalar_both_undef() { +; CHECK-LABEL: @test_sadd_scalar_both_undef( +; CHECK-NEXT: [[X:%.*]] = call i8 @llvm.sadd.sat.i8(i8 undef, i8 undef) +; CHECK-NEXT: ret i8 [[X]] +; + %x = call i8 @llvm.sadd.sat.i8(i8 undef, i8 undef) + ret i8 %x +} + +define i8 @test_usub_scalar_both_undef() { +; CHECK-LABEL: @test_usub_scalar_both_undef( +; CHECK-NEXT: [[X:%.*]] = call i8 @llvm.usub.sat.i8(i8 undef, i8 undef) +; CHECK-NEXT: ret i8 [[X]] +; + %x = call i8 @llvm.usub.sat.i8(i8 undef, i8 undef) + ret i8 %x +} + +define i8 @test_ssub_scalar_both_undef() { +; CHECK-LABEL: @test_ssub_scalar_both_undef( +; CHECK-NEXT: [[X:%.*]] = call i8 @llvm.ssub.sat.i8(i8 undef, i8 undef) +; CHECK-NEXT: ret i8 [[X]] +; + %x = call i8 @llvm.ssub.sat.i8(i8 undef, i8 undef) + ret i8 %x +} + +define i8 @test_uadd_scalar_op2_undef() { +; CHECK-LABEL: @test_uadd_scalar_op2_undef( +; CHECK-NEXT: [[X:%.*]] = call i8 @llvm.uadd.sat.i8(i8 10, i8 undef) +; CHECK-NEXT: ret i8 [[X]] +; + %x = call i8 @llvm.uadd.sat.i8(i8 10, i8 undef) + ret i8 %x +} + +define i8 @test_sadd_scalar_op1_undef() { +; CHECK-LABEL: @test_sadd_scalar_op1_undef( +; CHECK-NEXT: [[X:%.*]] = call i8 @llvm.sadd.sat.i8(i8 undef, i8 10) +; CHECK-NEXT: ret i8 [[X]] +; + %x = call i8 @llvm.sadd.sat.i8(i8 undef, i8 10) + ret i8 %x +} + +define i8 @test_usub_scalar_op2_undef() { +; CHECK-LABEL: @test_usub_scalar_op2_undef( +; CHECK-NEXT: [[X:%.*]] = call i8 @llvm.usub.sat.i8(i8 10, i8 undef) +; CHECK-NEXT: ret i8 [[X]] +; + %x = call i8 @llvm.usub.sat.i8(i8 10, i8 undef) + ret i8 %x +} + +define i8 @test_usub_scalar_op1_undef() { +; CHECK-LABEL: @test_usub_scalar_op1_undef( +; CHECK-NEXT: [[X:%.*]] = call i8 @llvm.usub.sat.i8(i8 undef, i8 10) +; CHECK-NEXT: ret i8 [[X]] +; + %x = call i8 @llvm.usub.sat.i8(i8 undef, i8 10) + ret i8 %x +} + +define <2 x i8> @test_uadd_vector_both_undef_splat() { +; CHECK-LABEL: @test_uadd_vector_both_undef_splat( +; CHECK-NEXT: [[X:%.*]] = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> undef, <2 x i8> undef) +; CHECK-NEXT: ret <2 x i8> [[X]] +; + %x = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> undef, <2 x i8> undef) + ret <2 x i8> %x +} + +define <2 x i8> @test_sadd_vector_both_undef_splat() { +; CHECK-LABEL: @test_sadd_vector_both_undef_splat( +; CHECK-NEXT: [[X:%.*]] = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> undef, <2 x i8> undef) +; CHECK-NEXT: ret <2 x i8> [[X]] +; + %x = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> undef, <2 x i8> undef) + ret <2 x i8> %x +} + +define <2 x i8> @test_usub_vector_both_undef_splat() { +; CHECK-LABEL: @test_usub_vector_both_undef_splat( +; CHECK-NEXT: [[X:%.*]] = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> undef, <2 x i8> undef) +; CHECK-NEXT: ret <2 x i8> [[X]] +; + %x = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> undef, <2 x i8> undef) + ret <2 x i8> %x +} + +define <2 x i8> @test_ssub_vector_both_undef_splat() { +; CHECK-LABEL: @test_ssub_vector_both_undef_splat( +; CHECK-NEXT: [[X:%.*]] = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> undef, <2 x i8> undef) +; CHECK-NEXT: ret <2 x i8> [[X]] +; + %x = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> undef, <2 x i8> undef) + ret <2 x i8> %x +} + +define <2 x i8> @test_uadd_vector_op2_undef_splat() { +; CHECK-LABEL: @test_uadd_vector_op2_undef_splat( +; CHECK-NEXT: [[X:%.*]] = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> , <2 x i8> undef) +; CHECK-NEXT: ret <2 x i8> [[X]] +; + %x = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> , <2 x i8> undef) + ret <2 x i8> %x +} + +define <2 x i8> @test_sadd_vector_op1_undef_splat() { +; CHECK-LABEL: @test_sadd_vector_op1_undef_splat( +; CHECK-NEXT: [[X:%.*]] = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> undef, <2 x i8> ) +; CHECK-NEXT: ret <2 x i8> [[X]] +; + %x = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> undef, <2 x i8> ) + ret <2 x i8> %x +} + +define <2 x i8> @test_usub_vector_op2_undef_splat() { +; CHECK-LABEL: @test_usub_vector_op2_undef_splat( +; CHECK-NEXT: [[X:%.*]] = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> , <2 x i8> undef) +; CHECK-NEXT: ret <2 x i8> [[X]] +; + %x = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> , <2 x i8> undef) + ret <2 x i8> %x +} + +define <2 x i8> @test_ssub_vector_op1_undef_splat() { +; CHECK-LABEL: @test_ssub_vector_op1_undef_splat( +; CHECK-NEXT: [[X:%.*]] = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> undef, <2 x i8> ) +; CHECK-NEXT: ret <2 x i8> [[X]] +; + %x = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> undef, <2 x i8> ) + ret <2 x i8> %x +} + +define <2 x i8> @test_uadd_vector_op2_undef_mix1() { +; CHECK-LABEL: @test_uadd_vector_op2_undef_mix1( +; CHECK-NEXT: [[X:%.*]] = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> , <2 x i8> ) +; CHECK-NEXT: ret <2 x i8> [[X]] +; + %x = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> , <2 x i8> ) + ret <2 x i8> %x +} + +define <2 x i8> @test_uadd_vector_op2_undef_mix2() { +; CHECK-LABEL: @test_uadd_vector_op2_undef_mix2( +; CHECK-NEXT: [[X:%.*]] = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> , <2 x i8> ) +; CHECK-NEXT: ret <2 x i8> [[X]] +; + %x = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> , <2 x i8> ) + ret <2 x i8> %x +} + +define <2 x i8> @test_sadd_vector_op1_undef_mix1() { +; CHECK-LABEL: @test_sadd_vector_op1_undef_mix1( +; CHECK-NEXT: [[X:%.*]] = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> , <2 x i8> ) +; CHECK-NEXT: ret <2 x i8> [[X]] +; + %x = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> , <2 x i8> ) + ret <2 x i8> %x +} + +define <2 x i8> @test_sadd_vector_op1_undef_mix2() { +; CHECK-LABEL: @test_sadd_vector_op1_undef_mix2( +; CHECK-NEXT: [[X:%.*]] = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> , <2 x i8> ) +; CHECK-NEXT: ret <2 x i8> [[X]] +; + %x = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> , <2 x i8> ) + ret <2 x i8> %x +} + +define <2 x i8> @test_usub_vector_op2_undef_mix1() { +; CHECK-LABEL: @test_usub_vector_op2_undef_mix1( +; CHECK-NEXT: [[X:%.*]] = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> , <2 x i8> ) +; CHECK-NEXT: ret <2 x i8> [[X]] +; + %x = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> , <2 x i8> ) + ret <2 x i8> %x +} + +define <2 x i8> @test_usub_vector_op2_undef_mix2() { +; CHECK-LABEL: @test_usub_vector_op2_undef_mix2( +; CHECK-NEXT: [[X:%.*]] = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> , <2 x i8> ) +; CHECK-NEXT: ret <2 x i8> [[X]] +; + %x = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> , <2 x i8> ) + ret <2 x i8> %x +} + +define <2 x i8> @test_ssub_vector_op1_undef_mix1() { +; CHECK-LABEL: @test_ssub_vector_op1_undef_mix1( +; CHECK-NEXT: [[X:%.*]] = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> , <2 x i8> ) +; CHECK-NEXT: ret <2 x i8> [[X]] +; + %x = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> , <2 x i8> ) + ret <2 x i8> %x +} + +define <2 x i8> @test_ssub_vector_op1_undef_mix2() { +; CHECK-LABEL: @test_ssub_vector_op1_undef_mix2( +; CHECK-NEXT: [[X:%.*]] = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> , <2 x i8> ) +; CHECK-NEXT: ret <2 x i8> [[X]] +; + %x = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> , <2 x i8> ) + ret <2 x i8> %x +}