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