| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | 
 | ; RUN: llc -mtriple=x86_64-unknown-linux-gnu < %s 2>&1 | FileCheck %s | 
 |  | 
 | define i32 @f(ptr %p) { | 
 | ; CHECK-LABEL: f: | 
 | ; CHECK:       # %bb.0: | 
 | ; CHECK-NEXT:    testb $8, 1(%rdi) | 
 | ; CHECK-NEXT:    je .LBB0_1 | 
 | ; CHECK-NEXT:  # %bb.2: # %B | 
 | ; CHECK-NEXT:    movl $20, %eax | 
 | ; CHECK-NEXT:    retq | 
 | ; CHECK-NEXT:  .LBB0_1: # %A | 
 | ; CHECK-NEXT:    movl $10, %eax | 
 | ; CHECK-NEXT:    retq | 
 |   %v = load i16, ptr %p, align 2 | 
 |   %and = and i16 %v, 2048 | 
 |   %cond = icmp eq i16 %and, 0 | 
 |   %cond.fr = freeze i1 %cond | 
 |   br i1 %cond.fr, label %A, label %B | 
 | A: | 
 |   ret i32 10 | 
 | B: | 
 |   ret i32 20 | 
 | } | 
 |  | 
 | define i32 @f_false(ptr %p) { | 
 | ; CHECK-LABEL: f_false: | 
 | ; CHECK:       # %bb.0: | 
 | ; CHECK-NEXT:    movb $1, %al | 
 | ; CHECK-NEXT:    testb %al, %al | 
 | ; CHECK-NEXT:    jne .LBB1_2 | 
 | ; CHECK-NEXT:  # %bb.1: # %A | 
 | ; CHECK-NEXT:    movl $10, %eax | 
 | ; CHECK-NEXT:    retq | 
 | ; CHECK-NEXT:  .LBB1_2: # %B | 
 | ; CHECK-NEXT:    movl $20, %eax | 
 | ; CHECK-NEXT:    retq | 
 |   %v = load i16, ptr %p, align 2 | 
 |   %and = and i16 %v, 2048 | 
 |   %cond = icmp ult i16 %and, 0 | 
 |   %cond.fr = freeze i1 %cond | 
 |   br i1 %cond.fr, label %A, label %B | 
 | A: | 
 |   ret i32 10 | 
 | B: | 
 |   ret i32 20 | 
 | } | 
 |  | 
 | define i32 @f_false2(ptr %p) { | 
 | ; CHECK-LABEL: f_false2: | 
 | ; CHECK:       # %bb.0: | 
 | ; CHECK-NEXT:    movb $1, %al | 
 | ; CHECK-NEXT:    testb %al, %al | 
 | ; CHECK-NEXT:    jne .LBB2_2 | 
 | ; CHECK-NEXT:  # %bb.1: # %A | 
 | ; CHECK-NEXT:    movl $10, %eax | 
 | ; CHECK-NEXT:    retq | 
 | ; CHECK-NEXT:  .LBB2_2: # %B | 
 | ; CHECK-NEXT:    movl $20, %eax | 
 | ; CHECK-NEXT:    retq | 
 |   %v = load i16, ptr %p, align 2 | 
 |   %and = and i16 %v, 2048 | 
 |   %cond = icmp ult i16 65535, %and | 
 |   %cond.fr = freeze i1 %cond | 
 |   br i1 %cond.fr, label %A, label %B | 
 | A: | 
 |   ret i32 10 | 
 | B: | 
 |   ret i32 20 | 
 | } | 
 |  | 
 | define i32 @f_false3(ptr %p) { | 
 | ; CHECK-LABEL: f_false3: | 
 | ; CHECK:       # %bb.0: | 
 | ; CHECK-NEXT:    movb $1, %al | 
 | ; CHECK-NEXT:    testb %al, %al | 
 | ; CHECK-NEXT:    jne .LBB3_2 | 
 | ; CHECK-NEXT:  # %bb.1: # %A | 
 | ; CHECK-NEXT:    movl $10, %eax | 
 | ; CHECK-NEXT:    retq | 
 | ; CHECK-NEXT:  .LBB3_2: # %B | 
 | ; CHECK-NEXT:    movl $20, %eax | 
 | ; CHECK-NEXT:    retq | 
 |   %v = load i16, ptr %p, align 2 | 
 |   %and = and i16 %v, 2048 | 
 |   %cond = icmp slt i16 32767, %and | 
 |   %cond.fr = freeze i1 %cond | 
 |   br i1 %cond.fr, label %A, label %B | 
 | A: | 
 |   ret i32 10 | 
 | B: | 
 |   ret i32 20 | 
 | } | 
 |  | 
 | define i32 @f_false4(ptr %p) { | 
 | ; CHECK-LABEL: f_false4: | 
 | ; CHECK:       # %bb.0: | 
 | ; CHECK-NEXT:    movb $1, %al | 
 | ; CHECK-NEXT:    testb %al, %al | 
 | ; CHECK-NEXT:    jne .LBB4_2 | 
 | ; CHECK-NEXT:  # %bb.1: # %A | 
 | ; CHECK-NEXT:    movl $10, %eax | 
 | ; CHECK-NEXT:    retq | 
 | ; CHECK-NEXT:  .LBB4_2: # %B | 
 | ; CHECK-NEXT:    movl $20, %eax | 
 | ; CHECK-NEXT:    retq | 
 |   %v = load i16, ptr %p, align 2 | 
 |   %and = and i16 %v, 2048 | 
 |   %cond = icmp sgt i16 %and, 32767 | 
 |   %cond.fr = freeze i1 %cond | 
 |   br i1 %cond.fr, label %A, label %B | 
 | A: | 
 |   ret i32 10 | 
 | B: | 
 |   ret i32 20 | 
 | } | 
 |  | 
 | define i32 @f_true(ptr %p) { | 
 | ; CHECK-LABEL: f_true: | 
 | ; CHECK:       # %bb.0: | 
 | ; CHECK-NEXT:    xorl %eax, %eax | 
 | ; CHECK-NEXT:    testb %al, %al | 
 | ; CHECK-NEXT:    jne .LBB5_2 | 
 | ; CHECK-NEXT:  # %bb.1: # %A | 
 | ; CHECK-NEXT:    movl $10, %eax | 
 | ; CHECK-NEXT:    retq | 
 | ; CHECK-NEXT:  .LBB5_2: # %B | 
 | ; CHECK-NEXT:    movl $20, %eax | 
 | ; CHECK-NEXT:    retq | 
 |   %v = load i16, ptr %p, align 2 | 
 |   %and = and i16 %v, 2048 | 
 |   %cond = icmp sge i16 %and, -32768 | 
 |   %cond.fr = freeze i1 %cond | 
 |   br i1 %cond.fr, label %A, label %B | 
 | A: | 
 |   ret i32 10 | 
 | B: | 
 |   ret i32 20 | 
 | } | 
 |  | 
 | define i32 @f_true2(ptr %p) { | 
 | ; CHECK-LABEL: f_true2: | 
 | ; CHECK:       # %bb.0: | 
 | ; CHECK-NEXT:    xorl %eax, %eax | 
 | ; CHECK-NEXT:    testb %al, %al | 
 | ; CHECK-NEXT:    jne .LBB6_2 | 
 | ; CHECK-NEXT:  # %bb.1: # %A | 
 | ; CHECK-NEXT:    movl $10, %eax | 
 | ; CHECK-NEXT:    retq | 
 | ; CHECK-NEXT:  .LBB6_2: # %B | 
 | ; CHECK-NEXT:    movl $20, %eax | 
 | ; CHECK-NEXT:    retq | 
 |   %v = load i16, ptr %p, align 2 | 
 |   %and = and i16 %v, 2048 | 
 |   %cond = icmp uge i16 %and, 0 | 
 |   %cond.fr = freeze i1 %cond | 
 |   br i1 %cond.fr, label %A, label %B | 
 | A: | 
 |   ret i32 10 | 
 | B: | 
 |   ret i32 20 | 
 | } | 
 |  | 
 | define i32 @f_true3(ptr %p) { | 
 | ; CHECK-LABEL: f_true3: | 
 | ; CHECK:       # %bb.0: | 
 | ; CHECK-NEXT:    xorl %eax, %eax | 
 | ; CHECK-NEXT:    testb %al, %al | 
 | ; CHECK-NEXT:    jne .LBB7_2 | 
 | ; CHECK-NEXT:  # %bb.1: # %A | 
 | ; CHECK-NEXT:    movl $10, %eax | 
 | ; CHECK-NEXT:    retq | 
 | ; CHECK-NEXT:  .LBB7_2: # %B | 
 | ; CHECK-NEXT:    movl $20, %eax | 
 | ; CHECK-NEXT:    retq | 
 |   %v = load i16, ptr %p, align 2 | 
 |   %and = and i16 %v, 2048 | 
 |   %cond = icmp ule i16 0, %and | 
 |   %cond.fr = freeze i1 %cond | 
 |   br i1 %cond.fr, label %A, label %B | 
 | A: | 
 |   ret i32 10 | 
 | B: | 
 |   ret i32 20 | 
 | } | 
 |  | 
 | define i32 @f_true4(ptr %p) { | 
 | ; CHECK-LABEL: f_true4: | 
 | ; CHECK:       # %bb.0: | 
 | ; CHECK-NEXT:    xorl %eax, %eax | 
 | ; CHECK-NEXT:    testb %al, %al | 
 | ; CHECK-NEXT:    jne .LBB8_2 | 
 | ; CHECK-NEXT:  # %bb.1: # %A | 
 | ; CHECK-NEXT:    movl $10, %eax | 
 | ; CHECK-NEXT:    retq | 
 | ; CHECK-NEXT:  .LBB8_2: # %B | 
 | ; CHECK-NEXT:    movl $20, %eax | 
 | ; CHECK-NEXT:    retq | 
 |   %v = load i16, ptr %p, align 2 | 
 |   %and = and i16 %v, 2048 | 
 |   %cond = icmp ule i16 %and, 65535 | 
 |   %cond.fr = freeze i1 %cond | 
 |   br i1 %cond.fr, label %A, label %B | 
 | A: | 
 |   ret i32 10 | 
 | B: | 
 |   ret i32 20 | 
 | } |