brintos

brintos / llvm-project-archived public Read only

0
0
Text · 17.5 KiB · 42e8ccb Raw
493 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-inst-comments2; RUN: opt -passes=print-predicateinfo -disable-output < %s 2>&1 | FileCheck %s3 4@a = external global i32		; <ptr> [#uses=7]5 6define i32 @test1() nounwind {7; CHECK-LABEL: @test1(8; CHECK-NEXT:  entry:9; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr @a, align 410; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i32 [[TMP0]], 411; CHECK-NEXT:    br i1 [[TMP1]], label [[BB:%.*]], label [[BB1:%.*]]12; CHECK:       bb:13; CHECK-NEXT:    br label [[BB8:%.*]]14; CHECK:       bb1:15; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr @a, align 416; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP2]], 517; CHECK-NEXT:    br i1 [[TMP3]], label [[BB2:%.*]], label [[BB3:%.*]]18; CHECK:       bb2:19; CHECK-NEXT:    br label [[BB8]]20; CHECK:       bb3:21; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr @a, align 422; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i32 [[TMP4]], 423; CHECK-NEXT:    br i1 [[TMP5]], label [[BB4:%.*]], label [[BB5:%.*]]24; CHECK:       bb4:25; CHECK-NEXT:    [[TMP6:%.*]] = load i32, ptr @a, align 426; CHECK-NEXT:    [[TMP7:%.*]] = add i32 [[TMP6]], 527; CHECK-NEXT:    br label [[BB8]]28; CHECK:       bb5:29; CHECK-NEXT:    [[TMP8:%.*]] = load i32, ptr @a, align 430; CHECK-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 531; CHECK-NEXT:    br i1 [[TMP9]], label [[BB6:%.*]], label [[BB7:%.*]]32; CHECK:       bb6:33; CHECK-NEXT:    [[TMP10:%.*]] = load i32, ptr @a, align 434; CHECK-NEXT:    [[TMP11:%.*]] = add i32 [[TMP10]], 435; CHECK-NEXT:    br label [[BB8]]36; CHECK:       bb7:37; CHECK-NEXT:    [[TMP12:%.*]] = load i32, ptr @a, align 438; CHECK-NEXT:    br label [[BB8]]39; CHECK:       bb8:40; CHECK-NEXT:    [[DOT0:%.*]] = phi i32 [ [[TMP12]], [[BB7]] ], [ [[TMP11]], [[BB6]] ], [ [[TMP7]], [[BB4]] ], [ 4, [[BB2]] ], [ 5, [[BB]] ]41; CHECK-NEXT:    br label [[RETURN:%.*]]42; CHECK:       return:43; CHECK-NEXT:    ret i32 [[DOT0]]44;45entry:46  %0 = load i32, ptr @a, align 447  %1 = icmp eq i32 %0, 448  br i1 %1, label %bb, label %bb149 50bb:		; preds = %entry51  br label %bb852 53bb1:		; preds = %entry54  %2 = load i32, ptr @a, align 455  %3 = icmp eq i32 %2, 556  br i1 %3, label %bb2, label %bb357 58bb2:		; preds = %bb159  br label %bb860 61bb3:		; preds = %bb162  %4 = load i32, ptr @a, align 463  %5 = icmp eq i32 %4, 464  br i1 %5, label %bb4, label %bb565 66bb4:		; preds = %bb367  %6 = load i32, ptr @a, align 468  %7 = add i32 %6, 569  br label %bb870 71bb5:		; preds = %bb372  %8 = load i32, ptr @a, align 473  %9 = icmp eq i32 %8, 574  br i1 %9, label %bb6, label %bb775 76bb6:		; preds = %bb577  %10 = load i32, ptr @a, align 478  %11 = add i32 %10, 479  br label %bb880 81bb7:		; preds = %bb582  %12 = load i32, ptr @a, align 483  br label %bb884 85bb8:		; preds = %bb7, %bb6, %bb4, %bb2, %bb86  %.0 = phi i32 [ %12, %bb7 ], [ %11, %bb6 ], [ %7, %bb4 ], [ 4, %bb2 ], [ 5, %bb ]87  br label %return88 89return:		; preds = %bb890  ret i32 %.091}92 93declare void @foo(i1)94declare void @bar(i32)95 96define void @test3(i32 %x, i32 %y) {97; CHECK-LABEL: @test3(98; CHECK-NEXT:    [[XZ:%.*]] = icmp eq i32 [[X:%.*]], 099; CHECK-NEXT:    [[YZ:%.*]] = icmp eq i32 [[Y:%.*]], 0100; CHECK-NEXT:    [[Z:%.*]] = and i1 [[XZ]], [[YZ]]101; CHECK-NEXT:  ; branch predicate info { TrueEdge: 0 Comparison: [[Z]] = and i1 [[XZ]], [[YZ]] Edge: [label [[TMP0:%.*]],label [[NOPE:%.*]]], RenamedOp: [[Z]] }102; CHECK-NEXT:    [[Z_0:%.*]] = bitcast i1 [[Z]] to i1103; CHECK-NEXT:  ; branch predicate info { TrueEdge: 1 Comparison: [[XZ]] = icmp eq i32 [[X]], 0 Edge: [label [[TMP0]],label [[BOTH_ZERO:%.*]]], RenamedOp: [[XZ]] }104; CHECK-NEXT:    [[XZ_0:%.*]] = bitcast i1 [[XZ]] to i1105; CHECK-NEXT:  ; branch predicate info { TrueEdge: 1 Comparison: [[XZ]] = icmp eq i32 [[X]], 0 Edge: [label [[TMP0]],label [[BOTH_ZERO]]], RenamedOp: [[X]] }106; CHECK-NEXT:    [[X_0:%.*]] = bitcast i32 [[X]] to i32107; CHECK-NEXT:  ; branch predicate info { TrueEdge: 1 Comparison: [[YZ]] = icmp eq i32 [[Y]], 0 Edge: [label [[TMP0]],label [[BOTH_ZERO]]], RenamedOp: [[YZ]] }108; CHECK-NEXT:    [[YZ_0:%.*]] = bitcast i1 [[YZ]] to i1109; CHECK-NEXT:  ; branch predicate info { TrueEdge: 1 Comparison: [[YZ]] = icmp eq i32 [[Y]], 0 Edge: [label [[TMP0]],label [[BOTH_ZERO]]], RenamedOp: [[Y]] }110; CHECK-NEXT:    [[Y_0:%.*]] = bitcast i32 [[Y]] to i32111; CHECK-NEXT:    br i1 [[Z]], label [[BOTH_ZERO]], label [[NOPE]]112; CHECK:       both_zero:113; CHECK-NEXT:    call void @foo(i1 [[XZ_0]])114; CHECK-NEXT:    call void @foo(i1 [[YZ_0]])115; CHECK-NEXT:    call void @bar(i32 [[X_0]])116; CHECK-NEXT:    call void @bar(i32 [[Y_0]])117; CHECK-NEXT:    ret void118; CHECK:       nope:119; CHECK-NEXT:    call void @foo(i1 [[Z_0]])120; CHECK-NEXT:    ret void121;122  %xz = icmp eq i32 %x, 0123  %yz = icmp eq i32 %y, 0124  %z = and i1 %xz, %yz125  br i1 %z, label %both_zero, label %nope126both_zero:127  call void @foo(i1 %xz)128  call void @foo(i1 %yz)129  call void @bar(i32 %x)130  call void @bar(i32 %y)131  ret void132nope:133  call void @foo(i1 %z)134  ret void135}136 137define void @test4(i1 %b, i32 %x) {138; CHECK-LABEL: @test4(139; CHECK-NEXT:    br i1 [[B:%.*]], label [[SW:%.*]], label [[CASE3:%.*]]140; CHECK:       sw:141; CHECK-NEXT:  ; switch predicate info { CaseValue: i32 1 Edge: [label [[SW]],label [[CASE1:%.*]]], RenamedOp: [[X:%.*]] }142; CHECK-NEXT:    [[X_0:%.*]] = bitcast i32 [[X]] to i32143; CHECK-NEXT:    switch i32 [[X]], label [[DEFAULT:%.*]] [144; CHECK-NEXT:      i32 0, label [[CASE0:%.*]]145; CHECK-NEXT:      i32 1, label [[CASE1]]146; CHECK-NEXT:      i32 2, label [[CASE0]]147; CHECK-NEXT:      i32 3, label [[CASE3]]148; CHECK-NEXT:      i32 4, label [[DEFAULT]]149; CHECK-NEXT:    ]150; CHECK:       default:151; CHECK-NEXT:    call void @bar(i32 [[X]])152; CHECK-NEXT:    ret void153; CHECK:       case0:154; CHECK-NEXT:    call void @bar(i32 [[X]])155; CHECK-NEXT:    ret void156; CHECK:       case1:157; CHECK-NEXT:    call void @bar(i32 [[X_0]])158; CHECK-NEXT:    ret void159; CHECK:       case3:160; CHECK-NEXT:    call void @bar(i32 [[X]])161; CHECK-NEXT:    ret void162;163  br i1 %b, label %sw, label %case3164sw:165  switch i32 %x, label %default [166  i32 0, label %case0167  i32 1, label %case1168  i32 2, label %case0169  i32 3, label %case3170  i32 4, label %default171  ]172default:173  call void @bar(i32 %x)174  ret void175case0:176  call void @bar(i32 %x)177  ret void178case1:179  call void @bar(i32 %x)180  ret void181case3:182  call void @bar(i32 %x)183  ret void184}185 186define i1 @test5(i32 %x, i32 %y) {187; CHECK-LABEL: @test5(188; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X:%.*]], [[Y:%.*]]189; CHECK-NEXT:  ; branch predicate info { TrueEdge: 1 Comparison: [[CMP]] = icmp eq i32 [[X]], [[Y]] Edge: [label [[TMP0:%.*]],label [[SAME:%.*]]], RenamedOp: [[X]] }190; CHECK-NEXT:    [[X_0:%.*]] = bitcast i32 [[X]] to i32191; CHECK-NEXT:  ; branch predicate info { TrueEdge: 0 Comparison: [[CMP]] = icmp eq i32 [[X]], [[Y]] Edge: [label [[TMP0]],label [[DIFFERENT:%.*]]], RenamedOp: [[X]] }192; CHECK-NEXT:    [[X_1:%.*]] = bitcast i32 [[X]] to i32193; CHECK-NEXT:  ; branch predicate info { TrueEdge: 1 Comparison: [[CMP]] = icmp eq i32 [[X]], [[Y]] Edge: [label [[TMP0]],label [[SAME]]], RenamedOp: [[Y]] }194; CHECK-NEXT:    [[Y_0:%.*]] = bitcast i32 [[Y]] to i32195; CHECK-NEXT:  ; branch predicate info { TrueEdge: 0 Comparison: [[CMP]] = icmp eq i32 [[X]], [[Y]] Edge: [label [[TMP0]],label [[DIFFERENT]]], RenamedOp: [[Y]] }196; CHECK-NEXT:    [[Y_1:%.*]] = bitcast i32 [[Y]] to i32197; CHECK-NEXT:    br i1 [[CMP]], label [[SAME]], label [[DIFFERENT]]198; CHECK:       same:199; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i32 [[X_0]], [[Y_0]]200; CHECK-NEXT:    ret i1 [[CMP2]]201; CHECK:       different:202; CHECK-NEXT:    [[CMP3:%.*]] = icmp eq i32 [[X_1]], [[Y_1]]203; CHECK-NEXT:    ret i1 [[CMP3]]204;205  %cmp = icmp eq i32 %x, %y206  br i1 %cmp, label %same, label %different207 208same:209  %cmp2 = icmp ne i32 %x, %y210  ret i1 %cmp2211 212different:213  %cmp3 = icmp eq i32 %x, %y214  ret i1 %cmp3215}216 217define i1 @test6(i32 %x, i32 %y) {218; CHECK-LABEL: @test6(219; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i32 [[X:%.*]], [[Y:%.*]]220; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X]], [[Y]]221; CHECK-NEXT:    [[CMP3:%.*]] = icmp eq i32 [[X]], [[Y]]222; CHECK-NEXT:    br i1 [[CMP]], label [[SAME:%.*]], label [[DIFFERENT:%.*]]223; CHECK:       same:224; CHECK-NEXT:    ret i1 [[CMP2]]225; CHECK:       different:226; CHECK-NEXT:    ret i1 [[CMP3]]227;228  %cmp2 = icmp ne i32 %x, %y229  %cmp = icmp eq i32 %x, %y230  %cmp3 = icmp eq i32 %x, %y231  br i1 %cmp, label %same, label %different232 233same:234  ret i1 %cmp2235 236different:237  ret i1 %cmp3238}239 240define i1 @test6_fp(float %x, float %y) {241; CHECK-LABEL: @test6_fp(242; CHECK-NEXT:    [[CMP2:%.*]] = fcmp une float [[X:%.*]], [[Y:%.*]]243; CHECK-NEXT:    [[CMP:%.*]] = fcmp oeq float [[X]], [[Y]]244; CHECK-NEXT:    [[CMP3:%.*]] = fcmp oeq float [[X]], [[Y]]245; CHECK-NEXT:    br i1 [[CMP]], label [[SAME:%.*]], label [[DIFFERENT:%.*]]246; CHECK:       same:247; CHECK-NEXT:    ret i1 [[CMP2]]248; CHECK:       different:249; CHECK-NEXT:    ret i1 [[CMP3]]250;251  %cmp2 = fcmp une float %x, %y252  %cmp = fcmp oeq float %x, %y253  %cmp3 = fcmp oeq float  %x, %y254  br i1 %cmp, label %same, label %different255 256same:257  ret i1 %cmp2258 259different:260  ret i1 %cmp3261}262 263define i1 @test7(i32 %x, i32 %y) {264; CHECK-LABEL: @test7(265; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], [[Y:%.*]]266; CHECK-NEXT:  ; branch predicate info { TrueEdge: 1 Comparison: [[CMP]] = icmp sgt i32 [[X]], [[Y]] Edge: [label [[TMP0:%.*]],label [[SAME:%.*]]], RenamedOp: [[X]] }267; CHECK-NEXT:    [[X_0:%.*]] = bitcast i32 [[X]] to i32268; CHECK-NEXT:  ; branch predicate info { TrueEdge: 0 Comparison: [[CMP]] = icmp sgt i32 [[X]], [[Y]] Edge: [label [[TMP0]],label [[DIFFERENT:%.*]]], RenamedOp: [[X]] }269; CHECK-NEXT:    [[X_1:%.*]] = bitcast i32 [[X]] to i32270; CHECK-NEXT:  ; branch predicate info { TrueEdge: 1 Comparison: [[CMP]] = icmp sgt i32 [[X]], [[Y]] Edge: [label [[TMP0]],label [[SAME]]], RenamedOp: [[Y]] }271; CHECK-NEXT:    [[Y_0:%.*]] = bitcast i32 [[Y]] to i32272; CHECK-NEXT:  ; branch predicate info { TrueEdge: 0 Comparison: [[CMP]] = icmp sgt i32 [[X]], [[Y]] Edge: [label [[TMP0]],label [[DIFFERENT]]], RenamedOp: [[Y]] }273; CHECK-NEXT:    [[Y_1:%.*]] = bitcast i32 [[Y]] to i32274; CHECK-NEXT:    br i1 [[CMP]], label [[SAME]], label [[DIFFERENT]]275; CHECK:       same:276; CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[X_0]], [[Y_0]]277; CHECK-NEXT:    ret i1 [[CMP2]]278; CHECK:       different:279; CHECK-NEXT:    [[CMP3:%.*]] = icmp sgt i32 [[X_1]], [[Y_1]]280; CHECK-NEXT:    ret i1 [[CMP3]]281;282  %cmp = icmp sgt i32 %x, %y283  br i1 %cmp, label %same, label %different284 285same:286  %cmp2 = icmp sle i32 %x, %y287  ret i1 %cmp2288 289different:290  %cmp3 = icmp sgt i32 %x, %y291  ret i1 %cmp3292}293 294define i1 @test7_fp(float %x, float %y) {295; CHECK-LABEL: @test7_fp(296; CHECK-NEXT:    [[CMP:%.*]] = fcmp ogt float [[X:%.*]], [[Y:%.*]]297; CHECK-NEXT:  ; branch predicate info { TrueEdge: 1 Comparison: [[CMP]] = fcmp ogt float [[X]], [[Y]] Edge: [label [[TMP0:%.*]],label [[SAME:%.*]]], RenamedOp: [[X]] }298; CHECK-NEXT:    [[X_0:%.*]] = bitcast float [[X]] to float299; CHECK-NEXT:  ; branch predicate info { TrueEdge: 0 Comparison: [[CMP]] = fcmp ogt float [[X]], [[Y]] Edge: [label [[TMP0]],label [[DIFFERENT:%.*]]], RenamedOp: [[X]] }300; CHECK-NEXT:    [[X_1:%.*]] = bitcast float [[X]] to float301; CHECK-NEXT:  ; branch predicate info { TrueEdge: 1 Comparison: [[CMP]] = fcmp ogt float [[X]], [[Y]] Edge: [label [[TMP0]],label [[SAME]]], RenamedOp: [[Y]] }302; CHECK-NEXT:    [[Y_0:%.*]] = bitcast float [[Y]] to float303; CHECK-NEXT:  ; branch predicate info { TrueEdge: 0 Comparison: [[CMP]] = fcmp ogt float [[X]], [[Y]] Edge: [label [[TMP0]],label [[DIFFERENT]]], RenamedOp: [[Y]] }304; CHECK-NEXT:    [[Y_1:%.*]] = bitcast float [[Y]] to float305; CHECK-NEXT:    br i1 [[CMP]], label [[SAME]], label [[DIFFERENT]]306; CHECK:       same:307; CHECK-NEXT:    [[CMP2:%.*]] = fcmp ule float [[X_0]], [[Y_0]]308; CHECK-NEXT:    ret i1 [[CMP2]]309; CHECK:       different:310; CHECK-NEXT:    [[CMP3:%.*]] = fcmp ogt float [[X_1]], [[Y_1]]311; CHECK-NEXT:    ret i1 [[CMP3]]312;313  %cmp = fcmp ogt float %x, %y314  br i1 %cmp, label %same, label %different315 316same:317  %cmp2 = fcmp ule float %x, %y318  ret i1 %cmp2319 320different:321  %cmp3 = fcmp ogt float %x, %y322  ret i1 %cmp3323}324 325define i1 @test8(i32 %x, i32 %y) {326; CHECK-LABEL: @test8(327; CHECK-NEXT:    [[CMP2:%.*]] = icmp sle i32 [[X:%.*]], [[Y:%.*]]328; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[X]], [[Y]]329; CHECK-NEXT:    [[CMP3:%.*]] = icmp sgt i32 [[X]], [[Y]]330; CHECK-NEXT:    br i1 [[CMP]], label [[SAME:%.*]], label [[DIFFERENT:%.*]]331; CHECK:       same:332; CHECK-NEXT:    ret i1 [[CMP2]]333; CHECK:       different:334; CHECK-NEXT:    ret i1 [[CMP3]]335;336  %cmp2 = icmp sle i32 %x, %y337  %cmp = icmp sgt i32 %x, %y338  %cmp3 = icmp sgt i32 %x, %y339  br i1 %cmp, label %same, label %different340 341same:342  ret i1 %cmp2343 344different:345  ret i1 %cmp3346}347 348define i1 @test8_fp(float %x, float %y) {349; CHECK-LABEL: @test8_fp(350; CHECK-NEXT:    [[CMP2:%.*]] = fcmp ule float [[X:%.*]], [[Y:%.*]]351; CHECK-NEXT:    [[CMP:%.*]] = fcmp ogt float [[X]], [[Y]]352; CHECK-NEXT:    [[CMP3:%.*]] = fcmp ogt float [[X]], [[Y]]353; CHECK-NEXT:    br i1 [[CMP]], label [[SAME:%.*]], label [[DIFFERENT:%.*]]354; CHECK:       same:355; CHECK-NEXT:    ret i1 [[CMP2]]356; CHECK:       different:357; CHECK-NEXT:    ret i1 [[CMP3]]358;359  %cmp2 = fcmp ule float %x, %y360  %cmp = fcmp ogt float %x, %y361  %cmp3 = fcmp ogt float %x, %y362  br i1 %cmp, label %same, label %different363 364same:365  ret i1 %cmp2366 367different:368  ret i1 %cmp3369}370 371define i32 @test9(i32 %i, i32 %j) {372; CHECK-LABEL: @test9(373; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[I:%.*]], [[J:%.*]]374; CHECK-NEXT:  ; branch predicate info { TrueEdge: 1 Comparison: [[CMP]] = icmp eq i32 [[I]], [[J]] Edge: [label [[TMP0:%.*]],label [[COND_TRUE:%.*]]], RenamedOp: [[I]] }375; CHECK-NEXT:    [[I_0:%.*]] = bitcast i32 [[I]] to i32376; CHECK-NEXT:  ; branch predicate info { TrueEdge: 1 Comparison: [[CMP]] = icmp eq i32 [[I]], [[J]] Edge: [label [[TMP0]],label [[COND_TRUE]]], RenamedOp: [[J]] }377; CHECK-NEXT:    [[J_0:%.*]] = bitcast i32 [[J]] to i32378; CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE]], label [[RET:%.*]]379; CHECK:       cond_true:380; CHECK-NEXT:    [[DIFF:%.*]] = sub i32 [[I_0]], [[J_0]]381; CHECK-NEXT:    ret i32 [[DIFF]]382; CHECK:       ret:383; CHECK-NEXT:    ret i32 5384;385  %cmp = icmp eq i32 %i, %j386  br i1 %cmp, label %cond_true, label %ret387 388cond_true:389  %diff = sub i32 %i, %j390  ret i32 %diff391 392ret:393  ret i32 5394}395 396define i32 @test10(i32 %j, i32 %i) {397; CHECK-LABEL: @test10(398; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[I:%.*]], [[J:%.*]]399; CHECK-NEXT:  ; branch predicate info { TrueEdge: 1 Comparison: [[CMP]] = icmp eq i32 [[I]], [[J]] Edge: [label [[TMP0:%.*]],label [[COND_TRUE:%.*]]], RenamedOp: [[I]] }400; CHECK-NEXT:    [[I_0:%.*]] = bitcast i32 [[I]] to i32401; CHECK-NEXT:  ; branch predicate info { TrueEdge: 1 Comparison: [[CMP]] = icmp eq i32 [[I]], [[J]] Edge: [label [[TMP0]],label [[COND_TRUE]]], RenamedOp: [[J]] }402; CHECK-NEXT:    [[J_0:%.*]] = bitcast i32 [[J]] to i32403; CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE]], label [[RET:%.*]]404; CHECK:       cond_true:405; CHECK-NEXT:    [[DIFF:%.*]] = sub i32 [[I_0]], [[J_0]]406; CHECK-NEXT:    ret i32 [[DIFF]]407; CHECK:       ret:408; CHECK-NEXT:    ret i32 5409;410  %cmp = icmp eq i32 %i, %j411  br i1 %cmp, label %cond_true, label %ret412 413cond_true:414  %diff = sub i32 %i, %j415  ret i32 %diff416 417ret:418  ret i32 5419}420 421declare i32 @yogibar()422 423define i32 @test11(i32 %x) {424; CHECK-LABEL: @test11(425; CHECK-NEXT:    [[V0:%.*]] = call i32 @yogibar()426; CHECK-NEXT:    [[V1:%.*]] = call i32 @yogibar()427; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[V0]], [[V1]]428; CHECK-NEXT:  ; branch predicate info { TrueEdge: 0 Comparison: [[CMP]] = icmp eq i32 [[V0]], [[V1]] Edge: [label [[TMP0:%.*]],label [[NEXT:%.*]]], RenamedOp: [[V0]] }429; CHECK-NEXT:    [[V0_0:%.*]] = bitcast i32 [[V0]] to i32430; CHECK-NEXT:  ; branch predicate info { TrueEdge: 1 Comparison: [[CMP]] = icmp eq i32 [[V0]], [[V1]] Edge: [label [[TMP0]],label [[COND_TRUE:%.*]]], RenamedOp: [[V1]] }431; CHECK-NEXT:    [[V1_0:%.*]] = bitcast i32 [[V1]] to i32432; CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE]], label [[NEXT]]433; CHECK:       cond_true:434; CHECK-NEXT:    ret i32 [[V1_0]]435; CHECK:       next:436; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq i32 [[X:%.*]], [[V0_0]]437; CHECK-NEXT:  ; branch predicate info { TrueEdge: 1 Comparison: [[CMP2]] = icmp eq i32 [[X]], [[V0_0]] Edge: [label [[NEXT]],label [[COND_TRUE2:%.*]]], RenamedOp: [[V0_0]] }438; CHECK-NEXT:    [[V0_0_1:%.*]] = bitcast i32 [[V0_0]] to i32439; CHECK-NEXT:    br i1 [[CMP2]], label [[COND_TRUE2]], label [[NEXT2:%.*]]440; CHECK:       cond_true2:441; CHECK-NEXT:    ret i32 [[V0_0_1]]442; CHECK:       next2:443; CHECK-NEXT:    ret i32 0444;445  %v0 = call i32 @yogibar()446  %v1 = call i32 @yogibar()447  %cmp = icmp eq i32 %v0, %v1448  br i1 %cmp, label %cond_true, label %next449 450cond_true:451  ret i32 %v1452 453next:454  %cmp2 = icmp eq i32 %x, %v0455  br i1 %cmp2, label %cond_true2, label %next2456 457cond_true2:458  ret i32 %v0459 460next2:461  ret i32 0462}463 464define i32 @test12(i32 %x) {465; CHECK-LABEL: @test12(466; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X:%.*]], 0467; CHECK-NEXT:  ; branch predicate info { TrueEdge: 1 Comparison: [[CMP]] = icmp eq i32 [[X]], 0 Edge: [label [[TMP0:%.*]],label [[COND_TRUE:%.*]]], RenamedOp: [[X]] }468; CHECK-NEXT:    [[X_0:%.*]] = bitcast i32 [[X]] to i32469; CHECK-NEXT:  ; branch predicate info { TrueEdge: 0 Comparison: [[CMP]] = icmp eq i32 [[X]], 0 Edge: [label [[TMP0]],label [[COND_FALSE:%.*]]], RenamedOp: [[X]] }470; CHECK-NEXT:    [[X_1:%.*]] = bitcast i32 [[X]] to i32471; CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE]], label [[COND_FALSE]]472; CHECK:       cond_true:473; CHECK-NEXT:    br label [[RET:%.*]]474; CHECK:       cond_false:475; CHECK-NEXT:    br label [[RET]]476; CHECK:       ret:477; CHECK-NEXT:    [[RES:%.*]] = phi i32 [ [[X_0]], [[COND_TRUE]] ], [ [[X_1]], [[COND_FALSE]] ]478; CHECK-NEXT:    ret i32 [[RES]]479;480  %cmp = icmp eq i32 %x, 0481  br i1 %cmp, label %cond_true, label %cond_false482 483cond_true:484  br label %ret485 486cond_false:487  br label %ret488 489ret:490  %res = phi i32 [ %x, %cond_true ], [ %x, %cond_false ]491  ret i32 %res492}493