1; RUN: opt < %s -ipsccp -S | FileCheck %s 2 3define internal i32 @f1(i32 %x) { 4; CHECK-LABEL: define internal i32 @f1( 5; CHECK-NEXT: ret i32 undef 6; 7 %cmp = icmp sgt i32 %x, 300 8 %res = select i1 %cmp, i32 1, i32 2 9 ret i32 %res 10} 11 12; %res is a constant range [0, 2) from a PHI node. 13define i32 @caller1(i1 %cmp) { 14; CHECK-LABEL: define i32 @caller1( 15; CHECK-LABEL: entry: 16; CHECK-NEXT: br i1 %cmp, label %if.true, label %end 17 18; CHECK-LABEL: if.true: 19; CHECK-NEXT: br label %end 20 21; CHECK-LABEL: end: 22; CHECK-NEXT: %res = phi i32 [ 0, %entry ], [ 1, %if.true ] 23; CHECK-NEXT: %call1 = tail call i32 @f1(i32 %res) 24; CHECK-NEXT: ret i32 2 25; 26entry: 27 br i1 %cmp, label %if.true, label %end 28 29if.true: 30 br label %end 31 32end: 33 %res = phi i32 [ 0, %entry], [ 1, %if.true ] 34 %call1 = tail call i32 @f1(i32 %res) 35 ret i32 %call1 36} 37 38define internal i32 @f2(i32 %x, i32 %y, i32 %z, i1 %cmp.1, i1 %cmp.2) { 39; CHECK-LABEL: define internal i32 @f2( 40; CHECK-LABEL: entry: 41; CHECK-NEXT: br i1 %cmp.1, label %if.true.1, label %end 42 43; CHECK-LABEL: if.true.1: 44; CHECK-NEXT: br i1 %cmp.2, label %if.true.2, label %end 45 46; CHECK-LABEL: if.true.2: 47; CHECK-NEXT: br label %end 48 49; CHECK-LABEL: end: 50; CHECK-NEXT: %p = phi i32 [ %x, %entry ], [ %y, %if.true.1 ], [ %z, %if.true.2 ] 51; CHECK-NEXT: %c.1 = icmp sgt i32 %p, 5 52; CHECK-NEXT: %c.2 = icmp eq i32 %p, 0 53; CHECK-NEXT: %c.3 = icmp slt i32 %p, 0 54; CHECK-NEXT: %v.1 = select i1 %c.1, i32 10, i32 100 55; CHECK-NEXT: %v.2 = select i1 %c.2, i32 20, i32 200 56; CHECK-NEXT: %v.3 = select i1 %c.3, i32 30, i32 300 57; CHECK-NEXT: %r.1 = add i32 %v.1, %v.2 58; CHECK-NEXT: %r.2 = add i32 %r.1, %v.3 59; CHECK-NEXT: %r.3 = add i32 %r.2, 400 60; CHECK-NEXT: %r.4 = add i32 %r.3, 50 61; CHECK-NEXT: %r.5 = add i32 %r.4, 60 62; CHECK-NEXT: %r.6 = add i32 %r.4, 700 63; CHECK-NEXT: ret i32 %r.6 64; 65entry: 66 br i1 %cmp.1, label %if.true.1, label %end 67 68if.true.1: 69 br i1 %cmp.2, label %if.true.2, label %end 70 71if.true.2: 72 br label %end 73 74end: 75 %p = phi i32 [ %x, %entry ], [ %y, %if.true.1 ], [ %z, %if.true.2 ] 76 %c.1 = icmp sgt i32 %p, 5 77 %c.2 = icmp eq i32 %p, 0 78 %c.3 = icmp slt i32 %p, 0 79 %c.4 = icmp sgt i32 %p, 10 80 %c.5 = icmp sle i32 %p, 10 81 %c.6 = icmp sgt i32 %p, -11 82 %c.7 = icmp slt i32 %p, -11 83 %v.1 = select i1 %c.1, i32 10, i32 100 84 %v.2 = select i1 %c.2, i32 20, i32 200 85 %v.3 = select i1 %c.3, i32 30, i32 300 86 %v.4 = select i1 %c.4, i32 40, i32 400 87 %v.5 = select i1 %c.5, i32 50, i32 500 88 %v.6 = select i1 %c.6, i32 60, i32 600 89 %v.7 = select i1 %c.7, i32 70, i32 700 90 %r.1 = add i32 %v.1, %v.2 91 %r.2 = add i32 %r.1, %v.3 92 %r.3 = add i32 %r.2, %v.4 93 %r.4 = add i32 %r.3, %v.5 94 %r.5 = add i32 %r.4, %v.6 95 %r.6 = add i32 %r.4, %v.7 96 ret i32 %r.6 97} 98 99define i32 @caller2(i1 %cmp.1, i1 %cmp.2) { 100; CHECK-LABEL: define i32 @caller2(i1 %cmp.1, i1 %cmp.2) { 101; CHECK-LABEL: entry: 102; CHECK-NEXT: br i1 %cmp.1, label %if.true, label %end 103 104; CHECK-LABEL: if.true: ; preds = %entry 105; CHECK-NEXT: br label %end 106 107; CHECK-LABEL: end: ; preds = %if.true, %entry 108; CHECK-NEXT: %p1 = phi i32 [ 0, %entry ], [ 1, %if.true ] 109; CHECK-NEXT: %p2 = phi i32 [ 1, %entry ], [ -10, %if.true ] 110; CHECK-NEXT: %p3 = phi i32 [ 1, %entry ], [ 10, %if.true ] 111; CHECK-NEXT: %call1 = tail call i32 @f2(i32 %p1, i32 %p2, i32 %p3, i1 %cmp.1, i1 %cmp.2) 112; CHECK-NEXT: ret i32 %call1 113; 114 115entry: 116 br i1 %cmp.1, label %if.true, label %end 117 118if.true: 119 br label %end 120 121end: 122 %p1 = phi i32 [ 0, %entry], [ 1, %if.true ] 123 %p2 = phi i32 [ 1, %entry], [ -10, %if.true ] 124 %p3 = phi i32 [ 1, %entry], [ 10, %if.true ] 125 %call1 = tail call i32 @f2(i32 %p1, i32 %p2, i32 %p3, i1 %cmp.1, i1 %cmp.2) 126 ret i32 %call1 127} 128 129define internal i32 @f3(i32 %x, i32 %y, i1 %cmp.1) { 130; CHECK-LABEL: define internal i32 @f3(i32 %x, i32 %y, i1 %cmp.1) { 131; CHECK-LABEL: entry: 132; CHECK-NEXT: br i1 %cmp.1, label %if.true.1, label %end 133 134; CHECK-LABEL: if.true.1: ; preds = %entry 135; CHECK-NEXT: br label %end 136 137; CHECK-LABEL: end: ; preds = %if.true.1, %entry 138; CHECK-NEXT: %p = phi i32 [ %x, %entry ], [ %y, %if.true.1 ] 139; CHECK-NEXT: %c.1 = icmp sgt i32 %p, 5 140; CHECK-NEXT: %c.2 = icmp eq i32 %p, 0 141; CHECK-NEXT: %c.3 = icmp slt i32 %p, 0 142; CHECK-NEXT: %c.4 = icmp sgt i32 %p, 10 143; CHECK-NEXT: %c.5 = icmp sle i32 %p, 10 144; CHECK-NEXT: %c.6 = icmp sgt i32 %p, -11 145; CHECK-NEXT: %c.7 = icmp slt i32 %p, -11 146; CHECK-NEXT: %v.1 = select i1 %c.1, i32 10, i32 100 147; CHECK-NEXT: %v.2 = select i1 %c.2, i32 20, i32 200 148; CHECK-NEXT: %v.3 = select i1 %c.3, i32 30, i32 300 149; CHECK-NEXT: %v.4 = select i1 %c.4, i32 40, i32 400 150; CHECK-NEXT: %v.5 = select i1 %c.5, i32 50, i32 500 151; CHECK-NEXT: %v.6 = select i1 %c.6, i32 60, i32 600 152; CHECK-NEXT: %v.7 = select i1 %c.7, i32 70, i32 700 153; CHECK-NEXT: %r.1 = add i32 %v.1, %v.2 154; CHECK-NEXT: %r.2 = add i32 %r.1, %v.3 155; CHECK-NEXT: %r.3 = add i32 %r.2, %v.4 156; CHECK-NEXT: %r.4 = add i32 %r.3, %v.5 157; CHECK-NEXT: %r.5 = add i32 %r.4, %v.6 158; CHECK-NEXT: %r.6 = add i32 %r.4, %v.7 159; CHECK-NEXT: ret i32 %r.6 160; 161entry: 162 br i1 %cmp.1, label %if.true.1, label %end 163 164if.true.1: 165 br label %end 166 167end: 168 %p = phi i32 [ %x, %entry ], [ %y, %if.true.1 ] 169 %c.1 = icmp sgt i32 %p, 5 170 %c.2 = icmp eq i32 %p, 0 171 %c.3 = icmp slt i32 %p, 0 172 %c.4 = icmp sgt i32 %p, 10 173 %c.5 = icmp sle i32 %p, 10 174 %c.6 = icmp sgt i32 %p, -11 175 %c.7 = icmp slt i32 %p, -11 176 %v.1 = select i1 %c.1, i32 10, i32 100 177 %v.2 = select i1 %c.2, i32 20, i32 200 178 %v.3 = select i1 %c.3, i32 30, i32 300 179 %v.4 = select i1 %c.4, i32 40, i32 400 180 %v.5 = select i1 %c.5, i32 50, i32 500 181 %v.6 = select i1 %c.6, i32 60, i32 600 182 %v.7 = select i1 %c.7, i32 70, i32 700 183 %r.1 = add i32 %v.1, %v.2 184 %r.2 = add i32 %r.1, %v.3 185 %r.3 = add i32 %r.2, %v.4 186 %r.4 = add i32 %r.3, %v.5 187 %r.5 = add i32 %r.4, %v.6 188 %r.6 = add i32 %r.4, %v.7 189 ret i32 %r.6 190} 191 192define i32 @caller3(i32 %y, i1 %cmp.1) { 193; CHECK-LABEL: define i32 @caller3(i32 %y, i1 %cmp.1) { 194; CHECK-LABEL: entry: 195; CHECK-NEXT: br i1 %cmp.1, label %if.true, label %end 196 197; CHECK-LABEL: if.true: 198; CHECK-NEXT: br label %end 199 200; CHECK-LABEL: end: 201; CHECK-NEXT: %p1 = phi i32 [ 0, %entry ], [ 5, %if.true ] 202; CHECK-NEXT: %call1 = tail call i32 @f3(i32 %p1, i32 %y, i1 %cmp.1) 203; CHECK-NEXT: ret i32 %call1 204; 205entry: 206 br i1 %cmp.1, label %if.true, label %end 207 208if.true: 209 br label %end 210 211end: 212 %p1 = phi i32 [ 0, %entry], [ 5, %if.true ] 213 %call1 = tail call i32 @f3(i32 %p1, i32 %y, i1 %cmp.1) 214 ret i32 %call1 215} 216