44#![ crate_type = "lib" ]
55#![ feature( try_blocks) ]
66
7- // These are now NOPs in LLVM 15, presumably thanks to nikic's change mentioned in
8- // <https://github.com/rust-lang/rust/issues/85133#issuecomment-1072168354>.
9- // Unfortunately, as of 2022-08-17 they're not yet nops for `u64`s nor `Option`.
10-
117use std:: ops:: ControlFlow :: { self , Continue , Break } ;
8+ use std:: ptr:: NonNull ;
9+
10+ // CHECK-LABEL: @option_nop_match_32
11+ #[ no_mangle]
12+ pub fn option_nop_match_32 ( x : Option < u32 > ) -> Option < u32 > {
13+ // CHECK: start:
14+ // CHECK-NEXT: insertvalue { i32, i32 }
15+ // CHECK-NEXT: insertvalue { i32, i32 }
16+ // CHECK-NEXT: ret { i32, i32 }
17+ match x {
18+ Some ( x) => Some ( x) ,
19+ None => None ,
20+ }
21+ }
22+
23+ // CHECK-LABEL: @option_nop_traits_32
24+ #[ no_mangle]
25+ pub fn option_nop_traits_32 ( x : Option < u32 > ) -> Option < u32 > {
26+ // CHECK: start:
27+ // CHECK-NEXT: insertvalue { i32, i32 }
28+ // CHECK-NEXT: insertvalue { i32, i32 }
29+ // CHECK-NEXT: ret { i32, i32 }
30+ try {
31+ x?
32+ }
33+ }
1234
1335// CHECK-LABEL: @result_nop_match_32
1436#[ no_mangle]
1537pub fn result_nop_match_32 ( x : Result < i32 , u32 > ) -> Result < i32 , u32 > {
16- // CHECK: start
17- // CHECK-NEXT: ret i64 %0
38+ // CHECK: start:
39+ // CHECK-NEXT: insertvalue { i32, i32 }
40+ // CHECK-NEXT: insertvalue { i32, i32 }
41+ // CHECK-NEXT: ret { i32, i32 }
1842 match x {
1943 Ok ( x) => Ok ( x) ,
2044 Err ( x) => Err ( x) ,
@@ -24,8 +48,60 @@ pub fn result_nop_match_32(x: Result<i32, u32>) -> Result<i32, u32> {
2448// CHECK-LABEL: @result_nop_traits_32
2549#[ no_mangle]
2650pub fn result_nop_traits_32 ( x : Result < i32 , u32 > ) -> Result < i32 , u32 > {
27- // CHECK: start
28- // CHECK-NEXT: ret i64 %0
51+ // CHECK: start:
52+ // CHECK-NEXT: insertvalue { i32, i32 }
53+ // CHECK-NEXT: insertvalue { i32, i32 }
54+ // CHECK-NEXT: ret { i32, i32 }
55+ try {
56+ x?
57+ }
58+ }
59+
60+ // CHECK-LABEL: @result_nop_match_64
61+ #[ no_mangle]
62+ pub fn result_nop_match_64 ( x : Result < i64 , u64 > ) -> Result < i64 , u64 > {
63+ // CHECK: start:
64+ // CHECK-NEXT: insertvalue { i64, i64 }
65+ // CHECK-NEXT: insertvalue { i64, i64 }
66+ // CHECK-NEXT: ret { i64, i64 }
67+ match x {
68+ Ok ( x) => Ok ( x) ,
69+ Err ( x) => Err ( x) ,
70+ }
71+ }
72+
73+ // CHECK-LABEL: @result_nop_traits_64
74+ #[ no_mangle]
75+ pub fn result_nop_traits_64 ( x : Result < i64 , u64 > ) -> Result < i64 , u64 > {
76+ // CHECK: start:
77+ // CHECK-NEXT: insertvalue { i64, i64 }
78+ // CHECK-NEXT: insertvalue { i64, i64 }
79+ // CHECK-NEXT: ret { i64, i64 }
80+ try {
81+ x?
82+ }
83+ }
84+
85+ // CHECK-LABEL: @result_nop_match_ptr
86+ #[ no_mangle]
87+ pub fn result_nop_match_ptr ( x : Result < usize , Box < ( ) > > ) -> Result < usize , Box < ( ) > > {
88+ // CHECK: start:
89+ // CHECK-NEXT: insertvalue { i{{[0-9]+}}, ptr }
90+ // CHECK-NEXT: insertvalue { i{{[0-9]+}}, ptr }
91+ // CHECK-NEXT: ret
92+ match x {
93+ Ok ( x) => Ok ( x) ,
94+ Err ( x) => Err ( x) ,
95+ }
96+ }
97+
98+ // CHECK-LABEL: @result_nop_traits_ptr
99+ #[ no_mangle]
100+ pub fn result_nop_traits_ptr ( x : Result < u64 , NonNull < ( ) > > ) -> Result < u64 , NonNull < ( ) > > {
101+ // CHECK: start:
102+ // CHECK-NEXT: insertvalue { i{{[0-9]+}}, ptr }
103+ // CHECK-NEXT: insertvalue { i{{[0-9]+}}, ptr }
104+ // CHECK-NEXT: ret
29105 try {
30106 x?
31107 }
@@ -34,8 +110,10 @@ pub fn result_nop_traits_32(x: Result<i32, u32>) -> Result<i32, u32> {
34110// CHECK-LABEL: @control_flow_nop_match_32
35111#[ no_mangle]
36112pub fn control_flow_nop_match_32 ( x : ControlFlow < i32 , u32 > ) -> ControlFlow < i32 , u32 > {
37- // CHECK: start
38- // CHECK-NEXT: ret i64 %0
113+ // CHECK: start:
114+ // CHECK-NEXT: insertvalue { i32, i32 }
115+ // CHECK-NEXT: insertvalue { i32, i32 }
116+ // CHECK-NEXT: ret { i32, i32 }
39117 match x {
40118 Continue ( x) => Continue ( x) ,
41119 Break ( x) => Break ( x) ,
@@ -45,8 +123,10 @@ pub fn control_flow_nop_match_32(x: ControlFlow<i32, u32>) -> ControlFlow<i32, u
45123// CHECK-LABEL: @control_flow_nop_traits_32
46124#[ no_mangle]
47125pub fn control_flow_nop_traits_32 ( x : ControlFlow < i32 , u32 > ) -> ControlFlow < i32 , u32 > {
48- // CHECK: start
49- // CHECK-NEXT: ret i64 %0
126+ // CHECK: start:
127+ // CHECK-NEXT: insertvalue { i32, i32 }
128+ // CHECK-NEXT: insertvalue { i32, i32 }
129+ // CHECK-NEXT: ret { i32, i32 }
50130 try {
51131 x?
52132 }
0 commit comments