summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Shen <timshen91@gmail.com>2017-05-25 22:58:35 +0000
committerTim Shen <timshen91@gmail.com>2017-05-25 22:58:35 +0000
commita2b85da879b5da371d4300aa102d36da53354b73 (patch)
treecf85c171470037897b39e43be432d4f58969cdfb
parent883dbc43d9b3f939c129d557833989c61dbae27d (diff)
downloadbcm5719-llvm-a2b85da879b5da371d4300aa102d36da53354b73.tar.gz
bcm5719-llvm-a2b85da879b5da371d4300aa102d36da53354b73.zip
[PPC] Fix atomics lowering in DAG lowering.
I forgot to forward the chain, causing some missing instruction dependencies. The test crashes the compiler without this patch. Inspired by the test case, D33519 also tries to remove the extra sync. Differential Revision: https://reviews.llvm.org/D33573 llvm-svn: 303931
-rw-r--r--llvm/lib/Target/PowerPC/PPCISelLowering.cpp4
-rw-r--r--llvm/test/CodeGen/PowerPC/atomics-constant.ll23
2 files changed, 26 insertions, 1 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
index 2f64a3f4eb5..7fde1238640 100644
--- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
+++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp
@@ -8296,10 +8296,12 @@ SDValue PPCTargetLowering::LowerINTRINSIC_VOID(SDValue Op,
SDLoc DL(Op);
switch (cast<ConstantSDNode>(Op.getOperand(ArgStart))->getZExtValue()) {
case Intrinsic::ppc_cfence: {
+ assert(ArgStart == 1);
assert(Subtarget.isPPC64() && "Only 64-bit is supported for now.");
return SDValue(DAG.getMachineNode(PPC::CFENCE8, DL, MVT::Other,
DAG.getNode(ISD::ANY_EXTEND, DL, MVT::i64,
- Op.getOperand(ArgStart + 1))),
+ Op.getOperand(ArgStart + 1)),
+ Op.getOperand(0)),
0);
}
default:
diff --git a/llvm/test/CodeGen/PowerPC/atomics-constant.ll b/llvm/test/CodeGen/PowerPC/atomics-constant.ll
new file mode 100644
index 00000000000..a92ca813af8
--- /dev/null
+++ b/llvm/test/CodeGen/PowerPC/atomics-constant.ll
@@ -0,0 +1,23 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s | FileCheck %s
+
+target triple = "powerpc64le-unknown-linux-gnu"
+
+@a = constant i64 zeroinitializer
+
+define i64 @foo() {
+; CHECK-LABEL: foo:
+; CHECK: # BB#0: # %entry
+; CHECK-NEXT: addis 3, 2, .LC0@toc@ha
+; CHECK-NEXT: li 4, 0
+; CHECK-NEXT: ld 3, .LC0@toc@l(3)
+; CHECK-NEXT: cmpw 7, 4, 4
+; CHECK-NEXT: ld 3, 0(3)
+; CHECK-NEXT: bne- 7, .+4
+; CHECK-NEXT: isync
+; CHECK-NEXT: li 3, 0
+; CHECK-NEXT: blr
+entry:
+ %value = load atomic i64, i64* @a acquire, align 8
+ ret i64 %value
+}
OpenPOWER on IntegriCloud