[ConstantFolding] Consolidate and extend bitcount intrinsic tests; NFC

Move constant folding tests into ConstantFolding/bitcount.ll and drop
various tests in other places. Add coverage for undefs.

llvm-svn: 349806
diff --git a/llvm/test/Analysis/ConstantFolding/bitcount.ll b/llvm/test/Analysis/ConstantFolding/bitcount.ll
new file mode 100644
index 0000000..5ef9b2e
--- /dev/null
+++ b/llvm/test/Analysis/ConstantFolding/bitcount.ll
@@ -0,0 +1,187 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -constprop -S | FileCheck %s
+
+declare i31 @llvm.ctpop.i31(i31 %val)
+declare i32 @llvm.cttz.i32(i32 %val, i1)
+declare i33 @llvm.ctlz.i33(i33 %val, i1)
+declare <2 x i31> @llvm.ctpop.v2i31(<2 x i31> %val)
+declare <2 x i32> @llvm.cttz.v2i32(<2 x i32> %val, i1)
+declare <2 x i33> @llvm.ctlz.v2i33(<2 x i33> %val, i1)
+
+define i31 @ctpop_const() {
+; CHECK-LABEL: @ctpop_const(
+; CHECK-NEXT:    ret i31 12
+;
+  %x = call i31 @llvm.ctpop.i31(i31 12415124)
+  ret i31 %x
+}
+
+define i32 @cttz_const() {
+; CHECK-LABEL: @cttz_const(
+; CHECK-NEXT:    ret i32 1
+;
+  %x = call i32 @llvm.cttz.i32(i32 87359874, i1 true)
+  ret i32 %x
+}
+
+define i33 @ctlz_const() {
+; CHECK-LABEL: @ctlz_const(
+; CHECK-NEXT:    ret i33 6
+;
+  %x = call i33 @llvm.ctlz.i33(i33 87359874, i1 true)
+  ret i33 %x
+}
+
+define i31 @ctpop_zero() {
+; CHECK-LABEL: @ctpop_zero(
+; CHECK-NEXT:    ret i31 0
+;
+  %x = call i31 @llvm.ctpop.i31(i31 0)
+  ret i31 %x
+}
+
+define i32 @cttz_zero_defined() {
+; CHECK-LABEL: @cttz_zero_defined(
+; CHECK-NEXT:    ret i32 32
+;
+  %x = call i32 @llvm.cttz.i32(i32 0, i1 false)
+  ret i32 %x
+}
+
+define i32 @cttz_zero_undefined() {
+; CHECK-LABEL: @cttz_zero_undefined(
+; CHECK-NEXT:    ret i32 undef
+;
+  %x = call i32 @llvm.cttz.i32(i32 0, i1 true)
+  ret i32 %x
+}
+
+define i33 @ctlz_zero_defined() {
+; CHECK-LABEL: @ctlz_zero_defined(
+; CHECK-NEXT:    ret i33 33
+;
+  %x = call i33 @llvm.ctlz.i33(i33 0, i1 false)
+  ret i33 %x
+}
+
+define i33 @ctlz_zero_undefined() {
+; CHECK-LABEL: @ctlz_zero_undefined(
+; CHECK-NEXT:    ret i33 undef
+;
+  %x = call i33 @llvm.ctlz.i33(i33 0, i1 true)
+  ret i33 %x
+}
+
+define i31 @ctpop_undef() {
+; CHECK-LABEL: @ctpop_undef(
+; CHECK-NEXT:    [[X:%.*]] = call i31 @llvm.ctpop.i31(i31 undef)
+; CHECK-NEXT:    ret i31 [[X]]
+;
+  %x = call i31 @llvm.ctpop.i31(i31 undef)
+  ret i31 %x
+}
+
+define i32 @cttz_undef_defined() {
+; CHECK-LABEL: @cttz_undef_defined(
+; CHECK-NEXT:    [[X:%.*]] = call i32 @llvm.cttz.i32(i32 undef, i1 false)
+; CHECK-NEXT:    ret i32 [[X]]
+;
+  %x = call i32 @llvm.cttz.i32(i32 undef, i1 false)
+  ret i32 %x
+}
+
+define i32 @cttz_undef_undefined() {
+; CHECK-LABEL: @cttz_undef_undefined(
+; CHECK-NEXT:    [[X:%.*]] = call i32 @llvm.cttz.i32(i32 undef, i1 true)
+; CHECK-NEXT:    ret i32 [[X]]
+;
+  %x = call i32 @llvm.cttz.i32(i32 undef, i1 true)
+  ret i32 %x
+}
+
+define i33 @ctlz_undef_defined() {
+; CHECK-LABEL: @ctlz_undef_defined(
+; CHECK-NEXT:    [[X:%.*]] = call i33 @llvm.ctlz.i33(i33 undef, i1 false)
+; CHECK-NEXT:    ret i33 [[X]]
+;
+  %x = call i33 @llvm.ctlz.i33(i33 undef, i1 false)
+  ret i33 %x
+}
+
+define i33 @ctlz_undef_undefined() {
+; CHECK-LABEL: @ctlz_undef_undefined(
+; CHECK-NEXT:    [[X:%.*]] = call i33 @llvm.ctlz.i33(i33 undef, i1 true)
+; CHECK-NEXT:    ret i33 [[X]]
+;
+  %x = call i33 @llvm.ctlz.i33(i33 undef, i1 true)
+  ret i33 %x
+}
+
+define <2 x i31> @ctpop_vector() {
+; CHECK-LABEL: @ctpop_vector(
+; CHECK-NEXT:    ret <2 x i31> <i31 8, i31 1>
+;
+  %x = call <2 x i31> @llvm.ctpop.v2i31(<2 x i31> <i31 255, i31 16>)
+  ret <2 x i31> %x
+}
+
+define <2 x i31> @ctpop_vector_undef() {
+; CHECK-LABEL: @ctpop_vector_undef(
+; CHECK-NEXT:    [[X:%.*]] = call <2 x i31> @llvm.ctpop.v2i31(<2 x i31> <i31 0, i31 undef>)
+; CHECK-NEXT:    ret <2 x i31> [[X]]
+;
+  %x = call <2 x i31> @llvm.ctpop.v2i31(<2 x i31> <i31 0, i31 undef>)
+  ret <2 x i31> %x
+}
+
+define <2 x i32> @cttz_vector() {
+; CHECK-LABEL: @cttz_vector(
+; CHECK-NEXT:    ret <2 x i32> <i32 0, i32 4>
+;
+  %x = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> <i32 255, i32 16>, i1 true)
+  ret <2 x i32> %x
+}
+
+define <2 x i32> @cttz_vector_undef_defined() {
+; CHECK-LABEL: @cttz_vector_undef_defined(
+; CHECK-NEXT:    [[X:%.*]] = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> <i32 0, i32 undef>, i1 false)
+; CHECK-NEXT:    ret <2 x i32> [[X]]
+;
+  %x = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> <i32 0, i32 undef>, i1 false)
+  ret <2 x i32> %x
+}
+
+define <2 x i32> @cttz_vector_undef_undefined() {
+; CHECK-LABEL: @cttz_vector_undef_undefined(
+; CHECK-NEXT:    [[X:%.*]] = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> <i32 0, i32 undef>, i1 true)
+; CHECK-NEXT:    ret <2 x i32> [[X]]
+;
+  %x = call <2 x i32> @llvm.cttz.v2i32(<2 x i32> <i32 0, i32 undef>, i1 true)
+  ret <2 x i32> %x
+}
+
+define <2 x i33> @ctlz_vector() {
+; CHECK-LABEL: @ctlz_vector(
+; CHECK-NEXT:    ret <2 x i33> <i33 25, i33 28>
+;
+  %x = call <2 x i33> @llvm.ctlz.v2i33(<2 x i33> <i33 255, i33 16>, i1 true)
+  ret <2 x i33> %x
+}
+
+define <2 x i33> @ctlz_vector_undef_defined() {
+; CHECK-LABEL: @ctlz_vector_undef_defined(
+; CHECK-NEXT:    [[X:%.*]] = call <2 x i33> @llvm.ctlz.v2i33(<2 x i33> <i33 0, i33 undef>, i1 false)
+; CHECK-NEXT:    ret <2 x i33> [[X]]
+;
+  %x = call <2 x i33> @llvm.ctlz.v2i33(<2 x i33> <i33 0, i33 undef>, i1 false)
+  ret <2 x i33> %x
+}
+
+define <2 x i33> @ctlz_vector_undef_undefined() {
+; CHECK-LABEL: @ctlz_vector_undef_undefined(
+; CHECK-NEXT:    [[X:%.*]] = call <2 x i33> @llvm.ctlz.v2i33(<2 x i33> <i33 0, i33 undef>, i1 true)
+; CHECK-NEXT:    ret <2 x i33> [[X]]
+;
+  %x = call <2 x i33> @llvm.ctlz.v2i33(<2 x i33> <i33 0, i33 undef>, i1 true)
+  ret <2 x i33> %x
+}