Index: llvm/trunk/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp =================================================================== --- llvm/trunk/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp +++ llvm/trunk/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp @@ -2678,6 +2678,14 @@ return true; } + if (RegString->getString() == "pc") { + ReplaceNode(N, CurDAG->getMachineNode( + AArch64::ADR, DL, N->getSimpleValueType(0), MVT::Other, + CurDAG->getTargetConstant(0, DL, MVT::i32), + N->getOperand(0))); + return true; + } + return false; } Index: llvm/trunk/test/CodeGen/AArch64/read-pc.ll =================================================================== --- llvm/trunk/test/CodeGen/AArch64/read-pc.ll +++ llvm/trunk/test/CodeGen/AArch64/read-pc.ll @@ -0,0 +1,11 @@ +; RUN: llc < %s -mtriple=arm64-linux-gnu | FileCheck %s + +define i64 @read_pc() { + ; CHECK: adr x0, #0 + %pc = call i64 @llvm.read_register.i64(metadata !0) + ret i64 %pc +} + +declare i64 @llvm.read_register.i64(metadata) nounwind + +!0 = !{!"pc"}