[llvm] r341725 - Set cost of invariant group intrinsics to 0

Piotr Padlewski via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 7 15:29:48 PDT 2018


Author: prazek
Date: Fri Sep  7 15:29:48 2018
New Revision: 341725

URL: http://llvm.org/viewvc/llvm-project?rev=341725&view=rev
Log:
Set cost of invariant group intrinsics to 0

Summary:
Like with other similar intrinsics, presense of strip or
launder.invariant.group should not change the result of inlining cost.
This is because they are just markers and do not perform any computation.

Reviewers: amharc, rsmith, reames, kuhar

Subscribers: eraman, llvm-commits

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

Modified:
    llvm/trunk/include/llvm/Analysis/TargetTransformInfoImpl.h
    llvm/trunk/test/Transforms/Inline/launder.invariant.group.ll

Modified: llvm/trunk/include/llvm/Analysis/TargetTransformInfoImpl.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/TargetTransformInfoImpl.h?rev=341725&r1=341724&r2=341725&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Analysis/TargetTransformInfoImpl.h (original)
+++ llvm/trunk/include/llvm/Analysis/TargetTransformInfoImpl.h Fri Sep  7 15:29:48 2018
@@ -158,6 +158,8 @@ public:
     case Intrinsic::dbg_label:
     case Intrinsic::invariant_start:
     case Intrinsic::invariant_end:
+    case Intrinsic::launder_invariant_group:
+    case Intrinsic::strip_invariant_group:
     case Intrinsic::lifetime_start:
     case Intrinsic::lifetime_end:
     case Intrinsic::objectsize:

Modified: llvm/trunk/test/Transforms/Inline/launder.invariant.group.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/Inline/launder.invariant.group.ll?rev=341725&r1=341724&r2=341725&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/Inline/launder.invariant.group.ll (original)
+++ llvm/trunk/test/Transforms/Inline/launder.invariant.group.ll Fri Sep  7 15:29:48 2018
@@ -1,13 +1,13 @@
 ; RUN: opt -S -inline < %s | FileCheck %s
 ; RUN: opt -S -O3 < %s | FileCheck %s
+; RUN: opt -S -inline -inline-threshold=1 < %s | FileCheck %s
+
+%struct.A = type <{ i32 (...)**, i32, [4 x i8] }>
 
 ; This test checks if value returned from the launder is considered aliasing
 ; with its argument.  Due to bug caused by handling launder in capture tracking
 ; sometimes it would be considered noalias.
-
-%struct.A = type <{ i32 (...)**, i32, [4 x i8] }>
-
-; CHECK: define i32 @bar(%struct.A* noalias
+; CHECK-LABEL: define i32 @bar(%struct.A* noalias
 define i32 @bar(%struct.A* noalias) {
 ; CHECK-NOT: noalias
   %2 = bitcast %struct.A* %0 to i8*
@@ -28,4 +28,32 @@ define i32 @foo(%struct.A* noalias)  {
   ret i32 %2
 }
 
+
+; This test checks if invariant group intrinsics have zero cost for inlining.
+; CHECK-LABEL: define i8* @caller(i8*
+define i8* @caller(i8* %p) {
+; CHECK-NOT: call i8* @lot_of_launders_and_strips
+  %a1 = call i8* @lot_of_launders_and_strips(i8* %p)
+  %a2 = call i8* @lot_of_launders_and_strips(i8* %a1)
+  %a3 = call i8* @lot_of_launders_and_strips(i8* %a2)
+  %a4 = call i8* @lot_of_launders_and_strips(i8* %a3)
+  ret i8* %a4
+}
+
+define i8* @lot_of_launders_and_strips(i8* %p) {
+  %a1 = call i8* @llvm.launder.invariant.group.p0i8(i8* %p)
+  %a2 = call i8* @llvm.launder.invariant.group.p0i8(i8* %a1)
+  %a3 = call i8* @llvm.launder.invariant.group.p0i8(i8* %a2)
+  %a4 = call i8* @llvm.launder.invariant.group.p0i8(i8* %a3)
+
+  %s1 = call i8* @llvm.strip.invariant.group.p0i8(i8* %a4)
+  %s2 = call i8* @llvm.strip.invariant.group.p0i8(i8* %s1)
+  %s3 = call i8* @llvm.strip.invariant.group.p0i8(i8* %s2)
+  %s4 = call i8* @llvm.strip.invariant.group.p0i8(i8* %s3)
+
+   ret i8* %s4
+}
+
+
 declare i8* @llvm.launder.invariant.group.p0i8(i8*)
+declare i8* @llvm.strip.invariant.group.p0i8(i8*)




More information about the llvm-commits mailing list