76 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=correlated-propagation -S < %s | FileCheck %s3 4; Checks that we don't crash on conflicting facts about a value5; (i.e. unreachable code)6 7; Test that we can handle conflict edge facts8 9define i8 @test(i8 %a) {10; CHECK-LABEL: @test(11; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A:%.*]], 512; 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 517; CHECK: exit:18; CHECK-NEXT: ret i8 019;20 %cmp1 = icmp eq i8 %a, 521 br i1 %cmp1, label %next, label %exit22next:23 %cmp2 = icmp eq i8 %a, 324 br i1 %cmp2, label %dead, label %exit25dead:26; NOTE: undef, or 3 would be equal valid27 ret i8 %a28exit:29 ret i8 030}31 32declare void @llvm.assume(i1)33 34; Test that we can handle conflicting assume vs edge facts35 36define i8 @test2(i8 %a) {37; CHECK-LABEL: @test2(38; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A:%.*]], 539; 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 543; CHECK: exit:44; CHECK-NEXT: ret i8 045;46 %cmp1 = icmp eq i8 %a, 547 call void @llvm.assume(i1 %cmp1)48 %cmp2 = icmp eq i8 %a, 349 br i1 %cmp2, label %dead, label %exit50dead:51 ret i8 %a52exit:53 ret i8 054}55 56define i8 @test3(i8 %a) {57; CHECK-LABEL: @test3(58; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[A:%.*]], 559; 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 563; CHECK: exit:64; CHECK-NEXT: ret i8 065;66 %cmp1 = icmp eq i8 %a, 567 br i1 %cmp1, label %dead, label %exit68dead:69 %cmp2 = icmp eq i8 %a, 370 call void @llvm.assume(i1 %cmp2)71 ret i8 %a72exit:73 ret i8 074}75 76