Commit 89cc852
committed
auto merge of #9332 : eugals/rust/master, r=alexcrichton
It is intended to optimize/beautify the code generated in a few trivial trait operations.
Let's take the following code as an example:
```
trait Stuff {
fn bar(&self);
}
fn callBar(s: &Stuff) {
s.bar();
}
struct Foo;
impl Stuff for Foo {
fn bar(&self) {
}
}
pub fn main() {
let o = Foo;
callBar(&o as &Stuff);
}
```
At present it is translated into something like:
```
define void @_ZN7callBar_UUID.0E({ i32, %tydesc*, i8*, i8*, i8 }*, { %tydesc*, i8* }*) #4 {
"function top level":
%__trait_callee = alloca { %tydesc*, i8* }
%__auto_borrow_obj = alloca { %tydesc*, i8* }
%2 = getelementptr inbounds { %tydesc*, i8* }* %1, i32 0, i32 0
%3 = load %tydesc** %2
%4 = getelementptr inbounds { %tydesc*, i8* }* %__auto_borrow_obj, i32 0, i32 0
store %tydesc* %3, %tydesc** %4
%5 = getelementptr inbounds { %tydesc*, i8* }* %1, i32 0, i32 1
%6 = load i8** %5
%7 = getelementptr inbounds { %tydesc*, i8* }* %__auto_borrow_obj, i32 0, i32 1
store i8* %6, i8** %7
%8 = bitcast { %tydesc*, i8* }* %__auto_borrow_obj to i8*
%9 = bitcast { %tydesc*, i8* }* %__trait_callee to i8*
call void @llvm.memcpy.p0i8.p0i8.i32(i8* %9, i8* %8, i32 8, i32 4, i1 false)
%10 = getelementptr inbounds { %tydesc*, i8* }* %__trait_callee, i32 0, i32 1
%11 = load i8** %10
%12 = bitcast i8* %11 to { i32, %tydesc*, i8*, i8*, i8 }*
%13 = getelementptr inbounds { %tydesc*, i8* }* %__trait_callee, i32 0, i32 0
%14 = bitcast %tydesc** %13 to [1 x i8*]**
%15 = load [1 x i8*]** %14
%16 = getelementptr inbounds [1 x i8*]* %15, i32 0, i32 1
%17 = load i8** %16
%18 = bitcast i8* %17 to void ({ i32, %tydesc*, i8*, i8*, i8 }*)*
call void %18({ i32, %tydesc*, i8*, i8*, i8 }* %12)
ret void
}
...
define void @_ZN4main_UUID.0E({ i32, %tydesc*, i8*, i8*, i8 }*) #4 {
"function top level":
%o = alloca %struct.Foo
%1 = alloca { %tydesc*, i8* }
%__auto_borrow_obj = alloca { %tydesc*, i8* }
%2 = getelementptr inbounds { %tydesc*, i8* }* %1, i32 0, i32 1
%3 = bitcast i8** %2 to %struct.Foo**
store %struct.Foo* %o, %struct.Foo** %3
%4 = getelementptr inbounds { %tydesc*, i8* }* %1, i32 0, i32 0
%5 = bitcast %tydesc** %4 to { %tydesc*, void ({ i32, %tydesc*, i8*, i8*, i8 }*)* }**
store { %tydesc*, void ({ i32, %tydesc*, i8*, i8*, i8 }*)* }* @vtable1081, { %tydesc*, void ({ i32, %tydesc*, i8*, i8*, i8 }*)* }** %5
%6 = getelementptr inbounds { %tydesc*, i8* }* %1, i32 0, i32 0
%7 = load %tydesc** %6
%8 = getelementptr inbounds { %tydesc*, i8* }* %__auto_borrow_obj, i32 0, i32 0
store %tydesc* %7, %tydesc** %8
%9 = getelementptr inbounds { %tydesc*, i8* }* %1, i32 0, i32 1
%10 = load i8** %9
%11 = getelementptr inbounds { %tydesc*, i8* }* %__auto_borrow_obj, i32 0, i32 1
store i8* %10, i8** %11
call void @_ZN7callBar_UUID.0E({ i32, %tydesc*, i8*, i8*, i8 }* undef, { %tydesc*, i8* }* %__auto_borrow_obj)
ret void
}
```
If you apply my patch, it would become way shorter and cleaner:
```
define void @_ZN7callBar_UUID.0E({ i32, %tydesc*, i8*, i8*, i8 }*, { %tydesc*, i8* }*) #4 {
"function top level":
%2 = getelementptr inbounds { %tydesc*, i8* }* %1, i32 0, i32 1
%3 = load i8** %2
%4 = bitcast i8* %3 to { i32, %tydesc*, i8*, i8*, i8 }*
%5 = getelementptr inbounds { %tydesc*, i8* }* %1, i32 0, i32 0
%6 = bitcast %tydesc** %5 to [1 x i8*]**
%7 = load [1 x i8*]** %6
%8 = getelementptr inbounds [1 x i8*]* %7, i32 0, i32 1
%9 = load i8** %8
%10 = bitcast i8* %9 to void ({ i32, %tydesc*, i8*, i8*, i8 }*)*
call void %10({ i32, %tydesc*, i8*, i8*, i8 }* %4)
ret void
}
...
define void @_ZN4main_UUID.0E({ i32, %tydesc*, i8*, i8*, i8 }*) #4 {
"function top level":
%o = alloca %struct.Foo
%1 = alloca { %tydesc*, i8* }
%2 = getelementptr inbounds { %tydesc*, i8* }* %1, i32 0, i32 1
%3 = bitcast i8** %2 to %struct.Foo**
store %struct.Foo* %o, %struct.Foo** %3
%4 = getelementptr inbounds { %tydesc*, i8* }* %1, i32 0, i32 0
%5 = bitcast %tydesc** %4 to { %tydesc*, void ({ i32, %tydesc*, i8*, i8*, i8 }*)* }**
store { %tydesc*, void ({ i32, %tydesc*, i8*, i8*, i8 }*)* }* @vtable1081, { %tydesc*, void ({ i32, %tydesc*, i8*, i8*, i8 }*)* }** %5
call void @_ZN7callBar_UUID.0E({ i32, %tydesc*, i8*, i8*, i8 }* undef, { %tydesc*, i8* }* %1)
ret void
}
```
Although this change doesn't increase the compilation speed much (I mentioned only about 1-2% boost on "rustc -O -Z time-passes syntax.rs"), but I still think it's a good thing to do as it greatly simplifies/clarifies LL generated in some cases which would definitely help in the future code generation investigations.
I don't provide any new test cases in this patch as it is merely an optimization.
Sorry guys, I somehow messed my previous PR and I don't see any better way to fix as to recreate it here.File tree
4 files changed
+51
-31
lines changed- src
- librustc/middle/trans
- test/run-pass
4 files changed
+51
-31
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
313 | 313 | | |
314 | 314 | | |
315 | 315 | | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
316 | 346 | | |
317 | 347 | | |
318 | 348 | | |
| |||
331 | 361 | | |
332 | 362 | | |
333 | 363 | | |
334 | | - | |
335 | | - | |
336 | | - | |
337 | | - | |
338 | | - | |
339 | | - | |
340 | | - | |
341 | | - | |
342 | | - | |
343 | 364 | | |
344 | 365 | | |
345 | 366 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
434 | 434 | | |
435 | 435 | | |
436 | 436 | | |
| 437 | + | |
437 | 438 | | |
438 | | - | |
439 | | - | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
| 446 | + | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
| 450 | + | |
| 451 | + | |
440 | 452 | | |
441 | | - | |
442 | | - | |
443 | | - | |
444 | 453 | | |
445 | 454 | | |
446 | 455 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
278 | 278 | | |
279 | 279 | | |
280 | 280 | | |
281 | | - | |
282 | | - | |
283 | | - | |
284 | | - | |
285 | | - | |
286 | | - | |
287 | | - | |
288 | | - | |
289 | | - | |
290 | | - | |
291 | | - | |
292 | | - | |
293 | | - | |
294 | | - | |
295 | | - | |
296 | | - | |
297 | | - | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
298 | 287 | | |
299 | 288 | | |
300 | 289 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
55 | 55 | | |
56 | 56 | | |
57 | 57 | | |
| 58 | + | |
58 | 59 | | |
59 | 60 | | |
60 | 61 | | |
| |||
0 commit comments