This is an archive of the discontinued LLVM Phabricator instance.

[X86] Selecting fld0 for undefined value in fast ISEL.
ClosedPublic

Authored by LuoYuanke on Jun 21 2021, 7:00 PM.

Details

Summary

When set opt-bisect-limit to some value that is less than ISel pass
in command line and CurBisectNum expired, "DAG to DAG" pass lower
its opt level to O0. However "processimpdefs" and "X86 FP Stackifier"
is not stopped due to the CurBisectNum expiration. So undefined fp0
is generated. This cause crash in the "X86 FP Stackifier" pass,
because Stackifier doesn't expect any undefined fp value.

Here is the scenario that cause compiler crash.

successors: %bb.26
liveins: $r14
  ST_FPrr $st0, implicit-def $fpsw, implicit $fpcw
  renamable $rdi = MOV64ri @.str.3.16422
  renamable $rdx = LEA64r %stack.6, 1, $noreg, 0, $noreg
  ADJCALLSTACKDOWN64 0, 0, 0, implicit-def $rsp, implicit-def dead
  $eflags, implicit-def $ssp, implicit $rsp, implicit $ssp
  dead $esi = MOV32r0 implicit-def dead $eflags, implicit-def $rsi
  CALL64pcrel32 @foo, implicit $rsp, implicit $ssp, implicit $rdi,
  implicit $rsi, implicit $rdx, implicit-def dead $fp0
  renamable $xmm0 = MOVSDrm_alt %stack.10, 1, $noreg, 0, $noreg :: (load 8
  from %stack.10)
  ADJCALLSTACKUP64 0, 0, implicit-def $rsp, implicit-def dead $eflags,
  implicit-def $ssp, implicit $rsp, implicit $ssp
  renamable $fp2 = CHS_Fp80 killed undef renamable $fp0, implicit-def
  $fpsw
  JMP_1 %bb.26

The CALL64pcrel32 mark fp0 dead, so llvm free the stack slot for fp0
and the stack become empty. In the late instruction CHS_Fp80, it use
undefined register fp0, the original code assume there must be a stack
slot for the src register (fp0) without respecting it is undefined,
so llvm report error.

We have some discussion in https://reviews.llvm.org/D104440 and we
decide to fix it in fast ISel. The fix is to lower undefined fp value to
zero value, so that it release the burden of "X86 FP Stackifier" pass.
Thank Craig for the suggestion and the initial patch to fix it

Diff Detail

Event Timeline

LuoYuanke created this revision.Jun 21 2021, 7:00 PM
LuoYuanke requested review of this revision.Jun 21 2021, 7:00 PM
Herald added a project: Restricted Project. · View Herald TranscriptJun 21 2021, 7:00 PM
LuoYuanke updated this revision to Diff 353526.Jun 21 2021, 7:02 PM

Edit commit message.

This revision is now accepted and ready to land.Jun 25 2021, 9:36 AM
This revision was automatically updated to reflect the committed changes.