This is an archive of the discontinued LLVM Phabricator instance.

LEA code size optimization pass (Part 2): Remove redundant LEA instructions
ClosedPublic

Authored by aturetsk on Sep 30 2015, 8:50 AM.

Details

Summary

Make x86 OptimizeLEAs pass remove LEA instruction if there is another LEA (in the same basic block) which calculates address differing only be a displacement. Works only for -Oz.

Diff Detail

Event Timeline

aturetsk updated this revision to Diff 36113.Sep 30 2015, 8:50 AM
aturetsk retitled this revision from to LEA code size optimization pass (Part 2): Remove redundant LEA instructions.
aturetsk updated this object.
aturetsk added a reviewer: nadav.
aturetsk added a subscriber: llvm-commits.
aturetsk updated this object.Sep 30 2015, 9:04 AM
nadav edited edge metadata.Nov 2 2015, 7:28 AM
nadav added a subscriber: nadav.

LGTM.

aturetsk updated this revision to Diff 40930.Nov 23 2015, 7:29 AM
aturetsk edited edge metadata.

Made some changes according to the comments to the first part of the patch

aturetsk updated this revision to Diff 41311.Nov 27 2015, 8:04 AM

Minor test changes to be up-to-date with the first part of the patch.

aturetsk updated this revision to Diff 41763.Dec 3 2015, 8:59 AM

Improved comments.

aturetsk updated this revision to Diff 41853.Dec 4 2015, 2:22 AM

Sync up with the changes of the first part of the patch.

aturetsk updated this revision to Diff 42835.Dec 15 2015, 4:28 AM

Updated to the latest trunk.

qcolombet edited edge metadata.Dec 15 2015, 11:44 AM

Hi Andrey,

Thanks for working on this.

Out of curiosity, what performance impact do you see?
I.e., compile time and code size improvements.

Couple more comments inlined.

Thanks,
-Quentin

lib/Target/X86/X86OptimizeLEAs.cpp
76

Please comment what AddrDispShift is and how it should be used by the caller.

201

differ?

228

This assert is useless.
This is already enforced by isLEA, isn’t it?

Moreover, in the previous check (getOperand(0).getReg()), the compiler would have asserted if the operand was not a register.

246

Could you add a comment over that loop?

398

The formatting looks funny to me, have you used clang-format?

415

else llvm_unreachable or assert?

426

Add a message in the assert.

aturetsk updated this revision to Diff 43516.Dec 23 2015, 2:33 AM
aturetsk edited edge metadata.

Fixed remarks from inline comments.

Hi Quentin,
Thanks for the review.
This part reduces code size on Spec2000 for additional 0.1%, making it total 0.3% at -Oz.
The performance impact I measured was negative, yet very close to zero. I didn't want to possibly hurt performance at any rate at -Os, so I enabled it only for -Oz and I intend to keep it so until I do some analysis.
I don't see any significant compile time impact on Spec 2000 or the test from https://llvm.org/bugs/show_bug.cgi?id=25843. The complexity of removeRedundantLEAs is something like O(n^2), so the compile time should not blow up for big basic blocks.

lib/Target/X86/X86OptimizeLEAs.cpp
76

Done.

201

Fixed.

228

Removed.

246

Done.

398

Absolutely, that's clang-format's doing.

415

Done.

426

Done.

qcolombet accepted this revision.Jan 11 2016, 1:59 PM
qcolombet edited edge metadata.

LGTM.

This revision is now accepted and ready to land.Jan 11 2016, 1:59 PM
This revision was automatically updated to reflect the committed changes.