This is an archive of the discontinued LLVM Phabricator instance.

[SelectionDAG] Don't crash on inline assembly errors when the inline assembly return type is a struct.
ClosedPublic

Authored by craig.topper on May 7 2018, 4:42 PM.

Details

Summary

If we get an error building the SelectionDAG for inline assembly we try to continue and still build the DAG.

But if the return type for the inline assembly is a struct we end up crashing because we try to create an UNDEF node with a struct type which isn't valid.

Instead we need to create an UNDEF for each element of the struct and join them with merge_values.

This patch relies on single operand merge_values being handled gracefully by getMergeValues. If the return type is void there will be no VTs returned by ComputeValueVTs and now we just return instead of calling setValue. Hopefully that's ok, I assumed nothing would need to look up the mapped value for void node.

Fixes PR37359

Diff Detail

Repository
rL LLVM

Event Timeline

craig.topper created this revision.May 7 2018, 4:42 PM
efriedma accepted this revision.Jun 19 2018, 6:42 PM

LGTM

Nothing should ask for the result of an inline asm which produces zero values; that's fine. (The chain is handled separately.)

This revision is now accepted and ready to land.Jun 19 2018, 6:42 PM

Good enough for me. I hadn't had time to look. Thanks Eli.

This revision was automatically updated to reflect the committed changes.