[llvm-dev] Tail merging "undef" with a defined register: wrong code
Krzysztof Parzyszek via llvm-dev
llvm-dev at lists.llvm.org
Thu Jul 27 11:40:09 PDT 2017
The comment in test/CodeGen/X86/branchfolding-undef.mir states that such
merging is legal, however doing so can actually generate wrong code:
Consider this (valid code):
---
name: fred
tracksRegLiveness: true
body: |
bb.0:
successors: %bb.1, %bb.2
J2_jumpt undef %p0, %bb.2, implicit-def %pc
J2_jump %bb.1, implicit-def %pc
bb.1:
successors: %bb.3
%r0 = L2_loadruh_io undef %r0, 0
PS_storerhabs 0, killed %r0
J2_jump %bb.3, implicit-def %pc
bb.2:
successors: %bb.3
PS_storerhabs 0, undef %r0
J2_jump %bb.3, implicit-def %pc
bb.3:
PS_jmpret killed %r31, implicit-def %pc
...
Run:
llc -march=hexagon -run-pass branch-folder test.mir -o -
We get an invalid code:
body: |
bb.0:
successors: %bb.1(0x40000000), %bb.2(0x40000000)
J2_jumpt undef %p0, %bb.2, implicit-def %pc
bb.1:
successors: %bb.2(0x80000000)
%r0 = L2_loadruh_io undef %r0, 0
bb.2:
liveins: %r0 ; Invalid: r0 is not live out of bb.0
PS_storerhabs 0, %r0
PS_jmpret killed %r31, implicit-def %pc
...
Should we disallow merging undef with non-undef?
-Krzysztof
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation
More information about the llvm-dev
mailing list