This is an archive of the discontinued LLVM Phabricator instance.

BPF: Fix a bug in peephole TRUNC elimination optimization
ClosedPublic

Authored by yonghong-song on Mar 2 2021, 11:17 AM.

Details

Summary

Andrei Matei reported a llvm11 core dump for his bpf program

https://bugs.llvm.org/show_bug.cgi?id=48578

The core dump happens in LiveVariables analysis phase.

#4 0x00007fce54356bb0 __restore_rt
#5 0x00007fce4d51785e llvm::LiveVariables::HandleVirtRegUse(unsigned int,
    llvm::MachineBasicBlock*, llvm::MachineInstr&)
#6 0x00007fce4d519abe llvm::LiveVariables::runOnInstr(llvm::MachineInstr&,
    llvm::SmallVectorImpl<unsigned int>&)
#7 0x00007fce4d519ec6 llvm::LiveVariables::runOnBlock(llvm::MachineBasicBlock*, unsigned int)
#8 0x00007fce4d51a4bf llvm::LiveVariables::runOnMachineFunction(llvm::MachineFunction&)

The bug can be reproduced with llvm12 and latest trunk as well.

Futher analysis shows that there is a bug in BPF peephole
TRUNC elimination optimization, which tries to remove
unnecessary TRUNC operations (a <<= 32; a >>= 32).
Specifically, the compiler did wrong transformation for the
following patterns:

%1 = LDW ... 
%2 = SLL_ri %1, 32
%3 = SRL_ri %2, 32
... %3 ... 
%4 = SRA_ri %2, 32
... %4 ...

The current transformation did not check how many uses of %2
and did transformation like

%1 = LDW ... 
... %1 ... 
%4 = SRL_ri %2, 32
... %4 ...

and pseudo register %2 is used by not defined and
caused LiveVariables analysis core dump.

To fix the issue, when traversing back from SRL_ri to SLL_ri,
check to ensure SLL_ri has only one use. Otherwise, don't
do transformation.

Diff Detail

Event Timeline

yonghong-song created this revision.Mar 2 2021, 11:17 AM
yonghong-song requested review of this revision.Mar 2 2021, 11:17 AM
Herald added a project: Restricted Project. · View Herald TranscriptMar 2 2021, 11:17 AM
ast accepted this revision.Mar 2 2021, 12:10 PM

thanks for the quick fix!

This revision is now accepted and ready to land.Mar 2 2021, 12:10 PM
This revision was landed with ongoing or failed builds.Mar 2 2021, 1:04 PM
This revision was automatically updated to reflect the committed changes.