[llvm] 6a2a5f0 - [CodeGenPrepare] Don't give up if unable to sink first arg to a cold call

Momchil Velikov via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 23 10:36:42 PDT 2023


Author: Momchil Velikov
Date: 2023-03-23T17:31:09Z
New Revision: 6a2a5f08de0a09171bb92f91cd7b9deea97f6cce

URL: https://github.com/llvm/llvm-project/commit/6a2a5f08de0a09171bb92f91cd7b9deea97f6cce
DIFF: https://github.com/llvm/llvm-project/commit/6a2a5f08de0a09171bb92f91cd7b9deea97f6cce.diff

LOG: [CodeGenPrepare] Don't give up if unable to sink first arg to a cold call

Reviewed By: mkazantsev

Differential Revision: https://reviews.llvm.org/D143892

Added: 
    llvm/test/CodeGen/Generic/addr-sink-call-multi-arg.ll

Modified: 
    llvm/lib/CodeGen/CodeGenPrepare.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/CodeGen/CodeGenPrepare.cpp b/llvm/lib/CodeGen/CodeGenPrepare.cpp
index 8d11f282516c8..b571b5a8ab5f4 100644
--- a/llvm/lib/CodeGen/CodeGenPrepare.cpp
+++ b/llvm/lib/CodeGen/CodeGenPrepare.cpp
@@ -2279,7 +2279,8 @@ bool CodeGenPrepare::optimizeCallInst(CallInst *CI, ModifyDT &ModifiedDT) {
       if (!Arg->getType()->isPointerTy())
         continue;
       unsigned AS = Arg->getType()->getPointerAddressSpace();
-      return optimizeMemoryInst(CI, Arg, Arg->getType(), AS);
+      if (optimizeMemoryInst(CI, Arg, Arg->getType(), AS))
+        return true;
     }
 
   IntrinsicInst *II = dyn_cast<IntrinsicInst>(CI);

diff  --git a/llvm/test/CodeGen/Generic/addr-sink-call-multi-arg.ll b/llvm/test/CodeGen/Generic/addr-sink-call-multi-arg.ll
new file mode 100644
index 0000000000000..b02bdc3b57242
--- /dev/null
+++ b/llvm/test/CodeGen/Generic/addr-sink-call-multi-arg.ll
@@ -0,0 +1,34 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -codegenprepare < %s | FileCheck %s
+; REQUIRES: aarch64-registered-target
+
+; Check that we don't give up if unable to sink the first argument.
+
+target triple = "aarch64-linux"
+
+declare void @f(ptr, ptr) cold
+
+define void @g(i1 %c1, ptr %p, i32 %i) {
+; CHECK-LABEL: @g(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    [[A0:%.*]] = getelementptr ptr, ptr [[P:%.*]], i32 [[I:%.*]]
+; CHECK-NEXT:    br i1 [[C1:%.*]], label [[IF_THEN:%.*]], label [[EXIT:%.*]]
+; CHECK:       if.then:
+; CHECK-NEXT:    [[SUNKADDR:%.*]] = getelementptr i8, ptr [[P]], i64 32
+; CHECK-NEXT:    call void @f(ptr [[A0]], ptr [[SUNKADDR]])
+; CHECK-NEXT:    br label [[EXIT]]
+; CHECK:       exit:
+; CHECK-NEXT:    ret void
+;
+entry:
+  %a0 = getelementptr ptr, ptr %p, i32 %i
+  %a1 = getelementptr ptr, ptr %p, i32 4
+  br i1 %c1, label %if.then, label %exit
+
+if.then:
+  call void @f(ptr %a0, ptr %a1)
+  br label %exit
+
+exit:
+  ret void
+}


        


More information about the llvm-commits mailing list