diff options
Diffstat (limited to 'llvm/test/Transforms/CallSiteSplitting')
10 files changed, 0 insertions, 1516 deletions
diff --git a/llvm/test/Transforms/CallSiteSplitting/callsite-instructions-before-call.ll b/llvm/test/Transforms/CallSiteSplitting/callsite-instructions-before-call.ll deleted file mode 100644 index 067022cd38a..00000000000 --- a/llvm/test/Transforms/CallSiteSplitting/callsite-instructions-before-call.ll +++ /dev/null @@ -1,253 +0,0 @@ -; RUN: opt -S -callsite-splitting < %s | FileCheck --check-prefix=CHECK %s -; RUN: opt -S -callsite-splitting -callsite-splitting-duplication-threshold=0 < %s | FileCheck --check-prefix=NODUP %s - -; Instructions before a call that will be pushed to its predecessors -; with uses after the callsite, must be patched up as PHI nodes in -; the join block. -define i32* @test_split_branch_phi(i32* %ptrarg, i32 %i) { -Header: - %tobool = icmp ne i32* %ptrarg, null - br i1 %tobool, label %TBB, label %CallSite - -TBB: ; preds = %Header - %arrayidx = getelementptr inbounds i32, i32* %ptrarg, i64 42 - %0 = load i32, i32* %arrayidx, align 4 - %tobool1 = icmp ne i32 %0, 0 - br i1 %tobool1, label %CallSite, label %End - -CallSite: ; preds = %TBB, %Header - %somepointer = getelementptr i32, i32* %ptrarg, i64 18 - call void @bar(i32* %ptrarg, i32 %i) - br label %End - -End: ; preds = %CallSite, %TBB - %somepointerphi = phi i32* [ %somepointer, %CallSite ], [ null, %TBB ] - ret i32* %somepointerphi -} -; NODUP-LABEL: test_split_branch_phi -; NODUP-NOT: split -; CHECK-LABEL: Header.split -; CHECK: %[[V1:somepointer[0-9]+]] = getelementptr i32, i32* %ptrarg, i64 18 -; CHECK: call void @bar(i32* null, i32 %i) -; CHECK: br label %CallSite -; CHECK-LABEL: TBB.split: -; CHECK: %[[V2:somepointer[0-9]+]] = getelementptr i32, i32* %ptrarg, i64 18 -; CHECK: call void @bar(i32* nonnull %ptrarg, i32 %i) -; CHECK: br label %CallSite -; CHECK: CallSite: -; CHECK: phi i32* [ %[[V1]], %Header.split ], [ %[[V2]], %TBB.split ] - - -define void @split_branch_no_extra_phi(i32* %ptrarg, i32 %i) { -Header: - %tobool = icmp ne i32* %ptrarg, null - br i1 %tobool, label %TBB, label %CallSite - -TBB: ; preds = %Header - %arrayidx = getelementptr inbounds i32, i32* %ptrarg, i64 42 - %0 = load i32, i32* %arrayidx, align 4 - %tobool1 = icmp ne i32 %0, 0 - br i1 %tobool1, label %CallSite, label %End - -CallSite: ; preds = %TBB, %Header - %i.add = add i32 %i, 99 - call void @bar(i32* %ptrarg, i32 %i.add) - br label %End - -End: ; preds = %CallSite, %TBB - ret void -} -; NODUP-LABEL: split_branch_no_extra_phi -; NODUP-NOT: split -; CHECK-LABEL: split_branch_no_extra_phi -; CHECK-LABEL: Header.split -; CHECK: %[[V1:.+]] = add i32 %i, 99 -; CHECK: call void @bar(i32* null, i32 %[[V1]]) -; CHECK: br label %CallSite -; CHECK-LABEL: TBB.split: -; CHECK: %[[V2:.+]] = add i32 %i, 99 -; CHECK: call void @bar(i32* nonnull %ptrarg, i32 %[[V2]]) -; CHECK: br label %CallSite -; CHECK: CallSite: -; CHECK-NOT: phi - - -; In this test case, the codesize cost of the instructions before the call to -; bar() is equal to the default DuplicationThreshold of 5, because calls are -; more expensive. -define void @test_no_split_threshold(i32* %ptrarg, i32 %i) { -Header: - %tobool = icmp ne i32* %ptrarg, null - br i1 %tobool, label %TBB, label %CallSite - -TBB: ; preds = %Header - %arrayidx = getelementptr inbounds i32, i32* %ptrarg, i64 42 - %0 = load i32, i32* %arrayidx, align 4 - %tobool1 = icmp ne i32 %0, 0 - br i1 %tobool1, label %CallSite, label %End - -CallSite: ; preds = %TBB, %Header - %i2 = add i32 %i, 10 - call void @bari(i32 %i2) - call void @bari(i32 %i2) - call void @bar(i32* %ptrarg, i32 %i2) - br label %End - -End: ; preds = %CallSite, %TBB - ret void -} -; NODUP-LABEL: test_no_split_threshold -; NODUP-NOT: split -; CHECK-LABEL: test_no_split_threshold -; CHECK-NOT: split -; CHECK-LABEL: CallSite: -; CHECK: call void @bar(i32* %ptrarg, i32 %i2) - -; In this test case, the phi node %l in CallSite should be removed, as after -; moving the call to the split blocks we can use the values directly. -define void @test_remove_unused_phi(i32* %ptrarg, i32 %i) { -Header: - %l1 = load i32, i32* undef, align 16 - %tobool = icmp ne i32* %ptrarg, null - br i1 %tobool, label %TBB, label %CallSite - -TBB: ; preds = %Header - %arrayidx = getelementptr inbounds i32, i32* %ptrarg, i64 42 - %0 = load i32, i32* %arrayidx, align 4 - %l2 = load i32, i32* undef, align 16 - %tobool1 = icmp ne i32 %0, 0 - br i1 %tobool1, label %CallSite, label %End - -CallSite: ; preds = %TBB, %Header - %l = phi i32 [ %l1, %Header ], [ %l2, %TBB ] - call void @bar(i32* %ptrarg, i32 %l) - br label %End - -End: ; preds = %CallSite, %TBB - ret void -} -; NODUP-LABEL: test_remove_unused_phi -; NODUP-NOT: split -; CHECK-LABEL: test_remove_unused_phi -; CHECK-LABEL: Header.split -; CHECK: call void @bar(i32* null, i32 %l1) -; CHECK: br label %CallSite -; CHECK-LABEL: TBB.split: -; CHECK: call void @bar(i32* nonnull %ptrarg, i32 %l2) -; CHECK: br label %CallSite -; CHECK-LABEL: CallSite: -; CHECK-NOT: phi - -; In this test case, we need to insert a new PHI node in TailBB to combine -; the loads we moved to the predecessors. -define void @test_add_new_phi(i32* %ptrarg, i32 %i) { -Header: - %tobool = icmp ne i32* %ptrarg, null - br i1 %tobool, label %TBB, label %CallSite - -TBB: - br i1 undef, label %CallSite, label %End - -CallSite: - %arrayidx112 = getelementptr inbounds i32, i32* undef, i64 1 - %0 = load i32, i32* %arrayidx112, align 4 - call void @bar(i32* %ptrarg, i32 %i) - %sub = sub nsw i32 %0, undef - br label %End - -End: ; preds = %CallSite, %TBB - ret void -} -; NODUP-LABEL: test_add_new_phi -; NODUP-NOT: split -; CHECK-LABEL: test_add_new_phi -; CHECK-LABEL: Header.split -; CHECK: %[[V1:.+]] = load i32, i32* -; CHECK: call void @bar(i32* null, i32 %i) -; CHECK: br label %CallSite -; CHECK-LABEL: TBB.split: -; CHECK: %[[V2:.+]] = load i32, i32* -; CHECK: call void @bar(i32* nonnull %ptrarg, i32 %i) -; CHECK: br label %CallSite -; CHECK-LABEL: CallSite: -; CHECK-NEXT: %[[V3:.+]] = phi i32 [ %[[V1]], %Header.split ], [ %[[V2]], %TBB.split ] -; CHECK: %sub = sub nsw i32 %[[V3]], undef - -define i32 @test_firstnophi(i32* %a, i32 %v) { -Header: - %tobool1 = icmp eq i32* %a, null - br i1 %tobool1, label %Tail, label %TBB - -TBB: - %cmp = icmp eq i32 %v, 1 - br i1 %cmp, label %Tail, label %End - -Tail: - %p = phi i32[1,%Header], [2, %TBB] - store i32 %v, i32* %a - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r - -End: - ret i32 %v -} -; NODUP-LABEL: @test_firstnophi -; NODUP-NOT: split: -; CHECK-LABEL: @test_firstnophi -; CHECK-LABEL: Header.split: -; CHECK-NEXT: store i32 %v, i32* %a -; CHECK-NEXT: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 1) -; CHECK-NEXT: br label %Tail -; CHECK-LABEL: TBB.split: -; CHECK-NEXT: store i32 %v, i32* %a -; CHECK-NEXT: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 2) -; CHECK-NEXT br label %Tail -; CHECK-LABEL: Tail: -; CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ] -; CHECK: ret i32 %[[MERGED]] -define i32 @callee(i32* %a, i32 %v, i32 %p) { - ret i32 0 -} - -define void @test_no_remove_used_phi(i32* %ptrarg, i32 %i) { -Header: - %l1 = load i32, i32* undef, align 16 - %tobool = icmp ne i32* %ptrarg, null - br i1 %tobool, label %TBB, label %CallSite - -TBB: ; preds = %Header - %arrayidx = getelementptr inbounds i32, i32* %ptrarg, i64 42 - %0 = load i32, i32* %arrayidx, align 4 - %l2 = load i32, i32* undef, align 16 - %tobool1 = icmp ne i32 %0, 0 - br i1 %tobool1, label %CallSite, label %End - -CallSite: ; preds = %TBB, %Header - %l = phi i32 [ %l1, %Header ], [ %l2, %TBB ] - call void @bar(i32* %ptrarg, i32 %l) - call void @bari(i32 %l) - br label %End - -End: ; preds = %CallSite, %TBB - ret void -} -; NODUP-LABEL: @test_no_remove_used_phi -; NODUP-NOT: split -; CHECK-LABEL: @test_no_remove_used_phi -; CHECK-LABEL: Header.split: -; CHECK: call void @bar(i32* null, i32 %l1) -; CHECK-NEXT: br label %CallSite -; CHECK-LABEL: TBB.split: -; CHECK: call void @bar(i32* nonnull %ptrarg, i32 %l2) -; CHECK-NEXT br label %CallSite -; CHECK-LABEL: CallSite: -; CHECK-NEXT: %l = phi i32 [ %l1, %Header.split ], [ %l2, %TBB.split ] -; CHECK: call void @bari(i32 %l) - -define void @bar(i32*, i32) { - ret void -} - -define void @bari(i32) { - ret void -} diff --git a/llvm/test/Transforms/CallSiteSplitting/callsite-no-or-structure.ll b/llvm/test/Transforms/CallSiteSplitting/callsite-no-or-structure.ll deleted file mode 100644 index e84687f71cb..00000000000 --- a/llvm/test/Transforms/CallSiteSplitting/callsite-no-or-structure.ll +++ /dev/null @@ -1,139 +0,0 @@ -; RUN: opt < %s -callsite-splitting -S | FileCheck %s -; RUN: opt < %s -passes='function(callsite-splitting)' -S | FileCheck %s - -; CHECK-LABEL: @test_simple -; CHECK-LABEL: Header: -; CHECK-NEXT: br i1 undef, label %Header.split -; CHECK-LABEL: Header.split: -; CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 %p) -; CHECK-LABEL: TBB: -; CHECK: br i1 %cmp, label %TBB.split -; CHECK-LABEL: TBB.split: -; CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 %v, i32 %p) -; CHECK-LABEL: Tail -; CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ] -; CHECK: ret i32 %[[MERGED]] -define i32 @test_simple(i32* %a, i32 %v, i32 %p) { -Header: - br i1 undef, label %Tail, label %End - -TBB: - %cmp = icmp eq i32* %a, null - br i1 %cmp, label %Tail, label %End - -Tail: - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r - -End: - ret i32 %v -} - -; CHECK-LABEL: @test_eq_eq_eq_untaken -; CHECK-LABEL: Header: -; CHECK: br i1 %tobool1, label %TBB1, label %Header.split -; CHECK-LABEL: Header.split: -; CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 %p) -; CHECK-LABEL: TBB2: -; CHECK: br i1 %cmp2, label %TBB2.split, label %End -; CHECK-LABEL: TBB2.split: -; CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 1, i32 99) -; CHECK-LABEL: Tail -; CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB2.split ] -; CHECK: ret i32 %[[MERGED]] -define i32 @test_eq_eq_eq_untaken2(i32* %a, i32 %v, i32 %p) { -Header: - %tobool1 = icmp eq i32* %a, null - br i1 %tobool1, label %TBB1, label %Tail - -TBB1: - %cmp1 = icmp eq i32 %v, 1 - br i1 %cmp1, label %TBB2, label %End - -TBB2: - %cmp2 = icmp eq i32 %p, 99 - br i1 %cmp2, label %Tail, label %End - -Tail: - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r - -End: - ret i32 %v -} - -; CHECK-LABEL: @test_eq_ne_eq_untaken -; CHECK-LABEL: Header: -; CHECK: br i1 %tobool1, label %TBB1, label %Header.split -; CHECK-LABEL: Header.split: -; CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 %p) -; CHECK-LABEL: TBB2: -; CHECK: br i1 %cmp2, label %TBB2.split, label %End -; CHECK-LABEL: TBB2.split: -; CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 %v, i32 99) -; CHECK-LABEL: Tail -; CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB2.split ] -; CHECK: ret i32 %[[MERGED]] -define i32 @test_eq_ne_eq_untaken(i32* %a, i32 %v, i32 %p) { -Header: - %tobool1 = icmp eq i32* %a, null - br i1 %tobool1, label %TBB1, label %Tail - -TBB1: - %cmp1 = icmp ne i32 %v, 1 - br i1 %cmp1, label %TBB2, label %End - -TBB2: - %cmp2 = icmp eq i32 %p, 99 - br i1 %cmp2, label %Tail, label %End - -Tail: - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r - -End: - ret i32 %v -} - -; CHECK-LABEL: @test_header_header2_tbb -; CHECK: Header2: -; CHECK:br i1 %tobool2, label %Header2.split, label %TBB1 -; CHECK-LABEL: Header2.split: -; CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 10) -; CHECK-LABEL: TBB2: -; CHECK: br i1 %cmp2, label %TBB2.split, label %End -; CHECK-LABEL: TBB2.split: -; NOTE: CallSiteSplitting cannot infer that %a is null here, as it currently -; only supports recording conditions along a single predecessor path. -; CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 1, i32 99) -; CHECK-LABEL: Tail -; CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB2.split ] -; CHECK: ret i32 %[[MERGED]] -define i32 @test_header_header2_tbb(i32* %a, i32 %v, i32 %p) { -Header: - %tobool1 = icmp eq i32* %a, null - br i1 %tobool1, label %TBB1, label %Header2 - -Header2: - %tobool2 = icmp eq i32 %p, 10 - br i1 %tobool2, label %Tail, label %TBB1 - -TBB1: - %cmp1 = icmp eq i32 %v, 1 - br i1 %cmp1, label %TBB2, label %End - -TBB2: - %cmp2 = icmp eq i32 %p, 99 - br i1 %cmp2, label %Tail, label %End - -Tail: - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r - -End: - ret i32 %v -} - -define i32 @callee(i32* %a, i32 %v, i32 %p) { - ret i32 10 -} diff --git a/llvm/test/Transforms/CallSiteSplitting/callsite-no-splitting.ll b/llvm/test/Transforms/CallSiteSplitting/callsite-no-splitting.ll deleted file mode 100644 index 25b4cb23be6..00000000000 --- a/llvm/test/Transforms/CallSiteSplitting/callsite-no-splitting.ll +++ /dev/null @@ -1,42 +0,0 @@ -; RUN: opt < %s -callsite-splitting -S | FileCheck %s -; RUN: opt < %s -passes='function(callsite-splitting)' -S | FileCheck %s - -define i32 @callee(i32*, i32, i32) { - ret i32 10 -} - -; CHECK-LABEL: @test_preds_equal -; CHECK-NOT: split -; CHECK: br i1 %cmp, label %Tail, label %Tail -define i32 @test_preds_equal(i32* %a, i32 %v, i32 %p) { -TBB: - %cmp = icmp eq i32* %a, null - br i1 %cmp, label %Tail, label %Tail -Tail: - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r -} - -define void @fn1(i16 %p1) { -entry: - ret void -} - -define void @fn2() { - ret void - -; Unreachable code below - -for.inc: ; preds = %for.inc - br i1 undef, label %for.end6, label %for.inc - -for.end6: ; preds = %for.inc - br i1 undef, label %lor.rhs, label %lor.end - -lor.rhs: ; preds = %for.end6 - br label %lor.end - -lor.end: ; preds = %for.end6, %lor.rhs - call void @fn1(i16 0) - ret void -} diff --git a/llvm/test/Transforms/CallSiteSplitting/callsite-split-debug.ll b/llvm/test/Transforms/CallSiteSplitting/callsite-split-debug.ll deleted file mode 100644 index 21cfed34e8f..00000000000 --- a/llvm/test/Transforms/CallSiteSplitting/callsite-split-debug.ll +++ /dev/null @@ -1,56 +0,0 @@ -; RUN: opt -S -callsite-splitting -o - < %s | FileCheck %s -; RUN: opt -S -strip-debug -callsite-splitting -o - < %s | FileCheck %s - -define internal i16 @bar(i16 %p1, i16 %p2) { - %_tmp3 = mul i16 %p2, %p1 - ret i16 %_tmp3 -} - -define i16 @foo(i16 %in) { -bb0: - br label %bb1 - -bb1: - %0 = icmp ne i16 %in, 0 - br i1 %0, label %bb2, label %CallsiteBB - -bb2: - br label %CallsiteBB - -CallsiteBB: - %1 = phi i16 [ 0, %bb1 ], [ 1, %bb2 ] - %c = phi i16 [ 2, %bb1 ], [ 3, %bb2 ] - call void @llvm.dbg.value(metadata i16 %c, metadata !7, metadata !DIExpression()), !dbg !8 - %2 = call i16 @bar(i16 %1, i16 5) - ret i16 %2 -} - -; Function Attrs: nounwind readnone speculatable -declare void @llvm.dbg.value(metadata, metadata, metadata) #0 - -attributes #0 = { nounwind readnone speculatable } - -!llvm.dbg.cu = !{!0} -!llvm.module.flags = !{!2, !3} -!llvm.ident = !{!4} - -!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "My Compiler") -!1 = !DIFile(filename: "foo.c", directory: "/bar") -!2 = !{i32 2, !"Dwarf Version", i32 4} -!3 = !{i32 2, !"Debug Info Version", i32 3} -!4 = !{!"My Compiler"} -!5 = !DIBasicType(name: "int", size: 16, encoding: DW_ATE_signed) -!6 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 4, unit: !0) -!7 = !DILocalVariable(name: "c", scope: !6, line: 5, type: !5) -!8 = !DILocation(line: 5, column: 7, scope: !6) - -; The optimization should trigger even in the presence of the dbg.value in -; CallSiteBB. - -; CHECK-LABEL: @foo -; CHECK-LABEL: bb1.split: -; CHECK: [[TMP1:%[0-9]+]] = call i16 @bar(i16 0, i16 5) -; CHECK-LABEL: bb2.split: -; CHECK: [[TMP2:%[0-9]+]] = call i16 @bar(i16 1, i16 5) -; CHECK-LABEL: CallsiteBB -; CHECK: %phi.call = phi i16 [ [[TMP2]], %bb2.split ], [ [[TMP1]], %bb1.split diff --git a/llvm/test/Transforms/CallSiteSplitting/callsite-split-or-phi.ll b/llvm/test/Transforms/CallSiteSplitting/callsite-split-or-phi.ll deleted file mode 100644 index cd2edb1e335..00000000000 --- a/llvm/test/Transforms/CallSiteSplitting/callsite-split-or-phi.ll +++ /dev/null @@ -1,588 +0,0 @@ -; RUN: opt < %s -callsite-splitting -S | FileCheck %s -; RUN: opt < %s -passes='function(callsite-splitting)' -S | FileCheck %s - -target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" -target triple = "aarch64-linaro-linux-gnueabi" - -;CHECK-LABEL: @test_eq_eq - -;CHECK-LABEL: Header: -;CHECK: br i1 %tobool1, label %Header.split, label %TBB -;CHECK-LABEL: Header.split: -;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 1) -;CHECK-LABEL: TBB: -;CHECK: br i1 %cmp, label %TBB.split, label %End -;CHECK-LABEL: TBB.split: -;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 2) -;CHECK-LABEL: Tail -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ] -;CHECK: ret i32 %[[MERGED]] -define i32 @test_eq_eq(i32* %a, i32 %v) { -Header: - %tobool1 = icmp eq i32* %a, null - br i1 %tobool1, label %Tail, label %TBB - -TBB: - %cmp = icmp eq i32 %v, 1 - br i1 %cmp, label %Tail, label %End - -Tail: - %p = phi i32[1,%Header], [2, %TBB] - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r - -End: - ret i32 %v -} - -;CHECK-LABEL: @test_eq_eq_eq -;CHECK-LABEL: Header2.split: -;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 10) -;CHECK-LABEL: TBB.split: -;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 1, i32 %p) -;CHECK-LABEL: Tail -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB.split ] -;CHECK: ret i32 %[[MERGED]] -define i32 @test_eq_eq_eq(i32* %a, i32 %v, i32 %p) { -Header: - %tobool1 = icmp eq i32* %a, null - br i1 %tobool1, label %Header2, label %End - -Header2: - %tobool2 = icmp eq i32 %p, 10 - br i1 %tobool2, label %Tail, label %TBB - -TBB: - %cmp = icmp eq i32 %v, 1 - br i1 %cmp, label %Tail, label %End - -Tail: - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r - -End: - ret i32 %v -} - -;CHECK-LABEL: @test_eq_eq_eq_constrain_same_i32_arg -;CHECK-LABEL: Header2.split: -;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 222, i32 %p) -;CHECK-LABEL: TBB.split: -;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 333, i32 %p) -;CHECK-LABEL: Tail -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB.split ] -;CHECK: ret i32 %[[MERGED]] -define i32 @test_eq_eq_eq_constrain_same_i32_arg(i32* %a, i32 %v, i32 %p) { -Header: - %tobool1 = icmp eq i32 %v, 111 - br i1 %tobool1, label %Header2, label %End - -Header2: - %tobool2 = icmp eq i32 %v, 222 - br i1 %tobool2, label %Tail, label %TBB - -TBB: - %cmp = icmp eq i32 %v, 333 - br i1 %cmp, label %Tail, label %End - -Tail: - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r - -End: - ret i32 %v -} - -;CHECK-LABEL: @test_ne_eq -;CHECK-LABEL: Header.split: -;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 1) -;CHECK-LABEL: TBB.split: -;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 1, i32 2) -;CHECK-LABEL: Tail -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ] -;CHECK: ret i32 %[[MERGED]] -define i32 @test_ne_eq(i32* %a, i32 %v) { -Header: - %tobool1 = icmp ne i32* %a, null - br i1 %tobool1, label %Tail, label %TBB - -TBB: - %cmp = icmp eq i32 %v, 1 - br i1 %cmp, label %Tail, label %End - -Tail: - %p = phi i32[1,%Header], [2, %TBB] - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r - -End: - ret i32 %v -} - -;CHECK-LABEL: @test_ne_eq_ne -;CHECK-LABEL: Header2.split: -;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 10) -;CHECK-LABEL: TBB.split: -;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 %v, i32 %p) -;CHECK-LABEL: Tail -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB.split ] -;CHECK: ret i32 %[[MERGED]] -define i32 @test_ne_eq_ne(i32* %a, i32 %v, i32 %p) { -Header: - %tobool1 = icmp ne i32* %a, null - br i1 %tobool1, label %Header2, label %TBB - -Header2: - %tobool2 = icmp eq i32 %p, 10 - br i1 %tobool2, label %Tail, label %TBB - -TBB: - %cmp = icmp ne i32 %v, 1 - br i1 %cmp, label %Tail, label %End - -Tail: - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r - -End: - ret i32 %v -} - -;CHECK-LABEL: @test_ne_ne -;CHECK-LABEL: Header.split: -;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 1) -;CHECK-LABEL: TBB.split: -;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 %v, i32 2) -;CHECK-LABEL: Tail -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ] -;CHECK: ret i32 %[[MERGED]] -define i32 @test_ne_ne(i32* %a, i32 %v) { -Header: - %tobool1 = icmp ne i32* %a, null - br i1 %tobool1, label %Tail, label %TBB - -TBB: - %cmp = icmp ne i32 %v, 1 - br i1 %cmp, label %Tail, label %End - -Tail: - %p = phi i32[1,%Header], [2, %TBB] - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r - -End: - ret i32 %v -} - -;CHECK-LABEL: @test_ne_ne_ne_constrain_same_pointer_arg -;CHECK-LABEL: Header2.split: -;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 %p) -;CHECK-LABEL: TBB.split: -;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 %v, i32 %p) -;CHECK-LABEL: Tail -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB.split ] -;CHECK: ret i32 %[[MERGED]] -define i32 @test_ne_ne_ne_constrain_same_pointer_arg(i32* %a, i32 %v, i32 %p, i32* %a2, i32* %a3) { -Header: - %tobool1 = icmp ne i32* %a, null - br i1 %tobool1, label %Header2, label %TBB - -Header2: - %tobool2 = icmp ne i32* %a, %a2 - br i1 %tobool2, label %Tail, label %TBB - -TBB: - %cmp = icmp ne i32* %a, %a3 - br i1 %cmp, label %Tail, label %End - -Tail: - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r - -End: - ret i32 %v -} - - - -;CHECK-LABEL: @test_eq_eq_untaken -;CHECK-LABEL: Header.split: -;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 1) -;CHECK-LABEL: TBB.split: -;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* null, i32 1, i32 2) -;CHECK-LABEL: Tail -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ] -;CHECK: ret i32 %[[MERGED]] -define i32 @test_eq_eq_untaken(i32* %a, i32 %v) { -Header: - %tobool1 = icmp eq i32* %a, null - br i1 %tobool1, label %TBB, label %Tail - -TBB: - %cmp = icmp eq i32 %v, 1 - br i1 %cmp, label %Tail, label %End - -Tail: - %p = phi i32[1,%Header], [2, %TBB] - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r - -End: - ret i32 %v -} - -;CHECK-LABEL: @test_eq_eq_eq_untaken -;CHECK-LABEL: Header2.split: -;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* nonnull %a, i32 %v, i32 10) -;CHECK-LABEL: TBB.split: -;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 1, i32 %p) -;CHECK-LABEL: Tail -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB.split ] -;CHECK: ret i32 %[[MERGED]] -define i32 @test_eq_eq_eq_untaken(i32* %a, i32 %v, i32 %p) { -Header: - %tobool1 = icmp eq i32* %a, null - br i1 %tobool1, label %TBB, label %Header2 - -Header2: - %tobool2 = icmp eq i32 %p, 10 - br i1 %tobool2, label %Tail, label %TBB - -TBB: - %cmp = icmp eq i32 %v, 1 - br i1 %cmp, label %Tail, label %End - -Tail: - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r - -End: - ret i32 %v -} - -;CHECK-LABEL: @test_ne_eq_untaken -;CHECK-LABEL: Header.split: -;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 1) -;CHECK-LABEL: TBB.split: -;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 2) -;CHECK-LABEL: Tail -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ] -;CHECK: ret i32 %[[MERGED]] -define i32 @test_ne_eq_untaken(i32* %a, i32 %v) { -Header: - %tobool1 = icmp ne i32* %a, null - br i1 %tobool1, label %TBB, label %Tail - -TBB: - %cmp = icmp eq i32 %v, 1 - br i1 %cmp, label %Tail, label %End - -Tail: - %p = phi i32[1,%Header], [2, %TBB] - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r - -End: - ret i32 %v -} - -;CHECK-LABEL: @test_ne_eq_ne_untaken -;CHECK-LABEL: Header2.split: -;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 10) -;CHECK-LABEL: TBB.split: -;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 %v, i32 %p) -;CHECK-LABEL: Tail -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header2.split ], [ %[[CALL2]], %TBB.split ] -;CHECK: ret i32 %[[MERGED]] -define i32 @test_ne_eq_ne_untaken(i32* %a, i32 %v, i32 %p) { -Header: - %tobool1 = icmp ne i32* %a, null - br i1 %tobool1, label %TBB, label %Header2 - -Header2: - %tobool2 = icmp eq i32 %p, 10 - br i1 %tobool2, label %Tail, label %TBB - -TBB: - %cmp = icmp ne i32 %v, 1 - br i1 %cmp, label %Tail, label %End - -Tail: - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r - -End: - ret i32 %v -} - -;CHECK-LABEL: @test_ne_ne_untaken -;CHECK-LABEL: Header.split: -;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* null, i32 %v, i32 1) -;CHECK-LABEL: TBB.split: -;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* nonnull %a, i32 1, i32 2) -;CHECK-LABEL: Tail -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ] -;CHECK: ret i32 %[[MERGED]] -define i32 @test_ne_ne_untaken(i32* %a, i32 %v) { -Header: - %tobool1 = icmp ne i32* %a, null - br i1 %tobool1, label %TBB, label %Tail - -TBB: - %cmp = icmp ne i32 %v, 1 - br i1 %cmp, label %End, label %Tail - -Tail: - %p = phi i32[1,%Header], [2, %TBB] - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r - -End: - ret i32 %v -} - -;CHECK-LABEL: @test_nonconst_const_phi -;CHECK-LABEL: Header.split: -;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 1) -;CHECK-LABEL: TBB.split: -;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 1, i32 2) -;CHECK-LABEL: Tail -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ] -;CHECK: ret i32 %[[MERGED]] -define i32 @test_nonconst_const_phi(i32* %a, i32* %b, i32 %v) { -Header: - %tobool1 = icmp eq i32* %a, %b - br i1 %tobool1, label %Tail, label %TBB - -TBB: - %cmp = icmp eq i32 %v, 1 - br i1 %cmp, label %Tail, label %End - -Tail: - %p = phi i32[1,%Header], [2, %TBB] - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r - -End: - ret i32 %v -} - -;CHECK-LABEL: @test_nonconst_nonconst_phi -;CHECK-LABEL: Header.split: -;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 1) -;CHECK-LABEL: TBB.split: -;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 %v, i32 2) -;CHECK-LABEL: Tail -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL2]], %TBB.split ], [ %[[CALL1]], %Header.split ] -;CHECK: ret i32 %[[MERGED]] -define i32 @test_nonconst_nonconst_phi(i32* %a, i32* %b, i32 %v, i32 %v2) { -Header: - %tobool1 = icmp eq i32* %a, %b - br i1 %tobool1, label %Tail, label %TBB - -TBB: - %cmp = icmp eq i32 %v, %v2 - br i1 %cmp, label %Tail, label %End - -Tail: - %p = phi i32[1,%Header], [2, %TBB] - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r - -End: - ret i32 %v -} - -;CHECK-LABEL: @test_cfg_no_or_phi -;CHECK-LABEL: TBB0.split -;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 1) -;CHECK-LABEL: TBB1.split: -;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 %v, i32 2) -;CHECK-LABEL: Tail -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL2]], %TBB1.split ], [ %[[CALL1]], %TBB0.split ] -;CHECK: ret i32 %[[MERGED]] -define i32 @test_cfg_no_or_phi(i32* %a, i32 %v) { -entry: - br i1 undef, label %TBB0, label %TBB1 -TBB0: - br i1 undef, label %Tail, label %End -TBB1: - br i1 undef, label %Tail, label %End -Tail: - %p = phi i32[1,%TBB0], [2, %TBB1] - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r -End: - ret i32 %v -} - -;CHECK-LABEL: @test_nonconst_nonconst_phi_noncost -;CHECK-NOT: Header.split: -;CHECK-NOT: TBB.split: -;CHECK-LABEL: Tail: -;CHECK: %r = call i32 @callee(i32* %a, i32 %v, i32 %p) -;CHECK: ret i32 %r -define i32 @test_nonconst_nonconst_phi_noncost(i32* %a, i32* %b, i32 %v, i32 %v2) { -Header: - %tobool1 = icmp eq i32* %a, %b - br i1 %tobool1, label %Tail, label %TBB - -TBB: - %cmp = icmp eq i32 %v, %v2 - br i1 %cmp, label %Tail, label %End - -Tail: - %p = phi i32[%v,%Header], [%v2, %TBB] - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r - -End: - ret i32 %v -} - -;CHECK-LABEL: @test_3preds_constphi -;CHECK-NOT: Header.split: -;CHECK-NOT: TBB.split: -;CHECK-LABEL: Tail: -;CHECK: %r = call i32 @callee(i32* %a, i32 %v, i32 %p) -;CHECK: ret i32 %r -define i32 @test_3preds_constphi(i32* %a, i32 %v, i1 %c1, i1 %c2, i1 %c3) { -Header: - br i1 %c1, label %Tail, label %TBB1 - -TBB1: - br i1 %c2, label %Tail, label %TBB2 - -TBB2: - br i1 %c3, label %Tail, label %End - -Tail: - %p = phi i32[1,%Header], [2, %TBB1], [3, %TBB2] - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r - -End: - ret i32 %v -} - -;CHECK-LABEL: @test_indirectbr_phi -;CHECK-NOT: Header.split: -;CHECK-NOT: TBB.split: -;CHECK-LABEL: Tail: -;CHECK: %r = call i32 @callee(i32* %a, i32 %v, i32 %p) -;CHECK: ret i32 %r -define i32 @test_indirectbr_phi(i8* %address, i32* %a, i32* %b, i32 %v) { -Header: - %indirect.goto.dest = select i1 undef, i8* blockaddress(@test_indirectbr_phi, %End), i8* %address - indirectbr i8* %indirect.goto.dest, [label %TBB, label %Tail] - -TBB: - %indirect.goto.dest2 = select i1 undef, i8* blockaddress(@test_indirectbr_phi, %End), i8* %address - indirectbr i8* %indirect.goto.dest2, [label %Tail, label %End] - -Tail: - %p = phi i32[1,%Header], [2, %TBB] - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r - -End: - ret i32 %v -} - -;CHECK-LABEL: @test_cond_no_effect -;CHECK-NOT: Header.split: -;CHECK-NOT: TBB.split: -;CHECK-LABEL: Tail: -;CHECK: %r = call i32 @callee(i32* %a, i32 %v, i32 0) -;CHECK: ret i32 %r -define i32 @test_cond_no_effect(i32* %a, i32 %v) { -Entry: - %tobool1 = icmp eq i32* %a, null - br i1 %tobool1, label %Header, label %End - -Header: - br i1 undef, label %Tail, label %TBB - -TBB: - br i1 undef, label %Tail, label %End - -Tail: - %r = call i32 @callee(i32* %a, i32 %v, i32 0) - ret i32 %r - -End: - ret i32 %v -} - -;CHECK-LABEL: @test_unreachable -;CHECK-LABEL: Header.split: -;CHECK: %[[CALL1:.*]] = call i32 @callee(i32* %a, i32 %v, i32 10) -;CHECK-LABEL: TBB.split: -;CHECK: %[[CALL2:.*]] = call i32 @callee(i32* %a, i32 1, i32 %p) -;CHECK-LABEL: Tail -;CHECK: %[[MERGED:.*]] = phi i32 [ %[[CALL1]], %Header.split ], [ %[[CALL2]], %TBB.split ] -;CHECK: ret i32 %[[MERGED]] -define i32 @test_unreachable(i32* %a, i32 %v, i32 %p) { -Entry: - br label %End -Header: - %tobool2 = icmp eq i32 %p, 10 - br i1 %tobool2, label %Tail, label %TBB -TBB: - %cmp = icmp eq i32 %v, 1 - br i1 %cmp, label %Tail, label %Header -Tail: - %r = call i32 @callee(i32* %a, i32 %v, i32 %p) - ret i32 %r -End: - ret i32 %v -} - -define i32 @callee(i32* %a, i32 %v, i32 %p) { -entry: - %c = icmp ne i32* %a, null - br i1 %c, label %BB1, label %BB2 - -BB1: - call void @dummy(i32* %a, i32 %p) - br label %End - -BB2: - call void @dummy2(i32 %v, i32 %p) - br label %End - -End: - ret i32 %p -} - -declare void @dummy(i32*, i32) -declare void @dummy2(i32, i32) - -; Make sure we remove the non-nullness on constant paramater. -; -;CHECK-LABEL: @caller2 -;CHECK-LABEL: Top1.split: -;CHECK: call i32 @callee(i32* inttoptr (i64 4643 to i32*) -define void @caller2(i32 %c, i32* %a_elt, i32* %b_elt) { -entry: - br label %Top0 - -Top0: - %tobool1 = icmp eq i32* %a_elt, inttoptr (i64 4643 to i32*) - br i1 %tobool1, label %Top1, label %NextCond - -Top1: - %tobool2 = icmp ne i32* %a_elt, null - br i1 %tobool2, label %CallSiteBB, label %NextCond - -NextCond: - %cmp = icmp ne i32* %b_elt, null - br i1 %cmp, label %CallSiteBB, label %End - -CallSiteBB: - call i32 @callee(i32* %a_elt, i32 %c, i32 %c) - br label %End - -End: - ret void -} diff --git a/llvm/test/Transforms/CallSiteSplitting/callsite-split-preserve-debug.ll b/llvm/test/Transforms/CallSiteSplitting/callsite-split-preserve-debug.ll deleted file mode 100644 index fd1d94c647f..00000000000 --- a/llvm/test/Transforms/CallSiteSplitting/callsite-split-preserve-debug.ll +++ /dev/null @@ -1,85 +0,0 @@ -; RUN: opt -callsite-splitting -S < %s | FileCheck %s - -; CHECK-LABEL: @test1 -; CHECK: [[R1:%.+]] = call i32 @callee(i32 0, i32 %dd), !dbg [[DBG1:!.*]] -; CHECK: [[R2:%.+]] = call i32 @callee(i32 1, i32 %dd), !dbg [[DBG1]] -; CHECK-LABEL: CallSite: -; CHECK-NEXT: phi i32 [ [[R2]], %land.rhs.split ], [ [[R1]], %entry.split ], !dbg [[DBG1]] - -define i32 @test1(i32* dereferenceable(4) %cc, i32 %dd) !dbg !6 { -entry: - br i1 undef, label %CallSite, label %land.rhs - -land.rhs: ; preds = %entry - br label %CallSite - -CallSite: ; preds = %land.rhs, %entry - %pv = phi i32 [ 0, %entry ], [ 1, %land.rhs ] - %call = call i32 @callee(i32 %pv, i32 %dd), !dbg !18 - ret i32 %call -} - -; CHECK-LABEL: @test2 -; CHECK: [[LV1:%.*]] = load i32, i32* %ptr, align 4, !dbg [[DBG_LV:!.*]] -; CHECK-NEXT: [[R1:%.+]] = call i32 @callee(i32 0, i32 10), !dbg [[DBG_CALL:!.*]] -; CHECK: [[LV2:%.*]] = load i32, i32* %ptr, align 4, !dbg [[DBG_LV]] -; CHECK-NEXT: [[R2:%.+]] = call i32 @callee(i32 0, i32 %i), !dbg [[DBG_CALL]] -; CHECK-LABEL: CallSite: -; CHECK-NEXT: phi i32 [ [[LV1]], %Header.split ], [ [[LV2]], %TBB.split ], !dbg [[DBG_LV]] -; CHECK-NEXT: phi i32 [ [[R1]], %Header.split ], [ [[R2]], %TBB.split ], !dbg [[DBG_CALL]] - -define void @test2(i32* %ptr, i32 %i) !dbg !19 { -Header: - %tobool = icmp ne i32 %i, 10 - br i1 %tobool, label %TBB, label %CallSite - -TBB: ; preds = %Header - br i1 undef, label %CallSite, label %End - -CallSite: ; preds = %TBB, %Header - %lv = load i32, i32* %ptr, align 4, !dbg !25 - %cv = call i32 @callee(i32 0, i32 %i), !dbg !26 - %sub = sub nsw i32 %lv, %cv - br label %End - -End: ; preds = %CallSite, %TBB - ret void -} - -define i32 @callee(i32 %aa, i32 %bb) { -entry: - %add = add nsw i32 %aa, %bb - ret i32 %add -} - -!llvm.dbg.cu = !{!0} -!llvm.debugify = !{!3, !4} -!llvm.module.flags = !{!5} - -!0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2) -!1 = !DIFile(filename: "<stdin>", directory: "/") -!2 = !{} -!3 = !{i32 23} -!4 = !{i32 11} -!5 = !{i32 2, !"Debug Info Version", i32 3} -!6 = distinct !DISubprogram(name: "test", linkageName: "test", scope: null, file: !1, line: 3, type: !7, isLocal: false, isDefinition: true, scopeLine: 3, isOptimized: true, unit: !0, retainedNodes: !8) -!7 = !DISubroutineType(types: !2) -!8 = !{!9, !11, !13, !15, !16, !17} -!9 = !DILocalVariable(name: "2", scope: !6, file: !1, line: 3, type: !10) -!10 = !DIBasicType(name: "ty64", size: 64, encoding: DW_ATE_unsigned) -!11 = !DILocalVariable(name: "3", scope: !6, file: !1, line: 5, type: !12) -!12 = !DIBasicType(name: "ty32", size: 32, encoding: DW_ATE_unsigned) -!13 = !DILocalVariable(name: "4", scope: !6, file: !1, line: 6, type: !14) -!14 = !DIBasicType(name: "ty8", size: 8, encoding: DW_ATE_unsigned) -!15 = !DILocalVariable(name: "5", scope: !6, file: !1, line: 9, type: !12) -!16 = !DILocalVariable(name: "6", scope: !6, file: !1, line: 10, type: !12) -!17 = !DILocalVariable(name: "7", scope: !6, file: !1, line: 11, type: !10) -!18 = !DILocation(line: 10, column: 1, scope: !6) -!19 = distinct !DISubprogram(name: "test_add_new_phi", linkageName: "test_add_new_phi", scope: null, file: !1, line: 14, type: !7, isLocal: false, isDefinition: true, scopeLine: 14, isOptimized: true, unit: !0, retainedNodes: !20) -!20 = !{!21, !22, !23, !24} -!21 = !DILocalVariable(name: "8", scope: !19, file: !1, line: 14, type: !14) -!22 = !DILocalVariable(name: "9", scope: !19, file: !1, line: 17, type: !10) -!23 = !DILocalVariable(name: "10", scope: !19, file: !1, line: 18, type: !12) -!24 = !DILocalVariable(name: "11", scope: !19, file: !1, line: 20, type: !12) -!25 = !DILocation(line: 18, column: 1, scope: !19) -!26 = !DILocation(line: 19, column: 1, scope: !19) diff --git a/llvm/test/Transforms/CallSiteSplitting/callsite-split.ll b/llvm/test/Transforms/CallSiteSplitting/callsite-split.ll deleted file mode 100644 index 117464904ce..00000000000 --- a/llvm/test/Transforms/CallSiteSplitting/callsite-split.ll +++ /dev/null @@ -1,119 +0,0 @@ -; RUN: opt < %s -callsite-splitting -inline -instcombine -jump-threading -S | FileCheck %s -; RUN: opt < %s -passes='function(callsite-splitting),cgscc(inline),function(instcombine,jump-threading)' -S | FileCheck %s - -target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" -target triple = "aarch64-linaro-linux-gnueabi" - -%struct.bitmap = type { i32, %struct.bitmap* } - -;CHECK-LABEL: @caller -;CHECK-LABEL: Top.split: -;CHECK: call void @callee(%struct.bitmap* null, %struct.bitmap* null, %struct.bitmap* %b_elt, i1 false) -;CHECK-LABEL: NextCond: -;CHECK: br {{.*}} label %callee.exit -;CHECK-LABEL: callee.exit: -;CHECK: call void @dummy2(%struct.bitmap* %a_elt) - -define void @caller(i1 %c, %struct.bitmap* %a_elt, %struct.bitmap* %b_elt) { -entry: - br label %Top - -Top: - %tobool1 = icmp eq %struct.bitmap* %a_elt, null - br i1 %tobool1, label %CallSiteBB, label %NextCond - -NextCond: - %cmp = icmp ne %struct.bitmap* %b_elt, null - br i1 %cmp, label %CallSiteBB, label %End - -CallSiteBB: - %p = phi i1 [0, %Top], [%c, %NextCond] - call void @callee(%struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %b_elt, i1 %p) - br label %End - -End: - ret void -} - -define void @callee(%struct.bitmap* %dst_elt, %struct.bitmap* %a_elt, %struct.bitmap* %b_elt, i1 %c) { -entry: - %tobool = icmp ne %struct.bitmap* %a_elt, null - %tobool1 = icmp ne %struct.bitmap* %b_elt, null - %or.cond = and i1 %tobool, %tobool1 - br i1 %or.cond, label %Cond, label %Big - -Cond: - %cmp = icmp eq %struct.bitmap* %dst_elt, %a_elt - br i1 %cmp, label %Small, label %Big - -Small: - call void @dummy2(%struct.bitmap* %a_elt) - br label %End - -Big: - call void @dummy1(%struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt) - call void @dummy1(%struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt) - call void @dummy1(%struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt) - call void @dummy1(%struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt) - call void @dummy1(%struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt) - call void @dummy1(%struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt) - call void @dummy1(%struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt, %struct.bitmap* %a_elt) - br label %End - -End: - ret void -} - -declare void @dummy2(%struct.bitmap*) -declare void @dummy1(%struct.bitmap*, %struct.bitmap*, %struct.bitmap*, %struct.bitmap*, %struct.bitmap*, %struct.bitmap*) - - -;CHECK-LABEL: @caller2 -;CHECK-LABEL: Top.split: -;CHECK: call void @dummy4() -;CHECK-LABEL: NextCond.split: -;CHECK: call void @dummy3() -;CheCK-LABEL: CallSiteBB: -;CHECK: %phi.call = phi i1 [ true, %NextCond.split ], [ false, %Top.split ] -;CHECK: call void @foo(i1 %phi.call) -define void @caller2(i1 %c, %struct.bitmap* %a_elt, %struct.bitmap* %b_elt, %struct.bitmap* %c_elt) { -entry: - br label %Top - -Top: - %tobool1 = icmp eq %struct.bitmap* %a_elt, %b_elt - br i1 %tobool1, label %CallSiteBB, label %NextCond - -NextCond: - %cmp = icmp ne %struct.bitmap* %b_elt, %c_elt - br i1 %cmp, label %CallSiteBB, label %End - -CallSiteBB: - %phi = phi i1 [0, %Top],[1, %NextCond] - %u = call i1 @callee2(i1 %phi) - call void @foo(i1 %u) - br label %End - -End: - ret void -} - -define i1 @callee2(i1 %b) { -entry: - br i1 %b, label %BB1, label %BB2 - -BB1: - call void @dummy3() - br label %End - -BB2: - call void @dummy4() - br label %End - -End: - ret i1 %b -} - -declare void @dummy3() -declare void @dummy4() -declare void @foo(i1) diff --git a/llvm/test/Transforms/CallSiteSplitting/lpad.ll b/llvm/test/Transforms/CallSiteSplitting/lpad.ll deleted file mode 100644 index fc72ec13aab..00000000000 --- a/llvm/test/Transforms/CallSiteSplitting/lpad.ll +++ /dev/null @@ -1,40 +0,0 @@ -; RUN: opt -S -callsite-splitting < %s | FileCheck %s -; -; Make sure that the callsite is not splitted by checking that there's only one -; call to @callee. - -; CHECK-LABEL: @caller -; CHECK-LABEL: lpad -; CHECK: call void @callee -; CHECK-NOT: call void @callee - -declare void @foo(i1* %p); -declare void @bar(i1* %p); -declare dso_local i32 @__gxx_personality_v0(...) - -define void @caller(i1* %p) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { -entry: - %0 = icmp eq i1* %p, null - br i1 %0, label %bb1, label %bb2 - -bb1: - invoke void @foo(i1* %p) to label %end1 unwind label %lpad - -bb2: - invoke void @bar(i1* %p) to label %end2 unwind label %lpad - -lpad: - %1 = landingpad { i8*, i32 } cleanup - call void @callee(i1* %p) - resume { i8*, i32 } %1 - -end1: - ret void - -end2: - ret void -} - -define internal void @callee(i1* %p) { - ret void -} diff --git a/llvm/test/Transforms/CallSiteSplitting/musttail.ll b/llvm/test/Transforms/CallSiteSplitting/musttail.ll deleted file mode 100644 index d8f76aed3dc..00000000000 --- a/llvm/test/Transforms/CallSiteSplitting/musttail.ll +++ /dev/null @@ -1,104 +0,0 @@ -; RUN: opt < %s -callsite-splitting -verify-dom-info -S | FileCheck %s - -;CHECK-LABEL: @caller -;CHECK-LABEL: Top.split: -;CHECK: %ca1 = musttail call i8* @callee(i8* null, i8* %b) -;CHECK: %cb2 = bitcast i8* %ca1 to i8* -;CHECK: ret i8* %cb2 -;CHECK-LABEL: TBB.split -;CHECK: %ca3 = musttail call i8* @callee(i8* nonnull %a, i8* null) -;CHECK: %cb4 = bitcast i8* %ca3 to i8* -;CHECK: ret i8* %cb4 -define i8* @caller(i8* %a, i8* %b) { -Top: - %c = icmp eq i8* %a, null - br i1 %c, label %Tail, label %TBB -TBB: - %c2 = icmp eq i8* %b, null - br i1 %c2, label %Tail, label %End -Tail: - %ca = musttail call i8* @callee(i8* %a, i8* %b) - %cb = bitcast i8* %ca to i8* - ret i8* %cb -End: - ret i8* null -} - -define i8* @callee(i8* %a, i8* %b) noinline { - ret i8* %a -} - -;CHECK-LABEL: @no_cast_caller -;CHECK-LABEL: Top.split: -;CHECK: %ca1 = musttail call i8* @callee(i8* null, i8* %b) -;CHECK: ret i8* %ca1 -;CHECK-LABEL: TBB.split -;CHECK: %ca2 = musttail call i8* @callee(i8* nonnull %a, i8* null) -;CHECK: ret i8* %ca2 -define i8* @no_cast_caller(i8* %a, i8* %b) { -Top: - %c = icmp eq i8* %a, null - br i1 %c, label %Tail, label %TBB -TBB: - %c2 = icmp eq i8* %b, null - br i1 %c2, label %Tail, label %End -Tail: - %ca = musttail call i8* @callee(i8* %a, i8* %b) - ret i8* %ca -End: - ret i8* null -} - -;CHECK-LABEL: @void_caller -;CHECK-LABEL: Top.split: -;CHECK: musttail call void @void_callee(i8* null, i8* %b) -;CHECK: ret void -;CHECK-LABEL: TBB.split -;CHECK: musttail call void @void_callee(i8* nonnull %a, i8* null) -;CHECK: ret void -define void @void_caller(i8* %a, i8* %b) { -Top: - %c = icmp eq i8* %a, null - br i1 %c, label %Tail, label %TBB -TBB: - %c2 = icmp eq i8* %b, null - br i1 %c2, label %Tail, label %End -Tail: - musttail call void @void_callee(i8* %a, i8* %b) - ret void -End: - ret void -} - -define void @void_callee(i8* %a, i8* %b) noinline { - ret void -} - -; Include a test with a larger CFG that exercises the DomTreeUpdater -; machinery a bit more. -;CHECK-LABEL: @larger_cfg_caller -;CHECK-LABEL: Top.split: -;CHECK: %r1 = musttail call i8* @callee(i8* null, i8* %b) -;CHECK: ret i8* %r1 -;CHECK-LABEL: TBB.split -;CHECK: %r2 = musttail call i8* @callee(i8* nonnull %a, i8* null) -;CHECK: ret i8* %r2 -define i8* @larger_cfg_caller(i8* %a, i8* %b) { -Top: - %cond1 = icmp eq i8* %a, null - br i1 %cond1, label %Tail, label %ExtraTest -ExtraTest: - %a0 = load i8, i8* %a - %cond2 = icmp eq i8 %a0, 0 - br i1 %cond2, label %TBB_pred, label %End -TBB_pred: - br label %TBB -TBB: - %cond3 = icmp eq i8* %b, null - br i1 %cond3, label %Tail, label %End -Tail: - %r = musttail call i8* @callee(i8* %a, i8* %b) - ret i8* %r -End: - ret i8* null -} diff --git a/llvm/test/Transforms/CallSiteSplitting/split-loop.ll b/llvm/test/Transforms/CallSiteSplitting/split-loop.ll deleted file mode 100644 index 3e49a73627f..00000000000 --- a/llvm/test/Transforms/CallSiteSplitting/split-loop.ll +++ /dev/null @@ -1,90 +0,0 @@ -; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -S -callsite-splitting -simplifycfg < %s | FileCheck %s - -define i16 @test1() { -; CHECK-LABEL: @test1( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 undef, i16 1, i16 0 -; CHECK-NEXT: call void @callee(i16 0) -; CHECK-NEXT: br label [[FOR_COND12:%.*]] -; CHECK: for.cond12: -; CHECK-NEXT: call void @callee(i16 [[SPEC_SELECT]]) -; CHECK-NEXT: br label [[FOR_COND12]] -; -entry: - %spec.select = select i1 undef, i16 1, i16 0 - %tobool18 = icmp ne i16 %spec.select, 0 - br i1 %tobool18, label %for.cond12.us, label %for.cond12 - -for.cond12.us: - unreachable - -for.cond12: - call void @callee(i16 %spec.select) - br label %for.cond12 -} - -define i16 @test2() { -; CHECK-LABEL: @test2( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[S:%.*]] = select i1 undef, i16 1, i16 0 -; CHECK-NEXT: call void @callee(i16 0) -; CHECK-NEXT: br label [[FOR_COND12:%.*]] -; CHECK: for.cond12: -; CHECK-NEXT: [[ADD:%.*]] = add i16 [[S]], 10 -; CHECK-NEXT: [[ADD2:%.*]] = add i16 [[S]], 10 -; CHECK-NEXT: call void @callee(i16 [[S]]) -; CHECK-NEXT: br label [[FOR_COND12]] -; -entry: - %s= select i1 undef, i16 1, i16 0 - %tobool18 = icmp ne i16 %s, 0 - br i1 %tobool18, label %for.cond12.us, label %for.cond12 - -for.cond12.us: - unreachable - -for.cond12: - call void @callee(i16 %s) - %add = add i16 %s, 10 - %add2 = add i16 %s, 10 - br label %for.cond12 -} - -define i16 @test3() { -; CHECK-LABEL: @test3( -; CHECK-NEXT: entry: -; CHECK-NEXT: [[S:%.*]] = select i1 undef, i16 1, i16 0 -; CHECK-NEXT: call void @callee(i16 0) -; CHECK-NEXT: br label [[FOR_COND12:%.*]] -; CHECK: for.cond12: -; CHECK-NEXT: [[ADD:%.*]] = add i16 [[S]], 10 -; CHECK-NEXT: [[ADD2:%.*]] = add i16 [[ADD]], 10 -; CHECK-NEXT: br i1 undef, label [[FOR_COND12_SPLIT:%.*]], label [[EXIT:%.*]] -; CHECK: for.cond12.split: -; CHECK-NEXT: call void @callee(i16 [[S]]) -; CHECK-NEXT: br label [[FOR_COND12]] -; CHECK: exit: -; CHECK-NEXT: ret i16 [[ADD2]] -; -entry: - %s= select i1 undef, i16 1, i16 0 - %tobool18 = icmp ne i16 %s, 0 - br i1 %tobool18, label %for.cond12.us, label %for.cond12 - -for.cond12.us: - unreachable - -for.cond12: - call void @callee(i16 %s) - %add = add i16 %s, 10 - %add2 = add i16 %add, 10 - br i1 undef, label %for.cond12, label %exit - -exit: - ret i16 %add2 -} - -define internal void @callee(i16 %flag) { - ret void -} |