mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-04 01:11:44 +00:00
4214740c57
Fast isel used to zero extends immediates to 64 bits. This normally goes unnoticed because the value is truncated to 32 bits for output. Two cases were it is noticed: * We fail to use smaller encodings. * If the original constant was smaller than i32. In the tests using i1 constants, codegen would change to use -1, which is fine (and matches what regular isel does) since only the lowest bit is then used. Instead, this patch then changes the ir to use i8 constants, which looks more like what clang produces. llvm-svn: 234249
43 lines
949 B
LLVM
43 lines
949 B
LLVM
; RUN: llc < %s -mtriple=i686-apple-darwin10 -fast-isel -fast-isel-abort=1 | FileCheck %s
|
|
; RUN: llc < %s -mtriple=x86_64-apple-darwin10 -fast-isel -fast-isel-abort=1 | FileCheck %s
|
|
|
|
declare i32 @test1a(i32)
|
|
|
|
define i32 @test1(i32 %x) nounwind {
|
|
; CHECK-LABEL: test1:
|
|
; CHECK: andb $1, %
|
|
%y = add i32 %x, -3
|
|
%t = call i32 @test1a(i32 %y)
|
|
%s = mul i32 %t, 77
|
|
%z = trunc i32 %s to i1
|
|
br label %next
|
|
|
|
next: ; preds = %0
|
|
%u = zext i1 %z to i32
|
|
%v = add i32 %u, 1999
|
|
br label %exit
|
|
|
|
exit: ; preds = %next
|
|
ret i32 %v
|
|
}
|
|
|
|
define void @test2(i8* %a) nounwind {
|
|
entry:
|
|
; clang uses i8 constants for booleans, so we test with an i8 1.
|
|
; CHECK-LABEL: test2:
|
|
; CHECK: movb {{.*}} %al
|
|
; CHECK-NEXT: xorb $1, %al
|
|
; CHECK-NEXT: testb $1
|
|
%tmp = load i8, i8* %a, align 1
|
|
%xor = xor i8 %tmp, 1
|
|
%tobool = trunc i8 %xor to i1
|
|
br i1 %tobool, label %if.then, label %if.end
|
|
|
|
if.then:
|
|
call void @test2(i8* null)
|
|
br label %if.end
|
|
|
|
if.end:
|
|
ret void
|
|
}
|