[llvm] llvm.lround: Update verifier to validate support of vector types. (PR #98950)

Sumanth Gundapaneni via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 1 09:51:38 PDT 2024


https://github.com/sgundapa updated https://github.com/llvm/llvm-project/pull/98950

>From 4d308a9520d991b7add6cca14a3b2924785f12c3 Mon Sep 17 00:00:00 2001
From: Sumanth Gundapaneni <sumanth.gundapaneni at amd.com>
Date: Fri, 12 Jul 2024 14:10:48 -0500
Subject: [PATCH 1/6] llvm.lround: Update verifier to validate support of
 vector types.

(cherry picked from commit 12ed1a477c451584f840978af1f34ba0c98d5215)
---
 llvm/lib/CodeGen/MachineVerifier.cpp         | 15 ++++-
 llvm/lib/IR/Verifier.cpp                     | 17 +++++-
 llvm/test/MachineVerifier/test_g_llround.mir | 16 +++--
 llvm/test/MachineVerifier/test_g_lround.mir  |  8 ++-
 llvm/unittests/IR/IntrinsicsTest.cpp         | 64 ++++++++++++++++++++
 5 files changed, 109 insertions(+), 11 deletions(-)

diff --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp
index 0a5b8bdbc9371..3ae2f7951cefa 100644
--- a/llvm/lib/CodeGen/MachineVerifier.cpp
+++ b/llvm/lib/CodeGen/MachineVerifier.cpp
@@ -2032,7 +2032,20 @@ void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) {
   }
   case TargetOpcode::G_LLROUND:
   case TargetOpcode::G_LROUND: {
-    verifyAllRegOpsScalar(*MI, *MRI);
+    LLT DstTy = MRI->getType(MI->getOperand(0).getReg());
+    LLT SrcTy = MRI->getType(MI->getOperand(1).getReg());
+    if (!DstTy.isValid() || !SrcTy.isValid())
+      break;
+    if (SrcTy.isPointer() || DstTy.isPointer()) {
+      std::string Op = SrcTy.isPointer() ? "Source" : "Destination";
+      report(Twine(Op, " operand must not be a pointer type"), MI);
+    } else if (SrcTy.isScalar()) {
+      verifyAllRegOpsScalar(*MI, *MRI);
+      break;
+    } else if (SrcTy.isVector()) {
+      verifyVectorElementMatch(SrcTy, DstTy, MI);
+      break;
+    }
     break;
   }
   case TargetOpcode::G_IS_FPCLASS: {
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index 75a53c1c99734..76fe759fc1f63 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -5963,8 +5963,21 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
   case Intrinsic::llround: {
     Type *ValTy = Call.getArgOperand(0)->getType();
     Type *ResultTy = Call.getType();
-    Check(!ValTy->isVectorTy() && !ResultTy->isVectorTy(),
-          "Intrinsic does not support vectors", &Call);
+    Check(
+        ValTy->isFPOrFPVectorTy() && ResultTy->isIntOrIntVectorTy(),
+        "llvm.lround, llvm.llround: argument must be floating-point or vector "
+        "of floating-points, and result must be integer or vector of integers",
+        &Call);
+    Check(
+        ValTy->isVectorTy() == ResultTy->isVectorTy(),
+        "llvm.lround, llvm.llround: argument and result disagree on vector use",
+        &Call);
+    if (ValTy->isVectorTy()) {
+      Check(cast<VectorType>(ValTy)->getElementCount() ==
+                cast<VectorType>(ResultTy)->getElementCount(),
+            "llvm.lround, llvm.llround: argument must be same length as result",
+            &Call);
+    }
     break;
   }
   case Intrinsic::bswap: {
diff --git a/llvm/test/MachineVerifier/test_g_llround.mir b/llvm/test/MachineVerifier/test_g_llround.mir
index 9a0f4a75acaf4..e69499b1150c1 100644
--- a/llvm/test/MachineVerifier/test_g_llround.mir
+++ b/llvm/test/MachineVerifier/test_g_llround.mir
@@ -14,10 +14,14 @@ body:             |
     %ptr:_(p0) = COPY $x0
     %vector:_(<2 x s64>) = COPY $q0
 
-    ; CHECK: Bad machine code: All register operands must have scalar types
-    ; CHECK: instruction: %no_ptrs:_(s64) = G_LROUND %ptr:_(p0)
-    %no_ptrs:_(s64) = G_LROUND %ptr:_(p0)
+    ; CHECK: Bad machine code: Source operand must not be a pointer type
+    ; CHECK: instruction: %no_ptrs:_(s32) = G_LLROUND %ptr:_(p0)
+    %no_ptrs:_(s32) = G_LLROUND %ptr:_(p0)
 
-    ; CHECK: Bad machine code: All register operands must have scalar types
-    ; CHECK: instruction: %no_vectors:_(s64) = G_LROUND %vector:_(<2 x s64>)
-    %no_vectors:_(s64) = G_LROUND %vector:_(<2 x s64>)
+    ; CHECK: Bad machine code: operand types must be all-vector or all-scalar
+    ; CHECK: instruction: %no_vectors:_(s32) = G_LLROUND %vector:_(<2 x s64>)
+    %no_vectors:_(s32) = G_LLROUND %vector:_(<2 x s64>)
+
+    ; CHECK: Bad machine code: operand types must preserve number of vector elements
+    ; CHECK: instruction: %inv_vectors:_(<3 x s32>) = G_LLROUND %vector:_(<2 x s64>)
+    %inv_vectors:_(<3 x s32>) = G_LLROUND %vector:_(<2 x s64>)
diff --git a/llvm/test/MachineVerifier/test_g_lround.mir b/llvm/test/MachineVerifier/test_g_lround.mir
index 69d5d4967de30..56f06f00049e7 100644
--- a/llvm/test/MachineVerifier/test_g_lround.mir
+++ b/llvm/test/MachineVerifier/test_g_lround.mir
@@ -14,10 +14,14 @@ body:             |
     %ptr:_(p0) = COPY $x0
     %vector:_(<2 x s64>) = COPY $q0
 
-    ; CHECK: Bad machine code: All register operands must have scalar types
+    ; CHECK: Bad machine code: Source operand must not be a pointer type
     ; CHECK: instruction: %no_ptrs:_(s32) = G_LROUND %ptr:_(p0)
     %no_ptrs:_(s32) = G_LROUND %ptr:_(p0)
 
-    ; CHECK: Bad machine code: All register operands must have scalar types
+    ; CHECK: Bad machine code: operand types must be all-vector or all-scalar
     ; CHECK: instruction: %no_vectors:_(s32) = G_LROUND %vector:_(<2 x s64>)
     %no_vectors:_(s32) = G_LROUND %vector:_(<2 x s64>)
+
+    ; CHECK: Bad machine code: operand types must preserve number of vector elements
+    ; CHECK: instruction: %inv_vectors:_(<3 x s32>) = G_LROUND %vector:_(<2 x s64>)
+    %inv_vectors:_(<3 x s32>) = G_LROUND %vector:_(<2 x s64>)
diff --git a/llvm/unittests/IR/IntrinsicsTest.cpp b/llvm/unittests/IR/IntrinsicsTest.cpp
index 6f9e724c40326..14badaa0de980 100644
--- a/llvm/unittests/IR/IntrinsicsTest.cpp
+++ b/llvm/unittests/IR/IntrinsicsTest.cpp
@@ -12,6 +12,7 @@
 #include "llvm/IR/IRBuilder.h"
 #include "llvm/IR/IntrinsicInst.h"
 #include "llvm/IR/Module.h"
+#include "llvm/IR/Verifier.h"
 #include "gtest/gtest.h"
 
 using namespace llvm;
@@ -106,4 +107,67 @@ TEST_F(IntrinsicsTest, InstrProfInheritance) {
     EXPECT_TRUE(Checker(*Intr));
   }
 }
+
+TEST(IntrinsicVerifierTest, LRound) {
+  LLVMContext C;
+  std::unique_ptr<Module> M = std::make_unique<Module>("M", C);
+  IRBuilder<> Builder(C);
+
+  using TypePair = std::pair<Type *, Type *>;
+  Type *Int32Ty = Type::getInt32Ty(C);
+  Type *Int64Ty = Type::getInt64Ty(C);
+  Type *HalfTy = Type::getHalfTy(C);
+  Type *FltTy = Type::getFloatTy(C);
+  Type *DblTy = Type::getDoubleTy(C);
+  auto Vec2xTy = [&](Type *ElemTy) {
+    return VectorType::get(ElemTy, ElementCount::getFixed(2));
+  };
+  Type *Vec2xInt32Ty = Vec2xTy(Int32Ty);
+  Type *Vec2xInt64Ty = Vec2xTy(Int64Ty);
+  Type *Vec2xFltTy = Vec2xTy(FltTy);
+
+  // Test Cases
+  // Validating only a limited set of possible combinations.
+  std::vector<TypePair> ValidTypes = {
+      {Int32Ty, FltTy},          {Int32Ty, DblTy},  {Int64Ty, FltTy},
+      {Int64Ty, DblTy},          {Int32Ty, HalfTy}, {Vec2xInt32Ty, Vec2xFltTy},
+      {Vec2xInt64Ty, Vec2xFltTy}};
+
+  // CreateIntrinsic errors out on invalid argument types.
+  std::vector<TypePair> InvalidTypes = {
+      {VectorType::get(Int32Ty, ElementCount::getFixed(3)), Vec2xFltTy}};
+
+  auto testIntrinsic = [&](TypePair types, Intrinsic::ID ID, bool expectValid) {
+    Function *F =
+        Function::Create(FunctionType::get(types.first, {types.second}, false),
+                         Function::ExternalLinkage, "lround_fn", M.get());
+    BasicBlock *BB = BasicBlock::Create(C, "entry", F);
+    Builder.SetInsertPoint(BB);
+
+    Value *Arg = F->arg_begin();
+    Value *Result = Builder.CreateIntrinsic(types.first, ID, {Arg});
+    Builder.CreateRet(Result);
+
+    std::string Error;
+    raw_string_ostream ErrorOS(Error);
+    EXPECT_EQ(expectValid, !verifyFunction(*F, &ErrorOS));
+    if (!expectValid) {
+      EXPECT_TRUE(StringRef(ErrorOS.str())
+                      .contains("llvm.lround, llvm.llround: argument must be "
+                                "same length as result"));
+    }
+  };
+
+  // Run Valid Cases.
+  for (auto Types : ValidTypes) {
+    testIntrinsic(Types, Intrinsic::lround, true);
+    testIntrinsic(Types, Intrinsic::llround, true);
+  }
+
+  // Run Invalid Cases.
+  for (auto Types : InvalidTypes) {
+    testIntrinsic(Types, Intrinsic::lround, false);
+    testIntrinsic(Types, Intrinsic::llround, false);
+  }
+}
 } // end namespace

