Intrinsics: Fix not speculating llvm.fptrunc.round
authorMatt Arsenault <Matthew.Arsenault@amd.com>
Sun, 4 Dec 2022 15:54:44 +0000 (10:54 -0500)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Mon, 5 Dec 2022 13:39:07 +0000 (08:39 -0500)
Move its definition to be with the other FP rounding intrinsics.

llvm/include/llvm/IR/Intrinsics.td
llvm/test/Transforms/SpeculativeExecution/spec-calls.ll

index 982f3c9..c9fc706 100644 (file)
@@ -708,6 +708,11 @@ let IntrProperties = [IntrNoMem, IntrSpeculatable, IntrWillReturn] in {
   def int_nearbyint : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
   def int_round : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
   def int_roundeven    : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>]>;
+
+  // Truncate a floating point number with a specific rounding mode
+  def int_fptrunc_round : DefaultAttrsIntrinsic<[ llvm_anyfloat_ty ],
+                                                [ llvm_anyfloat_ty, llvm_metadata_ty ]>;
+
   def int_canonicalize : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>],
                                    [IntrNoMem]>;
   // Arithmetic fence intrinsic.
@@ -947,11 +952,6 @@ let IntrProperties = [IntrInaccessibleMemOnly, IntrWillReturn] in {
 // FIXME: Consider maybe adding intrinsics for sitofp, uitofp.
 
 
-// Truncate a floating point number with a specific rounding mode
-def int_fptrunc_round : DefaultAttrsIntrinsic<[ llvm_anyfloat_ty ],
-                                              [ llvm_anyfloat_ty, llvm_metadata_ty ],
-                                              [ IntrNoMem, IntrWillReturn ]>;
-
 //===------------------------- Expect Intrinsics --------------------------===//
 //
 def int_expect : DefaultAttrsIntrinsic<[llvm_anyint_ty],
index 56d6637..6a693b4 100644 (file)
@@ -93,3 +93,19 @@ b:
 
 declare i1 @llvm.is.fpclass.f32(float, i32)
 declare float @llvm.arithmetic.fence.f32(float)
+
+; CHECK-LABEL: @ifThen_fptrunc_round(
+; CHECK: %round = call half @llvm.fptrunc.round.f16.f32(float %x, metadata !"round.downward")
+; CHECK-NEXT: br i1 true
+define void @ifThen_fptrunc_round(float %x) {
+  br i1 true, label %a, label %b
+
+a:
+  %round = call half @llvm.fptrunc.round.f16.f32(float %x, metadata !"round.downward")
+  br label %b
+
+b:
+  ret void
+}
+
+declare half @llvm.fptrunc.round.f16.f32(float, metadata)