[InstCombine] Signed saturation patterns
[llvm-complete.git] / test / Transforms / CodeGenPrepare / widenable-condition.ll
bloba12b87ff11583315a347ef1b4ef687b09bfe130a
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -codegenprepare -S < %s | FileCheck %s
4 ; Check the idiomatic guard pattern to ensure it's lowered correctly.
5 define void @test_guard(i1 %cond_0) {
6 ; CHECK-LABEL: @test_guard(
7 ; CHECK-NEXT:  entry:
8 ; CHECK-NEXT:    br i1 [[COND_0:%.*]], label [[GUARDED:%.*]], label [[DEOPT:%.*]]
9 ; CHECK:       deopt:
10 ; CHECK-NEXT:    call void @foo()
11 ; CHECK-NEXT:    ret void
12 ; CHECK:       guarded:
13 ; CHECK-NEXT:    ret void
15 entry:
16   %widenable_cond = call i1 @llvm.experimental.widenable.condition()
17   %exiplicit_guard_cond = and i1 %cond_0, %widenable_cond
18   br i1 %exiplicit_guard_cond, label %guarded, label %deopt
20 deopt:                                            ; preds = %entry
21   call void @foo()
22   ret void
24 guarded:
25   ret void
28 ;; Test a non-guard fastpath/slowpath case
29 define void @test_triangle(i1 %cond_0) {
30 ; CHECK-LABEL: @test_triangle(
31 ; CHECK-NEXT:  entry:
32 ; CHECK-NEXT:    br i1 [[COND_0:%.*]], label [[FASTPATH:%.*]], label [[SLOWPATH:%.*]]
33 ; CHECK:       fastpath:
34 ; CHECK-NEXT:    call void @bar()
35 ; CHECK-NEXT:    br label [[MERGE:%.*]]
36 ; CHECK:       slowpath:
37 ; CHECK-NEXT:    call void @foo()
38 ; CHECK-NEXT:    br label [[MERGE]]
39 ; CHECK:       merge:
40 ; CHECK-NEXT:    ret void
42 entry:
43   %widenable_cond = call i1 @llvm.experimental.widenable.condition()
44   %exiplicit_guard_cond = and i1 %cond_0, %widenable_cond
45   br i1 %exiplicit_guard_cond, label %fastpath, label %slowpath
47 fastpath:
48   call void @bar()
49   br label %merge
51 slowpath:
52   call void @foo()
53   br label %merge
55 merge:
56   ret void
60 ; Demonstrate that resulting CFG simplifications are made
61 define void @test_cfg_simplify() {
62 ; CHECK-LABEL: @test_cfg_simplify(
63 ; CHECK-NEXT:  entry:
64 ; CHECK-NEXT:    ret void
66 entry:
67   %widenable_cond3 = call i1 @llvm.experimental.widenable.condition()
68   br i1 %widenable_cond3, label %guarded2, label %deopt3
70 deopt3:
71   call void @foo()
72   ret void
74 guarded2:
75   %widenable_cond4 = call i1 @llvm.experimental.widenable.condition()
76   br i1 %widenable_cond4, label %merge1, label %slowpath1
78 slowpath1:
79   call void @foo()
80   br label %merge1
82 merge1:
83   ret void
87 declare void @foo()
88 declare void @bar()
90 ; Function Attrs: inaccessiblememonly nounwind
91 declare i1 @llvm.experimental.widenable.condition() #0
93 attributes #0 = { inaccessiblememonly nounwind }