summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/Hexagon
diff options
context:
space:
mode:
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>2017-05-05 12:20:07 +0000
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>2017-05-05 12:20:07 +0000
commit31d4b3b247cf74e7d4469cf69c8f2d773890d269 (patch)
tree67c2ad5f348ff57532e995fd8e6b9a2d49fefea3 /llvm/test/CodeGen/Hexagon
parentbb451903f5a51fd7f49c9d298376315236e94ede (diff)
downloadbcm5719-llvm-31d4b3b247cf74e7d4469cf69c8f2d773890d269.tar.gz
bcm5719-llvm-31d4b3b247cf74e7d4469cf69c8f2d773890d269.zip
Remove stale live-ins in the branch folder
Hoisting common code can cause registers that live-in in the successor blocks to no longer be live-in. The live-in information needs to be updated to reflect this, or otherwise incorrect code can be generated later on. Differential Revision: https://reviews.llvm.org/D32661 llvm-svn: 302228
Diffstat (limited to 'llvm/test/CodeGen/Hexagon')
-rw-r--r--llvm/test/CodeGen/Hexagon/branch-folder-hoist-kills.mir59
1 files changed, 59 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/Hexagon/branch-folder-hoist-kills.mir b/llvm/test/CodeGen/Hexagon/branch-folder-hoist-kills.mir
new file mode 100644
index 00000000000..a746d826265
--- /dev/null
+++ b/llvm/test/CodeGen/Hexagon/branch-folder-hoist-kills.mir
@@ -0,0 +1,59 @@
+# RUN: llc -march=hexagon -run-pass branch-folder -run-pass if-converter -verify-machineinstrs %s -o - | FileCheck %s
+
+# The hoisting of common instructions from successors could cause registers
+# to no longer be live-in in the successor blocks. The liveness was updated
+# to include potential new live-in registres, but not to remove registers
+# that were no longer live-in.
+# This could cause if-converter to generate incorrect code.
+#
+# In this testcase, the "r1 = A2_sxth r0<kill>" was hoisted, and since r0
+# was killed, it was no longer live-in in either successor. The if-converter
+# then created code, where the first predicated instruction has incorrect
+# implicit use of r0:
+#
+# BB#0:
+# Live Ins: %R0
+# %R1<def> = A2_sxth %R0<kill> ; hoisted, kills r0
+# A2_nop %P0<imp-def>
+# %R0<def> = C2_cmoveit %P0, 2, %R0<imp-use> ; predicated A2_tfrsi
+# %R0<def> = C2_cmoveif %P0, 1, %R0<imp-use> ; predicated A2_tfrsi
+# %R0<def> = A2_add %R0<kill>, %R1<kill>
+# J2_jumpr %R31, %PC<imp-def,dead>
+#
+
+# CHECK: %r1 = A2_sxth killed %r0
+# CHECK: %r0 = C2_cmoveit %p0, 2
+# CHECK-NOT: implicit-def %r0
+# CHECK: %r0 = C2_cmoveif %p0, 1, implicit %r0
+
+---
+name: fred
+tracksRegLiveness: true
+
+body: |
+ bb.0:
+ liveins: %r0
+ successors: %bb.1, %bb.2
+
+ A2_nop implicit-def %p0
+ J2_jumpt killed %p0, %bb.2, implicit-def dead %pc
+
+ bb.1:
+ successors: %bb.3
+ liveins: %r0
+ %r1 = A2_sxth killed %r0
+ %r0 = A2_tfrsi 1
+ J2_jump %bb.3, implicit-def %pc
+
+ bb.2:
+ successors: %bb.3
+ liveins: %r0
+ %r1 = A2_sxth killed %r0
+ %r0 = A2_tfrsi 2
+
+ bb.3:
+ liveins: %r0, %r1
+ %r0 = A2_add killed %r0, killed %r1
+ J2_jumpr %r31, implicit-def dead %pc
+...
+
OpenPOWER on IntegriCloud