1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes='require<profile-summary>,function(codegenprepare)' -cgp-optimize-phi-types %s -S | FileCheck %s 3 4target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" 5target triple = "aarch64--linux-gnu" 6 7define float @convphi1(ptr %s, ptr %d, i32 %n) { 8; CHECK-LABEL: @convphi1( 9; CHECK-NEXT: entry: 10; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 11; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]] 12; CHECK: then: 13; CHECK-NEXT: [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4 14; CHECK-NEXT: [[LS_BC:%.*]] = bitcast i32 [[LS]] to float 15; CHECK-NEXT: br label [[END:%.*]] 16; CHECK: else: 17; CHECK-NEXT: [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4 18; CHECK-NEXT: [[LD_BC:%.*]] = bitcast i32 [[LD]] to float 19; CHECK-NEXT: br label [[END]] 20; CHECK: end: 21; CHECK-NEXT: [[PHI_TC:%.*]] = phi float [ [[LS_BC]], [[THEN]] ], [ [[LD_BC]], [[ELSE]] ] 22; CHECK-NEXT: ret float [[PHI_TC]] 23; 24entry: 25 %cmp15 = icmp sgt i32 %n, 0 26 br i1 %cmp15, label %then, label %else 27 28then: 29 %ls = load i32, ptr %s, align 4 30 br label %end 31 32else: 33 %ld = load i32, ptr %d, align 4 34 br label %end 35 36end: 37 %phi = phi i32 [ %ls, %then ], [ %ld, %else ] 38 %b = bitcast i32 %phi to float 39 ret float %b 40} 41 42define float @convphi2(ptr %s, ptr %d, i32 %n) { 43; CHECK-LABEL: @convphi2( 44; CHECK-NEXT: entry: 45; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 46; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]] 47; CHECK: then: 48; CHECK-NEXT: [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4 49; CHECK-NEXT: [[LS_BC:%.*]] = bitcast i32 [[LS]] to float 50; CHECK-NEXT: br label [[END]] 51; CHECK: end: 52; CHECK-NEXT: [[PHI_TC:%.*]] = phi float [ [[LS_BC]], [[THEN]] ], [ undef, [[ENTRY:%.*]] ] 53; CHECK-NEXT: ret float [[PHI_TC]] 54; 55entry: 56 %cmp15 = icmp sgt i32 %n, 0 57 br i1 %cmp15, label %then, label %end 58 59then: 60 %ls = load i32, ptr %s, align 4 61 br label %end 62 63end: 64 %phi = phi i32 [ %ls, %then ], [ undef, %entry ] 65 %b = bitcast i32 %phi to float 66 ret float %b 67} 68 69define float @convphi3(ptr %s, ptr %d, i32 %n, float %f) { 70; CHECK-LABEL: @convphi3( 71; CHECK-NEXT: entry: 72; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 73; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]] 74; CHECK: then: 75; CHECK-NEXT: [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4 76; CHECK-NEXT: [[LS_BC:%.*]] = bitcast i32 [[LS]] to float 77; CHECK-NEXT: br label [[END]] 78; CHECK: end: 79; CHECK-NEXT: [[PHI_TC:%.*]] = phi float [ [[LS_BC]], [[THEN]] ], [ [[F:%.*]], [[ENTRY:%.*]] ] 80; CHECK-NEXT: ret float [[PHI_TC]] 81; 82entry: 83 %cmp15 = icmp sgt i32 %n, 0 84 %fb = bitcast float %f to i32 85 br i1 %cmp15, label %then, label %end 86 87then: 88 %ls = load i32, ptr %s, align 4 89 br label %end 90 91end: 92 %phi = phi i32 [ %ls, %then ], [ %fb, %entry ] 93 %b = bitcast i32 %phi to float 94 ret float %b 95} 96 97define void @convphi4(ptr %s, ptr %d, i32 %n, float %f) { 98; CHECK-LABEL: @convphi4( 99; CHECK-NEXT: entry: 100; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 101; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]] 102; CHECK: then: 103; CHECK-NEXT: [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4 104; CHECK-NEXT: [[LS_BC:%.*]] = bitcast i32 [[LS]] to float 105; CHECK-NEXT: br label [[END]] 106; CHECK: end: 107; CHECK-NEXT: [[PHI_TC:%.*]] = phi float [ [[LS_BC]], [[THEN]] ], [ [[F:%.*]], [[ENTRY:%.*]] ] 108; CHECK-NEXT: [[BC:%.*]] = bitcast float [[PHI_TC]] to i32 109; CHECK-NEXT: store i32 [[BC]], ptr [[D:%.*]], align 4 110; CHECK-NEXT: ret void 111; 112entry: 113 %cmp15 = icmp sgt i32 %n, 0 114 %fb = bitcast float %f to i32 115 br i1 %cmp15, label %then, label %end 116 117then: 118 %ls = load i32, ptr %s, align 4 119 br label %end 120 121end: 122 %phi = phi i32 [ %ls, %then ], [ %fb, %entry ] 123 store i32 %phi, ptr %d 124 ret void 125} 126 127define i64 @convphi_d2i(ptr %s, ptr %d, i32 %n) { 128; CHECK-LABEL: @convphi_d2i( 129; CHECK-NEXT: entry: 130; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 131; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]] 132; CHECK: then: 133; CHECK-NEXT: [[LS:%.*]] = load double, ptr [[S:%.*]], align 4 134; CHECK-NEXT: [[LS_BC:%.*]] = bitcast double [[LS]] to i64 135; CHECK-NEXT: br label [[END:%.*]] 136; CHECK: else: 137; CHECK-NEXT: [[LD:%.*]] = load double, ptr [[D:%.*]], align 4 138; CHECK-NEXT: [[LD_BC:%.*]] = bitcast double [[LD]] to i64 139; CHECK-NEXT: br label [[END]] 140; CHECK: end: 141; CHECK-NEXT: [[PHI_TC:%.*]] = phi i64 [ [[LS_BC]], [[THEN]] ], [ [[LD_BC]], [[ELSE]] ] 142; CHECK-NEXT: ret i64 [[PHI_TC]] 143; 144entry: 145 %cmp15 = icmp sgt i32 %n, 0 146 br i1 %cmp15, label %then, label %else 147 148then: 149 %ls = load double, ptr %s, align 4 150 br label %end 151 152else: 153 %ld = load double, ptr %d, align 4 154 br label %end 155 156end: 157 %phi = phi double [ %ls, %then ], [ %ld, %else ] 158 %b = bitcast double %phi to i64 159 ret i64 %b 160} 161 162define i32 @convphi_f2i(ptr %s, ptr %d, i32 %n) { 163; CHECK-LABEL: @convphi_f2i( 164; CHECK-NEXT: entry: 165; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 166; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]] 167; CHECK: then: 168; CHECK-NEXT: [[LS:%.*]] = load float, ptr [[S:%.*]], align 4 169; CHECK-NEXT: [[LS_BC:%.*]] = bitcast float [[LS]] to i32 170; CHECK-NEXT: br label [[END:%.*]] 171; CHECK: else: 172; CHECK-NEXT: [[LD:%.*]] = load float, ptr [[D:%.*]], align 4 173; CHECK-NEXT: [[LD_BC:%.*]] = bitcast float [[LD]] to i32 174; CHECK-NEXT: br label [[END]] 175; CHECK: end: 176; CHECK-NEXT: [[PHI_TC:%.*]] = phi i32 [ [[LS_BC]], [[THEN]] ], [ [[LD_BC]], [[ELSE]] ] 177; CHECK-NEXT: ret i32 [[PHI_TC]] 178; 179entry: 180 %cmp15 = icmp sgt i32 %n, 0 181 br i1 %cmp15, label %then, label %else 182 183then: 184 %ls = load float, ptr %s, align 4 185 br label %end 186 187else: 188 %ld = load float, ptr %d, align 4 189 br label %end 190 191end: 192 %phi = phi float [ %ls, %then ], [ %ld, %else ] 193 %b = bitcast float %phi to i32 194 ret i32 %b 195} 196 197define i16 @convphi_h2i(ptr %s, ptr %d, i32 %n) { 198; CHECK-LABEL: @convphi_h2i( 199; CHECK-NEXT: entry: 200; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 201; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]] 202; CHECK: then: 203; CHECK-NEXT: [[LS:%.*]] = load half, ptr [[S:%.*]], align 4 204; CHECK-NEXT: [[LS_BC:%.*]] = bitcast half [[LS]] to i16 205; CHECK-NEXT: br label [[END:%.*]] 206; CHECK: else: 207; CHECK-NEXT: [[LD:%.*]] = load half, ptr [[D:%.*]], align 4 208; CHECK-NEXT: [[LD_BC:%.*]] = bitcast half [[LD]] to i16 209; CHECK-NEXT: br label [[END]] 210; CHECK: end: 211; CHECK-NEXT: [[PHI_TC:%.*]] = phi i16 [ [[LS_BC]], [[THEN]] ], [ [[LD_BC]], [[ELSE]] ] 212; CHECK-NEXT: ret i16 [[PHI_TC]] 213; 214entry: 215 %cmp15 = icmp sgt i32 %n, 0 216 br i1 %cmp15, label %then, label %else 217 218then: 219 %ls = load half, ptr %s, align 4 220 br label %end 221 222else: 223 %ld = load half, ptr %d, align 4 224 br label %end 225 226end: 227 %phi = phi half [ %ls, %then ], [ %ld, %else ] 228 %b = bitcast half %phi to i16 229 ret i16 %b 230} 231 232define i128 @convphi_ld2i(ptr %s, ptr %d, i32 %n) { 233; CHECK-LABEL: @convphi_ld2i( 234; CHECK-NEXT: entry: 235; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 236; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]] 237; CHECK: then: 238; CHECK-NEXT: [[LS:%.*]] = load fp128, ptr [[S:%.*]], align 4 239; CHECK-NEXT: [[LS_BC:%.*]] = bitcast fp128 [[LS]] to i128 240; CHECK-NEXT: br label [[END:%.*]] 241; CHECK: else: 242; CHECK-NEXT: [[LD:%.*]] = load fp128, ptr [[D:%.*]], align 4 243; CHECK-NEXT: [[LD_BC:%.*]] = bitcast fp128 [[LD]] to i128 244; CHECK-NEXT: br label [[END]] 245; CHECK: end: 246; CHECK-NEXT: [[PHI_TC:%.*]] = phi i128 [ [[LS_BC]], [[THEN]] ], [ [[LD_BC]], [[ELSE]] ] 247; CHECK-NEXT: ret i128 [[PHI_TC]] 248; 249entry: 250 %cmp15 = icmp sgt i32 %n, 0 251 br i1 %cmp15, label %then, label %else 252 253then: 254 %ls = load fp128, ptr %s, align 4 255 br label %end 256 257else: 258 %ld = load fp128, ptr %d, align 4 259 br label %end 260 261end: 262 %phi = phi fp128 [ %ls, %then ], [ %ld, %else ] 263 %b = bitcast fp128 %phi to i128 264 ret i128 %b 265} 266 267define <4 x i32> @convphi_4xf2i(ptr %s, ptr %d, i32 %n) { 268; CHECK-LABEL: @convphi_4xf2i( 269; CHECK-NEXT: entry: 270; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 271; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]] 272; CHECK: then: 273; CHECK-NEXT: [[LS:%.*]] = load <4 x float>, ptr [[S:%.*]], align 4 274; CHECK-NEXT: br label [[END:%.*]] 275; CHECK: else: 276; CHECK-NEXT: [[LD:%.*]] = load <4 x float>, ptr [[D:%.*]], align 4 277; CHECK-NEXT: br label [[END]] 278; CHECK: end: 279; CHECK-NEXT: [[PHI:%.*]] = phi <4 x float> [ [[LS]], [[THEN]] ], [ [[LD]], [[ELSE]] ] 280; CHECK-NEXT: [[B:%.*]] = bitcast <4 x float> [[PHI]] to <4 x i32> 281; CHECK-NEXT: ret <4 x i32> [[B]] 282; 283entry: 284 %cmp15 = icmp sgt i32 %n, 0 285 br i1 %cmp15, label %then, label %else 286 287then: 288 %ls = load <4 x float>, ptr %s, align 4 289 br label %end 290 291else: 292 %ld = load <4 x float>, ptr %d, align 4 293 br label %end 294 295end: 296 %phi = phi <4 x float> [ %ls, %then ], [ %ld, %else ] 297 %b = bitcast <4 x float> %phi to <4 x i32> 298 ret <4 x i32> %b 299} 300 301define float @convphi_loop(ptr %s, ptr %d, i64 %n) { 302; CHECK-LABEL: @convphi_loop( 303; CHECK-NEXT: entry: 304; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i64 [[N:%.*]], 0 305; CHECK-NEXT: [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4 306; CHECK-NEXT: [[LS_BC:%.*]] = bitcast i32 [[LS]] to float 307; CHECK-NEXT: br i1 [[CMP15]], label [[LOOP:%.*]], label [[END:%.*]] 308; CHECK: loop: 309; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ] 310; CHECK-NEXT: [[LPHI_TC:%.*]] = phi float [ [[LS_BC]], [[ENTRY]] ], [ [[LD_BC:%.*]], [[LOOP]] ] 311; CHECK-NEXT: [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4 312; CHECK-NEXT: [[LD_BC]] = bitcast i32 [[LD]] to float 313; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1 314; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]] 315; CHECK-NEXT: br i1 [[EXITCOND]], label [[END]], label [[LOOP]] 316; CHECK: end: 317; CHECK-NEXT: [[PHI_TC:%.*]] = phi float [ undef, [[ENTRY]] ], [ [[LPHI_TC]], [[LOOP]] ] 318; CHECK-NEXT: ret float [[PHI_TC]] 319; 320entry: 321 %cmp15 = icmp sgt i64 %n, 0 322 %ls = load i32, ptr %s, align 4 323 br i1 %cmp15, label %loop, label %end 324 325loop: 326 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 327 %lphi = phi i32 [ %ls, %entry ], [ %ld, %loop ] 328 %ld = load i32, ptr %d, align 4 329 %iv.next = add nuw nsw i64 %iv, 1 330 %exitcond = icmp eq i64 %iv.next, %n 331 br i1 %exitcond, label %end, label %loop 332 333end: 334 %phi = phi i32 [ undef, %entry ], [ %lphi, %loop ] 335 %b = bitcast i32 %phi to float 336 ret float %b 337} 338 339define float @convphi_loopdelayed(ptr %s, ptr %d, i64 %n) { 340; CHECK-LABEL: @convphi_loopdelayed( 341; CHECK-NEXT: entry: 342; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i64 [[N:%.*]], 0 343; CHECK-NEXT: [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4 344; CHECK-NEXT: [[LS_BC:%.*]] = bitcast i32 [[LS]] to float 345; CHECK-NEXT: br i1 [[CMP15]], label [[LOOP:%.*]], label [[END:%.*]] 346; CHECK: loop: 347; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ] 348; CHECK-NEXT: [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4 349; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1 350; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]] 351; CHECK-NEXT: br i1 [[EXITCOND]], label [[END]], label [[LOOP]] 352; CHECK: end: 353; CHECK-NEXT: [[PHI_TC:%.*]] = phi float [ undef, [[ENTRY]] ], [ [[LS_BC]], [[LOOP]] ] 354; CHECK-NEXT: ret float [[PHI_TC]] 355; 356entry: 357 %cmp15 = icmp sgt i64 %n, 0 358 %ls = load i32, ptr %s, align 4 359 br i1 %cmp15, label %loop, label %end 360 361loop: 362 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 363 %lphi = phi i32 [ %ls, %entry ], [ %lphi, %loop ] 364 %ld = load i32, ptr %d, align 4 365 %iv.next = add nuw nsw i64 %iv, 1 366 %exitcond = icmp eq i64 %iv.next, %n 367 br i1 %exitcond, label %end, label %loop 368 369end: 370 %phi = phi i32 [ undef, %entry ], [ %lphi, %loop ] 371 %b = bitcast i32 %phi to float 372 ret float %b 373} 374 375define float @convphi_loopdelayed2(ptr %s, ptr %d, i64 %n) { 376; CHECK-LABEL: @convphi_loopdelayed2( 377; CHECK-NEXT: entry: 378; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i64 [[N:%.*]], 0 379; CHECK-NEXT: [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4 380; CHECK-NEXT: [[LS_BC:%.*]] = bitcast i32 [[LS]] to float 381; CHECK-NEXT: br i1 [[CMP15]], label [[LOOP:%.*]], label [[END:%.*]] 382; CHECK: loop: 383; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ] 384; CHECK-NEXT: [[LPHI_TC:%.*]] = phi float [ [[LS_BC]], [[ENTRY]] ], [ [[LD_BC:%.*]], [[LOOP]] ] 385; CHECK-NEXT: [[LPHI2_TC:%.*]] = phi float [ undef, [[ENTRY]] ], [ [[LPHI_TC]], [[LOOP]] ] 386; CHECK-NEXT: [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4 387; CHECK-NEXT: [[LD_BC]] = bitcast i32 [[LD]] to float 388; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1 389; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]] 390; CHECK-NEXT: br i1 [[EXITCOND]], label [[END]], label [[LOOP]] 391; CHECK: end: 392; CHECK-NEXT: [[PHI_TC:%.*]] = phi float [ undef, [[ENTRY]] ], [ [[LPHI2_TC]], [[LOOP]] ] 393; CHECK-NEXT: ret float [[PHI_TC]] 394; 395entry: 396 %cmp15 = icmp sgt i64 %n, 0 397 %ls = load i32, ptr %s, align 4 398 br i1 %cmp15, label %loop, label %end 399 400loop: 401 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 402 %lphi = phi i32 [ %ls, %entry ], [ %ld, %loop ] 403 %lphi2 = phi i32 [ undef, %entry ], [ %lphi, %loop ] 404 %ld = load i32, ptr %d, align 4 405 %iv.next = add nuw nsw i64 %iv, 1 406 %exitcond = icmp eq i64 %iv.next, %n 407 br i1 %exitcond, label %end, label %loop 408 409end: 410 %phi = phi i32 [ undef, %entry ], [ %lphi2, %loop ] 411 %b = bitcast i32 %phi to float 412 ret float %b 413} 414 415define float @convphi_loopmore(ptr %s, ptr %d, i64 %n) { 416; CHECK-LABEL: @convphi_loopmore( 417; CHECK-NEXT: entry: 418; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[N:%.*]], 1 419; CHECK-NEXT: [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4 420; CHECK-NEXT: [[LS_BC:%.*]] = bitcast i32 [[LS]] to float 421; CHECK-NEXT: br i1 [[CMP]], label [[THEN:%.*]], label [[IFEND:%.*]] 422; CHECK: then: 423; CHECK-NEXT: [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4 424; CHECK-NEXT: [[LD_BC:%.*]] = bitcast i32 [[LD]] to float 425; CHECK-NEXT: br label [[IFEND]] 426; CHECK: ifend: 427; CHECK-NEXT: [[PHI1_TC:%.*]] = phi float [ [[LD_BC]], [[THEN]] ], [ [[LS_BC]], [[ENTRY:%.*]] ] 428; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i64 [[N]], 0 429; CHECK-NEXT: br i1 [[CMP15]], label [[LOOP:%.*]], label [[END:%.*]] 430; CHECK: loop: 431; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, [[IFEND]] ], [ [[IV_NEXT:%.*]], [[LOOPEND:%.*]] ] 432; CHECK-NEXT: [[PHI2_TC:%.*]] = phi float [ [[PHI1_TC]], [[IFEND]] ], [ [[PHI3_TC:%.*]], [[LOOPEND]] ] 433; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i64 [[N]], 1 434; CHECK-NEXT: br i1 [[TMP0]], label [[LOOPTHEN:%.*]], label [[LOOPEND]] 435; CHECK: loopthen: 436; CHECK-NEXT: [[LL:%.*]] = load i32, ptr [[D]], align 4 437; CHECK-NEXT: [[LL_BC:%.*]] = bitcast i32 [[LL]] to float 438; CHECK-NEXT: br label [[LOOPEND]] 439; CHECK: loopend: 440; CHECK-NEXT: [[PHI3_TC]] = phi float [ [[LL_BC]], [[LOOPTHEN]] ], [ [[PHI2_TC]], [[LOOP]] ] 441; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1 442; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]] 443; CHECK-NEXT: br i1 [[EXITCOND]], label [[END]], label [[LOOP]] 444; CHECK: end: 445; CHECK-NEXT: [[PHI_TC:%.*]] = phi float [ [[PHI1_TC]], [[IFEND]] ], [ [[PHI3_TC]], [[LOOPEND]] ] 446; CHECK-NEXT: ret float [[PHI_TC]] 447; 448entry: 449 %cmp = icmp eq i64 %n, 1 450 %ls = load i32, ptr %s, align 4 451 br i1 %cmp, label %then, label %ifend 452 453then: 454 %ld = load i32, ptr %d, align 4 455 br label %ifend 456 457ifend: 458 %phi1 = phi i32 [ %ld, %then ], [ %ls, %entry ] 459 %cmp15 = icmp sgt i64 %n, 0 460 br i1 %cmp15, label %loop, label %end 461 462loop: 463 %iv = phi i64 [ 0, %ifend ], [ %iv.next, %loopend ] 464 %phi2 = phi i32 [ %phi1, %ifend ], [ %phi3, %loopend ] 465 br i1 %cmp, label %loopthen, label %loopend 466 467loopthen: 468 %ll = load i32, ptr %d, align 4 469 br label %loopend 470 471loopend: 472 %phi3 = phi i32 [ %ll, %loopthen ], [ %phi2, %loop ] 473 %iv.next = add nuw nsw i64 %iv, 1 474 %exitcond = icmp eq i64 %iv.next, %n 475 br i1 %exitcond, label %end, label %loop 476 477end: 478 %phi = phi i32 [ %phi1, %ifend ], [ %phi3, %loopend ] 479 %b = bitcast i32 %phi to float 480 ret float %b 481} 482 483define void @convphi_stop(ptr %s, ptr %d, ptr %e, i32 %n) { 484; CHECK-LABEL: @convphi_stop( 485; CHECK-NEXT: entry: 486; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 487; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]] 488; CHECK: then: 489; CHECK-NEXT: [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4 490; CHECK-NEXT: br label [[END:%.*]] 491; CHECK: else: 492; CHECK-NEXT: [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4 493; CHECK-NEXT: br label [[END]] 494; CHECK: end: 495; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[LS]], [[THEN]] ], [ [[LD]], [[ELSE]] ] 496; CHECK-NEXT: [[B:%.*]] = bitcast i32 [[PHI]] to float 497; CHECK-NEXT: store float [[B]], ptr [[E:%.*]], align 4 498; CHECK-NEXT: ret void 499; 500entry: 501 %cmp15 = icmp sgt i32 %n, 0 502 br i1 %cmp15, label %then, label %else 503 504then: 505 %ls = load i32, ptr %s, align 4 506 br label %end 507 508else: 509 %ld = load i32, ptr %d, align 4 510 br label %end 511 512end: 513 %phi = phi i32 [ %ls, %then ], [ %ld, %else ] 514 %b = bitcast i32 %phi to float 515 store float %b, ptr %e, align 4 516 ret void 517} 518 519define void @convphi_stop2(ptr %s, ptr %d, ptr %e, i32 %n) { 520; CHECK-LABEL: @convphi_stop2( 521; CHECK-NEXT: entry: 522; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 523; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]] 524; CHECK: then: 525; CHECK-NEXT: [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4 526; CHECK-NEXT: [[LSB:%.*]] = bitcast i32 [[LS]] to float 527; CHECK-NEXT: br label [[END:%.*]] 528; CHECK: else: 529; CHECK-NEXT: [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4 530; CHECK-NEXT: [[LDB:%.*]] = bitcast i32 [[LD]] to float 531; CHECK-NEXT: br label [[END]] 532; CHECK: end: 533; CHECK-NEXT: [[PHI:%.*]] = phi float [ [[LSB]], [[THEN]] ], [ [[LDB]], [[ELSE]] ] 534; CHECK-NEXT: store float [[PHI]], ptr [[E:%.*]], align 4 535; CHECK-NEXT: ret void 536; 537entry: 538 %cmp15 = icmp sgt i32 %n, 0 539 br i1 %cmp15, label %then, label %else 540 541then: 542 %ls = load i32, ptr %s, align 4 543 %lsb = bitcast i32 %ls to float 544 br label %end 545 546else: 547 %ld = load i32, ptr %d, align 4 548 %ldb = bitcast i32 %ld to float 549 br label %end 550 551end: 552 %phi = phi float [ %lsb, %then ], [ %ldb, %else ] 553 store float %phi, ptr %e, align 4 554 ret void 555} 556 557define float @convphi_stop3(ptr %s, ptr %d, ptr %e, i32 %n) { 558; CHECK-LABEL: @convphi_stop3( 559; CHECK-NEXT: entry: 560; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 561; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]] 562; CHECK: then: 563; CHECK-NEXT: [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4 564; CHECK-NEXT: [[LS_BC:%.*]] = bitcast i32 [[LS]] to float 565; CHECK-NEXT: br label [[END:%.*]] 566; CHECK: else: 567; CHECK-NEXT: [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4 568; CHECK-NEXT: [[LD_BC:%.*]] = bitcast i32 [[LD]] to float 569; CHECK-NEXT: br label [[END]] 570; CHECK: end: 571; CHECK-NEXT: [[PHI_TC:%.*]] = phi float [ [[LS_BC]], [[THEN]] ], [ [[LD_BC]], [[ELSE]] ] 572; CHECK-NEXT: store float [[PHI_TC]], ptr [[E:%.*]], align 4 573; CHECK-NEXT: ret float [[PHI_TC]] 574; 575entry: 576 %cmp15 = icmp sgt i32 %n, 0 577 br i1 %cmp15, label %then, label %else 578 579then: 580 %ls = load i32, ptr %s, align 4 581 br label %end 582 583else: 584 %ld = load i32, ptr %d, align 4 585 br label %end 586 587end: 588 %phi = phi i32 [ %ls, %then ], [ %ld, %else ] 589 %b = bitcast i32 %phi to float 590 store float %b, ptr %e, align 4 591 ret float %b 592} 593 594define void @convphi_stop4(ptr %s, ptr %d, ptr %e, i32 %n) { 595; CHECK-LABEL: @convphi_stop4( 596; CHECK-NEXT: entry: 597; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 598; CHECK-NEXT: [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4 599; CHECK-NEXT: [[LD_BC:%.*]] = bitcast i32 [[LD]] to float 600; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]] 601; CHECK: then: 602; CHECK-NEXT: [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4 603; CHECK-NEXT: [[LS_BC:%.*]] = bitcast i32 [[LS]] to float 604; CHECK-NEXT: br label [[END]] 605; CHECK: end: 606; CHECK-NEXT: [[PHI_TC:%.*]] = phi float [ [[LS_BC]], [[THEN]] ], [ [[LD_BC]], [[ENTRY:%.*]] ] 607; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt i32 [[N]], 0 608; CHECK-NEXT: [[BC:%.*]] = bitcast float [[PHI_TC]] to i32 609; CHECK-NEXT: store i32 [[BC]], ptr [[S]], align 4 610; CHECK-NEXT: br i1 [[TMP0]], label [[THEN2:%.*]], label [[END2:%.*]] 611; CHECK: then2: 612; CHECK-NEXT: [[LF:%.*]] = load float, ptr [[E:%.*]], align 4 613; CHECK-NEXT: br label [[END2]] 614; CHECK: end2: 615; CHECK-NEXT: [[PHI2:%.*]] = phi float [ [[PHI_TC]], [[END]] ], [ [[LF]], [[THEN2]] ] 616; CHECK-NEXT: store float [[PHI2]], ptr [[E]], align 4 617; CHECK-NEXT: ret void 618; 619entry: 620 %cmp15 = icmp sgt i32 %n, 0 621 %ld = load i32, ptr %d, align 4 622 br i1 %cmp15, label %then, label %end 623 624then: 625 %ls = load i32, ptr %s, align 4 626 br label %end 627 628end: 629 %phi = phi i32 [ %ls, %then ], [ %ld, %entry ] 630 %phib = bitcast i32 %phi to float 631 store i32 %phi, ptr %s, align 4 632 br i1 %cmp15, label %then2, label %end2 633 634then2: 635 %lf = load float, ptr %e, align 4 636 br label %end2 637 638end2: 639 %phi2 = phi float [ %phib, %end ], [ %lf, %then2 ] 640 store float %phi2, ptr %e, align 4 641 ret void 642} 643 644define float @multiuse(ptr %s, ptr %d, i32 %n) { 645; CHECK-LABEL: @multiuse( 646; CHECK-NEXT: entry: 647; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 648; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]] 649; CHECK: then: 650; CHECK-NEXT: [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4 651; CHECK-NEXT: [[A:%.*]] = add i32 [[LS]], 2 652; CHECK-NEXT: store i32 [[A]], ptr [[D:%.*]], align 4 653; CHECK-NEXT: br label [[END:%.*]] 654; CHECK: else: 655; CHECK-NEXT: [[LD:%.*]] = load i32, ptr [[D]], align 4 656; CHECK-NEXT: br label [[END]] 657; CHECK: end: 658; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[LS]], [[THEN]] ], [ [[LD]], [[ELSE]] ] 659; CHECK-NEXT: [[B:%.*]] = bitcast i32 [[PHI]] to float 660; CHECK-NEXT: ret float [[B]] 661; 662entry: 663 %cmp15 = icmp sgt i32 %n, 0 664 br i1 %cmp15, label %then, label %else 665 666then: 667 %ls = load i32, ptr %s, align 4 668 %a = add i32 %ls, 2 669 store i32 %a, ptr %d, align 4 670 br label %end 671 672else: 673 %ld = load i32, ptr %d, align 4 674 br label %end 675 676end: 677 %phi = phi i32 [ %ls, %then ], [ %ld, %else ] 678 %b = bitcast i32 %phi to float 679 ret float %b 680} 681 682define float @convphi_volatile(ptr %s, ptr %d, i32 %n) { 683; CHECK-LABEL: @convphi_volatile( 684; CHECK-NEXT: entry: 685; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 686; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]] 687; CHECK: then: 688; CHECK-NEXT: [[LS:%.*]] = load volatile i32, ptr [[S:%.*]], align 4 689; CHECK-NEXT: br label [[END:%.*]] 690; CHECK: else: 691; CHECK-NEXT: [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4 692; CHECK-NEXT: br label [[END]] 693; CHECK: end: 694; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[LS]], [[THEN]] ], [ [[LD]], [[ELSE]] ] 695; CHECK-NEXT: [[B:%.*]] = bitcast i32 [[PHI]] to float 696; CHECK-NEXT: ret float [[B]] 697; 698; DEBUG-LABEL: @convphi_volatile( 699; DEBUG-NEXT: entry: 700; DEBUG-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0, !dbg !358 701; DEBUG-NEXT: call void @llvm.dbg.value(metadata i1 [[CMP15]], metadata !353, metadata !DIExpression()), !dbg !358 702; DEBUG-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]], !dbg !359 703; DEBUG: then: 704; DEBUG-NEXT: [[LS:%.*]] = load volatile i32, ptr [[S:%.*]], align 4, !dbg !360 705; DEBUG-NEXT: call void @llvm.dbg.value(metadata i32 [[LS]], metadata !354, metadata !DIExpression()), !dbg !360 706; DEBUG-NEXT: br label [[END:%.*]], !dbg !361 707; DEBUG: else: 708; DEBUG-NEXT: [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4, !dbg !362 709; DEBUG-NEXT: call void @llvm.dbg.value(metadata i32 [[LD]], metadata !355, metadata !DIExpression()), !dbg !362 710; DEBUG-NEXT: br label [[END]], !dbg !363 711; DEBUG: end: 712; DEBUG-NEXT: [[PHI:%.*]] = phi i32 [ [[LS]], [[THEN]] ], [ [[LD]], [[ELSE]] ], !dbg !364 713; DEBUG-NEXT: call void @llvm.dbg.value(metadata i32 [[PHI]], metadata !356, metadata !DIExpression()), !dbg !364 714; DEBUG-NEXT: [[B:%.*]] = bitcast i32 [[PHI]] to float, !dbg !365 715; DEBUG-NEXT: call void @llvm.dbg.value(metadata float [[B]], metadata !357, metadata !DIExpression()), !dbg !365 716; DEBUG-NEXT: ret float [[B]], !dbg !366 717entry: 718 %cmp15 = icmp sgt i32 %n, 0 719 br i1 %cmp15, label %then, label %else 720 721then: 722 %ls = load volatile i32, ptr %s, align 4 723 br label %end 724 725else: 726 %ld = load i32, ptr %d, align 4 727 br label %end 728 729end: 730 %phi = phi i32 [ %ls, %then ], [ %ld, %else ] 731 %b = bitcast i32 %phi to float 732 ret float %b 733} 734 735define void @convphi_volatile2(ptr %s, ptr %d, i32 %n, float %f) { 736; CHECK-LABEL: @convphi_volatile2( 737; CHECK-NEXT: entry: 738; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 739; CHECK-NEXT: [[FB:%.*]] = bitcast float [[F:%.*]] to i32 740; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]] 741; CHECK: then: 742; CHECK-NEXT: [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4 743; CHECK-NEXT: br label [[END]] 744; CHECK: end: 745; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[LS]], [[THEN]] ], [ [[FB]], [[ENTRY:%.*]] ] 746; CHECK-NEXT: store volatile i32 [[PHI]], ptr [[D:%.*]], align 4 747; CHECK-NEXT: ret void 748; 749; DEBUG-LABEL: @convphi_volatile2( 750; DEBUG-NEXT: entry: 751; DEBUG-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0, !dbg !373 752; DEBUG-NEXT: call void @llvm.dbg.value(metadata i1 [[CMP15]], metadata !369, metadata !DIExpression()), !dbg !373 753; DEBUG-NEXT: [[FB:%.*]] = bitcast float [[F:%.*]] to i32, !dbg !374 754; DEBUG-NEXT: call void @llvm.dbg.value(metadata i32 [[FB]], metadata !370, metadata !DIExpression()), !dbg !374 755; DEBUG-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]], !dbg !375 756; DEBUG: then: 757; DEBUG-NEXT: [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4, !dbg !376 758; DEBUG-NEXT: call void @llvm.dbg.value(metadata i32 [[LS]], metadata !371, metadata !DIExpression()), !dbg !376 759; DEBUG-NEXT: br label [[END]], !dbg !377 760; DEBUG: end: 761; DEBUG-NEXT: [[PHI:%.*]] = phi i32 [ [[LS]], [[THEN]] ], [ [[FB]], [[ENTRY:%.*]] ], !dbg !378 762; DEBUG-NEXT: call void @llvm.dbg.value(metadata i32 [[PHI]], metadata !372, metadata !DIExpression()), !dbg !378 763; DEBUG-NEXT: store volatile i32 [[PHI]], ptr [[D:%.*]], align 4, !dbg !379 764; DEBUG-NEXT: ret void, !dbg !380 765entry: 766 %cmp15 = icmp sgt i32 %n, 0 767 %fb = bitcast float %f to i32 768 br i1 %cmp15, label %then, label %end 769 770then: 771 %ls = load i32, ptr %s, align 4 772 br label %end 773 774end: 775 %phi = phi i32 [ %ls, %then ], [ %fb, %entry ] 776 store volatile i32 %phi, ptr %d 777 ret void 778} 779 780define float @convphi_atomic(ptr %s, ptr %d, i32 %n) { 781; CHECK-LABEL: @convphi_atomic( 782; CHECK-NEXT: entry: 783; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 784; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]] 785; CHECK: then: 786; CHECK-NEXT: [[LS:%.*]] = load atomic i32, ptr [[S:%.*]] acquire, align 4 787; CHECK-NEXT: br label [[END:%.*]] 788; CHECK: else: 789; CHECK-NEXT: [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4 790; CHECK-NEXT: br label [[END]] 791; CHECK: end: 792; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[LS]], [[THEN]] ], [ [[LD]], [[ELSE]] ] 793; CHECK-NEXT: [[B:%.*]] = bitcast i32 [[PHI]] to float 794; CHECK-NEXT: ret float [[B]] 795; 796; DEBUG-LABEL: @convphi_atomic( 797; DEBUG-NEXT: entry: 798; DEBUG-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0, !dbg !388 799; DEBUG-NEXT: call void @llvm.dbg.value(metadata i1 [[CMP15]], metadata !383, metadata !DIExpression()), !dbg !388 800; DEBUG-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[ELSE:%.*]], !dbg !389 801; DEBUG: then: 802; DEBUG-NEXT: [[LS:%.*]] = load atomic i32, ptr [[S:%.*]] acquire, align 4, !dbg !390 803; DEBUG-NEXT: call void @llvm.dbg.value(metadata i32 [[LS]], metadata !384, metadata !DIExpression()), !dbg !390 804; DEBUG-NEXT: br label [[END:%.*]], !dbg !391 805; DEBUG: else: 806; DEBUG-NEXT: [[LD:%.*]] = load i32, ptr [[D:%.*]], align 4, !dbg !392 807; DEBUG-NEXT: call void @llvm.dbg.value(metadata i32 [[LD]], metadata !385, metadata !DIExpression()), !dbg !392 808; DEBUG-NEXT: br label [[END]], !dbg !393 809; DEBUG: end: 810; DEBUG-NEXT: [[PHI:%.*]] = phi i32 [ [[LS]], [[THEN]] ], [ [[LD]], [[ELSE]] ], !dbg !394 811; DEBUG-NEXT: call void @llvm.dbg.value(metadata i32 [[PHI]], metadata !386, metadata !DIExpression()), !dbg !394 812; DEBUG-NEXT: [[B:%.*]] = bitcast i32 [[PHI]] to float, !dbg !395 813; DEBUG-NEXT: call void @llvm.dbg.value(metadata float [[B]], metadata !387, metadata !DIExpression()), !dbg !395 814; DEBUG-NEXT: ret float [[B]], !dbg !396 815entry: 816 %cmp15 = icmp sgt i32 %n, 0 817 br i1 %cmp15, label %then, label %else 818 819then: 820 %ls = load atomic i32, ptr %s acquire, align 4 821 br label %end 822 823else: 824 %ld = load i32, ptr %d, align 4 825 br label %end 826 827end: 828 %phi = phi i32 [ %ls, %then ], [ %ld, %else ] 829 %b = bitcast i32 %phi to float 830 ret float %b 831} 832 833define void @convphi_atomic2(ptr %s, ptr %d, i32 %n, float %f) { 834; CHECK-LABEL: @convphi_atomic2( 835; CHECK-NEXT: entry: 836; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 837; CHECK-NEXT: [[FB:%.*]] = bitcast float [[F:%.*]] to i32 838; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]] 839; CHECK: then: 840; CHECK-NEXT: [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4 841; CHECK-NEXT: br label [[END]] 842; CHECK: end: 843; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ [[LS]], [[THEN]] ], [ [[FB]], [[ENTRY:%.*]] ] 844; CHECK-NEXT: store atomic i32 [[PHI]], ptr [[D:%.*]] release, align 4 845; CHECK-NEXT: ret void 846; 847; DEBUG-LABEL: @convphi_atomic2( 848; DEBUG-NEXT: entry: 849; DEBUG-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0, !dbg !403 850; DEBUG-NEXT: call void @llvm.dbg.value(metadata i1 [[CMP15]], metadata !399, metadata !DIExpression()), !dbg !403 851; DEBUG-NEXT: [[FB:%.*]] = bitcast float [[F:%.*]] to i32, !dbg !404 852; DEBUG-NEXT: call void @llvm.dbg.value(metadata i32 [[FB]], metadata !400, metadata !DIExpression()), !dbg !404 853; DEBUG-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]], !dbg !405 854; DEBUG: then: 855; DEBUG-NEXT: [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4, !dbg !406 856; DEBUG-NEXT: call void @llvm.dbg.value(metadata i32 [[LS]], metadata !401, metadata !DIExpression()), !dbg !406 857; DEBUG-NEXT: br label [[END]], !dbg !407 858; DEBUG: end: 859; DEBUG-NEXT: [[PHI:%.*]] = phi i32 [ [[LS]], [[THEN]] ], [ [[FB]], [[ENTRY:%.*]] ], !dbg !408 860; DEBUG-NEXT: call void @llvm.dbg.value(metadata i32 [[PHI]], metadata !402, metadata !DIExpression()), !dbg !408 861; DEBUG-NEXT: store atomic i32 [[PHI]], ptr [[D:%.*]] release, align 4, !dbg !409 862; DEBUG-NEXT: ret void, !dbg !410 863entry: 864 %cmp15 = icmp sgt i32 %n, 0 865 %fb = bitcast float %f to i32 866 br i1 %cmp15, label %then, label %end 867 868then: 869 %ls = load i32, ptr %s, align 4 870 br label %end 871 872end: 873 %phi = phi i32 [ %ls, %then ], [ %fb, %entry ] 874 store atomic i32 %phi, ptr %d release, align 4 875 ret void 876} 877 878define float @convphi2_zero(ptr %s, ptr %d, i32 %n) { 879; CHECK-LABEL: @convphi2_zero( 880; CHECK-NEXT: entry: 881; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 882; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]] 883; CHECK: then: 884; CHECK-NEXT: [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4 885; CHECK-NEXT: [[LS_BC:%.*]] = bitcast i32 [[LS]] to float 886; CHECK-NEXT: br label [[END]] 887; CHECK: end: 888; CHECK-NEXT: [[PHI_TC:%.*]] = phi float [ [[LS_BC]], [[THEN]] ], [ 0.000000e+00, [[ENTRY:%.*]] ] 889; CHECK-NEXT: ret float [[PHI_TC]] 890; 891entry: 892 %cmp15 = icmp sgt i32 %n, 0 893 br i1 %cmp15, label %then, label %end 894 895then: 896 %ls = load i32, ptr %s, align 4 897 br label %end 898 899end: 900 %phi = phi i32 [ %ls, %then ], [ 0, %entry ] 901 %b = bitcast i32 %phi to float 902 ret float %b 903} 904 905define i32 @convphi2f_zero(ptr %s, ptr %d, i32 %n) { 906; CHECK-LABEL: @convphi2f_zero( 907; CHECK-NEXT: entry: 908; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 909; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]] 910; CHECK: then: 911; CHECK-NEXT: [[LS:%.*]] = load float, ptr [[S:%.*]], align 4 912; CHECK-NEXT: [[LS_BC:%.*]] = bitcast float [[LS]] to i32 913; CHECK-NEXT: br label [[END]] 914; CHECK: end: 915; CHECK-NEXT: [[PHI_TC:%.*]] = phi i32 [ [[LS_BC]], [[THEN]] ], [ 0, [[ENTRY:%.*]] ] 916; CHECK-NEXT: ret i32 [[PHI_TC]] 917; 918entry: 919 %cmp15 = icmp sgt i32 %n, 0 920 br i1 %cmp15, label %then, label %end 921 922then: 923 %ls = load float, ptr %s, align 4 924 br label %end 925 926end: 927 %phi = phi float [ %ls, %then ], [ 0.0, %entry ] 928 %b = bitcast float %phi to i32 929 ret i32 %b 930} 931 932define float @convphi2_ten(ptr %s, ptr %d, i32 %n) { 933; CHECK-LABEL: @convphi2_ten( 934; CHECK-NEXT: entry: 935; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 936; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]] 937; CHECK: then: 938; CHECK-NEXT: [[LS:%.*]] = load i32, ptr [[S:%.*]], align 4 939; CHECK-NEXT: [[LS_BC:%.*]] = bitcast i32 [[LS]] to float 940; CHECK-NEXT: br label [[END]] 941; CHECK: end: 942; CHECK-NEXT: [[PHI_TC:%.*]] = phi float [ [[LS_BC]], [[THEN]] ], [ 0x36D4000000000000, [[ENTRY:%.*]] ] 943; CHECK-NEXT: ret float [[PHI_TC]] 944; 945entry: 946 %cmp15 = icmp sgt i32 %n, 0 947 br i1 %cmp15, label %then, label %end 948 949then: 950 %ls = load i32, ptr %s, align 4 951 br label %end 952 953end: 954 %phi = phi i32 [ %ls, %then ], [ 10, %entry ] 955 %b = bitcast i32 %phi to float 956 ret float %b 957} 958 959define i32 @convphi2f_ten(ptr %s, ptr %d, i32 %n) { 960; CHECK-LABEL: @convphi2f_ten( 961; CHECK-NEXT: entry: 962; CHECK-NEXT: [[CMP15:%.*]] = icmp sgt i32 [[N:%.*]], 0 963; CHECK-NEXT: br i1 [[CMP15]], label [[THEN:%.*]], label [[END:%.*]] 964; CHECK: then: 965; CHECK-NEXT: [[LS:%.*]] = load float, ptr [[S:%.*]], align 4 966; CHECK-NEXT: [[LS_BC:%.*]] = bitcast float [[LS]] to i32 967; CHECK-NEXT: br label [[END]] 968; CHECK: end: 969; CHECK-NEXT: [[PHI_TC:%.*]] = phi i32 [ [[LS_BC]], [[THEN]] ], [ 1092616192, [[ENTRY:%.*]] ] 970; CHECK-NEXT: ret i32 [[PHI_TC]] 971; 972entry: 973 %cmp15 = icmp sgt i32 %n, 0 974 br i1 %cmp15, label %then, label %end 975 976then: 977 %ls = load float, ptr %s, align 4 978 br label %end 979 980end: 981 %phi = phi float [ %ls, %then ], [ 10.0, %entry ] 982 %b = bitcast float %phi to i32 983 ret i32 %b 984} 985