xref: /llvm-project/llvm/test/Transforms/GuardWidening/mixed_guards.ll (revision 0b5bb6923f09ebc257ebed4ace1d8b6b113b2bf5)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -guard-widening-widen-branch-guards=true -passes=guard-widening < %s        | FileCheck %s
3; RUN: opt -S -guard-widening-widen-branch-guards=true -passes=guard-widening < %s | FileCheck %s
4
5; Interaction between intrinsic and widenable condition guards.
6
7declare void @llvm.experimental.guard(i1,...)
8
9declare void @llvm.experimental.deoptimize.isVoid(...)
10
11; Function Attrs: inaccessiblememonly nounwind
12declare i1 @llvm.experimental.widenable.condition() #0
13
14; Widen condition of intrinsic guard with a condition from widenable branch.
15define void @test_01(i1 %cond_0, i1 %cond_1) {
16; CHECK-LABEL: @test_01(
17; CHECK-NEXT:  entry:
18; CHECK-NEXT:    [[COND_1_GW_FR:%.*]] = freeze i1 [[COND_1:%.*]]
19; CHECK-NEXT:    [[WIDE_CHK:%.*]] = and i1 [[COND_0:%.*]], [[COND_1_GW_FR]]
20; CHECK-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[WIDE_CHK]]) [ "deopt"() ]
21; CHECK-NEXT:    [[WIDENABLE_COND3:%.*]] = call i1 @llvm.experimental.widenable.condition()
22; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND4:%.*]] = and i1 [[COND_1_GW_FR]], [[WIDENABLE_COND3]]
23; CHECK-NEXT:    br i1 true, label [[GUARDED1:%.*]], label [[DEOPT2:%.*]], !prof [[PROF0:![0-9]+]]
24; CHECK:       deopt2:
25; CHECK-NEXT:    call void (...) @llvm.experimental.deoptimize.isVoid() [ "deopt"() ]
26; CHECK-NEXT:    ret void
27; CHECK:       guarded1:
28; CHECK-NEXT:    ret void
29;
30entry:
31  call void (i1, ...) @llvm.experimental.guard(i1 %cond_0) [ "deopt"() ]
32  %widenable_cond3 = call i1 @llvm.experimental.widenable.condition()
33  %exiplicit_guard_cond4 = and i1 %cond_1, %widenable_cond3
34  br i1 %exiplicit_guard_cond4, label %guarded1, label %deopt2, !prof !0
35
36deopt2:                                           ; preds = %guarded
37  call void (...) @llvm.experimental.deoptimize.isVoid() [ "deopt"() ]
38  ret void
39
40guarded1:                                         ; preds = %guarded
41  ret void
42}
43
44; Widen condition of widenable condition guard with a condition from intrinsic.
45define void @test_02(i1 %cond_0, i1 %cond_1) {
46; CHECK-LABEL: @test_02(
47; CHECK-NEXT:  entry:
48; CHECK-NEXT:    [[COND_1_GW_FR:%.*]] = freeze i1 [[COND_1:%.*]]
49; CHECK-NEXT:    [[WIDE_CHK:%.*]] = and i1 [[COND_0:%.*]], [[COND_1_GW_FR]]
50; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
51; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[WIDE_CHK]], [[WIDENABLE_COND]]
52; CHECK-NEXT:    br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
53; CHECK:       deopt:
54; CHECK-NEXT:    call void (...) @llvm.experimental.deoptimize.isVoid() [ "deopt"() ]
55; CHECK-NEXT:    ret void
56; CHECK:       guarded:
57; CHECK-NEXT:    ret void
58;
59entry:
60  %widenable_cond = call i1 @llvm.experimental.widenable.condition()
61  %exiplicit_guard_cond = and i1 %cond_0, %widenable_cond
62  br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0
63
64deopt:                                            ; preds = %entry
65  call void (...) @llvm.experimental.deoptimize.isVoid() [ "deopt"() ]
66  ret void
67
68guarded:                                          ; preds = %entry
69  call void (i1, ...) @llvm.experimental.guard(i1 %cond_1) [ "deopt"() ]
70  ret void
71}
72
73attributes #0 = { inaccessiblememonly nounwind }
74
75!0 = !{!"branch_weights", i32 1048576, i32 1}
76