>From 2c9fcee8f312a9d98c1558998f3a28017260f6ad Mon Sep 17 00:00:00 2001
From: Sumanth Gundapaneni <sumanth.gundapaneni at amd.com>
Date: Tue, 16 Jul 2024 13:12:27 -0500
Subject: [PATCH 2/6] Update doc for llvm.lround

---
 llvm/docs/LangRef.rst | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/llvm/docs/LangRef.rst b/llvm/docs/LangRef.rst
index a04b5769f095f..1fa23fd88792f 100644
--- a/llvm/docs/LangRef.rst
+++ b/llvm/docs/LangRef.rst
@@ -16606,7 +16606,8 @@ Syntax:
 """""""
 
 This is an overloaded intrinsic. You can use ``llvm.lround`` on any
-floating-point type. Not all targets support all types however.
+floating-point type or vector of floating-point type. Not all targets
+support all types however.
 
 ::
 

>From 6f634cb7bbd28531f1aa0ae5a0b81a145ebc1639 Mon Sep 17 00:00:00 2001
From: Sumanth Gundapaneni <sumanth.gundapaneni at amd.com>
Date: Fri, 26 Jul 2024 12:17:44 -0500
Subject: [PATCH 3/6] Addressed reviwer's comment.

---
 llvm/lib/CodeGen/MachineVerifier.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/lib/CodeGen/MachineVerifier.cpp b/llvm/lib/CodeGen/MachineVerifier.cpp
