Skip to content

DAGCombiner doesn't check legality for merging stores with noimplicitfloat #39641

@nemanjai

Description

@nemanjai
Bugzilla Link 40294
Version trunk
OS All

Extended Description

This can be reproduced as follows:

$ cat a.ll 
define dso_local void @test(i64* nocapture %arr1) local_unnamed_addr #0 {
entry:
  %arrayidx = getelementptr inbounds i64, i64* %arr1, i64 2
  %0 = load i64, i64* %arrayidx, align 8
  store i64 %0, i64* %arr1, align 8
  %arrayidx2 = getelementptr inbounds i64, i64* %arr1, i64 3
  %1 = load i64, i64* %arrayidx2, align 8
  %arrayidx3 = getelementptr inbounds i64, i64* %arr1, i64 1
  store i64 %1, i64* %arrayidx3, align 8
  ret void
}

attributes #0 = { noimplicitfloat }

$ llc a.ll -mtriple=powerpc64le-unknown-unknown
llc: /home/nemanjai/llvm/llvm-clean/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:970: void {anonymous}::SelectionDAGLegalize::LegalizeOp(llvm::SDNode*): Assertion `(TLI.getTypeAction(*DAG.getContext(), Op.getValueType()) == TargetLowering::TypeLegal || TLI.isTypeLegal(Op.getValueType()) || Op.getOpcode() == ISD::TargetConstant || Op.getOpcode() == ISD::Register) && "Unexpected illegal type!"' failed.

The problem is that PPC does not override TargetLowering::mergeStoresAfterLegalization() and the merging will produce an i128 which isn't legal.
It will of course produce it prior to legalization as well, but the legalizer will undo that, the problem is after legalization.

Note that without the noimplicitfloat attribute, things work because using vectors is allowed and then it will find a corresponding vector type.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions