xref: /llvm-project/llvm/test/Transforms/CorrelatedValuePropagation/conflict.ll (revision 8ebb3eac02a926ffa4298c12834c57aefb2e8579)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=correlated-propagation -S < %s | FileCheck %s
3
4; Checks that we don't crash on conflicting facts about a value
5; (i.e. unreachable code)
6
7; Test that we can handle conflict edge facts
8
9define i8 @test(i8 %a) {
10; CHECK-LABEL: @test(
11; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i8 [[A:%.*]], 5
12; CHECK-NEXT:    br i1 [[CMP1]], label [[NEXT:%.*]], label [[EXIT:%.*]]
13; CHECK:       next:
14; CHECK-NEXT:    br i1 false, label [[DEAD:%.*]], label [[EXIT]]
15; CHECK:       dead:
16; CHECK-NEXT:    ret i8 5
17; CHECK:       exit:
18; CHECK-NEXT:    ret i8 0
19;
20  %cmp1 = icmp eq i8 %a, 5
21  br i1 %cmp1, label %next, label %exit
22next:
23  %cmp2 = icmp eq i8 %a, 3
24  br i1 %cmp2, label %dead, label %exit
25dead:
26; NOTE: undef, or 3 would be equal valid
27  ret i8 %a
28exit:
29  ret i8 0
30}
31
32declare void @llvm.assume(i1)
33
34; Test that we can handle conflicting assume vs edge facts
35
36define i8 @test2(i8 %a) {
37; CHECK-LABEL: @test2(
38; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i8 [[A:%.*]], 5
39; CHECK-NEXT:    call void @llvm.assume(i1 [[CMP1]])
40; CHECK-NEXT:    br i1 false, label [[DEAD:%.*]], label [[EXIT:%.*]]
41; CHECK:       dead:
42; CHECK-NEXT:    ret i8 5
43; CHECK:       exit:
44; CHECK-NEXT:    ret i8 0
45;
46  %cmp1 = icmp eq i8 %a, 5
47  call void @llvm.assume(i1 %cmp1)
48  %cmp2 = icmp eq i8 %a, 3
49  br i1 %cmp2, label %dead, label %exit
50dead:
51  ret i8 %a
52exit:
53  ret i8 0
54}
55
56define i8 @test3(i8 %a) {
57; CHECK-LABEL: @test3(
58; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i8 [[A:%.*]], 5
59; CHECK-NEXT:    br i1 [[CMP1]], label [[DEAD:%.*]], label [[EXIT:%.*]]
60; CHECK:       dead:
61; CHECK-NEXT:    call void @llvm.assume(i1 false)
62; CHECK-NEXT:    ret i8 5
63; CHECK:       exit:
64; CHECK-NEXT:    ret i8 0
65;
66  %cmp1 = icmp eq i8 %a, 5
67  br i1 %cmp1, label %dead, label %exit
68dead:
69  %cmp2 = icmp eq i8 %a, 3
70  call void @llvm.assume(i1 %cmp2)
71  ret i8 %a
72exit:
73  ret i8 0
74}
75
76