1; RUN: opt -analyze -scalar-evolution -S -debug-only=scalar-evolution,apint < %s 2>&1 | FileCheck %s 2; REQUIRES: asserts 3 4; Use the following template to get a chrec {L,+,M,+,N}. 5; 6; define signext i32 @func() { 7; entry: 8; br label %loop 9; 10; loop: 11; %ivr = phi i32 [ 0, %entry ], [ %ivr1, %loop ] 12; %inc = phi i32 [ X, %entry ], [ %inc1, %loop ] 13; %acc = phi i32 [ Y, %entry ], [ %acc1, %loop ] 14; %ivr1 = add i32 %ivr, %inc 15; %inc1 = add i32 %inc, Z ; M = inc1 = inc + N = X + N 16; %acc1 = add i32 %acc, %inc ; L = acc1 = X + Y 17; %and = and i32 %acc1, 2^W-1 ; iW 18; %cond = icmp eq i32 %and, 0 19; br i1 %cond, label %exit, label %loop 20; 21; exit: 22; %rv = phi i32 [ %acc1, %loop ] 23; ret i32 %rv 24; } 25; 26; From 27; X + Y = L 28; X + Z = M 29; Z = N 30; get 31; X = M - N 32; Y = N - M + L 33; Z = N 34 35; The connection between the chrec coefficients {L,+,M,+,N} and the quadratic 36; coefficients is that the quadratic equation is N x^2 + (2M-N) x + 2L = 0, 37; where the equation was multiplied by 2 to make the coefficient at x^2 an 38; integer (the actual equation is N/2 x^2 + (M-N/2) x + L = 0). 39 40; Quadratic equation: 2x^2 + 2x + 4 in i4, solution (wrap): 4 41; {14,+,14,+,14} -> X=0, Y=14, Z=14 42; 43; CHECK-LABEL: Printing analysis 'Scalar Evolution Analysis' for function 'test01' 44; CHECK: {{.*}}GetQuadraticEquation{{.*}}: analyzing quadratic addrec: {-2,+,-2,+,-2}<%loop> 45; CHECK: {{.*}}GetQuadraticEquation{{.*}}: addrec coeff bw: 4 46; CHECK: {{.*}}GetQuadraticEquation{{.*}}: equation -2x^2 + -2x + -4, coeff bw: 5, multiplied by 2 47; CHECK: {{.*}}SolveQuadraticAddRecExact{{.*}}: solving for unsigned overflow 48; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving -2x^2 + -2x + -4, rw:5 49; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 2x^2 + 2x + -28, rw:5 50; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 4 51; CHECK: Loop %loop: Unpredictable backedge-taken count 52define signext i32 @test01() { 53entry: 54 br label %loop 55 56loop: 57 %ivr = phi i32 [ 0, %entry ], [ %ivr1, %loop ] 58 %inc = phi i32 [ 0, %entry ], [ %inc1, %loop ] 59 %acc = phi i32 [ 14, %entry ], [ %acc1, %loop ] 60 %ivr1 = add i32 %ivr, %inc 61 %inc1 = add i32 %inc, 14 62 %acc1 = add i32 %acc, %inc 63 %and = and i32 %acc1, 15 64 %cond = icmp eq i32 %and, 0 65 br i1 %cond, label %exit, label %loop 66 67exit: 68 %rv = phi i32 [ %acc1, %loop ] 69 ret i32 %rv 70} 71 72; Quadratic equation: 1x^2 + -73x + -146 in i32, solution (wrap): 75 73; {-72,+,-36,+,1} -> X=-37, Y=-35, Z=1 74; 75; CHECK-LABEL: Printing analysis 'Scalar Evolution Analysis' for function 'test02': 76; CHECK: {{.*}}GetQuadraticEquation{{.*}}: analyzing quadratic addrec: {0,+,-36,+,1}<%loop> 77; CHECK: {{.*}}GetQuadraticEquation{{.*}}: addrec coeff bw: 32 78; CHECK: {{.*}}GetQuadraticEquation{{.*}}: equation 1x^2 + -73x + 0, coeff bw: 33, multiplied by 2 79; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for signed overflow 80; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 1x^2 + -73x + 4294967154, rw:32 81; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 1x^2 + -73x + -142, rw:32 82; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 75 83; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for unsigned overflow 84; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 1x^2 + -73x + 4294967154, rw:33 85; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 1x^2 + -73x + -4294967438, rw:33 86; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 65573 87; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for signed overflow 88; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 1x^2 + -73x + -146, rw:32 89; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 1x^2 + -73x + -146, rw:32 90; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 75 91; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for unsigned overflow 92; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 1x^2 + -73x + -146, rw:33 93; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 1x^2 + -73x + -146, rw:33 94; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 75 95; CHECK: Loop %loop: backedge-taken count is 75 96define signext i32 @test02() { 97entry: 98 br label %loop 99 100loop: 101 %ivr = phi i32 [ 0, %entry ], [ %ivr1, %loop ] 102 %inc = phi i32 [ -37, %entry ], [ %inc1, %loop ] 103 %acc = phi i32 [ -35, %entry ], [ %acc1, %loop ] 104 %ivr1 = add i32 %ivr, %inc 105 %inc1 = add i32 %inc, 1 106 %acc1 = add i32 %acc, %inc 107 %and = and i32 %acc1, -1 108 %cond = icmp sgt i32 %and, 0 109 br i1 %cond, label %exit, label %loop 110 111exit: 112 %rv = phi i32 [ %acc1, %loop ] 113 ret i32 %rv 114} 115 116; Quadratic equation: 2x^2 - 4x + 34 in i4, solution (exact): 1. 117; {17,+,-1,+,2} -> X=-3, Y=20, Z=2 118; 119; CHECK-LABEL: Printing analysis 'Scalar Evolution Analysis' for function 'test03': 120; CHECK: {{.*}}GetQuadraticEquation{{.*}}: analyzing quadratic addrec: {1,+,-1,+,2}<%loop> 121; CHECK: {{.*}}GetQuadraticEquation{{.*}}: addrec coeff bw: 4 122; CHECK: {{.*}}GetQuadraticEquation{{.*}}: equation 2x^2 + -4x + 2, coeff bw: 5, multiplied by 2 123; CHECK: {{.*}}SolveQuadraticAddRecExact{{.*}}: solving for unsigned overflow 124; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 2x^2 + -4x + 2, rw:5 125; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 2x^2 + -4x + 2, rw:5 126; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (root): 1 127; CHECK: Loop %loop: backedge-taken count is 1 128define signext i32 @test03() { 129entry: 130 br label %loop 131 132loop: 133 %ivr = phi i32 [ 0, %entry ], [ %ivr1, %loop ] 134 %inc = phi i32 [ -3, %entry ], [ %inc1, %loop ] 135 %acc = phi i32 [ 20, %entry ], [ %acc1, %loop ] 136 %ivr1 = add i32 %ivr, %inc 137 %inc1 = add i32 %inc, 2 138 %acc1 = add i32 %acc, %inc 139 %and = and i32 %acc1, 15 140 %cond = icmp eq i32 %and, 0 141 br i1 %cond, label %exit, label %loop 142 143exit: 144 %rv = phi i32 [ %acc1, %loop ] 145 ret i32 %rv 146} 147 148; Quadratic equation 4x^2 + 2x + 2 in i16, solution (wrap): 181 149; {1,+,3,+,4} -> X=-1, Y=2, Z=4 (i16) 150; 151; This is an example where the returned solution is the first time an 152; unsigned wrap occurs, whereas the actual exit condition occurs much 153; later. The number of iterations returned by SolveQuadraticEquation 154; is 181, but the loop will iterate 37174 times. 155; 156; Here is a C code that corresponds to this case that calculates the number 157; of iterations: 158; 159; int test04() { 160; int c = 0; 161; int ivr = 0; 162; int inc = -1; 163; int acc = 2; 164; 165; while (acc & 0xffff) { 166; c++; 167; ivr += inc; 168; inc += 4; 169; acc += inc; 170; } 171; 172; return c; 173; } 174; 175 176; CHECK-LABEL: Printing analysis 'Scalar Evolution Analysis' for function 'test04': 177; CHECK: {{.*}}GetQuadraticEquation{{.*}}: analyzing quadratic addrec: {0,+,3,+,4}<%loop> 178; CHECK: {{.*}}GetQuadraticEquation{{.*}}: addrec coeff bw: 16 179; CHECK: {{.*}}GetQuadraticEquation{{.*}}: equation 4x^2 + 2x + 0, coeff bw: 17, multiplied by 2 180; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for signed overflow 181; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 4x^2 + 2x + 2, rw:16 182; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 4x^2 + 2x + -65534, rw:16 183; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 128 184; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for unsigned overflow 185; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 4x^2 + 2x + 2, rw:17 186; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 4x^2 + 2x + -131070, rw:17 187; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 181 188; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for signed overflow 189; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 4x^2 + 2x + 2, rw:16 190; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 4x^2 + 2x + -65534, rw:16 191; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 128 192; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for unsigned overflow 193; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 4x^2 + 2x + 2, rw:17 194; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 4x^2 + 2x + -131070, rw:17 195; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 181 196; CHECK: {{.*}}GetQuadraticEquation{{.*}}: analyzing quadratic addrec: {1,+,3,+,4}<%loop> 197; CHECK: {{.*}}GetQuadraticEquation{{.*}}: addrec coeff bw: 16 198; CHECK: {{.*}}GetQuadraticEquation{{.*}}: equation 4x^2 + 2x + 2, coeff bw: 17, multiplied by 2 199; CHECK: {{.*}}SolveQuadraticAddRecExact{{.*}}: solving for unsigned overflow 200; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 4x^2 + 2x + 2, rw:17 201; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 4x^2 + 2x + -131070, rw:17 202; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 181 203; CHECK: Loop %loop: Unpredictable backedge-taken count. 204define signext i32 @test04() { 205entry: 206 br label %loop 207 208loop: 209 %ivr = phi i32 [ 0, %entry ], [ %ivr1, %loop ] 210 %inc = phi i32 [ -1, %entry ], [ %inc1, %loop ] 211 %acc = phi i32 [ 2, %entry ], [ %acc1, %loop ] 212 %ivr1 = add i32 %ivr, %inc 213 %inc1 = add i32 %inc, 4 214 %acc1 = add i32 %acc, %inc 215 %and = trunc i32 %acc1 to i16 216 %cond = icmp eq i16 %and, 0 217 br i1 %cond, label %exit, label %loop 218 219exit: 220 %rv = phi i32 [ %acc1, %loop ] 221 ret i32 %rv 222} 223 224; A case with signed arithmetic, but unsigned comparison. 225 226; CHECK-LABEL: Printing analysis 'Scalar Evolution Analysis' for function 'test05': 227; CHECK: {{.*}}GetQuadraticEquation{{.*}}: analyzing quadratic addrec: {0,+,-1,+,-1}<%loop> 228; CHECK: {{.*}}GetQuadraticEquation{{.*}}: addrec coeff bw: 32 229; CHECK: {{.*}}GetQuadraticEquation{{.*}}: equation -1x^2 + -1x + 0, coeff bw: 33, multiplied by 2 230; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for signed overflow 231; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving -1x^2 + -1x + 4, rw:32 232; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 1x^2 + 1x + -4, rw:32 233; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 2 234; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for unsigned overflow 235; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving -1x^2 + -1x + 4, rw:33 236; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 1x^2 + 1x + -4, rw:33 237; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 2 238; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for signed overflow 239; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving -1x^2 + -1x + -2, rw:32 240; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 1x^2 + 1x + -4294967294, rw:32 241; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 65536 242; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for unsigned overflow 243; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving -1x^2 + -1x + -2, rw:33 244; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 1x^2 + 1x + -8589934590, rw:33 245; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 92682 246; CHECK: Loop %loop: backedge-taken count is 2 247 248define signext i32 @test05() { 249entry: 250 br label %loop 251 252loop: 253 %ivr = phi i32 [ 0, %entry ], [ %ivr1, %loop ] 254 %inc = phi i32 [ 0, %entry ], [ %inc1, %loop ] 255 %acc = phi i32 [ -1, %entry ], [ %acc1, %loop ] 256 %ivr1 = add i32 %ivr, %inc 257 %inc1 = add i32 %inc, -1 258 %acc1 = add i32 %acc, %inc 259 %and = and i32 %acc1, -1 260 %cond = icmp ule i32 %and, -3 261 br i1 %cond, label %exit, label %loop 262 263exit: 264 %rv = phi i32 [ %acc1, %loop ] 265 ret i32 %rv 266} 267 268; A test that used to crash with one of the earlier versions of the code. 269 270; CHECK-LABEL: Printing analysis 'Scalar Evolution Analysis' for function 'test06': 271; CHECK: {{.*}}GetQuadraticEquation{{.*}}: analyzing quadratic addrec: {0,+,-99999,+,1}<%loop> 272; CHECK: {{.*}}GetQuadraticEquation{{.*}}: addrec coeff bw: 32 273; CHECK: {{.*}}GetQuadraticEquation{{.*}}: equation 1x^2 + -199999x + 0, coeff bw: 33, multiplied by 2 274; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for signed overflow 275; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 1x^2 + -199999x + -4294967294, rw:32 276; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 1x^2 + -199999x + 2, rw:32 277; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 1 278; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for unsigned overflow 279; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 1x^2 + -199999x + -4294967294, rw:33 280; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 1x^2 + -199999x + 4294967298, rw:33 281; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 24469 282; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for signed overflow 283; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 1x^2 + -199999x + -12, rw:32 284; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 1x^2 + -199999x + 4294967284, rw:32 285; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 24469 286; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for unsigned overflow 287; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 1x^2 + -199999x + -12, rw:33 288; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 1x^2 + -199999x + 8589934580, rw:33 289; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solution (wrap): 62450 290; CHECK: Loop %loop: backedge-taken count is 24469 291define signext i32 @test06() { 292entry: 293 br label %loop 294 295loop: 296 %ivr = phi i32 [ 0, %entry ], [ %ivr1, %loop ] 297 %inc = phi i32 [ -100000, %entry ], [ %inc1, %loop ] 298 %acc = phi i32 [ 100000, %entry ], [ %acc1, %loop ] 299 %ivr1 = add i32 %ivr, %inc 300 %inc1 = add i32 %inc, 1 301 %acc1 = add i32 %acc, %inc 302 %and = and i32 %acc1, -1 303 %cond = icmp sgt i32 %and, 5 304 br i1 %cond, label %exit, label %loop 305 306exit: 307 %rv = phi i32 [ %acc1, %loop ] 308 ret i32 %rv 309} 310 311; The equation 312; 532052752x^2 + -450429774x + 71188414 = 0 313; has two exact solutions (up to two decimal digits): 0.21 and 0.64. 314; Since there is no integer between them, there is no integer n that either 315; solves the equation exactly, or changes the sign of it between n and n+1. 316 317; CHECK-LABEL: Printing analysis 'Scalar Evolution Analysis' for function 'test07': 318; CHECK: {{.*}}GetQuadraticEquation{{.*}}: analyzing quadratic addrec: {0,+,40811489,+,532052752}<%loop> 319; CHECK: {{.*}}GetQuadraticEquation{{.*}}: addrec coeff bw: 32 320; CHECK: {{.*}}GetQuadraticEquation{{.*}}: equation 532052752x^2 + -450429774x + 0, coeff bw: 33, multiplied by 2 321; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for signed overflow 322; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 532052752x^2 + -450429774x + 71188414, rw:32 323; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 532052752x^2 + -450429774x + 71188414, rw:32 324; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: no valid solution 325; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for unsigned overflow 326; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 532052752x^2 + -450429774x + 71188414, rw:33 327; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 532052752x^2 + -450429774x + 71188414, rw:33 328; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: no valid solution 329; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for signed overflow 330; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 532052752x^2 + -450429774x + 71188414, rw:32 331; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 532052752x^2 + -450429774x + 71188414, rw:32 332; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: no valid solution 333; CHECK: {{.*}}SolveQuadraticAddRecRange{{.*}}: solving for unsigned overflow 334; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 532052752x^2 + -450429774x + 71188414, rw:33 335; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 532052752x^2 + -450429774x + 71188414, rw:33 336; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: no valid solution 337; CHECK: {{.*}}GetQuadraticEquation{{.*}}: analyzing quadratic addrec: {35594207,+,40811489,+,532052752}<%loop> 338; CHECK: {{.*}}GetQuadraticEquation{{.*}}: addrec coeff bw: 32 339; CHECK: {{.*}}GetQuadraticEquation{{.*}}: equation 532052752x^2 + -450429774x + 71188414, coeff bw: 33, multiplied by 2 340; CHECK: {{.*}}SolveQuadraticAddRecExact{{.*}}: solving for unsigned overflow 341; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: solving 532052752x^2 + -450429774x + 71188414, rw:33 342; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: updated coefficients 532052752x^2 + -450429774x + 71188414, rw:33 343; CHECK: {{.*}}SolveQuadraticEquationWrap{{.*}}: no valid solution 344; CHECK: Loop %loop: Unpredictable backedge-taken count. 345define signext i32 @test07() { 346entry: 347 br label %loop 348 349loop: 350 %ivr = phi i32 [ 0, %entry ], [ %ivr1, %loop ] 351 %inc = phi i32 [ -491241263, %entry ], [ %inc1, %loop ] 352 %acc = phi i32 [ 526835470, %entry ], [ %acc1, %loop ] 353 %ivr1 = add i32 %ivr, %inc 354 %inc1 = add i32 %inc, 532052752 355 %acc1 = add i32 %acc, %inc 356 %and = and i32 %acc1, -1 357 %cond = icmp eq i32 %and, 0 358 br i1 %cond, label %exit, label %loop 359 360exit: 361 %rv = phi i32 [ %acc1, %loop ] 362 ret i32 %rv 363} 364 365