mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-23 15:29:51 +00:00
e56d946a38
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51813 91177308-0d34-0410-b5e6-96231b3b80d8
15 lines
260 B
LLVM
15 lines
260 B
LLVM
; 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
|
|
}
|