brintos

brintos / llvm-project-archived public Read only

0
0
Text · 17.2 KiB · c77a85f Raw
786 lines · plain
1; RUN: opt < %s -passes=gvn-sink,simplifycfg -simplifycfg-require-and-preserve-domtree=1 -hoist-common-insts=true -simplifycfg-sink-common=false -S | FileCheck %s2 3define zeroext i1 @test1(i1 zeroext %flag, i32 %blksA, i32 %blksB, i32 %nblks) {4entry:5  br i1 %flag, label %if.then, label %if.else6 7; CHECK-LABEL: test18; CHECK: add9; CHECK: select10; CHECK: icmp11; CHECK-NOT: br12if.then:13  %cmp = icmp uge i32 %blksA, %nblks14  %frombool1 = zext i1 %cmp to i815  br label %if.end16 17if.else:18  %add = add i32 %nblks, %blksB19  %cmp2 = icmp ule i32 %add, %blksA20  %frombool3 = zext i1 %cmp2 to i821  br label %if.end22 23if.end:24  %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.else ]25  %tobool4 = icmp ne i8 %obeys.0, 026  ret i1 %tobool427}28 29define zeroext i1 @test2(i1 zeroext %flag, i32 %blksA, i32 %blksB, i32 %nblks) {30entry:31  br i1 %flag, label %if.then, label %if.else32 33; CHECK-LABEL: test234; CHECK: add35; CHECK: select36; CHECK: icmp37; CHECK-NOT: br38if.then:39  %cmp = icmp uge i32 %blksA, %nblks40  %frombool1 = zext i1 %cmp to i841  br label %if.end42 43if.else:44  %add = add i32 %nblks, %blksB45  %cmp2 = icmp uge i32 %blksA, %add46  %frombool3 = zext i1 %cmp2 to i847  br label %if.end48 49if.end:50  %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.else ]51  %tobool4 = icmp ne i8 %obeys.0, 052  ret i1 %tobool453}54 55declare i32 @foo(i32, i32) nounwind readnone56 57; FIXME: The test failes when the original order of the58; candidates with the same cost is preserved.59;60;define i32 @test3(i1 zeroext %flag, i32 %x, i32 %y) {61;entry:62;  br i1 %flag, label %if.then, label %if.else63;64;if.then:65;  %x0 = call i32 @foo(i32 %x, i32 0) nounwind readnone66;  %y0 = call i32 @foo(i32 %x, i32 1) nounwind readnone67;  br label %if.end68;69;if.else:70;  %x1 = call i32 @foo(i32 %y, i32 0) nounwind readnone71;  %y1 = call i32 @foo(i32 %y, i32 1) nounwind readnone72;  br label %if.end73;74;if.end:75;  %xx = phi i32 [ %x0, %if.then ], [ %x1, %if.else ]76;  %yy = phi i32 [ %y0, %if.then ], [ %y1, %if.else ]77;  %ret = add i32 %xx, %yy78;  ret i32 %ret79;}80;81; -CHECK-LABEL: test382; -CHECK: select83; -CHECK: call84; -CHECK: call85; -CHECK: add86; -CHECK-NOT: br87 88define i32 @test4(i1 zeroext %flag, i32 %x, ptr %y) {89entry:90  br i1 %flag, label %if.then, label %if.else91 92if.then:93  %a = add i32 %x, 594  store i32 %a, ptr %y95  br label %if.end96 97if.else:98  %b = add i32 %x, 799  store i32 %b, ptr %y100  br label %if.end101 102if.end:103  ret i32 1104}105 106; CHECK-LABEL: test4107; CHECK: select108; CHECK: store109; CHECK-NOT: store110 111define i32 @test5(i1 zeroext %flag, i32 %x, ptr %y) {112entry:113  br i1 %flag, label %if.then, label %if.else114 115if.then:116  %a = add i32 %x, 5117  store volatile i32 %a, ptr %y118  br label %if.end119 120if.else:121  %b = add i32 %x, 7122  store i32 %b, ptr %y123  br label %if.end124 125if.end:126  ret i32 1127}128 129; CHECK-LABEL: test5130; CHECK: store volatile131; CHECK: store132 133define i32 @test6(i1 zeroext %flag, i32 %x, ptr %y) {134entry:135  br i1 %flag, label %if.then, label %if.else136 137if.then:138  %a = add i32 %x, 5139  store volatile i32 %a, ptr %y140  br label %if.end141 142if.else:143  %b = add i32 %x, 7144  store volatile i32 %b, ptr %y145  br label %if.end146 147if.end:148  ret i32 1149}150 151; CHECK-LABEL: test6152; CHECK: select153; CHECK: store volatile154; CHECK-NOT: store155 156define i32 @test7(i1 zeroext %flag, i32 %x, ptr %y) {157entry:158  br i1 %flag, label %if.then, label %if.else159 160if.then:161  %z = load volatile i32, ptr %y162  %a = add i32 %z, 5163  store volatile i32 %a, ptr %y164  br label %if.end165 166if.else:167  %w = load volatile i32, ptr %y168  %b = add i32 %w, 7169  store volatile i32 %b, ptr %y170  br label %if.end171 172if.end:173  ret i32 1174}175 176; CHECK-LABEL: test7177; CHECK-DAG: select178; CHECK-DAG: load volatile179; CHECK: store volatile180; CHECK-NOT: load181; CHECK-NOT: store182 183; The extra store in %if.then means %z and %w are not equivalent.184define i32 @test9(i1 zeroext %flag, i32 %x, ptr %y, ptr %p) {185entry:186  br i1 %flag, label %if.then, label %if.else187 188if.then:189  store i32 7, ptr %p190  %z = load volatile i32, ptr %y191  store i32 6, ptr %p192  %a = add i32 %z, 5193  store volatile i32 %a, ptr %y194  br label %if.end195 196if.else:197  %w = load volatile i32, ptr %y198  %b = add i32 %w, 7199  store volatile i32 %b, ptr %y200  br label %if.end201 202if.end:203  ret i32 1204}205 206; CHECK-LABEL: test9207; CHECK: add208; CHECK: add209 210%struct.anon = type { i32, i32, i32 }211 212; The GEP indexes a struct type so cannot have a variable last index.213define i32 @test10(i1 zeroext %flag, i32 %x, ptr %y, ptr %s) {214entry:215  br i1 %flag, label %if.then, label %if.else216 217if.then:218  %dummy = add i32 %x, 5219  %gepa = getelementptr inbounds %struct.anon, ptr %s, i32 0, i32 1220  store volatile i32 %x, ptr %gepa221  br label %if.end222 223if.else:224  %dummy1 = add i32 %x, 6225  %gepb = getelementptr inbounds %struct.anon, ptr %s, i32 0, i32 2226  store volatile i32 %x, ptr %gepb227  br label %if.end228 229if.end:230  ret i32 1231}232 233; CHECK-LABEL: test10234; CHECK: getelementptr235; CHECK: store volatile236; CHECK: getelementptr237; CHECK: store volatile238 239; The shufflevector's mask operand cannot be merged in a PHI.240define i32 @test11(i1 zeroext %flag, i32 %w, <2 x i32> %x, <2 x i32> %y) {241entry:242  br i1 %flag, label %if.then, label %if.else243 244if.then:245  %dummy = add i32 %w, 5246  %sv1 = shufflevector <2 x i32> %x, <2 x i32> %y, <2 x i32> <i32 0, i32 1>247  br label %if.end248 249if.else:250  %dummy1 = add i32 %w, 6251  %sv2 = shufflevector <2 x i32> %x, <2 x i32> %y, <2 x i32> <i32 1, i32 0>252  br label %if.end253 254if.end:255  %p = phi <2 x i32> [ %sv1, %if.then ], [ %sv2, %if.else ]256  ret i32 1257}258 259; CHECK-LABEL: test11260; CHECK: shufflevector261; CHECK: shufflevector262 263; We can't common an intrinsic!264define i32 @test12(i1 zeroext %flag, i32 %w, i32 %x, i32 %y) {265entry:266  br i1 %flag, label %if.then, label %if.else267 268if.then:269  %dummy = add i32 %w, 5270  %sv1 = call i32 @llvm.ctlz.i32(i32 %x)271  br label %if.end272 273if.else:274  %dummy1 = add i32 %w, 6275  %sv2 = call i32 @llvm.cttz.i32(i32 %x)276  br label %if.end277 278if.end:279  %p = phi i32 [ %sv1, %if.then ], [ %sv2, %if.else ]280  ret i32 1281}282 283declare i32 @llvm.ctlz.i32(i32 %x) readnone284declare i32 @llvm.cttz.i32(i32 %x) readnone285 286; CHECK-LABEL: test12287; CHECK: call i32 @llvm.ctlz288; CHECK: call i32 @llvm.cttz289 290; The TBAA metadata should be properly combined.291define i32 @test13(i1 zeroext %flag, i32 %x, ptr %y) {292entry:293  br i1 %flag, label %if.then, label %if.else294 295if.then:296  %z = load volatile i32, ptr %y297  %a = add i32 %z, 5298  store volatile i32 %a, ptr %y, !tbaa !3299  br label %if.end300 301if.else:302  %w = load volatile i32, ptr %y303  %b = add i32 %w, 7304  store volatile i32 %b, ptr %y, !tbaa !4305  br label %if.end306 307if.end:308  ret i32 1309}310 311!0 = !{ !"an example type tree" }312!1 = !{ !"int", !0 }313!2 = !{ !"float", !0 }314!3 = !{ !"const float", !2, i64 0 }315!4 = !{ !"special float", !2, i64 1 }316 317; CHECK-LABEL: test13318; CHECK-DAG: select319; CHECK-DAG: load volatile320; CHECK: store volatile {{.*}}, !tbaa !0321; CHECK-NOT: load322; CHECK-NOT: store323 324; The call should be commoned.325define i32 @test13a(i1 zeroext %flag, i32 %w, i32 %x, i32 %y) {326entry:327  br i1 %flag, label %if.then, label %if.else328 329if.then:330  %sv1 = call i32 @bar(i32 %x)331  br label %if.end332 333if.else:334  %sv2 = call i32 @bar(i32 %y)335  br label %if.end336 337if.end:338  %p = phi i32 [ %sv1, %if.then ], [ %sv2, %if.else ]339  ret i32 1340}341declare i32 @bar(i32)342 343; CHECK-LABEL: test13a344; CHECK: %[[x:.*]] = select i1 %flag345; CHECK: call i32 @bar(i32 %[[x]])346 347; The load should be commoned.348define i32 @test14(i1 zeroext %flag, i32 %w, i32 %x, i32 %y, ptr %s) {349entry:350  br i1 %flag, label %if.then, label %if.else351 352if.then:353  %dummy = add i32 %x, 1354  %gepa = getelementptr inbounds %struct.anon, ptr %s, i32 0, i32 1355  %sv1 = load i32, ptr %gepa356  %cmp1 = icmp eq i32 %sv1, 56357  br label %if.end358 359if.else:360  %dummy2 = add i32 %x, 4361  %gepb = getelementptr inbounds %struct.anon, ptr %s, i32 0, i32 1362  %sv2 = load i32, ptr %gepb363  %cmp2 = icmp eq i32 %sv2, 57364  br label %if.end365 366if.end:367  %p = phi i1 [ %cmp1, %if.then ], [ %cmp2, %if.else ]368  ret i32 1369}370 371; CHECK-LABEL: test14372; CHECK: getelementptr373; CHECK: load374; CHECK-NOT: load375 376; The load should be commoned.377define i32 @test15(i1 zeroext %flag, i32 %w, i32 %x, i32 %y, ptr %s) {378entry:379  br i1 %flag, label %if.then, label %if.else380 381if.then:382  %dummy = add i32 %x, 1383  %gepa = getelementptr inbounds %struct.anon, ptr %s, i32 0, i32 0384  %sv1 = load i32, ptr %gepa385  %ext1 = zext i32 %sv1 to i64386  %cmp1 = icmp eq i64 %ext1, 56387  br label %if.end388 389if.else:390  %dummy2 = add i32 %x, 4391  %gepb = getelementptr inbounds %struct.anon, ptr %s, i32 0, i32 1392  %sv2 = load i32, ptr %gepb393  %ext2 = zext i32 %sv2 to i64394  %cmp2 = icmp eq i64 %ext2, 56395  br label %if.end396 397if.end:398  %p = phi i1 [ %cmp1, %if.then ], [ %cmp2, %if.else ]399  ret i32 1400}401 402; CHECK-LABEL: test15403; CHECK: getelementptr404; CHECK: load405; CHECK-NOT: load406 407define zeroext i1 @test_crash(i1 zeroext %flag, ptr %i4, ptr %m, ptr %n) {408entry:409  br i1 %flag, label %if.then, label %if.else410 411if.then:412  %tmp1 = load i32, ptr %i4413  %tmp2 = add i32 %tmp1, -1414  store i32 %tmp2, ptr %i4415  br label %if.end416 417if.else:418  %tmp3 = load i32, ptr %m419  %tmp4 = load i32, ptr %n420  %tmp5 = add i32 %tmp3, %tmp4421  store i32 %tmp5, ptr %i4422  br label %if.end423 424if.end:425  ret i1 true426}427 428; CHECK-LABEL: test_crash429; No checks for test_crash - just ensure it doesn't crash!430 431define zeroext i1 @test16(i1 zeroext %flag, i1 zeroext %flag2, i32 %blksA, i32 %blksB, i32 %nblks) {432 433entry:434  br i1 %flag, label %if.then, label %if.else435 436if.then:437  %cmp = icmp uge i32 %blksA, %nblks438  %frombool1 = zext i1 %cmp to i8439  br label %if.end440 441if.else:442  br i1 %flag2, label %if.then2, label %if.end443 444if.then2:445  %add = add i32 %nblks, %blksB446  %cmp2 = icmp ule i32 %add, %blksA447  %frombool3 = zext i1 %cmp2 to i8448  br label %if.end449 450if.end:451  %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.then2 ], [ 0, %if.else ]452  %tobool4 = icmp ne i8 %obeys.0, 0453  ret i1 %tobool4454}455 456; CHECK-LABEL: test16457; CHECK: zext458; CHECK: zext459 460define zeroext i1 @test16a(i1 zeroext %flag, i1 zeroext %flag2, i32 %blksA, i32 %blksB, i32 %nblks, ptr %p) {461 462entry:463  br i1 %flag, label %if.then, label %if.else464 465if.then:466  %cmp = icmp uge i32 %blksA, %nblks467  %frombool1 = zext i1 %cmp to i8468  %b1 = sext i8 %frombool1 to i32469  %b2 = trunc i32 %b1 to i8470  store i8 %b2, ptr %p471  br label %if.end472 473if.else:474  br i1 %flag2, label %if.then2, label %if.end475 476if.then2:477  %add = add i32 %nblks, %blksB478  %cmp2 = icmp ule i32 %add, %blksA479  %frombool3 = zext i1 %cmp2 to i8480  %a1 = sext i8 %frombool3 to i32481  %a2 = trunc i32 %a1 to i8482  store i8 %a2, ptr %p483  br label %if.end484 485if.end:486  ret i1 true487}488 489; CHECK-LABEL: test16a490; CHECK: zext491; CHECK-NOT: zext492 493define zeroext i1 @test17(i32 %flag, i32 %blksA, i32 %blksB, i32 %nblks) {494entry:495  switch i32 %flag, label %if.end [496    i32 0, label %if.then497    i32 1, label %if.then2498  ]499 500if.then:501  %cmp = icmp uge i32 %blksA, %nblks502  %frombool1 = call i8 @i1toi8(i1 %cmp)503  %a1 = sext i8 %frombool1 to i32504  %a2 = trunc i32 %a1 to i8505  br label %if.end506 507if.then2:508  %add = add i32 %nblks, %blksB509  %cmp2 = icmp ule i32 %add, %blksA510  %frombool3 = call i8 @i1toi8(i1 %cmp2)511  %b1 = sext i8 %frombool3 to i32512  %b2 = trunc i32 %b1 to i8513  br label %if.end514 515if.end:516  %obeys.0 = phi i8 [ %a2, %if.then ], [ %b2, %if.then2 ], [ 0, %entry ]517  %tobool4 = icmp ne i8 %obeys.0, 0518  ret i1 %tobool4519}520declare i8 @i1toi8(i1)521 522; FIXME: DISABLED - we don't consider this profitable. We should523;  - Consider argument setup/return mov'ing for calls, like InlineCost does.524;  - Consider the removal of the %obeys.0 PHI (zero PHI movement overall)525 526; DISABLED-CHECK-LABEL: test17527; DISABLED-CHECK: if.then:528; DISABLED-CHECK-NEXT: icmp uge529; DISABLED-CHECK-NEXT: br label %[[x:.*]]530 531; DISABLED-CHECK: if.then2:532; DISABLED-CHECK-NEXT: add533; DISABLED-CHECK-NEXT: icmp ule534; DISABLED-CHECK-NEXT: br label %[[x]]535 536; DISABLED-CHECK: [[x]]:537; DISABLED-CHECK-NEXT: %[[y:.*]] = phi i1 [ %cmp538; DISABLED-CHECK-NEXT: %[[z:.*]] = call i8 @i1toi8(i1 %[[y]])539; DISABLED-CHECK-NEXT: br label %if.end540 541; DISABLED-CHECK: if.end:542; DISABLED-CHECK-NEXT: phi i8543; DISABLED-CHECK-DAG: [ %[[z]], %[[x]] ]544; DISABLED-CHECK-DAG: [ 0, %entry ]545 546define zeroext i1 @test18(i32 %flag, i32 %blksA, i32 %blksB, i32 %nblks) {547entry:548  switch i32 %flag, label %if.then3 [549    i32 0, label %if.then550    i32 1, label %if.then2551  ]552 553if.then:554  %cmp = icmp uge i32 %blksA, %nblks555  %frombool1 = zext i1 %cmp to i8556  br label %if.end557 558if.then2:559  %add = add i32 %nblks, %blksB560  %cmp2 = icmp ule i32 %add, %blksA561  %frombool3 = zext i1 %cmp2 to i8562  br label %if.end563 564if.then3:565  %add2 = add i32 %nblks, %blksA566  %cmp3 = icmp ule i32 %add2, %blksA567  %frombool4 = zext i1 %cmp3 to i8568  br label %if.end569 570if.end:571  %obeys.0 = phi i8 [ %frombool1, %if.then ], [ %frombool3, %if.then2 ], [ %frombool4, %if.then3 ]572  %tobool4 = icmp ne i8 %obeys.0, 0573  ret i1 %tobool4574}575 576; CHECK-LABEL: test18577; CHECK: if.end:578; CHECK-NEXT: %[[x:.*]] = phi i1579; CHECK-DAG: [ %cmp, %if.then ]580; CHECK-DAG: [ %cmp2, %if.then2 ]581; CHECK-DAG: [ %cmp3, %if.then3 ]582; CHECK-NEXT: zext i1 %[[x]] to i8583 584; The phi is confusing - both add instructions are used by it, but585; not on their respective unconditional arcs. It should not be586; optimized.587define void @test_pr30292(i1 %cond, i1 %cond2, i32 %a, i32 %b) {588entry:589  %add1 = add i32 %a, 1590  br label %succ591 592one:593  br i1 %cond, label %two, label %succ594 595two:596  call void @g()597  %add2 = add i32 %a, 1598  br label %succ599 600succ:601  %p = phi i32 [ 0, %entry ], [ %add1, %one ], [ %add2, %two ]602  br label %one603}604declare void @g()605 606; CHECK-LABEL: test_pr30292607; CHECK: phi i32 [ 0, %entry ], [ %add1, %succ ], [ %add2, %two ]608 609define zeroext i1 @test_pr30244(i1 zeroext %flag, i1 zeroext %flag2, i32 %blksA, i32 %blksB, i32 %nblks) {610 611entry:612  %p = alloca i8613  br i1 %flag, label %if.then, label %if.else614 615if.then:616  %cmp = icmp uge i32 %blksA, %nblks617  %frombool1 = zext i1 %cmp to i8618  store i8 %frombool1, ptr %p619  br label %if.end620 621if.else:622  br i1 %flag2, label %if.then2, label %if.end623 624if.then2:625  %add = add i32 %nblks, %blksB626  %cmp2 = icmp ule i32 %add, %blksA627  %frombool3 = zext i1 %cmp2 to i8628  store i8 %frombool3, ptr %p629  br label %if.end630 631if.end:632  ret i1 true633}634 635; CHECK-LABEL: @test_pr30244636; CHECK: store637; CHECK-NOT: store638 639define i32 @test_pr30373a(i1 zeroext %flag, i32 %x, i32 %y) {640entry:641  br i1 %flag, label %if.then, label %if.else642 643if.then:644  %x0 = call i32 @foo(i32 %x, i32 0) nounwind readnone645  %y0 = call i32 @foo(i32 %x, i32 1) nounwind readnone646  %z0 = lshr i32 %y0, 8647  br label %if.end648 649if.else:650  %x1 = call i32 @foo(i32 %y, i32 0) nounwind readnone651  %y1 = call i32 @foo(i32 %y, i32 1) nounwind readnone652  %z1 = lshr exact i32 %y1, 8653  br label %if.end654 655if.end:656  %xx = phi i32 [ %x0, %if.then ], [ %x1, %if.else ]657  %yy = phi i32 [ %z0, %if.then ], [ %z1, %if.else ]658  %ret = add i32 %xx, %yy659  ret i32 %ret660}661 662; CHECK-LABEL: test_pr30373a663; CHECK: lshr664; CHECK-NOT: exact665; CHECK: }666 667define i32 @test_pr30373b(i1 zeroext %flag, i32 %x, i32 %y) {668entry:669  br i1 %flag, label %if.then, label %if.else670 671if.then:672  %x0 = call i32 @foo(i32 %x, i32 0) nounwind readnone673  %y0 = call i32 @foo(i32 %x, i32 1) nounwind readnone674  %z0 = lshr exact i32 %y0, 8675  br label %if.end676 677if.else:678  %x1 = call i32 @foo(i32 %y, i32 0) nounwind readnone679  %y1 = call i32 @foo(i32 %y, i32 1) nounwind readnone680  %z1 = lshr i32 %y1, 8681  br label %if.end682 683if.end:684  %xx = phi i32 [ %x0, %if.then ], [ %x1, %if.else ]685  %yy = phi i32 [ %z0, %if.then ], [ %z1, %if.else ]686  %ret = add i32 %xx, %yy687  ret i32 %ret688}689 690; CHECK-LABEL: test_pr30373b691; CHECK: lshr692; CHECK-NOT: exact693; CHECK: }694 695 696; CHECK-LABEL: @common_bitcast(697; CHECK: %. = select i1 %flag, float 2.000000e+00, float 1.000000e+00698; CHECK: %[[a1:.*]] = bitcast ptr %x to ptr699; CHECK: store float %., ptr %[[a1]]700define i32 @common_bitcast(i1 zeroext %flag, ptr %x) {701entry:702  br i1 %flag, label %if.then, label %if.else703 704if.then:705  %a = bitcast ptr %x to ptr706  store float 2.0, ptr %a707  br label %if.end708 709if.else:710  %b = bitcast ptr %x to ptr711  store float 1.0, ptr %b712  br label %if.end713 714if.end:715  ret i32 1716}717 718; CHECK-LABEL: @common_addrspacecast(719; CHECK: %. = select i1 %flag, i32 9, i32 10720; CHECK: %[[a2:.*]] = addrspacecast ptr %x to ptr addrspace(1)721; CHECK: store i32 %., ptr addrspace(1) %[[a2]]722define i32 @common_addrspacecast(i1 zeroext %flag, ptr %x) {723entry:724  br i1 %flag, label %if.then, label %if.else725 726if.then:727  %a = addrspacecast ptr %x to ptr addrspace(1)728  store i32 9, ptr addrspace(1) %a729  br label %if.end730 731if.else:732  %b = addrspacecast ptr %x to ptr addrspace(1)733  store i32 10, ptr addrspace(1) %b734  br label %if.end735 736if.end:737  ret i32 1738}739 740; Don't merge different address spaces741; CHECK-LABEL: @no_common_addrspacecast(742; CHECK: addrspacecast ptr %x to ptr addrspace(1)743; CHECK: addrspacecast ptr %x to ptr addrspace(3)744define i32 @no_common_addrspacecast(i1 zeroext %flag, ptr %x) {745entry:746  br i1 %flag, label %if.then, label %if.else747 748if.then:749  %a = addrspacecast ptr %x to ptr addrspace(1)750  store i32 9, ptr addrspace(1) %a751  br label %if.end752 753if.else:754  %b = addrspacecast ptr %x to ptr addrspace(3)755  store i32 10, ptr addrspace(3) %b756  br label %if.end757 758if.end:759  ret i32 1760}761 762; CHECK-LABEL: test_pr36954763; CHECK-NOT: xor764; PR36954 reproducer containing self referencing instruction shouldn't crash GVNSink pass.765define void @test_pr36954(i1 %arg) {766bb1:767  %i2 = trunc i32 undef to i8768  br label %bb2769 770bb2:771  br i1 %arg, label %bb2, label %exit772 773bb4.critedge:774  %i6 = sub i8 %i2, undef775  %i7 = zext i8 %i6 to i32776  %i8 = xor i32 %i8, %i7777  br i1 false, label %exit, label %bb4.critedge778 779exit:780  ret void781}782 783; CHECK: !0 = !{!1, !1, i64 0}784; CHECK: !1 = !{!"float", !2}785; CHECK: !2 = !{!"an example type tree"}786