[NVPTX] Fix issue introduced in D10321
authorJingyue Wu <jingyue@google.com>
Tue, 30 Jun 2015 18:59:19 +0000 (18:59 +0000)
committerJingyue Wu <jingyue@google.com>
Tue, 30 Jun 2015 18:59:19 +0000 (18:59 +0000)
Summary:
Really check if %SP is not used in other places, instead of checking only exact
one non-dbg use.

Patched by Xuetian Weng.

Test Plan:
@foo4 in test/CodeGen/NVPTX/local-stack-frame.ll, create a case that
SP will appear twice.

Reviewers: jholewinski, jingyue

Reviewed By: jingyue

Subscribers: llvm-commits, sfantao, jholewinski

Differential Revision: http://reviews.llvm.org/D10844

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241099 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/NVPTX/NVPTXFrameLowering.cpp
test/CodeGen/NVPTX/local-stack-frame.ll

index 0b0cb87e5bc728d47dee38f24f36a01d27e16d24..cffcac0f19f30cf0db40cbcdbbfbd77354d465b2 100644 (file)
@@ -47,20 +47,19 @@ void NVPTXFrameLowering::emitPrologue(MachineFunction &MF,
     // cvta.local %SP, %SPL;
     if (static_cast<const NVPTXTargetMachine &>(MF.getTarget()).is64Bit()) {
       // Check if %SP is actually used
-      if (MR.hasOneNonDBGUse(NVPTX::VRFrame)) {
+      if (!MR.use_empty(NVPTX::VRFrame)) {
         MI = BuildMI(MBB, MI, dl, MF.getSubtarget().getInstrInfo()->get(
                                       NVPTX::cvta_local_yes_64),
                      NVPTX::VRFrame)
                  .addReg(NVPTX::VRFrameLocal);
       }
-
       BuildMI(MBB, MI, dl,
               MF.getSubtarget().getInstrInfo()->get(NVPTX::MOV_DEPOT_ADDR_64),
               NVPTX::VRFrameLocal)
           .addImm(MF.getFunctionNumber());
     } else {
       // Check if %SP is actually used
-      if (MR.hasOneNonDBGUse(NVPTX::VRFrame)) {
+      if (!MR.use_empty(NVPTX::VRFrame)) {
         MI = BuildMI(MBB, MI, dl, MF.getSubtarget().getInstrInfo()->get(
                                       NVPTX::cvta_local_yes),
                      NVPTX::VRFrame)
index 1058e4b0a5744181a786e575657668f6c1b6fcbc..fba5dd883f9353af87ab2c9b40efbb7a34feaef9 100644 (file)
@@ -56,3 +56,21 @@ define void @foo3(i32 %a) {
   store i32 %a, i32* %2
   ret void
 }
+
+; PTX32:        cvta.local.u32   %SP, %SPL;
+; PTX32:        add.u32          {{%r[0-9]+}}, %SP, 0;
+; PTX32:        st.local.u32     [{{%r[0-9]+}}], {{%r[0-9]+}}
+; PTX32:        st.local.u32     [{{%r[0-9]+}}], {{%r[0-9]+}}
+; PTX64:        cvta.local.u64   %SP, %SPL;
+; PTX64:        add.u64          {{%rd[0-9]+}}, %SP, 0;
+; PTX64:        st.local.u32     [{{%rd[0-9]+}}], {{%r[0-9]+}}
+; PTX64:        st.local.u32     [{{%rd[0-9]+}}], {{%r[0-9]+}}
+define void @foo4() {
+  %A = alloca i32
+  %B = alloca i32
+  store i32 0, i32* %A
+  store i32 0, i32* %B
+  call void @bar(i32* %A)
+  call void @bar(i32* %B)
+  ret void
+}