| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | 
 | ; RUN: llc < %s -mtriple=arm64 | FileCheck %s --check-prefixes=CHECK,CHECK-SD | 
 | ; RUN: llc < %s -mtriple=aarch64 -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI | 
 |  | 
 | ; This test provides fmf coverage for DAG combining of selects | 
 |  | 
 | ; select Cond0, (select Cond1, X, Y), Y -> select (and Cond0, Cond1), X, Y | 
 | define float @select_select_fold_select_and(float %w, float %x, float %y, float %z) { | 
 | ; CHECK-SD-LABEL: select_select_fold_select_and: | 
 | ; CHECK-SD:       // %bb.0: | 
 | ; CHECK-SD-NEXT:    fminnm s4, s1, s2 | 
 | ; CHECK-SD-NEXT:    fcmp s1, s2 | 
 | ; CHECK-SD-NEXT:    fmaxnm s2, s0, s3 | 
 | ; CHECK-SD-NEXT:    fmov s1, #0.50000000 | 
 | ; CHECK-SD-NEXT:    fccmp s4, s0, #4, lt | 
 | ; CHECK-SD-NEXT:    fadd s1, s0, s1 | 
 | ; CHECK-SD-NEXT:    fcsel s2, s2, s0, gt | 
 | ; CHECK-SD-NEXT:    fadd s4, s1, s2 | 
 | ; CHECK-SD-NEXT:    fcmp s4, s1 | 
 | ; CHECK-SD-NEXT:    b.le .LBB0_2 | 
 | ; CHECK-SD-NEXT:  // %bb.1: // %if.then.i157.i.i | 
 | ; CHECK-SD-NEXT:    fmov s0, #1.00000000 | 
 | ; CHECK-SD-NEXT:    fadd s0, s2, s0 | 
 | ; CHECK-SD-NEXT:    ret | 
 | ; CHECK-SD-NEXT:  .LBB0_2: // %if.end.i159.i.i | 
 | ; CHECK-SD-NEXT:    mov w8, #52429 // =0xcccd | 
 | ; CHECK-SD-NEXT:    mov w9, #13107 // =0x3333 | 
 | ; CHECK-SD-NEXT:    fcmp s1, #0.0 | 
 | ; CHECK-SD-NEXT:    movk w8, #48844, lsl #16 | 
 | ; CHECK-SD-NEXT:    movk w9, #48819, lsl #16 | 
 | ; CHECK-SD-NEXT:    fmov s2, w8 | 
 | ; CHECK-SD-NEXT:    fmov s4, w9 | 
 | ; CHECK-SD-NEXT:    fadd s0, s0, s2 | 
 | ; CHECK-SD-NEXT:    fadd s2, s3, s4 | 
 | ; CHECK-SD-NEXT:    fcsel s0, s0, s2, gt | 
 | ; CHECK-SD-NEXT:    ret | 
 | ; | 
 | ; CHECK-GI-LABEL: select_select_fold_select_and: | 
 | ; CHECK-GI:       // %bb.0: | 
 | ; CHECK-GI-NEXT:    fcmp s1, s2 | 
 | ; CHECK-GI-NEXT:    fcsel s4, s1, s2, mi | 
 | ; CHECK-GI-NEXT:    fcmp s0, s3 | 
 | ; CHECK-GI-NEXT:    fcsel s5, s0, s3, gt | 
 | ; CHECK-GI-NEXT:    fcmp s1, s2 | 
 | ; CHECK-GI-NEXT:    fmov s1, #0.50000000 | 
 | ; CHECK-GI-NEXT:    fcsel s2, s5, s0, mi | 
 | ; CHECK-GI-NEXT:    fcmp s4, s0 | 
 | ; CHECK-GI-NEXT:    fadd s1, s0, s1 | 
 | ; CHECK-GI-NEXT:    fcsel s2, s2, s0, gt | 
 | ; CHECK-GI-NEXT:    fadd s4, s1, s2 | 
 | ; CHECK-GI-NEXT:    fcmp s4, s1 | 
 | ; CHECK-GI-NEXT:    b.le .LBB0_2 | 
 | ; CHECK-GI-NEXT:  // %bb.1: // %if.then.i157.i.i | 
 | ; CHECK-GI-NEXT:    fmov s0, #1.00000000 | 
 | ; CHECK-GI-NEXT:    fadd s0, s2, s0 | 
 | ; CHECK-GI-NEXT:    ret | 
 | ; CHECK-GI-NEXT:  .LBB0_2: // %if.end.i159.i.i | 
 | ; CHECK-GI-NEXT:    mov w8, #52429 // =0xcccd | 
 | ; CHECK-GI-NEXT:    mov w9, #13107 // =0x3333 | 
 | ; CHECK-GI-NEXT:    fcmp s1, #0.0 | 
 | ; CHECK-GI-NEXT:    movk w8, #48844, lsl #16 | 
 | ; CHECK-GI-NEXT:    movk w9, #48819, lsl #16 | 
 | ; CHECK-GI-NEXT:    fmov s2, w8 | 
 | ; CHECK-GI-NEXT:    fmov s4, w9 | 
 | ; CHECK-GI-NEXT:    fadd s0, s0, s2 | 
 | ; CHECK-GI-NEXT:    fadd s2, s3, s4 | 
 | ; CHECK-GI-NEXT:    fcsel s0, s0, s2, gt | 
 | ; CHECK-GI-NEXT:    ret | 
 |   %tmp21 = fcmp fast olt float %x, %y | 
 |   %tmp22 = select fast i1 %tmp21, float %x, float %y | 
 |   %tmp24 = fcmp fast ogt float %tmp22, %w | 
 |   %tmp78 = fcmp fast ogt float %w, %z | 
 |   %select0 = select fast i1 %tmp78, float %w, float %z | 
 |   %select1 = select fast i1 %tmp21, float %select0, float %w | 
 |   %select2 = select fast i1 %tmp24, float %select1, float %w | 
 |   %tmp82 = fadd fast float %w, 5.000000e-01 | 
 |   %tmp102 = fadd fast float %tmp82, %select2 | 
 |   %cmp.i155.i.i = fcmp fast ogt float %tmp102, %tmp82 | 
 |   br i1 %cmp.i155.i.i, label %if.then.i157.i.i, label %if.end.i159.i.i | 
 |  | 
 | if.then.i157.i.i:                                 ; preds = %0 | 
 |   %add.i156.i.i = fadd fast float %select2, 1.000000e+00 | 
 |   br label %exit | 
 |  | 
 | if.end.i159.i.i:                                  ; preds = %0 | 
 |   %sub.i158.i.i = fadd fast float %w, 0xBFD99999A0000000 | 
 |   %sub15.i.i.i = fadd fast float %z, 0xBFD6666660000000 | 
 |   %tmp191 = fcmp fast ogt float %tmp82, 0.000000e+00 | 
 |   %select3 = select fast i1 %tmp191, float %sub.i158.i.i, float %sub15.i.i.i | 
 |   br label %exit | 
 |  | 
 | exit:                                     ; preds = %if.end.i159.i.i, %if.then.i157.i.i | 
 |   %phi1 = phi float [ %add.i156.i.i, %if.then.i157.i.i ], [ %select3, %if.end.i159.i.i ] | 
 |   ret float %phi1 | 
 | } | 
 |  | 
 | ; select Cond0, X, (select Cond1, X, Y) -> select (or Cond0, Cond1), X, Y | 
 | define float @select_select_fold_select_or(float %w, float %x, float %y, float %z) { | 
 | ; CHECK-SD-LABEL: select_select_fold_select_or: | 
 | ; CHECK-SD:       // %bb.0: | 
 | ; CHECK-SD-NEXT:    fminnm s4, s1, s2 | 
 | ; CHECK-SD-NEXT:    fcmp s1, s2 | 
 | ; CHECK-SD-NEXT:    fmaxnm s2, s0, s3 | 
 | ; CHECK-SD-NEXT:    fmov s1, #0.50000000 | 
 | ; CHECK-SD-NEXT:    fccmp s4, s0, #0, ge | 
 | ; CHECK-SD-NEXT:    fadd s1, s0, s1 | 
 | ; CHECK-SD-NEXT:    fcsel s2, s0, s2, gt | 
 | ; CHECK-SD-NEXT:    fadd s4, s1, s2 | 
 | ; CHECK-SD-NEXT:    fcmp s4, s1 | 
 | ; CHECK-SD-NEXT:    b.le .LBB1_2 | 
 | ; CHECK-SD-NEXT:  // %bb.1: // %if.then.i157.i.i | 
 | ; CHECK-SD-NEXT:    fmov s0, #1.00000000 | 
 | ; CHECK-SD-NEXT:    fadd s0, s2, s0 | 
 | ; CHECK-SD-NEXT:    ret | 
 | ; CHECK-SD-NEXT:  .LBB1_2: // %if.end.i159.i.i | 
 | ; CHECK-SD-NEXT:    mov w8, #52429 // =0xcccd | 
 | ; CHECK-SD-NEXT:    mov w9, #13107 // =0x3333 | 
 | ; CHECK-SD-NEXT:    fcmp s1, #0.0 | 
 | ; CHECK-SD-NEXT:    movk w8, #48844, lsl #16 | 
 | ; CHECK-SD-NEXT:    movk w9, #48819, lsl #16 | 
 | ; CHECK-SD-NEXT:    fmov s2, w8 | 
 | ; CHECK-SD-NEXT:    fmov s4, w9 | 
 | ; CHECK-SD-NEXT:    fadd s0, s0, s2 | 
 | ; CHECK-SD-NEXT:    fadd s2, s3, s4 | 
 | ; CHECK-SD-NEXT:    fcsel s0, s0, s2, gt | 
 | ; CHECK-SD-NEXT:    ret | 
 | ; | 
 | ; CHECK-GI-LABEL: select_select_fold_select_or: | 
 | ; CHECK-GI:       // %bb.0: | 
 | ; CHECK-GI-NEXT:    fcmp s1, s2 | 
 | ; CHECK-GI-NEXT:    fcsel s4, s1, s2, mi | 
 | ; CHECK-GI-NEXT:    fcmp s0, s3 | 
 | ; CHECK-GI-NEXT:    fcsel s5, s0, s3, gt | 
 | ; CHECK-GI-NEXT:    fcmp s1, s2 | 
 | ; CHECK-GI-NEXT:    fmov s1, #0.50000000 | 
 | ; CHECK-GI-NEXT:    fcsel s2, s0, s5, mi | 
 | ; CHECK-GI-NEXT:    fcmp s4, s0 | 
 | ; CHECK-GI-NEXT:    fadd s1, s0, s1 | 
 | ; CHECK-GI-NEXT:    fcsel s2, s0, s2, gt | 
 | ; CHECK-GI-NEXT:    fadd s4, s1, s2 | 
 | ; CHECK-GI-NEXT:    fcmp s4, s1 | 
 | ; CHECK-GI-NEXT:    b.le .LBB1_2 | 
 | ; CHECK-GI-NEXT:  // %bb.1: // %if.then.i157.i.i | 
 | ; CHECK-GI-NEXT:    fmov s0, #1.00000000 | 
 | ; CHECK-GI-NEXT:    fadd s0, s2, s0 | 
 | ; CHECK-GI-NEXT:    ret | 
 | ; CHECK-GI-NEXT:  .LBB1_2: // %if.end.i159.i.i | 
 | ; CHECK-GI-NEXT:    mov w8, #52429 // =0xcccd | 
 | ; CHECK-GI-NEXT:    mov w9, #13107 // =0x3333 | 
 | ; CHECK-GI-NEXT:    fcmp s1, #0.0 | 
 | ; CHECK-GI-NEXT:    movk w8, #48844, lsl #16 | 
 | ; CHECK-GI-NEXT:    movk w9, #48819, lsl #16 | 
 | ; CHECK-GI-NEXT:    fmov s2, w8 | 
 | ; CHECK-GI-NEXT:    fmov s4, w9 | 
 | ; CHECK-GI-NEXT:    fadd s0, s0, s2 | 
 | ; CHECK-GI-NEXT:    fadd s2, s3, s4 | 
 | ; CHECK-GI-NEXT:    fcsel s0, s0, s2, gt | 
 | ; CHECK-GI-NEXT:    ret | 
 |   %tmp21 = fcmp fast olt float %x, %y | 
 |   %tmp22 = select fast i1 %tmp21, float %x, float %y | 
 |   %tmp24 = fcmp fast ogt float %tmp22, %w | 
 |   %tmp78 = fcmp fast ogt float %w, %z | 
 |   %select0 = select fast i1 %tmp78, float %w, float %z | 
 |   %select1 = select fast i1 %tmp21, float %w, float %select0 | 
 |   %select2 = select fast i1 %tmp24, float %w, float %select1 | 
 |   %tmp82 = fadd fast float %w, 5.000000e-01 | 
 |   %tmp102 = fadd fast float %tmp82, %select2 | 
 |   %cmp.i155.i.i = fcmp fast ogt float %tmp102, %tmp82 | 
 |   br i1 %cmp.i155.i.i, label %if.then.i157.i.i, label %if.end.i159.i.i | 
 |  | 
 | if.then.i157.i.i:                                 ; preds = %0 | 
 |   %add.i156.i.i = fadd fast float %select2, 1.000000e+00 | 
 |   br label %exit | 
 |  | 
 | if.end.i159.i.i:                                  ; preds = %0 | 
 |   %sub.i158.i.i = fadd fast float %w, 0xBFD99999A0000000 | 
 |   %sub15.i.i.i = fadd fast float %z, 0xBFD6666660000000 | 
 |   %tmp191 = fcmp fast ogt float %tmp82, 0.000000e+00 | 
 |   %select3 = select fast i1 %tmp191, float %sub.i158.i.i, float %sub15.i.i.i | 
 |   br label %exit | 
 |  | 
 | exit:                                     ; preds = %if.end.i159.i.i, %if.then.i157.i.i | 
 |   %phi1 = phi float [ %add.i156.i.i, %if.then.i157.i.i ], [ %select3, %if.end.i159.i.i ] | 
 |   ret float %phi1 | 
 | } | 
 | ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: | 
 | ; CHECK: {{.*}} |