diff options
Diffstat (limited to 'test/CodeGen/X86/trunc-to-bool.ll')
-rw-r--r-- | test/CodeGen/X86/trunc-to-bool.ll | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/test/CodeGen/X86/trunc-to-bool.ll b/test/CodeGen/X86/trunc-to-bool.ll new file mode 100644 index 0000000..693b94c --- /dev/null +++ b/test/CodeGen/X86/trunc-to-bool.ll @@ -0,0 +1,32 @@ +; An integer truncation to bool should be done with an and instruction to make +; sure only the LSBit survives. Test that this is the case both for a returned +; value and as the operand of a branch. +; RUN: llvm-as < %s | llc -march=x86 && +; RUN: llvm-as < %s | llc -march=x86 | grep '\(and\)\|\(test.*1\)' | wc -l | grep 3 +bool %test1(int %X) { + %Y = trunc int %X to bool + ret bool %Y +} + +bool %test2(int %val, int %mask) { +entry: + %mask = trunc int %mask to ubyte + %shifted = ashr int %val, ubyte %mask + %anded = and int %shifted, 1 + %trunced = trunc int %anded to bool + br bool %trunced, label %ret_true, label %ret_false +ret_true: + ret bool true +ret_false: + ret bool false +} + +int %test3(sbyte* %ptr) { + %val = load sbyte* %ptr + %tmp = trunc sbyte %val to bool ; %<bool> [#uses=1] + br bool %tmp, label %cond_true, label %cond_false +cond_true: + ret int 21 +cond_false: + ret int 42 +} |