[llvm] 792f8e1 - [SVE] Take constant fold fast path for splatted vscale vectors

Christopher Tetreault via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 17 12:45:55 PST 2020


Author: Christopher Tetreault
Date: 2020-11-17T12:45:31-08:00
New Revision: 792f8e1114afa7f40227eee2820c6e425ee07c3b

URL: https://github.com/llvm/llvm-project/commit/792f8e1114afa7f40227eee2820c6e425ee07c3b
DIFF: https://github.com/llvm/llvm-project/commit/792f8e1114afa7f40227eee2820c6e425ee07c3b.diff

LOG: [SVE] Take constant fold fast path for splatted vscale vectors

This should be a perfectly reasonable operation for scalable vectors.
Currently, it only works for zeroinitializer values of
ScalableVectorType, but the fundamental operation is sound and it should
be possible to make it work for other splats

Reviewed By: david-arm

Differential Revision: https://reviews.llvm.org/D77442

Added: 
    llvm/test/Transforms/InstSimplify/cmp-vec-fast-path.ll

Modified: 
    llvm/lib/IR/ConstantFold.cpp
    llvm/test/Transforms/InstSimplify/ConstProp/vscale.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/IR/ConstantFold.cpp b/llvm/lib/IR/ConstantFold.cpp
index 968742b599be..b8502673a829 100644
--- a/llvm/lib/IR/ConstantFold.cpp
+++ b/llvm/lib/IR/ConstantFold.cpp
@@ -2042,11 +2042,6 @@ Constant *llvm::ConstantFoldCompareInstruction(unsigned short pred,
     }
   } else if (auto *C1VTy = dyn_cast<VectorType>(C1->getType())) {
 
-    // Do not iterate on scalable vector. The number of elements is unknown at
-    // compile-time.
-    if (isa<ScalableVectorType>(C1VTy))
-      return nullptr;
-
     // Fast path for splatted constants.
     if (Constant *C1Splat = C1->getSplatValue())
       if (Constant *C2Splat = C2->getSplatValue())
@@ -2054,6 +2049,11 @@ Constant *llvm::ConstantFoldCompareInstruction(unsigned short pred,
             C1VTy->getElementCount(),
             ConstantExpr::getCompare(pred, C1Splat, C2Splat));
 
+    // Do not iterate on scalable vector. The number of elements is unknown at
+    // compile-time.
+    if (isa<ScalableVectorType>(C1VTy))
+      return nullptr;
+
     // If we can constant fold the comparison of each element, constant fold
     // the whole vector comparison.
     SmallVector<Constant*, 4> ResElts;

diff  --git a/llvm/test/Transforms/InstSimplify/ConstProp/vscale.ll b/llvm/test/Transforms/InstSimplify/ConstProp/vscale.ll
index 1da77358ede7..66e4c93e1968 100644
--- a/llvm/test/Transforms/InstSimplify/ConstProp/vscale.ll
+++ b/llvm/test/Transforms/InstSimplify/ConstProp/vscale.ll
@@ -208,7 +208,7 @@ define <vscale x 4 x i32> @shufflevector() {
 
 define <vscale x 2 x double> @load() {
 ; CHECK-LABEL: @load(
-; CHECK-NEXT:    [[R:%.*]] = load <vscale x 2 x double>, <vscale x 2 x double>* getelementptr (<vscale x 2 x double>, <vscale x 2 x double>* null, i64 1)
+; CHECK-NEXT:    [[R:%.*]] = load <vscale x 2 x double>, <vscale x 2 x double>* getelementptr (<vscale x 2 x double>, <vscale x 2 x double>* null, i64 1), align 16
 ; CHECK-NEXT:    ret <vscale x 2 x double> [[R]]
 ;
   %r = load <vscale x 2 x double>, <vscale x 2 x double>* getelementptr (<vscale x 2 x double>, <vscale x 2 x double>* null, i64 1)
@@ -262,7 +262,7 @@ define <vscale x 4 x i1> @icmp_undef() {
 
 define <vscale x 4 x i1> @icmp_zero() {
 ; CHECK-LABEL: @icmp_zero(
-; CHECK-NEXT:    ret <vscale x 4 x i1> icmp eq (<vscale x 4 x i32> zeroinitializer, <vscale x 4 x i32> zeroinitializer)
+; CHECK-NEXT:    ret <vscale x 4 x i1> shufflevector (<vscale x 4 x i1> insertelement (<vscale x 4 x i1> undef, i1 true, i32 0), <vscale x 4 x i1> undef, <vscale x 4 x i32> zeroinitializer)
 ;
   %r = icmp eq <vscale x 4 x i32> zeroinitializer, zeroinitializer
   ret <vscale x 4 x i1> %r

diff  --git a/llvm/test/Transforms/InstSimplify/cmp-vec-fast-path.ll b/llvm/test/Transforms/InstSimplify/cmp-vec-fast-path.ll
new file mode 100644
index 000000000000..ab315fe26336
--- /dev/null
+++ b/llvm/test/Transforms/InstSimplify/cmp-vec-fast-path.ll
@@ -0,0 +1,837 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; Check that cmp's of scalable vector splats are simplified
+
+; RUN: opt -instsimplify -S < %s | FileCheck %s
+
+define <2 x i1> @i32cmp_eq_fixed_zero() {
+; CHECK-LABEL: @i32cmp_eq_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = icmp eq <2 x i32> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @i32cmp_eq_scalable_zero() {
+; CHECK-LABEL: @i32cmp_eq_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = icmp eq <vscale x 2 x i32> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @i32cmp_eq_fixed_one() {
+; CHECK-LABEL: @i32cmp_eq_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = icmp eq <2 x i32> <i32 1, i32 1>, <i32 1, i32 1>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @i32cmp_eq_scalable_one() {
+; CHECK-LABEL: @i32cmp_eq_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = icmp eq <vscale x 2 x i32> shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> undef, i32 1, i32 0), <vscale x 2 x i32> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> undef, i32 1, i32 0), <vscale x 2 x i32> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @i32cmp_ne_fixed_zero() {
+; CHECK-LABEL: @i32cmp_ne_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = icmp ne <2 x i32> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @i32cmp_ne_scalable_zero() {
+; CHECK-LABEL: @i32cmp_ne_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = icmp ne <vscale x 2 x i32> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @i32cmp_ne_fixed_one() {
+; CHECK-LABEL: @i32cmp_ne_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = icmp ne <2 x i32> <i32 1, i32 1>, <i32 1, i32 1>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @i32cmp_ne_scalable_one() {
+; CHECK-LABEL: @i32cmp_ne_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = icmp ne <vscale x 2 x i32> shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> undef, i32 1, i32 0), <vscale x 2 x i32> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> undef, i32 1, i32 0), <vscale x 2 x i32> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @i32cmp_ugt_fixed_zero() {
+; CHECK-LABEL: @i32cmp_ugt_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = icmp ugt <2 x i32> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @i32cmp_ugt_scalable_zero() {
+; CHECK-LABEL: @i32cmp_ugt_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = icmp ugt <vscale x 2 x i32> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @i32cmp_ugt_fixed_one() {
+; CHECK-LABEL: @i32cmp_ugt_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = icmp ugt <2 x i32> <i32 1, i32 1>, <i32 1, i32 1>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @i32cmp_ugt_scalable_one() {
+; CHECK-LABEL: @i32cmp_ugt_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = icmp ugt <vscale x 2 x i32> shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> undef, i32 1, i32 0), <vscale x 2 x i32> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> undef, i32 1, i32 0), <vscale x 2 x i32> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @i32cmp_uge_fixed_zero() {
+; CHECK-LABEL: @i32cmp_uge_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = icmp uge <2 x i32> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @i32cmp_uge_scalable_zero() {
+; CHECK-LABEL: @i32cmp_uge_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = icmp uge <vscale x 2 x i32> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @i32cmp_uge_fixed_one() {
+; CHECK-LABEL: @i32cmp_uge_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = icmp uge <2 x i32> <i32 1, i32 1>, <i32 1, i32 1>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @i32cmp_uge_scalable_one() {
+; CHECK-LABEL: @i32cmp_uge_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = icmp uge <vscale x 2 x i32> shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> undef, i32 1, i32 0), <vscale x 2 x i32> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> undef, i32 1, i32 0), <vscale x 2 x i32> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @i32cmp_ult_fixed_zero() {
+; CHECK-LABEL: @i32cmp_ult_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = icmp ult <2 x i32> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @i32cmp_ult_scalable_zero() {
+; CHECK-LABEL: @i32cmp_ult_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = icmp ult <vscale x 2 x i32> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @i32cmp_ult_fixed_one() {
+; CHECK-LABEL: @i32cmp_ult_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = icmp ult <2 x i32> <i32 1, i32 1>, <i32 1, i32 1>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @i32cmp_ult_scalable_one() {
+; CHECK-LABEL: @i32cmp_ult_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = icmp ult <vscale x 2 x i32> shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> undef, i32 1, i32 0), <vscale x 2 x i32> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> undef, i32 1, i32 0), <vscale x 2 x i32> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @i32cmp_ule_fixed_zero() {
+; CHECK-LABEL: @i32cmp_ule_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = icmp ule <2 x i32> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @i32cmp_ule_scalable_zero() {
+; CHECK-LABEL: @i32cmp_ule_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = icmp ule <vscale x 2 x i32> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @i32cmp_ule_fixed_one() {
+; CHECK-LABEL: @i32cmp_ule_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = icmp ule <2 x i32> <i32 1, i32 1>, <i32 1, i32 1>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @i32cmp_ule_scalable_one() {
+; CHECK-LABEL: @i32cmp_ule_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = icmp ule <vscale x 2 x i32> shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> undef, i32 1, i32 0), <vscale x 2 x i32> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> undef, i32 1, i32 0), <vscale x 2 x i32> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @i32cmp_sgt_fixed_zero() {
+; CHECK-LABEL: @i32cmp_sgt_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = icmp sgt <2 x i32> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @i32cmp_sgt_scalable_zero() {
+; CHECK-LABEL: @i32cmp_sgt_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = icmp sgt <vscale x 2 x i32> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @i32cmp_sgt_fixed_one() {
+; CHECK-LABEL: @i32cmp_sgt_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = icmp sgt <2 x i32> <i32 1, i32 1>, <i32 1, i32 1>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @i32cmp_sgt_scalable_one() {
+; CHECK-LABEL: @i32cmp_sgt_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = icmp sgt <vscale x 2 x i32> shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> undef, i32 1, i32 0), <vscale x 2 x i32> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> undef, i32 1, i32 0), <vscale x 2 x i32> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @i32cmp_sge_fixed_zero() {
+; CHECK-LABEL: @i32cmp_sge_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = icmp sge <2 x i32> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @i32cmp_sge_scalable_zero() {
+; CHECK-LABEL: @i32cmp_sge_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = icmp sge <vscale x 2 x i32> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @i32cmp_sge_fixed_one() {
+; CHECK-LABEL: @i32cmp_sge_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = icmp sge <2 x i32> <i32 1, i32 1>, <i32 1, i32 1>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @i32cmp_sge_scalable_one() {
+; CHECK-LABEL: @i32cmp_sge_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = icmp sge <vscale x 2 x i32> shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> undef, i32 1, i32 0), <vscale x 2 x i32> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> undef, i32 1, i32 0), <vscale x 2 x i32> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @i32cmp_slt_fixed_zero() {
+; CHECK-LABEL: @i32cmp_slt_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = icmp slt <2 x i32> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @i32cmp_slt_scalable_zero() {
+; CHECK-LABEL: @i32cmp_slt_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = icmp slt <vscale x 2 x i32> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @i32cmp_slt_fixed_one() {
+; CHECK-LABEL: @i32cmp_slt_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = icmp slt <2 x i32> <i32 1, i32 1>, <i32 1, i32 1>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @i32cmp_slt_scalable_one() {
+; CHECK-LABEL: @i32cmp_slt_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = icmp slt <vscale x 2 x i32> shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> undef, i32 1, i32 0), <vscale x 2 x i32> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> undef, i32 1, i32 0), <vscale x 2 x i32> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @i32cmp_sle_fixed_zero() {
+; CHECK-LABEL: @i32cmp_sle_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = icmp sle <2 x i32> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @i32cmp_sle_scalable_zero() {
+; CHECK-LABEL: @i32cmp_sle_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = icmp sle <vscale x 2 x i32> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @i32cmp_sle_fixed_one() {
+; CHECK-LABEL: @i32cmp_sle_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = icmp sle <2 x i32> <i32 1, i32 1>, <i32 1, i32 1>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @i32cmp_sle_scalable_one() {
+; CHECK-LABEL: @i32cmp_sle_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = icmp sle <vscale x 2 x i32> shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> undef, i32 1, i32 0), <vscale x 2 x i32> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x i32> insertelement (<vscale x 2 x i32> undef, i32 1, i32 0), <vscale x 2 x i32> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_false_fixed_zero() {
+; CHECK-LABEL: @floatcmp_false_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = fcmp false <2 x float> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_false_scalable_zero() {
+; CHECK-LABEL: @floatcmp_false_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = fcmp false <vscale x 2 x float> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_false_fixed_one() {
+; CHECK-LABEL: @floatcmp_false_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = fcmp false <2 x float> <float 1.0, float 1.0>, <float 1.0, float 1.0>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_false_scalable_one() {
+; CHECK-LABEL: @floatcmp_false_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = fcmp false <vscale x 2 x float> shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_oeq_fixed_zero() {
+; CHECK-LABEL: @floatcmp_oeq_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = fcmp oeq <2 x float> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_oeq_scalable_zero() {
+; CHECK-LABEL: @floatcmp_oeq_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = fcmp oeq <vscale x 2 x float> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_oeq_fixed_one() {
+; CHECK-LABEL: @floatcmp_oeq_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = fcmp oeq <2 x float> <float 1.0, float 1.0>, <float 1.0, float 1.0>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_oeq_scalable_one() {
+; CHECK-LABEL: @floatcmp_oeq_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = fcmp oeq <vscale x 2 x float> shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_ogt_fixed_zero() {
+; CHECK-LABEL: @floatcmp_ogt_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = fcmp ogt <2 x float> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_ogt_scalable_zero() {
+; CHECK-LABEL: @floatcmp_ogt_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = fcmp ogt <vscale x 2 x float> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_ogt_fixed_one() {
+; CHECK-LABEL: @floatcmp_ogt_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = fcmp ogt <2 x float> <float 1.0, float 1.0>, <float 1.0, float 1.0>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_ogt_scalable_one() {
+; CHECK-LABEL: @floatcmp_ogt_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = fcmp ogt <vscale x 2 x float> shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_oge_fixed_zero() {
+; CHECK-LABEL: @floatcmp_oge_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = fcmp oge <2 x float> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_oge_scalable_zero() {
+; CHECK-LABEL: @floatcmp_oge_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = fcmp oge <vscale x 2 x float> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_oge_fixed_one() {
+; CHECK-LABEL: @floatcmp_oge_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = fcmp oge <2 x float> <float 1.0, float 1.0>, <float 1.0, float 1.0>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_oge_scalable_one() {
+; CHECK-LABEL: @floatcmp_oge_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = fcmp oge <vscale x 2 x float> shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_olt_fixed_zero() {
+; CHECK-LABEL: @floatcmp_olt_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = fcmp olt <2 x float> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_olt_scalable_zero() {
+; CHECK-LABEL: @floatcmp_olt_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = fcmp olt <vscale x 2 x float> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_olt_fixed_one() {
+; CHECK-LABEL: @floatcmp_olt_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = fcmp olt <2 x float> <float 1.0, float 1.0>, <float 1.0, float 1.0>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_olt_scalable_one() {
+; CHECK-LABEL: @floatcmp_olt_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = fcmp olt <vscale x 2 x float> shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_ole_fixed_zero() {
+; CHECK-LABEL: @floatcmp_ole_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = fcmp ole <2 x float> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_ole_scalable_zero() {
+; CHECK-LABEL: @floatcmp_ole_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = fcmp ole <vscale x 2 x float> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_ole_fixed_one() {
+; CHECK-LABEL: @floatcmp_ole_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = fcmp ole <2 x float> <float 1.0, float 1.0>, <float 1.0, float 1.0>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_ole_scalable_one() {
+; CHECK-LABEL: @floatcmp_ole_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = fcmp ole <vscale x 2 x float> shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_one_fixed_zero() {
+; CHECK-LABEL: @floatcmp_one_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = fcmp one <2 x float> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_one_scalable_zero() {
+; CHECK-LABEL: @floatcmp_one_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = fcmp one <vscale x 2 x float> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_one_fixed_one() {
+; CHECK-LABEL: @floatcmp_one_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = fcmp one <2 x float> <float 1.0, float 1.0>, <float 1.0, float 1.0>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_one_scalable_one() {
+; CHECK-LABEL: @floatcmp_one_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = fcmp one <vscale x 2 x float> shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_ord_fixed_zero() {
+; CHECK-LABEL: @floatcmp_ord_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = fcmp ord <2 x float> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_ord_scalable_zero() {
+; CHECK-LABEL: @floatcmp_ord_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = fcmp ord <vscale x 2 x float> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_ord_fixed_one() {
+; CHECK-LABEL: @floatcmp_ord_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = fcmp ord <2 x float> <float 1.0, float 1.0>, <float 1.0, float 1.0>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_ord_scalable_one() {
+; CHECK-LABEL: @floatcmp_ord_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = fcmp ord <vscale x 2 x float> shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_ueq_fixed_zero() {
+; CHECK-LABEL: @floatcmp_ueq_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = fcmp ueq <2 x float> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_ueq_scalable_zero() {
+; CHECK-LABEL: @floatcmp_ueq_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = fcmp ueq <vscale x 2 x float> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_ueq_fixed_one() {
+; CHECK-LABEL: @floatcmp_ueq_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = fcmp ueq <2 x float> <float 1.0, float 1.0>, <float 1.0, float 1.0>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_ueq_scalable_one() {
+; CHECK-LABEL: @floatcmp_ueq_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = fcmp ueq <vscale x 2 x float> shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_ugt_fixed_zero() {
+; CHECK-LABEL: @floatcmp_ugt_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = fcmp ugt <2 x float> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_ugt_scalable_zero() {
+; CHECK-LABEL: @floatcmp_ugt_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = fcmp ugt <vscale x 2 x float> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_ugt_fixed_one() {
+; CHECK-LABEL: @floatcmp_ugt_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = fcmp ugt <2 x float> <float 1.0, float 1.0>, <float 1.0, float 1.0>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_ugt_scalable_one() {
+; CHECK-LABEL: @floatcmp_ugt_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = fcmp ugt <vscale x 2 x float> shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_uge_fixed_zero() {
+; CHECK-LABEL: @floatcmp_uge_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = fcmp uge <2 x float> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_uge_scalable_zero() {
+; CHECK-LABEL: @floatcmp_uge_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = fcmp uge <vscale x 2 x float> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_uge_fixed_one() {
+; CHECK-LABEL: @floatcmp_uge_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = fcmp uge <2 x float> <float 1.0, float 1.0>, <float 1.0, float 1.0>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_uge_scalable_one() {
+; CHECK-LABEL: @floatcmp_uge_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = fcmp uge <vscale x 2 x float> shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_ult_fixed_zero() {
+; CHECK-LABEL: @floatcmp_ult_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = fcmp ult <2 x float> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_ult_scalable_zero() {
+; CHECK-LABEL: @floatcmp_ult_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = fcmp ult <vscale x 2 x float> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_ult_fixed_one() {
+; CHECK-LABEL: @floatcmp_ult_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = fcmp ult <2 x float> <float 1.0, float 1.0>, <float 1.0, float 1.0>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_ult_scalable_one() {
+; CHECK-LABEL: @floatcmp_ult_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = fcmp ult <vscale x 2 x float> shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_ule_fixed_zero() {
+; CHECK-LABEL: @floatcmp_ule_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = fcmp ule <2 x float> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_ule_scalable_zero() {
+; CHECK-LABEL: @floatcmp_ule_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = fcmp ule <vscale x 2 x float> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_ule_fixed_one() {
+; CHECK-LABEL: @floatcmp_ule_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = fcmp ule <2 x float> <float 1.0, float 1.0>, <float 1.0, float 1.0>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_ule_scalable_one() {
+; CHECK-LABEL: @floatcmp_ule_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = fcmp ule <vscale x 2 x float> shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_une_fixed_zero() {
+; CHECK-LABEL: @floatcmp_une_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = fcmp une <2 x float> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_une_scalable_zero() {
+; CHECK-LABEL: @floatcmp_une_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = fcmp une <vscale x 2 x float> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_une_fixed_one() {
+; CHECK-LABEL: @floatcmp_une_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = fcmp une <2 x float> <float 1.0, float 1.0>, <float 1.0, float 1.0>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_une_scalable_one() {
+; CHECK-LABEL: @floatcmp_une_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = fcmp une <vscale x 2 x float> shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_uno_fixed_zero() {
+; CHECK-LABEL: @floatcmp_uno_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = fcmp uno <2 x float> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_uno_scalable_zero() {
+; CHECK-LABEL: @floatcmp_uno_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = fcmp uno <vscale x 2 x float> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_uno_fixed_one() {
+; CHECK-LABEL: @floatcmp_uno_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> zeroinitializer
+;
+  %res = fcmp uno <2 x float> <float 1.0, float 1.0>, <float 1.0, float 1.0>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_uno_scalable_one() {
+; CHECK-LABEL: @floatcmp_uno_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> zeroinitializer
+;
+  %res = fcmp uno <vscale x 2 x float> shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_true_fixed_zero() {
+; CHECK-LABEL: @floatcmp_true_fixed_zero(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = fcmp true <2 x float> zeroinitializer, zeroinitializer
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_true_scalable_zero() {
+; CHECK-LABEL: @floatcmp_true_scalable_zero(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = fcmp true <vscale x 2 x float> zeroinitializer, zeroinitializer
+  ret <vscale x 2 x i1> %res
+}
+
+define <2 x i1> @floatcmp_true_fixed_one() {
+; CHECK-LABEL: @floatcmp_true_fixed_one(
+; CHECK-NEXT:    ret <2 x i1> <i1 true, i1 true>
+;
+  %res = fcmp true <2 x float> <float 1.0, float 1.0>, <float 1.0, float 1.0>
+  ret <2 x i1> %res
+}
+
+define <vscale x 2 x i1> @floatcmp_true_scalable_one() {
+; CHECK-LABEL: @floatcmp_true_scalable_one(
+; CHECK-NEXT:    ret <vscale x 2 x i1> shufflevector (<vscale x 2 x i1> insertelement (<vscale x 2 x i1> undef, i1 true, i32 0), <vscale x 2 x i1> undef, <vscale x 2 x i32> zeroinitializer)
+;
+  %res = fcmp true <vscale x 2 x float> shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer), shufflevector (<vscale x 2 x float> insertelement (<vscale x 2 x float> undef, float 1.0, i32 0), <vscale x 2 x float> undef, <vscale x 2 x i32> zeroinitializer)
+  ret <vscale x 2 x i1> %res
+}
+


        


More information about the llvm-commits mailing list