Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / EarlyCSE / conditional.ll
blob562aad78b2ebf02e790603fd2f274507dd202242
1 ; RUN: opt -passes=early-cse -earlycse-debug-hash -S < %s | FileCheck %s
2 ; RUN: opt -passes='early-cse<memssa>' -S < %s | FileCheck %s
4 ; Can we CSE a known condition to a constant?
5 define i1 @test(ptr %p) {
6 ; CHECK-LABEL: @test
7 entry:
8   %cnd1 = icmp eq ptr %p, null
9   br i1 %cnd1, label %taken, label %untaken
11 taken:
12 ; CHECK-LABEL: taken:
13 ; CHECK-NEXT: ret i1 true
14   %cnd2 = icmp eq ptr %p, null
15   ret i1 %cnd2
17 untaken:
18 ; CHECK-LABEL: untaken:
19 ; CHECK-NEXT: ret i1 false
20   %cnd3 = icmp eq ptr %p, null
21   ret i1 %cnd3
24 ; We can CSE the condition, but we *don't* know it's value after the merge
25 define i1 @test_neg1(ptr %p) {
26 ; CHECK-LABEL: @test_neg1
27 entry:
28   %cnd1 = icmp eq ptr %p, null
29   br i1 %cnd1, label %taken, label %untaken
31 taken:
32   br label %merge
34 untaken:
35   br label %merge
37 merge:
38 ; CHECK-LABEL: merge:
39 ; CHECK-NEXT: ret i1 %cnd1
40   %cnd3 = icmp eq ptr %p, null
41   ret i1 %cnd3
44 ; Check specifically for a case where we have a unique predecessor, but
45 ; not a single predecessor.  We can not know the value of the condition here.
46 define i1 @test_neg2(ptr %p) {
47 ; CHECK-LABEL: @test_neg2
48 entry:
49   %cnd1 = icmp eq ptr %p, null
50   br i1 %cnd1, label %merge, label %merge
52 merge:
53 ; CHECK-LABEL: merge:
54 ; CHECK-NEXT: ret i1 %cnd1
55   %cnd3 = icmp eq ptr %p, null
56   ret i1 %cnd3
59 ; Replace a use rather than CSE
60 define i1 @test2(ptr %p) {
61 ; CHECK-LABEL: @test2
62 entry:
63   %cnd = icmp eq ptr %p, null
64   br i1 %cnd, label %taken, label %untaken
66 taken:
67 ; CHECK-LABEL: taken:
68 ; CHECK-NEXT: ret i1 true
69   ret i1 %cnd
71 untaken:
72 ; CHECK-LABEL: untaken:
73 ; CHECK-NEXT: ret i1 false
74   ret i1 %cnd
77 ; Not legal to replace use given it's not dominated by edge
78 define i1 @test2_neg1(ptr %p) {
79 ; CHECK-LABEL: @test2_neg1
80 entry:
81   %cnd1 = icmp eq ptr %p, null
82   br i1 %cnd1, label %taken, label %untaken
84 taken:
85   br label %merge
87 untaken:
88   br label %merge
90 merge:
91 ; CHECK-LABEL: merge:
92 ; CHECK-NEXT: ret i1 %cnd1
93   ret i1 %cnd1
96 ; Another single predecessor test, but for dominated use
97 define i1 @test2_neg2(ptr %p) {
98 ; CHECK-LABEL: @test2_neg2
99 entry:
100   %cnd1 = icmp eq ptr %p, null
101   br i1 %cnd1, label %merge, label %merge
103 merge:
104 ; CHECK-LABEL: merge:
105 ; CHECK-NEXT: ret i1 %cnd1
106   ret i1 %cnd1