index 3ae2f7951cefa..2acc172098500 100644
--- a/llvm/lib/CodeGen/MachineVerifier.cpp
+++ b/llvm/lib/CodeGen/MachineVerifier.cpp
@@ -2037,7 +2037,7 @@ void MachineVerifier::verifyPreISelGenericInstruction(const MachineInstr *MI) {
     if (!DstTy.isValid() || !SrcTy.isValid())
       break;
     if (SrcTy.isPointer() || DstTy.isPointer()) {
-      std::string Op = SrcTy.isPointer() ? "Source" : "Destination";
+      StringRef Op = SrcTy.isPointer() ? "Source" : "Destination";
       report(Twine(Op, " operand must not be a pointer type"), MI);
     } else if (SrcTy.isScalar()) {
       verifyAllRegOpsScalar(*MI, *MRI);

>From 4d5d69899b3be1419808f2f8ac3f22026ff1d5d6 Mon Sep 17 00:00:00 2001
From: Sumanth Gundapaneni <sumanth.gundapaneni at amd.com>
Date: Tue, 30 Jul 2024 10:06:43 -0500
Subject: [PATCH 4/6] Address reviewer's comment to move the unittest.

---
 llvm/test/Assembler/lround_vec_intrinsic.ll | 29 ++++++++++
 llvm/unittests/IR/IntrinsicsTest.cpp        | 64 ---------------------
 2 files changed, 29 insertions(+), 64 deletions(-)
 create mode 100644 llvm/test/Assembler/lround_vec_intrinsic.ll

diff --git a/llvm/test/Assembler/lround_vec_intrinsic.ll b/llvm/test/Assembler/lround_vec_intrinsic.ll
new file mode 100644
index 0000000000000..ff99077361ffa
--- /dev/null
+++ b/llvm/test/Assembler/lround_vec_intrinsic.ll
@@ -0,0 +1,29 @@
+; Validate that vector types are accepted for llvm.lround/llvm.llround intrinsic
+; RUN: llvm-as < %s -disable-output 2>&1| FileCheck -allow-empty %s
+
+; CHECK-NOT:assembly parsed, but does not verify as correct
+; CHECK-NOT:Intrinsic does not support vectors
+
+define <2 x i32> @intrinsic_lround_v2i32_v2f32(<2 x float> %arg) {
+entry:
+  %0 = tail call <2 x i32> @llvm.lround.v2i32.v2f32(<2 x float> %arg)
+  ret <2 x i32> %0
+}
+
+define <2 x i32> @intrinsic_llround_v2i32_v2f32(<2 x float> %arg) {
+entry:
+  %0 = tail call <2 x i32> @llvm.llround.v2i32.v2f32(<2 x float> %arg)
+  ret <2 x i32> %0
+}
+
+define <2 x i64> @intrinsic_lround_v2i64_v2f32(<2 x float> %arg) {
+entry:
+  %0 = tail call <2 x i64> @llvm.lround.v2i64.v2f32(<2 x float> %arg)
+  ret <2 x i64> %0
+}
+
+define <2 x i64> @intrinsic_llround_v2i64_v2f32(<2 x float> %arg) {
+entry:
+  %0 = tail call <2 x i64> @llvm.llround.v2i64.v2f32(<2 x float> %arg)
+  ret <2 x i64> %0
+}
diff --git a/llvm/unittests/IR/IntrinsicsTest.cpp b/llvm/unittests/IR/IntrinsicsTest.cpp
index 14badaa0de980..6f9e724c40326 100644
--- a/llvm/unittests/IR/IntrinsicsTest.cpp
+++ b/llvm/unittests/IR/IntrinsicsTest.cpp
@@ -12,7 +12,6 @@
 #include "llvm/IR/IRBuilder.h"
 #include "llvm/IR/IntrinsicInst.h"
 #include "llvm/IR/Module.h"
-#include "llvm/IR/Verifier.h"
 #include "gtest/gtest.h"
 
 using namespace llvm;
@@ -107,67 +106,4 @@ TEST_F(IntrinsicsTest, InstrProfInheritance) {
     EXPECT_TRUE(Checker(*Intr));
   }
 }
-
-TEST(IntrinsicVerifierTest, LRound) {
-  LLVMContext C;
-  std::unique_ptr<Module> M = std::make_unique<Module>("M", C);
-  IRBuilder<> Builder(C);
-
-  using TypePair = std::pair<Type *, Type *>;
-  Type *Int32Ty = Type::getInt32Ty(C);
-  Type *Int64Ty = Type::getInt64Ty(C);
-  Type *HalfTy = Type::getHalfTy(C);
-  Type *FltTy = Type::getFloatTy(C);
-  Type *DblTy = Type::getDoubleTy(C);
-  auto Vec2xTy = [&](Type *ElemTy) {
-    return VectorType::get(ElemTy, ElementCount::getFixed(2));
-  };
-  Type *Vec2xInt32Ty = Vec2xTy(Int32Ty);
-  Type *Vec2xInt64Ty = Vec2xTy(Int64Ty);
-  Type *Vec2xFltTy = Vec2xTy(FltTy);
-
-  // Test Cases
-  // Validating only a limited set of possible combinations.
-  std::vector<TypePair> ValidTypes = {
-      {Int32Ty, FltTy},          {Int32Ty, DblTy},  {Int64Ty, FltTy},
-      {Int64Ty, DblTy},          {Int32Ty, HalfTy}, {Vec2xInt32Ty, Vec2xFltTy},
-      {Vec2xInt64Ty, Vec2xFltTy}};
-
-  // CreateIntrinsic errors out on invalid argument types.
-  std::vector<TypePair> InvalidTypes = {
-      {VectorType::get(Int32Ty, ElementCount::getFixed(3)), Vec2xFltTy}};
-
-  auto testIntrinsic = [&](TypePair types, Intrinsic::ID ID, bool expectValid) {
-    Function *F =
-        Function::Create(FunctionType::get(types.first, {types.second}, false),
-                         Function::ExternalLinkage, "lround_fn", M.get());
-    BasicBlock *BB = BasicBlock::Create(C, "entry", F);
-    Builder.SetInsertPoint(BB);
-
-    Value *Arg = F->arg_begin();
-    Value *Result = Builder.CreateIntrinsic(types.first, ID, {Arg});
-    Builder.CreateRet(Result);
-
-    std::string Error;
-    raw_string_ostream ErrorOS(Error);
-    EXPECT_EQ(expectValid, !verifyFunction(*F, &ErrorOS));
-    if (!expectValid) {
-      EXPECT_TRUE(StringRef(ErrorOS.str())
-                      .contains("llvm.lround, llvm.llround: argument must be "
-                                "same length as result"));
-    }
-  };
-
-  // Run Valid Cases.
-  for (auto Types : ValidTypes) {
-    testIntrinsic(Types, Intrinsic::lround, true);
-    testIntrinsic(Types, Intrinsic::llround, true);
-  }
-
-  // Run Invalid Cases.
-  for (auto Types : InvalidTypes) {
-    testIntrinsic(Types, Intrinsic::lround, false);
-    testIntrinsic(Types, Intrinsic::llround, false);
-  }
-}
 } // end namespace

