2
2
; RUN: opt -S -make-guards-explicit -basicaa -licm < %s | FileCheck %s
3
3
; RUN: opt -S -aa-pipeline=basic-aa -passes='require<opt-remark-emit>,make-guards-explicit,loop(licm)' < %s | FileCheck %s
4
4
5
- ; Test interaction between explicit guards and LICM: make sure that we do not
6
- ; hoist explicit conditions while we can hoist invariant loads in presence of
7
- ; explicit guards.
8
-
9
5
declare void @llvm.experimental.guard (i1 ,...)
6
+ declare void @maythrow ()
10
7
11
8
; Make sure that we do not hoist widenable_cond out of loop.
12
- define void @do_not_hoist_widenable_cond (i1 %cond , i32 %N , i32 %M ) {
13
- ; CHECK-LABEL: @do_not_hoist_widenable_cond (
9
+ define void @hoist_widenable_cond (i1 %cond , i32 %N , i32 %M ) {
10
+ ; CHECK-LABEL: @hoist_widenable_cond (
14
11
; CHECK-NEXT: entry:
12
+ ; CHECK-NEXT: [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
15
13
; CHECK-NEXT: br label [[LOOP:%.*]]
16
14
; CHECK: loop:
17
15
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[GUARDED:%.*]] ]
18
16
; CHECK-NEXT: [[GUARD_COND:%.*]] = icmp slt i32 [[IV]], [[N:%.*]]
17
+ ; CHECK-NEXT: [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[GUARD_COND]], [[WIDENABLE_COND]]
18
+ ; CHECK-NEXT: br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED]], label [[DEOPT:%.*]], !prof !0
19
+ ; CHECK: deopt:
20
+ ; CHECK-NEXT: call void (...) @llvm.experimental.deoptimize.isVoid() [ "deopt"() ]
21
+ ; CHECK-NEXT: ret void
22
+ ; CHECK: guarded:
23
+ ; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp slt i32 [[IV]], [[M:%.*]]
24
+ ; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
25
+ ; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[EXIT:%.*]]
26
+ ; CHECK: exit:
27
+ ; CHECK-NEXT: ret void
28
+ ;
29
+ entry:
30
+ br label %loop
31
+
32
+ loop:
33
+ %iv = phi i32 [ 0 , %entry ], [ %iv.next , %loop ]
34
+ %guard_cond = icmp slt i32 %iv , %N
35
+ call void (i1 , ...) @llvm.experimental.guard (i1 %guard_cond ) [ "deopt" () ]
36
+ %loop_cond = icmp slt i32 %iv , %M
37
+ %iv.next = add i32 %iv , 1
38
+ br i1 %loop_cond , label %loop , label %exit
39
+
40
+ exit:
41
+ ret void
42
+ }
43
+
44
+ define void @hoist_widenable_cond_speculate (i1 %cond , i32 %N , i32 %M ) {
45
+ ; CHECK-LABEL: @hoist_widenable_cond_speculate(
46
+ ; CHECK-NEXT: entry:
19
47
; CHECK-NEXT: [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
48
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
49
+ ; CHECK: loop:
50
+ ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[GUARDED:%.*]] ]
51
+ ; CHECK-NEXT: [[GUARD_COND:%.*]] = icmp slt i32 [[IV]], [[N:%.*]]
52
+ ; CHECK-NEXT: call void @maythrow()
20
53
; CHECK-NEXT: [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[GUARD_COND]], [[WIDENABLE_COND]]
21
54
; CHECK-NEXT: br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED]], label [[DEOPT:%.*]], !prof !0
22
55
; CHECK: deopt:
35
68
loop:
36
69
%iv = phi i32 [ 0 , %entry ], [ %iv.next , %loop ]
37
70
%guard_cond = icmp slt i32 %iv , %N
71
+ call void @maythrow ()
38
72
call void (i1 , ...) @llvm.experimental.guard (i1 %guard_cond ) [ "deopt" () ]
39
73
%loop_cond = icmp slt i32 %iv , %M
40
74
%iv.next = add i32 %iv , 1
@@ -44,15 +78,16 @@ exit:
44
78
ret void
45
79
}
46
80
81
+
47
82
define void @hoist_invariant_load (i1 %cond , i32* %np , i32 %M ) {
48
83
; CHECK-LABEL: @hoist_invariant_load(
49
84
; CHECK-NEXT: entry:
50
85
; CHECK-NEXT: [[N:%.*]] = load i32, i32* [[NP:%.*]]
86
+ ; CHECK-NEXT: [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
51
87
; CHECK-NEXT: br label [[LOOP:%.*]]
52
88
; CHECK: loop:
53
89
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[GUARDED:%.*]] ]
54
90
; CHECK-NEXT: [[GUARD_COND:%.*]] = icmp slt i32 [[IV]], [[N]]
55
- ; CHECK-NEXT: [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
56
91
; CHECK-NEXT: [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[GUARD_COND]], [[WIDENABLE_COND]]
57
92
; CHECK-NEXT: br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED]], label [[DEOPT:%.*]], !prof !0
58
93
; CHECK: deopt:
0 commit comments