1; RUN: opt -correlated-propagation -S < %s | FileCheck %s
2; Checks that we don't crash on conflicting facts about a value
3; (i.e. unreachable code)
4
5; Test that we can handle conflict edge facts
6define i8 @test(i8 %a) {
7; CHECK-LABEL: @test
8  %cmp1 = icmp eq i8 %a, 5
9  br i1 %cmp1, label %next, label %exit
10next:
11  %cmp2 = icmp eq i8 %a, 3
12; CHECK: br i1 false, label %dead, label %exit
13  br i1 %cmp2, label %dead, label %exit
14dead:
15; CHECK-LABEL: dead:
16; CHECK: ret i8 5
17; NOTE: undef, or 3 would be equal valid
18  ret i8 %a
19exit:
20  ret i8 0
21}
22
23declare void @llvm.assume(i1)
24
25; Test that we can handle conflicting assume vs edge facts
26define i8 @test2(i8 %a) {
27; CHECK-LABEL: @test2
28  %cmp1 = icmp eq i8 %a, 5
29  call void @llvm.assume(i1 %cmp1)
30  %cmp2 = icmp eq i8 %a, 3
31; CHECK: br i1 false, label %dead, label %exit
32  br i1 %cmp2, label %dead, label %exit
33dead:
34  ret i8 %a
35exit:
36  ret i8 0
37}
38
39define i8 @test3(i8 %a) {
40; CHECK-LABEL: @test3
41  %cmp1 = icmp eq i8 %a, 5
42  br i1 %cmp1, label %dead, label %exit
43dead:
44  %cmp2 = icmp eq i8 %a, 3
45; CHECK: call void @llvm.assume(i1 false)
46  call void @llvm.assume(i1 %cmp2)
47  ret i8 %a
48exit:
49  ret i8 0
50}
51