>From 32a7cae4d24519209c0ea476fc08b180b179a00a Mon Sep 17 00:00:00 2001
From: Sumanth Gundapaneni <sumanth.gundapaneni at amd.com>
Date: Tue, 30 Jul 2024 10:19:58 -0500
Subject: [PATCH 5/6] Format the RUN line

---
 llvm/test/Assembler/lround_vec_intrinsic.ll | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/llvm/test/Assembler/lround_vec_intrinsic.ll b/llvm/test/Assembler/lround_vec_intrinsic.ll
index ff99077361ffa..7478487d014b0 100644
--- a/llvm/test/Assembler/lround_vec_intrinsic.ll
+++ b/llvm/test/Assembler/lround_vec_intrinsic.ll
@@ -1,8 +1,8 @@
 ; Validate that vector types are accepted for llvm.lround/llvm.llround intrinsic
 ; RUN: llvm-as < %s -disable-output 2>&1| FileCheck -allow-empty %s
 
-; CHECK-NOT:assembly parsed, but does not verify as correct
-; CHECK-NOT:Intrinsic does not support vectors
+; CHECK-NOT: assembly parsed, but does not verify as correct
+; CHECK-NOT: Intrinsic does not support vectors
 
 define <2 x i32> @intrinsic_lround_v2i32_v2f32(<2 x float> %arg) {
 entry:

>From 889a095c4540f2cd6330ee857e248bd7e995d071 Mon Sep 17 00:00:00 2001
From: Sumanth Gundapaneni <sumanth.gundapaneni at amd.com>
Date: Thu, 1 Aug 2024 11:49:22 -0500
Subject: [PATCH 6/6] Update lit test as per comments.

---
 llvm/test/Assembler/lround.ll               | 30 +++++++++++++++++++++
 llvm/test/Assembler/lround_vec_intrinsic.ll | 29 --------------------
 2 files changed, 30 insertions(+), 29 deletions(-)
 create mode 100644 llvm/test/Assembler/lround.ll
 delete mode 100644 llvm/test/Assembler/lround_vec_intrinsic.ll

diff --git a/llvm/test/Assembler/lround.ll b/llvm/test/Assembler/lround.ll
new file mode 100644
index 0000000000000..90a6f484fa2dd
--- /dev/null
+++ b/llvm/test/Assembler/lround.ll
@@ -0,0 +1,30 @@
+; Validate that vector types are accepted for llvm.lround/llvm.llround intrinsic
+; RUN: llvm-as < %s | llvm-dis |  FileCheck %s
+
+define <2 x i32> @intrinsic_lround_v2i32_v2f32(<2 x float> %arg) {
+entry:
+  ;CHECK: %res = tail call <2 x i32> @llvm.lround.v2i32.v2f32(<2 x float> %arg)
+  %res = tail call <2 x i32> @llvm.lround.v2i32.v2f32(<2 x float> %arg)
+  ret <2 x i32> %res
+}
+
+define <2 x i32> @intrinsic_llround_v2i32_v2f32(<2 x float> %arg) {
+entry:
+  ;CHECK: %res = tail call <2 x i32> @llvm.llround.v2i32.v2f32(<2 x float> %arg)
+  %res = tail call <2 x i32> @llvm.llround.v2i32.v2f32(<2 x float> %arg)
+  ret <2 x i32> %res
+}
+
+define <2 x i64> @intrinsic_lround_v2i64_v2f32(<2 x float> %arg) {
+entry:
+  ;CHECK: %res = tail call <2 x i64> @llvm.lround.v2i64.v2f32(<2 x float> %arg)
+  %res = tail call <2 x i64> @llvm.lround.v2i64.v2f32(<2 x float> %arg)
+  ret <2 x i64> %res
+}
+
+define <2 x i64> @intrinsic_llround_v2i64_v2f32(<2 x float> %arg) {
+entry:
+  ;CHECK: %res = tail call <2 x i64> @llvm.llround.v2i64.v2f32(<2 x float> %arg)
+  %res = tail call <2 x i64> @llvm.llround.v2i64.v2f32(<2 x float> %arg)
+  ret <2 x i64> %res
+}
diff --git a/llvm/test/Assembler/lround_vec_intrinsic.ll b/llvm/test/Assembler/lround_vec_intrinsic.ll
deleted file mode 100644
index 7478487d014b0..0000000000000
--- a/llvm/test/Assembler/lround_vec_intrinsic.ll
+++ /dev/null
@@ -1,29 +0,0 @@
-; Validate that vector types are accepted for llvm.lround/llvm.llround intrinsic
-; RUN: llvm-as < %s -disable-output 2>&1| FileCheck -allow-empty %s
-
-; CHECK-NOT: assembly parsed, but does not verify as correct
-; CHECK-NOT: Intrinsic does not support vectors
-
-define <2 x i32> @intrinsic_lround_v2i32_v2f32(<2 x float> %arg) {
-entry:
-  %0 = tail call <2 x i32> @llvm.lround.v2i32.v2f32(<2 x float> %arg)
-  ret <2 x i32> %0
-}
-
-define <2 x i32> @intrinsic_llround_v2i32_v2f32(<2 x float> %arg) {
-entry:
-  %0 = tail call <2 x i32> @llvm.llround.v2i32.v2f32(<2 x float> %arg)
-  ret <2 x i32> %0
-}
-
-define <2 x i64> @intrinsic_lround_v2i64_v2f32(<2 x float> %arg) {
-entry:
-  %0 = tail call <2 x i64> @llvm.lround.v2i64.v2f32(<2 x float> %arg)
-  ret <2 x i64> %0
-}
-
-define <2 x i64> @intrinsic_llround_v2i64_v2f32(<2 x float> %arg) {
-entry:
-  %0 = tail call <2 x i64> @llvm.llround.v2i64.v2f32(<2 x float> %arg)
-  ret <2 x i64> %0
-}



More information about the llvm-commits mailing list