150
|
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
2 ; RUN: opt -S -passes=spec-phis < %s | FileCheck %s
|
|
3 ; Make sure convergent and noduplicate calls aren't duplicated.
|
|
4
|
|
5 declare i32 @llvm.convergent(i32) #0
|
|
6 declare i32 @llvm.noduplicate(i32) #1
|
|
7 declare i32 @llvm.regular(i32) #2
|
|
8
|
|
9 define i32 @test_convergent(i1 %flag, i32 %arg) #0 {
|
|
10 ; CHECK-LABEL: @test_convergent(
|
|
11 ; CHECK-NEXT: entry:
|
|
12 ; CHECK-NEXT: br i1 [[FLAG:%.*]], label [[A:%.*]], label [[B:%.*]]
|
|
13 ; CHECK: a:
|
|
14 ; CHECK-NEXT: br label [[EXIT:%.*]]
|
|
15 ; CHECK: b:
|
|
16 ; CHECK-NEXT: br label [[EXIT]]
|
|
17 ; CHECK: exit:
|
|
18 ; CHECK-NEXT: [[P:%.*]] = phi i32 [ 7, [[A]] ], [ 11, [[B]] ]
|
|
19 ; CHECK-NEXT: [[SUM:%.*]] = call i32 @llvm.convergent(i32 [[P]])
|
|
20 ; CHECK-NEXT: ret i32 [[SUM]]
|
|
21 ;
|
|
22 entry:
|
|
23 br i1 %flag, label %a, label %b
|
|
24
|
|
25 a:
|
|
26 br label %exit
|
|
27
|
|
28 b:
|
|
29 br label %exit
|
|
30
|
|
31 exit:
|
|
32 %p = phi i32 [ 7, %a ], [ 11, %b ]
|
|
33 %sum = call i32 @llvm.convergent(i32 %p)
|
|
34 ret i32 %sum
|
|
35 }
|
|
36
|
|
37 define i32 @test_noduplicate(i1 %flag, i32 %arg) #1 {
|
|
38 ; CHECK-LABEL: @test_noduplicate(
|
|
39 ; CHECK-NEXT: entry:
|
|
40 ; CHECK-NEXT: br i1 [[FLAG:%.*]], label [[A:%.*]], label [[B:%.*]]
|
|
41 ; CHECK: a:
|
|
42 ; CHECK-NEXT: br label [[EXIT:%.*]]
|
|
43 ; CHECK: b:
|
|
44 ; CHECK-NEXT: br label [[EXIT]]
|
|
45 ; CHECK: exit:
|
|
46 ; CHECK-NEXT: [[P:%.*]] = phi i32 [ 7, [[A]] ], [ 11, [[B]] ]
|
|
47 ; CHECK-NEXT: [[SUM:%.*]] = call i32 @llvm.noduplicate(i32 [[P]])
|
|
48 ; CHECK-NEXT: ret i32 [[SUM]]
|
|
49 ;
|
|
50 entry:
|
|
51 br i1 %flag, label %a, label %b
|
|
52
|
|
53 a:
|
|
54 br label %exit
|
|
55
|
|
56 b:
|
|
57 br label %exit
|
|
58
|
|
59 exit:
|
|
60 %p = phi i32 [ 7, %a ], [ 11, %b ]
|
|
61 %sum = call i32 @llvm.noduplicate(i32 %p)
|
|
62 ret i32 %sum
|
|
63 }
|
|
64
|
|
65 ; Otherwise identical function which should be transformed.
|
|
66 define i32 @test_reference(i1 %flag, i32 %arg) #2 {
|
|
67 ; CHECK-LABEL: @test_reference(
|
|
68 ; CHECK-NEXT: entry:
|
|
69 ; CHECK-NEXT: br i1 [[FLAG:%.*]], label [[A:%.*]], label [[B:%.*]]
|
|
70 ; CHECK: a:
|
|
71 ; CHECK-NEXT: [[SUM_0:%.*]] = call i32 @llvm.regular(i32 7)
|
|
72 ; CHECK-NEXT: br label [[EXIT:%.*]]
|
|
73 ; CHECK: b:
|
|
74 ; CHECK-NEXT: [[SUM_1:%.*]] = call i32 @llvm.regular(i32 11)
|
|
75 ; CHECK-NEXT: br label [[EXIT]]
|
|
76 ; CHECK: exit:
|
|
77 ; CHECK-NEXT: [[SUM_PHI:%.*]] = phi i32 [ [[SUM_0]], [[A]] ], [ [[SUM_1]], [[B]] ]
|
|
78 ; CHECK-NEXT: ret i32 [[SUM_PHI]]
|
|
79 ;
|
|
80 entry:
|
|
81 br i1 %flag, label %a, label %b
|
|
82
|
|
83 a:
|
|
84 br label %exit
|
|
85
|
|
86 b:
|
|
87 br label %exit
|
|
88
|
|
89 exit:
|
|
90 %p = phi i32 [ 7, %a ], [ 11, %b ]
|
|
91 %sum = call i32 @llvm.regular(i32 %p)
|
|
92 ret i32 %sum
|
|
93 }
|
|
94
|
|
95
|
|
96 attributes #0 = { nounwind readnone convergent speculatable }
|
|
97 attributes #1 = { nounwind readnone noduplicate speculatable }
|
|
98 attributes #2 = { nounwind readnone speculatable }
|