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 -mtriple=i686-unknown-linux-gnu | FileCheck %s
5
6define zeroext i1 @test1(i32 %X)  nounwind {
7    %Y = trunc i32 %X to i1
8    ret i1 %Y
9}
10; CHECK-LABEL: test1:
11; CHECK: andb $1, %al
12
13define i1 @test2(i32 %val, i32 %mask) nounwind {
14entry:
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
19ret_true:
20    ret i1 true
21ret_false:
22    ret i1 false
23}
24; CHECK-LABEL: test2:
25; CHECK: btl
26
27define 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
31cond_true:
32    ret i32 21
33cond_false:
34    ret i32 42
35}
36; CHECK-LABEL: test3:
37; CHECK: testb $1, (%eax)
38
39define i32 @test4(i8* %ptr) nounwind {
40    %tmp = ptrtoint i8* %ptr to i1
41    br i1 %tmp, label %cond_true, label %cond_false
42cond_true:
43    ret i32 21
44cond_false:
45    ret i32 42
46}
47; CHECK-LABEL: test4:
48; CHECK: testb $1, 4(%esp)
49
50define i32 @test5(double %d) nounwind {
51    %tmp = fptosi double %d to i1
52    br i1 %tmp, label %cond_true, label %cond_false
53cond_true:
54    ret i32 21
55cond_false:
56    ret i32 42
57}
58; CHECK-LABEL: test5:
59; CHECK: testb $1
60