Home | History | Annotate | Download | only in X86
      1 ; An integer truncation to i1 should be done with an and instruction to make
      2 ; sure only the LSBit survives. Test that this is the case both for a returned
      3 ; value and as the operand of a branch.
      4 ; RUN: llc < %s -march=x86 | FileCheck %s
      5 
      6 define zeroext i1 @test1(i32 %X)  nounwind {
      7     %Y = trunc i32 %X to i1
      8     ret i1 %Y
      9 }
     10 ; CHECK-LABEL: test1:
     11 ; CHECK: andl $1, %eax
     12 
     13 define i1 @test2(i32 %val, i32 %mask) nounwind {
     14 entry:
     15     %shifted = ashr i32 %val, %mask
     16     %anded = and i32 %shifted, 1
     17     %trunced = trunc i32 %anded to i1
     18     br i1 %trunced, label %ret_true, label %ret_false
     19 ret_true:
     20     ret i1 true
     21 ret_false:
     22     ret i1 false
     23 }
     24 ; CHECK-LABEL: test2:
     25 ; CHECK: btl
     26 
     27 define i32 @test3(i8* %ptr) nounwind {
     28     %val = load i8, i8* %ptr
     29     %tmp = trunc i8 %val to i1
     30     br i1 %tmp, label %cond_true, label %cond_false
     31 cond_true:
     32     ret i32 21
     33 cond_false:
     34     ret i32 42
     35 }
     36 ; CHECK-LABEL: test3:
     37 ; CHECK: testb $1, (%eax)
     38 
     39 define i32 @test4(i8* %ptr) nounwind {
     40     %tmp = ptrtoint i8* %ptr to i1
     41     br i1 %tmp, label %cond_true, label %cond_false
     42 cond_true:
     43     ret i32 21
     44 cond_false:
     45     ret i32 42
     46 }
     47 ; CHECK-LABEL: test4:
     48 ; CHECK: testb $1, 4(%esp)
     49 
     50 define i32 @test5(double %d) nounwind {
     51     %tmp = fptosi double %d to i1
     52     br i1 %tmp, label %cond_true, label %cond_false
     53 cond_true:
     54     ret i32 21
     55 cond_false:
     56     ret i32 42
     57 }
     58 ; CHECK-LABEL: test5:
     59 ; CHECK: testb $1
     60