[all-commits] [llvm/llvm-project] 334302: [ModuleInliner] Fix the heap maintenance (#69251)

Kazu Hirata via All-commits all-commits at lists.llvm.org
Tue Oct 17 23:04:48 PDT 2023


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 33430205510f4ac82f91728e6289b0412576209c
      https://github.com/llvm/llvm-project/commit/33430205510f4ac82f91728e6289b0412576209c
  Author: Kazu Hirata <kazu at google.com>
  Date:   2023-10-17 (Tue, 17 Oct 2023)

  Changed paths:
    M llvm/lib/Analysis/InlineOrder.cpp

  Log Message:
  -----------
  [ModuleInliner] Fix the heap maintenance (#69251)

With expensive checks enabled but without this patch, std::pop_heap
triggers an assertion failure.  This is because:

  updateAndCheckDecreased(Heap.front())

updates the priority associated with Heap.front(), so Heap may no
longer be a valid heap.  The libstdc++ version of std::pop_heap
requires that the entire range be a valid heap even though the core
task of std::pop_heap is just to swap the Heap.front() and
Heap.back().

This patch fixes the problem by:

- calling std::pop_heap to swap Heap.front() and Heap.back(),
- updating the priority of Heap.back(), and
- inserting Heap.back() back into the heap.

We could reduce the number of calls to updateAndCheckDecreased or the
number of elements being moved, but I think it's important to fix the
crash first.

Credit to Ivan Kosarev for identifying the problem and Liqiang Tao for
the analysis and initial version of the patch.




More information about the All-commits mailing list