Skip to content

Commit b4bf56c

Browse files
committed
Auto merge of #94570 - shampoofactory:reopen-91719, r=workingjubilee
Reopen 91719 Reopened #91719, which was closed inadvertently due to technical difficulties.
2 parents 047f9c4 + 0c13186 commit b4bf56c

File tree

5 files changed

+67
-54
lines changed

5 files changed

+67
-54
lines changed

compiler/rustc_middle/src/ty/layout.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -3226,12 +3226,8 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> {
32263226
_ => return,
32273227
}
32283228

3229-
// Pass and return structures up to 2 pointers in size by value, matching `ScalarPair`.
3230-
// LLVM will usually pass these in 2 registers, which is more efficient than by-ref.
3231-
let max_by_val_size = Pointer.size(self) * 2;
32323229
let size = arg.layout.size;
3233-
3234-
if arg.layout.is_unsized() || size > max_by_val_size {
3230+
if arg.layout.is_unsized() || size > Pointer.size(self) {
32353231
arg.make_indirect();
32363232
} else {
32373233
// We want to pass small aggregates as immediates, but using

src/test/codegen/arg-return-value-in-reg.rs

-32
This file was deleted.

src/test/codegen/array-equality.rs

+31-9
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,20 @@
55

66
// CHECK-LABEL: @array_eq_value
77
#[no_mangle]
8-
pub fn array_eq_value(a: [u16; 6], b: [u16; 6]) -> bool {
8+
pub fn array_eq_value(a: [u16; 3], b: [u16; 3]) -> bool {
99
// CHECK-NEXT: start:
10-
// CHECK-NEXT: %2 = icmp eq i96 %0, %1
10+
// CHECK-NEXT: %2 = icmp eq i48 %0, %1
1111
// CHECK-NEXT: ret i1 %2
1212
a == b
1313
}
1414

1515
// CHECK-LABEL: @array_eq_ref
1616
#[no_mangle]
17-
pub fn array_eq_ref(a: &[u16; 6], b: &[u16; 6]) -> bool {
17+
pub fn array_eq_ref(a: &[u16; 3], b: &[u16; 3]) -> bool {
1818
// CHECK: start:
19-
// CHECK: load i96, i96* %{{.+}}, align 2
20-
// CHECK: load i96, i96* %{{.+}}, align 2
21-
// CHECK: icmp eq i96
19+
// CHECK: load i48, i48* %{{.+}}, align 2
20+
// CHECK: load i48, i48* %{{.+}}, align 2
21+
// CHECK: icmp eq i48
2222
// CHECK-NEXT: ret
2323
a == b
2424
}
@@ -47,11 +47,33 @@ pub fn array_eq_long(a: &[u16; 1234], b: &[u16; 1234]) -> bool {
4747
a == b
4848
}
4949

50-
// CHECK-LABEL: @array_eq_zero(i128 %0)
50+
// CHECK-LABEL: @array_eq_zero_short(i48
5151
#[no_mangle]
52-
pub fn array_eq_zero(x: [u16; 8]) -> bool {
52+
pub fn array_eq_zero_short(x: [u16; 3]) -> bool {
5353
// CHECK-NEXT: start:
54-
// CHECK-NEXT: %[[EQ:.+]] = icmp eq i128 %0, 0
54+
// CHECK-NEXT: %[[EQ:.+]] = icmp eq i48 %0, 0
55+
// CHECK-NEXT: ret i1 %[[EQ]]
56+
x == [0; 3]
57+
}
58+
59+
// CHECK-LABEL: @array_eq_zero_mid([8 x i16]*
60+
#[no_mangle]
61+
pub fn array_eq_zero_mid(x: [u16; 8]) -> bool {
62+
// CHECK-NEXT: start:
63+
// CHECK-NEXT: bitcast
64+
// CHECK-NEXT: %[[LOAD:.+]] = load i128,
65+
// CHECK-NEXT: %[[EQ:.+]] = icmp eq i128 %[[LOAD]], 0
5566
// CHECK-NEXT: ret i1 %[[EQ]]
5667
x == [0; 8]
5768
}
69+
70+
// CHECK-LABEL: @array_eq_zero_long([1234 x i16]*
71+
#[no_mangle]
72+
pub fn array_eq_zero_long(x: [u16; 1234]) -> bool {
73+
// CHECK-NEXT: start:
74+
// CHECK-NOT: alloca
75+
// CHECK: %[[CMP:.+]] = tail call i32 @{{bcmp|memcmp}}(
76+
// CHECK-NEXT: %[[EQ:.+]] = icmp eq i32 %[[CMP]], 0
77+
// CHECK-NEXT: ret i1 %[[EQ]]
78+
x == [0; 1234]
79+
}
+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// compile-flags: -C opt-level=3
2+
// only-x86_64
3+
#![crate_type = "lib"]
4+
5+
// CHECK-LABEL: @auto_vectorize_direct
6+
#[no_mangle]
7+
pub fn auto_vectorize_direct(a: [f32; 4], b: [f32; 4]) -> [f32; 4] {
8+
// CHECK: load <4 x float>
9+
// CHECK: load <4 x float>
10+
// CHECK: fadd <4 x float>
11+
// CHECK: store <4 x float>
12+
[
13+
a[0] + b[0],
14+
a[1] + b[1],
15+
a[2] + b[2],
16+
a[3] + b[3],
17+
]
18+
}
19+
20+
// CHECK-LABEL: @auto_vectorize_loop
21+
#[no_mangle]
22+
pub fn auto_vectorize_loop(a: [f32; 4], b: [f32; 4]) -> [f32; 4] {
23+
// CHECK: load <4 x float>
24+
// CHECK: load <4 x float>
25+
// CHECK: fadd <4 x float>
26+
// CHECK: store <4 x float>
27+
let mut c = [0.0; 4];
28+
for i in 0..4 {
29+
c[i] = a[i] + b[i];
30+
}
31+
c
32+
}

src/test/codegen/union-abi.rs

+3-8
Original file line numberDiff line numberDiff line change
@@ -63,16 +63,11 @@ pub union UnionU128{a:u128}
6363
#[no_mangle]
6464
pub fn test_UnionU128(_: UnionU128) -> UnionU128 { loop {} }
6565

66-
pub union UnionU128x2{a:(u128, u128)}
67-
// CHECK: define void @test_UnionU128x2(i128 %_1.0, i128 %_1.1)
68-
#[no_mangle]
69-
pub fn test_UnionU128x2(_: UnionU128x2) { loop {} }
70-
7166
#[repr(C)]
72-
pub union CUnionU128x2{a:(u128, u128)}
73-
// CHECK: define void @test_CUnionU128x2(%CUnionU128x2* {{.*}} %_1)
67+
pub union CUnionU128{a:u128}
68+
// CHECK: define void @test_CUnionU128(%CUnionU128* {{.*}} %_1)
7469
#[no_mangle]
75-
pub fn test_CUnionU128x2(_: CUnionU128x2) { loop {} }
70+
pub fn test_CUnionU128(_: CUnionU128) { loop {} }
7671

7772
pub union UnionBool { b:bool }
7873
// CHECK: define noundef zeroext i1 @test_UnionBool(i8 %b)

0 commit comments

Comments
 (0)