Skip to content

Commit 9bc7cea

Browse files
committed
Fix is_val_statically_known for floats
1 parent 569d7e3 commit 9bc7cea

File tree

3 files changed

+96
-9
lines changed

3 files changed

+96
-9
lines changed

compiler/rustc_codegen_llvm/src/context.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1000,8 +1000,10 @@ impl<'ll> CodegenCx<'ll, '_> {
10001000
ifn!("llvm.is.constant.i64", fn(t_i64) -> i1);
10011001
ifn!("llvm.is.constant.i128", fn(t_i128) -> i1);
10021002
ifn!("llvm.is.constant.isize", fn(t_isize) -> i1);
1003+
ifn!("llvm.is.constant.f16", fn(t_f16) -> i1);
10031004
ifn!("llvm.is.constant.f32", fn(t_f32) -> i1);
10041005
ifn!("llvm.is.constant.f64", fn(t_f64) -> i1);
1006+
ifn!("llvm.is.constant.f128", fn(t_f128) -> i1);
10051007
ifn!("llvm.is.constant.ptr", fn(ptr) -> i1);
10061008

10071009
ifn!("llvm.expect.i1", fn(i1, i1) -> i1);

compiler/rustc_codegen_llvm/src/intrinsic.rs

+15-7
Original file line numberDiff line numberDiff line change
@@ -192,14 +192,22 @@ impl<'ll, 'tcx> IntrinsicCallMethods<'tcx> for Builder<'_, 'll, 'tcx> {
192192
}
193193
sym::is_val_statically_known => {
194194
let intrinsic_type = args[0].layout.immediate_llvm_type(self.cx);
195-
match self.type_kind(intrinsic_type) {
196-
TypeKind::Pointer | TypeKind::Integer | TypeKind::Float | TypeKind::Double => {
197-
self.call_intrinsic(
198-
&format!("llvm.is.constant.{:?}", intrinsic_type),
199-
&[args[0].immediate()],
200-
)
195+
let kind = self.type_kind(intrinsic_type);
196+
let intrinsic_name = match kind {
197+
TypeKind::Pointer | TypeKind::Integer => {
198+
Some(format!("llvm.is.constant.{intrinsic_type:?}"))
201199
}
202-
_ => self.const_bool(false),
200+
// LLVM float types' intrinsic names differ from their type names.
201+
TypeKind::Half => Some(format!("llvm.is.constant.f16")),
202+
TypeKind::Float => Some(format!("llvm.is.constant.f32")),
203+
TypeKind::Double => Some(format!("llvm.is.constant.f64")),
204+
TypeKind::FP128 => Some(format!("llvm.is.constant.f128")),
205+
_ => None,
206+
};
207+
if let Some(intrinsic_name) = intrinsic_name {
208+
self.call_intrinsic(&intrinsic_name, &[args[0].immediate()])
209+
} else {
210+
self.const_bool(false)
203211
}
204212
}
205213
sym::unlikely => self

tests/codegen/is_val_statically_known.rs

+79-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
//@ compile-flags: --crate-type=lib -Zmerge-functions=disabled -O
22

33
#![feature(core_intrinsics)]
4+
#![feature(f16, f128)]
45

56
use std::intrinsics::is_val_statically_known;
67

@@ -49,7 +50,7 @@ pub fn _bool_false(b: bool) -> i32 {
4950

5051
#[inline]
5152
pub fn _iref(a: &u8) -> i32 {
52-
if unsafe { is_val_statically_known(a) } { 5 } else { 4 }
53+
if is_val_statically_known(a) { 5 } else { 4 }
5354
}
5455

5556
// CHECK-LABEL: @_iref_borrow(
@@ -68,7 +69,7 @@ pub fn _iref_arg(a: &u8) -> i32 {
6869

6970
#[inline]
7071
pub fn _slice_ref(a: &[u8]) -> i32 {
71-
if unsafe { is_val_statically_known(a) } { 7 } else { 6 }
72+
if is_val_statically_known(a) { 7 } else { 6 }
7273
}
7374

7475
// CHECK-LABEL: @_slice_ref_borrow(
@@ -84,3 +85,79 @@ pub fn _slice_ref_arg(a: &[u8]) -> i32 {
8485
// CHECK: ret i32 6
8586
_slice_ref(a)
8687
}
88+
89+
#[inline]
90+
pub fn _f16(a: f16) -> i32 {
91+
if is_val_statically_known(a) { 1 } else { 0 }
92+
}
93+
94+
// CHECK-LABEL: @_f16_true(
95+
#[no_mangle]
96+
pub fn _f16_true() -> i32 {
97+
// CHECK: ret i32 1
98+
_f16(1.0)
99+
}
100+
101+
// CHECK-LABEL: @_f16_false(
102+
#[no_mangle]
103+
pub fn _f16_false(a: f16) -> i32 {
104+
// CHECK: ret i32 0
105+
_f16(a)
106+
}
107+
108+
#[inline]
109+
pub fn _f32(a: f32) -> i32 {
110+
if is_val_statically_known(a) { 1 } else { 0 }
111+
}
112+
113+
// CHECK-LABEL: @_f32_true(
114+
#[no_mangle]
115+
pub fn _f32_true() -> i32 {
116+
// CHECK: ret i32 1
117+
_f32(1.0)
118+
}
119+
120+
// CHECK-LABEL: @_f32_false(
121+
#[no_mangle]
122+
pub fn _f32_false(a: f32) -> i32 {
123+
// CHECK: ret i32 0
124+
_f32(a)
125+
}
126+
127+
#[inline]
128+
pub fn _f64(a: f64) -> i32 {
129+
if is_val_statically_known(a) { 1 } else { 0 }
130+
}
131+
132+
// CHECK-LABEL: @_f64_true(
133+
#[no_mangle]
134+
pub fn _f64_true() -> i32 {
135+
// CHECK: ret i32 1
136+
_f64(1.0)
137+
}
138+
139+
// CHECK-LABEL: @_f64_false(
140+
#[no_mangle]
141+
pub fn _f64_false(a: f64) -> i32 {
142+
// CHECK: ret i32 0
143+
_f64(a)
144+
}
145+
146+
#[inline]
147+
pub fn _f128(a: f128) -> i32 {
148+
if is_val_statically_known(a) { 1 } else { 0 }
149+
}
150+
151+
// CHECK-LABEL: @_f128_true(
152+
#[no_mangle]
153+
pub fn _f128_true() -> i32 {
154+
// CHECK: ret i32 1
155+
_f128(1.0)
156+
}
157+
158+
// CHECK-LABEL: @_f128_false(
159+
#[no_mangle]
160+
pub fn _f128_false(a: f128) -> i32 {
161+
// CHECK: ret i32 0
162+
_f128(a)
163+
}

0 commit comments

Comments
 (0)