summaryrefslogtreecommitdiffstats
path: root/llvm/test/CodeGen/SystemZ/pr36164.ll
diff options
context:
space:
mode:
authorNirav Dave <niravd@google.com>2018-02-01 16:11:59 +0000
committerNirav Dave <niravd@google.com>2018-02-01 16:11:59 +0000
commit18f7f60e1758cf8e47eb5b06ee7b3e04159c4415 (patch)
treef5188c2145a72a312be315754f71e527a4b16768 /llvm/test/CodeGen/SystemZ/pr36164.ll
parent9c6e2fd5a4d37df0cf82486e0648583650b297f9 (diff)
downloadbcm5719-llvm-18f7f60e1758cf8e47eb5b06ee7b3e04159c4415.tar.gz
bcm5719-llvm-18f7f60e1758cf8e47eb5b06ee7b3e04159c4415.zip
[SelectionDAG] Fix UpdateChains handling of TokenFactors
Summary: In Instruction Selection UpdateChains replaces all matched Nodes' chain references including interior token factors and deletes them. This may allow nodes which depend on these interior nodes but are not part of the set of matched nodes to be left with a dangling dependence. Avoid this by doing the replacement for matched non-TokenFactor nodes. Fixes PR36164. Reviewers: jonpa, RKSimon, bogner Subscribers: llvm-commits, hiraditya Differential Revision: https://reviews.llvm.org/D42754 llvm-svn: 323977
Diffstat (limited to 'llvm/test/CodeGen/SystemZ/pr36164.ll')
-rw-r--r--llvm/test/CodeGen/SystemZ/pr36164.ll113
1 files changed, 113 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/SystemZ/pr36164.ll b/llvm/test/CodeGen/SystemZ/pr36164.ll
new file mode 100644
index 00000000000..0c850091d31
--- /dev/null
+++ b/llvm/test/CodeGen/SystemZ/pr36164.ll
@@ -0,0 +1,113 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc %s -o - -mtriple=s390x-linux-gnu -mcpu=z13 -disable-basicaa | FileCheck %s
+
+; This test checks that we do not a reference to a deleted node.
+
+%0 = type { i32 }
+
+@g_11 = external dso_local unnamed_addr global i1, align 4
+@g_69 = external dso_local global i32, align 4
+@g_73 = external dso_local unnamed_addr global i32, align 4
+@g_832 = external dso_local constant %0, align 4
+@g_938 = external dso_local unnamed_addr global i64, align 8
+
+; Function Attrs: nounwind
+define void @main() local_unnamed_addr #0 {
+; CHECK-LABEL: main:
+; CHECK: # %bb.0:
+; CHECK-NEXT: stmg %r12, %r15, 96(%r15)
+; CHECK-NEXT: .cfi_offset %r12, -64
+; CHECK-NEXT: .cfi_offset %r13, -56
+; CHECK-NEXT: .cfi_offset %r14, -48
+; CHECK-NEXT: .cfi_offset %r15, -40
+; CHECK-NEXT: lhi %r0, 1
+; CHECK-NEXT: larl %r1, g_938
+; CHECK-NEXT: lhi %r2, 2
+; CHECK-NEXT: lhi %r3, 3
+; CHECK-NEXT: lhi %r4, 0
+; CHECK-NEXT: lhi %r5, 4
+; CHECK-NEXT: larl %r14, g_11
+; CHECK-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=1
+; CHECK-NEXT: strl %r0, g_73
+; CHECK-NEXT: lrl %r13, g_832
+; CHECK-NEXT: lrl %r13, g_832
+; CHECK-NEXT: lrl %r13, g_832
+; CHECK-NEXT: lrl %r13, g_832
+; CHECK-NEXT: lrl %r13, g_832
+; CHECK-NEXT: lrl %r13, g_832
+; CHECK-NEXT: lrl %r13, g_832
+; CHECK-NEXT: lrl %r13, g_832
+; CHECK-NEXT: lrl %r13, g_832
+; CHECK-NEXT: lrl %r13, g_832
+; CHECK-NEXT: lrl %r13, g_832
+; CHECK-NEXT: lrl %r13, g_832
+; CHECK-NEXT: lrl %r13, g_832
+; CHECK-NEXT: lrl %r13, g_832
+; CHECK-NEXT: lrl %r13, g_832
+; CHECK-NEXT: strl %r0, g_69
+; CHECK-NEXT: lrl %r13, g_832
+; CHECK-NEXT: lghi %r13, 24
+; CHECK-NEXT: strl %r2, g_69
+; CHECK-NEXT: ag %r13, 0(%r1)
+; CHECK-NEXT: lrl %r12, g_832
+; CHECK-NEXT: strl %r3, g_69
+; CHECK-NEXT: lrl %r12, g_832
+; CHECK-NEXT: strl %r4, g_69
+; CHECK-NEXT: lrl %r12, g_832
+; CHECK-NEXT: strl %r0, g_69
+; CHECK-NEXT: lrl %r12, g_832
+; CHECK-NEXT: strl %r2, g_69
+; CHECK-NEXT: lrl %r12, g_832
+; CHECK-NEXT: strl %r3, g_69
+; CHECK-NEXT: stgrl %r13, g_938
+; CHECK-NEXT: lrl %r13, g_832
+; CHECK-NEXT: strl %r5, g_69
+; CHECK-NEXT: mvi 0(%r14), 1
+; CHECK-NEXT: j .LBB0_1
+ br label %1
+
+; <label>:1: ; preds = %1, %0
+ store i32 1, i32* @g_73, align 4
+ %2 = load i64, i64* @g_938, align 8
+ store i32 0, i32* @g_69, align 4
+ %3 = load volatile i32, i32* getelementptr inbounds (%0, %0* @g_832, i64 0, i32 0), align 4
+ %4 = load volatile i32, i32* getelementptr inbounds (%0, %0* @g_832, i64 0, i32 0), align 4
+ %5 = load volatile i32, i32* getelementptr inbounds (%0, %0* @g_832, i64 0, i32 0), align 4
+ %6 = load volatile i32, i32* getelementptr inbounds (%0, %0* @g_832, i64 0, i32 0), align 4
+ store i32 1, i32* @g_69, align 4
+ %7 = load volatile i32, i32* getelementptr inbounds (%0, %0* @g_832, i64 0, i32 0), align 4
+ %8 = load volatile i32, i32* getelementptr inbounds (%0, %0* @g_832, i64 0, i32 0), align 4
+ store i32 3, i32* @g_69, align 4
+ %9 = load volatile i32, i32* getelementptr inbounds (%0, %0* @g_832, i64 0, i32 0), align 4
+ %10 = load volatile i32, i32* getelementptr inbounds (%0, %0* @g_832, i64 0, i32 0), align 4
+ store i32 1, i32* @g_69, align 4
+ %11 = load volatile i32, i32* getelementptr inbounds (%0, %0* @g_832, i64 0, i32 0), align 4
+ store i32 2, i32* @g_69, align 4
+ %12 = load volatile i32, i32* getelementptr inbounds (%0, %0* @g_832, i64 0, i32 0), align 4
+ store i32 3, i32* @g_69, align 4
+ %13 = load volatile i32, i32* getelementptr inbounds (%0, %0* @g_832, i64 0, i32 0), align 4
+ store i32 0, i32* @g_69, align 4
+ %14 = load volatile i32, i32* getelementptr inbounds (%0, %0* @g_832, i64 0, i32 0), align 4
+ %15 = load volatile i32, i32* getelementptr inbounds (%0, %0* @g_832, i64 0, i32 0), align 4
+ %16 = load volatile i32, i32* getelementptr inbounds (%0, %0* @g_832, i64 0, i32 0), align 4
+ %17 = load volatile i32, i32* getelementptr inbounds (%0, %0* @g_832, i64 0, i32 0), align 4
+ store i32 1, i32* @g_69, align 4
+ %18 = load volatile i32, i32* getelementptr inbounds (%0, %0* @g_832, i64 0, i32 0), align 4
+ store i32 2, i32* @g_69, align 4
+ %19 = load volatile i32, i32* getelementptr inbounds (%0, %0* @g_832, i64 0, i32 0), align 4
+ store i32 3, i32* @g_69, align 4
+ %20 = load volatile i32, i32* getelementptr inbounds (%0, %0* @g_832, i64 0, i32 0), align 4
+ store i32 0, i32* @g_69, align 4
+ %21 = load volatile i32, i32* getelementptr inbounds (%0, %0* @g_832, i64 0, i32 0), align 4
+ store i32 1, i32* @g_69, align 4
+ %22 = load volatile i32, i32* getelementptr inbounds (%0, %0* @g_832, i64 0, i32 0), align 4
+ store i32 2, i32* @g_69, align 4
+ %23 = load volatile i32, i32* getelementptr inbounds (%0, %0* @g_832, i64 0, i32 0), align 4
+ store i32 3, i32* @g_69, align 4
+ %24 = add i64 %2, 24
+ store i64 %24, i64* @g_938, align 8
+ %25 = load volatile i32, i32* getelementptr inbounds (%0, %0* @g_832, i64 0, i32 0), align 4
+ store i32 4, i32* @g_69, align 4
+ store i1 true, i1* @g_11, align 4
+ br label %1
+}
OpenPOWER on IntegriCloud