Skip to content

Commit a1ab167

Browse files
authored
Rollup merge of #117141 - tmiasko:inline-target-features, r=oli-obk
Require target features to match exactly during inlining In general it is not correct to inline a callee with a target features that are subset of the callee. Require target features to match exactly during inlining. The exact match could be potentially relaxed, but this would require identifying specific feature that are allowed to differ, those that need to match, and those that can be present in caller but not in callee. This resolves MIR part of #116573. For other concerns with respect to the previous implementation also see areInlineCompatible in LLVM.
2 parents 24254d2 + 011b260 commit a1ab167

12 files changed

+44
-230
lines changed

compiler/rustc_mir_transform/src/inline.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -438,10 +438,8 @@ impl<'tcx> Inliner<'tcx> {
438438
return Err("incompatible instruction set");
439439
}
440440

441-
for feature in &callee_attrs.target_features {
442-
if !self.codegen_fn_attrs.target_features.contains(feature) {
443-
return Err("incompatible target feature");
444-
}
441+
if callee_attrs.target_features != self.codegen_fn_attrs.target_features {
442+
return Err("incompatible target features");
445443
}
446444

447445
Ok(())

tests/mir-opt/inline/inline_compatibility.inlined_no_sanitize.Inline.panic-abort.diff

-21
This file was deleted.

tests/mir-opt/inline/inline_compatibility.inlined_no_sanitize.Inline.panic-unwind.diff

-21
This file was deleted.

tests/mir-opt/inline/inline_compatibility.inlined_target_feature.Inline.panic-abort.diff

-21
This file was deleted.

tests/mir-opt/inline/inline_compatibility.inlined_target_feature.Inline.panic-unwind.diff

-21
This file was deleted.

tests/mir-opt/inline/inline_compatibility.not_inlined_c_variadic.Inline.panic-abort.diff

-22
This file was deleted.

tests/mir-opt/inline/inline_compatibility.not_inlined_c_variadic.Inline.panic-unwind.diff

-22
This file was deleted.

tests/mir-opt/inline/inline_compatibility.not_inlined_no_sanitize.Inline.panic-abort.diff

-19
This file was deleted.

tests/mir-opt/inline/inline_compatibility.not_inlined_no_sanitize.Inline.panic-unwind.diff

-19
This file was deleted.

tests/mir-opt/inline/inline_compatibility.not_inlined_target_feature.Inline.panic-abort.diff

-19
This file was deleted.

tests/mir-opt/inline/inline_compatibility.not_inlined_target_feature.Inline.panic-unwind.diff

-19
This file was deleted.

tests/mir-opt/inline/inline_compatibility.rs

+42-22
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,71 @@
1-
// skip-filecheck
21
// Checks that only functions with compatible attributes are inlined.
3-
//
42
// only-x86_64
5-
// EMIT_MIR_FOR_EACH_PANIC_STRATEGY
3+
// compile-flags: -Cpanic=abort
64

75
#![crate_type = "lib"]
86
#![feature(no_sanitize)]
97
#![feature(target_feature_11)]
108
#![feature(c_variadic)]
119

12-
// EMIT_MIR inline_compatibility.inlined_target_feature.Inline.diff
10+
#[inline]
11+
#[target_feature(enable = "sse2")]
12+
unsafe fn sse2() {}
13+
14+
#[inline]
15+
fn nop() {}
16+
17+
// CHECK-LABEL: fn f0()
18+
// CHECK: bb0: {
19+
// CHECK-NEXT: return;
1320
#[target_feature(enable = "sse2")]
14-
pub unsafe fn inlined_target_feature() {
15-
target_feature();
21+
pub unsafe fn f0() {
22+
sse2();
1623
}
1724

18-
// EMIT_MIR inline_compatibility.not_inlined_target_feature.Inline.diff
19-
pub unsafe fn not_inlined_target_feature() {
20-
target_feature();
25+
// CHECK-LABEL: fn f1()
26+
// CHECK: bb0: {
27+
// CHECK-NEXT: sse2()
28+
pub unsafe fn f1() {
29+
sse2();
2130
}
2231

23-
// EMIT_MIR inline_compatibility.inlined_no_sanitize.Inline.diff
32+
// CHECK-LABEL: fn f2()
33+
// CHECK: bb0: {
34+
// CHECK-NEXT: nop()
35+
#[target_feature(enable = "avx")]
36+
pub unsafe fn f2() {
37+
nop();
38+
}
39+
40+
#[inline]
41+
#[no_sanitize(address)]
42+
pub unsafe fn no_sanitize() {}
43+
44+
// CHECK-LABEL: fn inlined_no_sanitize()
45+
// CHECK: bb0: {
46+
// CHECK-NEXT: return;
2447
#[no_sanitize(address)]
2548
pub unsafe fn inlined_no_sanitize() {
2649
no_sanitize();
2750
}
2851

29-
// EMIT_MIR inline_compatibility.not_inlined_no_sanitize.Inline.diff
52+
// CHECK-LABEL: fn not_inlined_no_sanitize()
53+
// CHECK: bb0: {
54+
// CHECK-NEXT: no_sanitize()
3055
pub unsafe fn not_inlined_no_sanitize() {
3156
no_sanitize();
3257
}
3358

34-
#[inline]
35-
#[target_feature(enable = "sse2")]
36-
pub unsafe fn target_feature() {}
37-
38-
#[inline]
39-
#[no_sanitize(address)]
40-
pub unsafe fn no_sanitize() {}
41-
42-
// EMIT_MIR inline_compatibility.not_inlined_c_variadic.Inline.diff
59+
// CHECK-LABEL: fn not_inlined_c_variadic()
60+
// CHECK: bb0: {
61+
// CHECK-NEXT: StorageLive(_1)
62+
// CHECK-NEXT: _1 = sum
4363
pub unsafe fn not_inlined_c_variadic() {
44-
let s = sum(4u32, 4u32, 30u32, 200u32, 1000u32);
64+
let _ = sum(4u32, 4u32, 30u32, 200u32, 1000u32);
4565
}
4666

47-
#[no_mangle]
4867
#[inline(always)]
68+
#[no_mangle]
4969
unsafe extern "C" fn sum(n: u32, mut vs: ...) -> u32 {
5070
let mut s = 0;
5171
let mut i = 0;

0 commit comments

Comments
 (0)