diff options
| author | Chris Lattner <sabre@nondot.org> | 2008-05-31 09:23:55 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2008-05-31 09:23:55 +0000 |
| commit | 666d664595219ef12601e98db4c98763a0c977ee (patch) | |
| tree | 4008c054a6966c92b09b9240ac570a2385df0ed4 /llvm/test/CodeGen/CBackend | |
| parent | 930e099b9011240122a3e9b79e35cdc9efab859c (diff) | |
| download | bcm5719-llvm-666d664595219ef12601e98db4c98763a0c977ee.tar.gz bcm5719-llvm-666d664595219ef12601e98db4c98763a0c977ee.zip | |
Fix the CBE's handling of instructions whose result is an i1. Previously,
we did not truncate the value down to i1 with (x&1). This caused a problem
when the computation of x was nontrivial, for example, "add i1 1, 1" would
return 2 instead of 0.
This makes the testcase compile into:
...
llvm_cbe_t = (((llvm_cbe_r == 0u) + (llvm_cbe_r == 0u))&1);
llvm_cbe_u = (((unsigned int )(bool )llvm_cbe_t));
...
instead of:
...
llvm_cbe_t = ((llvm_cbe_r == 0u) + (llvm_cbe_r == 0u));
llvm_cbe_u = (((unsigned int )(bool )llvm_cbe_t));
...
This fixes a miscompilation of mediabench/adpcm/rawdaudio/rawdaudio and
403.gcc with the CBE, regressions from LLVM 2.2. Tanya, please pull
this into the release branch.
llvm-svn: 51813
Diffstat (limited to 'llvm/test/CodeGen/CBackend')
| -rw-r--r-- | llvm/test/CodeGen/CBackend/2008-05-31-BoolOverflow.ll | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/CBackend/2008-05-31-BoolOverflow.ll b/llvm/test/CodeGen/CBackend/2008-05-31-BoolOverflow.ll new file mode 100644 index 00000000000..52e02590078 --- /dev/null +++ b/llvm/test/CodeGen/CBackend/2008-05-31-BoolOverflow.ll @@ -0,0 +1,14 @@ +; RUN: llvm-as < %s | llc -march=c | grep {llvm_cbe_t.*&1} +define i32 @test(i32 %r) { + %s = icmp eq i32 %r, 0 + %t = add i1 %s, %s + %u = zext i1 %t to i32 + br i1 %t, label %A, label %B +A: + + ret i32 %u +B: + + %v = select i1 %t, i32 %r, i32 %u + ret i32 %v +} |

