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