]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
Pull in r360099 from upstream llvm trunk (by Eli Friedman):
authordim <dim@FreeBSD.org>
Wed, 8 May 2019 05:45:00 +0000 (05:45 +0000)
committerdim <dim@FreeBSD.org>
Wed, 8 May 2019 05:45:00 +0000 (05:45 +0000)
commit5446f43efb6144f630411db3a4035678553522e6
treeea061bfa81d53a58bdfbecfbf2849e09be300f81
parentd539c69d814bec6ff9fe8454d17f304c1b7e011d
Pull in r360099 from upstream llvm trunk (by Eli Friedman):

  [ARM] Glue register copies to tail calls.

  This generally follows what other targets do. I don't completely
  understand why the special case for tail calls existed in the first
  place; even when the code was committed in r105413, call lowering
  didn't work in the way described in the comments.

  Stack protector lowering breaks if the register copies are not glued
  to a tail call: we have to insert the stack protector check before
  the tail call, and we choose the location based on the assumption
  that all physical register dependencies of a tail call are adjacent
  to the tail call. (See FindSplitPointForStackProtector.) This is sort
  of fragile, but I don't see any reason to break that assumption.

  I'm guessing nobody has seen this before just because it's hard to
  convince the scheduler to actually schedule the code in a way that
  breaks; even without the glue, the only computation that could
  actually be scheduled after the register copies is the computation of
  the call address, and the scheduler usually prefers to schedule that
  before the copies anyway.

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

  Differential Revision: https://reviews.llvm.org/D60427

This should fix several instances of "Bad machine code: Using an
undefined physical register", when compiling ports such as
multimedia/vlc, audio/alsa-lib and devel/avro-c for armv6, with
-fstack-protector-strong.

Reported by: jbeich
PR: 237074, 237783, 237784
MFC after: 3 days
contrib/llvm/lib/Target/ARM/ARMISelLowering.cpp