130 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=ipsccp < %s | FileCheck %s3 4; Test that information about the true/false value of conditions themselves5; is also used, not information implied by comparisions.6 7define i32 @switch(i32 %x) {8; CHECK-LABEL: @switch(9; CHECK-NEXT: switch i32 [[X:%.*]], label [[CASE_DEFAULT:%.*]] [10; CHECK-NEXT: i32 0, label [[CASE_0:%.*]]11; CHECK-NEXT: i32 2, label [[CASE_2:%.*]]12; CHECK-NEXT: ]13; CHECK: case.0:14; CHECK-NEXT: br label [[END:%.*]]15; CHECK: case.2:16; CHECK-NEXT: br label [[END]]17; CHECK: case.default:18; CHECK-NEXT: br label [[END]]19; CHECK: end:20; CHECK-NEXT: ret i32 121;22 switch i32 %x, label %case.default [23 i32 0, label %case.024 i32 2, label %case.225 ]26 27case.0:28 %add = add i32 %x, 129 br label %end30 31case.2:32 %sub = sub i32 %x, 133 br label %end34 35case.default:36 br label %end37 38end:39 %phi = phi i32 [ %add, %case.0 ], [ %sub, %case.2 ], [ 1, %case.default]40 ret i32 %phi41}42 43define i1 @assume(i32 %x) {44; CHECK-LABEL: @assume(45; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[X:%.*]], 046; CHECK-NEXT: call void @llvm.assume(i1 [[CMP]])47; CHECK-NEXT: ret i1 true48;49 %cmp = icmp sge i32 %x, 050 call void @llvm.assume(i1 %cmp)51 ret i1 %cmp52}53 54define i32 @branch(i32 %x) {55; CHECK-LABEL: @branch(56; CHECK-NEXT: [[CMP:%.*]] = icmp sge i32 [[X:%.*]], 057; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN1:%.*]], label [[IF_THEN2:%.*]]58; CHECK: if.then1:59; CHECK-NEXT: br label [[IF2_THEN1:%.*]]60; CHECK: if2.then1:61; CHECK-NEXT: br label [[IF2_END:%.*]]62; CHECK: if2.end:63; CHECK-NEXT: ret i32 064; CHECK: if.then2:65; CHECK-NEXT: br label [[IF3_THEN2:%.*]]66; CHECK: if3.then2:67; CHECK-NEXT: br label [[IF3_END:%.*]]68; CHECK: if3.end:69; CHECK-NEXT: ret i32 170;71 %cmp = icmp sge i32 %x, 072 br i1 %cmp, label %if.then1, label %if.then273 74if.then1:75 br i1 %cmp, label %if2.then1, label %if2.then276 77if2.then1:78 br label %if2.end79 80if2.then2:81 br label %if2.end82 83if2.end:84 %phi = phi i32 [ 0, %if2.then1 ], [ 1, %if2.then2 ]85 ret i32 %phi86 87if.then2:88 br i1 %cmp, label %if3.then1, label %if3.then289 90if3.then1:91 br label %if3.end92 93if3.then2:94 br label %if3.end95 96if3.end:97 %phi2 = phi i32 [ 0, %if3.then1 ], [ 1, %if3.then2 ]98 ret i32 %phi299}100 101define void @pr46814(i32 %a) {102; CHECK-LABEL: @pr46814(103; CHECK-NEXT: [[C1:%.*]] = icmp uge i32 [[A:%.*]], 10104; CHECK-NEXT: [[C2:%.*]] = icmp ult i32 [[A]], 20105; CHECK-NEXT: [[C3:%.*]] = and i1 [[C1]], [[C2]]106; CHECK-NEXT: br i1 [[C3]], label [[IF_1:%.*]], label [[EXIT:%.*]]107; CHECK: if.1:108; CHECK-NEXT: br label [[IF_2:%.*]]109; CHECK: if.2:110; CHECK-NEXT: br i1 true, label [[EXIT]], label [[EXIT]]111; CHECK: exit:112; CHECK-NEXT: ret void113;114 %c1 = icmp uge i32 %a, 10115 %c2 = icmp ult i32 %a, 20116 %c3 = and i1 %c1, %c2117 br i1 %c3, label %if.1, label %exit118 119if.1:120 br i1 %c3, label %if.2, label %exit121 122if.2:123 br i1 %c3, label %exit, label %exit124 125exit:126 ret void127}128 129declare void @llvm.assume(i1)130