HomeFreeBSD

Pull in r354756 from upstream llvm trunk (by Craig Topper):

Description

Pull in r354756 from upstream llvm trunk (by Craig Topper):

[X86] Fix tls variable lowering issue with large code model

Summary:
The problem here is the lowering for tls variable. Below is the DAG
for the code. SelectionDAG has 11 nodes:

t0: ch = EntryToken

t8: i64,ch = load<(load 8 from i8 addrspace(257)* null,
addrspace 257)> t0, Constant:i64<0>, undef:i64

	  t10: i64 = X86ISD::WrapperRIP TargetGlobalTLSAddress:i64<i32*
	  @x> 0 [TF=10]

t11: i64,ch = load<(load 8 from got)> t0, t10, undef:i64

    t12: i64 = add t8, t11
  t4: i32,ch = load<(dereferenceable load 4 from @x)> t0, t12,
  undef:i64
t6: ch = CopyToReg t0, Register:i32 %0, t4

And when mcmodel is large, below instruction can NOT be folded.

  t10: i64 = X86ISD::WrapperRIP TargetGlobalTLSAddress:i64<i32* @x> 0
  [TF=10]
t11: i64,ch = load<(load 8 from got)> t0, t10, undef:i64

So "t11: i64,ch = load<(load 8 from got)> t0, t10, undef:i64" is
lowered to " Morphed node: t11: i64,ch = MOV64rm<Mem:(load 8 from
got)> t10, TargetConstant:i8<1>, Register:i64 $noreg,
TargetConstant:i32<0>, Register:i32 $noreg, t0"

When llvm start to lower "t10: i64 = X86ISD::WrapperRIP
TargetGlobalTLSAddress:i64<i32* @x> 0 [TF=10]", it fails.

The patch is to fold the load and X86ISD::WrapperRIP.

Fixes PR26906

Patch by LuoYuanke

Reviewers: craig.topper, rnk, annita.zhang, wxiao3

Reviewed By: rnk

Subscribers: llvm-commits

Tags: #llvm

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

This should fix "fatal error: error in backend: Cannot select" messages
when compiling <ctype.h> functions using -mcmodel=large.

Reported by: phk
PR: 233143
MFC after: 3 days

Details

Provenance
dimAuthored on
Parents
rS344502: sh: Add set -o pipefail
Branches
Unknown
Tags
Unknown