This is an archive of the discontinued LLVM Phabricator instance.

Check that the key is in the LEAs map before accessing
ClosedPublic

Authored by trixirt on Aug 15 2018, 7:09 AM.

Details

Summary

When the key is not already in the map, the access operator[] creates an empty value and grows the map.
Resizing a map is very slow, so this needs to be avoided.

Found with csmith + asserts.

May help with
https://bugs.llvm.org/show_bug.cgi?id=25843

Diff Detail

Repository
rL LLVM

Event Timeline

trixirt created this revision.Aug 15 2018, 7:09 AM

Any comments ?

kristina added subscribers: craig.topper, kristina.

This looks like intentional behavior, added @craig.topper to review.

I think you're changing the semantics of the code by removing a side effect, may lead to unexpected bugs somewhere else.

I don't think there are any meaningful side effects.

In this function, removeRedundantAddrCalc, when genMemOpKey returns a key not already in the map, the value/vector on instructions is empty.
When chooseBestLEA is passed an empty vector, it never loops over it an returns a nullptr.
A nullptr causes the mi loop to continue

If on a future mi loop pass, there was a match, the match would return the same empty value/vector
and cause the same continue in the mi loop

When removeRedundantAddrCalc returns, it is only to 1 place in the main runOnMachineFunction work loop.
The LEAs map's scope is the work loop and removeRedundantAddrCalc is it's last use.

craig.topper added inline comments.Aug 19 2018, 10:06 AM
lib/Target/X86/X86OptimizeLEAs.cpp
519

Can we use LEAs.find so we can use one map search for the existence check and getting the SmallVectorImpl for chooseBestLEA?

trixirt updated this revision to Diff 161476.Aug 20 2018, 7:11 AM

Switch to using 'find' as suggested by Craig

craig.topper added inline comments.Aug 20 2018, 10:06 AM
lib/Target/X86/X86OptimizeLEAs.cpp
517

Can you just call getMemOpKey when you call find? I don't think we need a separate variable for it.

518

Variable names should be capitalized.

trixirt updated this revision to Diff 161551.Aug 20 2018, 1:30 PM

Changes suggested by Craig.
For readability, move chooseBestLEA's variables closer to call.

This revision is now accepted and ready to land.Aug 21 2018, 10:00 AM

I do not have commit perms, so can someone commit this for me ?

This revision was automatically updated to reflect the committed changes.