[llvm] r361990 - CallSiteSplitting: Respect convergent and noduplicate
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Wed May 29 09:59:48 PDT 2019
Author: arsenm
Date: Wed May 29 09:59:48 2019
New Revision: 361990
URL: http://llvm.org/viewvc/llvm-project?rev=361990&view=rev
Log:
CallSiteSplitting: Respect convergent and noduplicate
Added:
llvm/trunk/test/Transforms/CallSiteSplitting/convergent.ll
llvm/trunk/test/Transforms/CallSiteSplitting/noduplicate.ll
Modified:
llvm/trunk/lib/Transforms/Scalar/CallSiteSplitting.cpp
Modified: llvm/trunk/lib/Transforms/Scalar/CallSiteSplitting.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/CallSiteSplitting.cpp?rev=361990&r1=361989&r2=361990&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/CallSiteSplitting.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/CallSiteSplitting.cpp Wed May 29 09:59:48 2019
@@ -183,6 +183,9 @@ static SmallVector<BasicBlock *, 2> getT
}
static bool canSplitCallSite(CallSite CS, TargetTransformInfo &TTI) {
+ if (CS.isConvergent() || CS.cannotDuplicate())
+ return false;
+
// FIXME: As of now we handle only CallInst. InvokeInst could be handled
// without too much effort.
Instruction *Instr = CS.getInstruction();
Added: llvm/trunk/test/Transforms/CallSiteSplitting/convergent.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CallSiteSplitting/convergent.ll?rev=361990&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CallSiteSplitting/convergent.ll (added)
+++ llvm/trunk/test/Transforms/CallSiteSplitting/convergent.ll Wed May 29 09:59:48 2019
@@ -0,0 +1,89 @@
+; RUN: opt -S -callsite-splitting -callsite-splitting-duplication-threshold=100000000 < %s | FileCheck -enable-var-scope %s
+
+; Convergent calls should not be duplicated in this case
+; CHECK-LABEL: define void @convergent_caller(
+; CHECK: call void @convergent_callee(
+; CHECK-NOT: call void @convergent_callee(
+define void @convergent_caller(i1 %c, i8* %a_elt, i8* %b_elt) #0 {
+entry:
+ br label %Top
+
+Top:
+ %tobool1 = icmp eq i8* %a_elt, null
+ br i1 %tobool1, label %CallSiteBB, label %NextCond
+
+NextCond:
+ %cmp = icmp ne i8* %b_elt, null
+ br i1 %cmp, label %CallSiteBB, label %End
+
+CallSiteBB:
+ %p = phi i1 [ false, %Top ], [ %c, %NextCond ]
+ call void @convergent_callee(i8* %a_elt, i1 %p)
+ br label %End
+
+End:
+ ret void
+}
+
+; CHECK-LABEL: define void @convergent_callee(
+; CHECK: call void @convergent_external(
+; CHECK-NOT: call void @convergent_external(
+define void @convergent_callee(i8* %a_elt, i1 %c) #0 {
+entry:
+ %tobool = icmp ne i8* %a_elt, null
+ br i1 %tobool, label %then, label %endif
+
+then:
+ br label %endif
+
+endif:
+ call void @convergent_external(i8* %a_elt) #0
+ ret void
+}
+
+; Make sure an otherwise identical function is transformed
+; CHECK-LABEL: define void @reference_caller(
+; CHECK: call void @nonconvergent_callee(
+; CHECK: call void @nonconvergent_callee(
+define void @reference_caller(i1 %c, i8* %a_elt, i8* %b_elt) #1 {
+entry:
+ br label %Top
+
+Top:
+ %tobool1 = icmp eq i8* %a_elt, null
+ br i1 %tobool1, label %CallSiteBB, label %NextCond
+
+NextCond:
+ %cmp = icmp ne i8* %b_elt, null
+ br i1 %cmp, label %CallSiteBB, label %End
+
+CallSiteBB:
+ %p = phi i1 [ false, %Top ], [ %c, %NextCond ]
+ call void @nonconvergent_callee(i8* %a_elt, i1 %p)
+ br label %End
+
+End:
+ ret void
+}
+
+; CHECK-LABEL: define void @nonconvergent_callee(
+; CHECK: call void @nonconvergent_external(
+; CHECK-NOT: call void @nonconvergent_external(
+define void @nonconvergent_callee(i8* %a_elt, i1 %c) #1 {
+entry:
+ %tobool = icmp ne i8* %a_elt, null
+ br i1 %tobool, label %then, label %endif
+
+then:
+ br label %endif
+
+endif:
+ call void @nonconvergent_external(i8* %a_elt)
+ ret void
+}
+
+declare void @convergent_external(i8*) #0
+declare void @nonconvergent_external(i8*) #1
+
+attributes #0 = { convergent nounwind }
+attributes #1 = { nounwind }
Added: llvm/trunk/test/Transforms/CallSiteSplitting/noduplicate.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CallSiteSplitting/noduplicate.ll?rev=361990&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/CallSiteSplitting/noduplicate.ll (added)
+++ llvm/trunk/test/Transforms/CallSiteSplitting/noduplicate.ll Wed May 29 09:59:48 2019
@@ -0,0 +1,91 @@
+; RUN: opt -S -callsite-splitting -callsite-splitting-duplication-threshold=100000000 < %s | FileCheck -enable-var-scope %s
+; RUN: opt -S -callsite-splitting -callsite-splitting-duplication-threshold=100000000 < %s | FileCheck -enable-var-scope %s
+
+; Noduplicate calls should not be duplicated
+; CHECK-LABEL: define void @noduplicate_caller(
+; CHECK: call void @noduplicate_callee(
+; CHECK-NOT: call void @noduplicate_callee(
+define void @noduplicate_caller(i1 %c, i8* %a_elt, i8* %b_elt) #0 {
+entry:
+ br label %Top
+
+Top:
+ %tobool1 = icmp eq i8* %a_elt, null
+ br i1 %tobool1, label %CallSiteBB, label %NextCond
+
+NextCond:
+ %cmp = icmp ne i8* %b_elt, null
+ br i1 %cmp, label %CallSiteBB, label %End
+
+CallSiteBB:
+ %p = phi i1 [ false, %Top ], [ %c, %NextCond ]
+ call void @noduplicate_callee(i8* %a_elt, i1 %p)
+ br label %End
+
+End:
+ ret void
+}
+
+; CHECK-LABEL: define void @noduplicate_callee(
+; CHECK: call void @noduplicate_external(
+; CHECK-NOT: call void @noduplicate_external(
+define void @noduplicate_callee(i8* %a_elt, i1 %c) #0 {
+entry:
+ %tobool = icmp ne i8* %a_elt, null
+ br i1 %tobool, label %then, label %endif
+
+then:
+ br label %endif
+
+endif:
+ call void @noduplicate_external(i8* %a_elt) #0
+ ret void
+}
+
+; Make sure an otherwise identical function is transformed
+; CHECK-LABEL: define void @reference_caller(
+; CHECK: call void @nonnoduplicate_callee(
+; CHECK: call void @nonnoduplicate_callee(
+define void @reference_caller(i1 %c, i8* %a_elt, i8* %b_elt) #1 {
+entry:
+ br label %Top
+
+Top:
+ %tobool1 = icmp eq i8* %a_elt, null
+ br i1 %tobool1, label %CallSiteBB, label %NextCond
+
+NextCond:
+ %cmp = icmp ne i8* %b_elt, null
+ br i1 %cmp, label %CallSiteBB, label %End
+
+CallSiteBB:
+ %p = phi i1 [ false, %Top ], [ %c, %NextCond ]
+ call void @nonnoduplicate_callee(i8* %a_elt, i1 %p)
+ br label %End
+
+End:
+ ret void
+}
+
+; CHECK-LABEL: define void @nonnoduplicate_callee(
+; CHECK: call void @nonnoduplicate_external(
+; CHECK-NOT: call void @nonnoduplicate_external(
+define void @nonnoduplicate_callee(i8* %a_elt, i1 %c) #1 {
+entry:
+ %tobool = icmp ne i8* %a_elt, null
+ br i1 %tobool, label %then, label %endif
+
+then:
+ br label %endif
+
+endif:
+ call void @nonnoduplicate_external(i8* %a_elt)
+ ret void
+}
+
+declare void @noduplicate_external(i8*) #0
+declare void @nonnoduplicate_external(i8*) #1
+
+attributes #0 = { noduplicate nounwind }
+attributes #1 = { nounwind }
+
More information about the llvm-commits
mailing list