mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-25 20:59:51 +00:00
918871ee01
(eliminating some extends) if the new type of the computation is legal or if both the source and dest are illegal. This prevents instcombine from changing big chains of computation into i64 on 32-bit targets for example. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@86398 91177308-0d34-0410-b5e6-96231b3b80d8
66 lines
2.0 KiB
LLVM
66 lines
2.0 KiB
LLVM
; This tests for various complex cast elimination cases instcombine should
|
|
; handle.
|
|
|
|
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
|
|
|
|
; RUN: opt < %s -instcombine -S | FileCheck %s
|
|
|
|
define i1 @test1(i32 %X) {
|
|
%A = bitcast i32 %X to i32 ; <i32> [#uses=1]
|
|
; Convert to setne int %X, 12
|
|
%c = icmp ne i32 %A, 12 ; <i1> [#uses=1]
|
|
ret i1 %c
|
|
; CHECK: %c = icmp ne i32 %X, 12
|
|
; CHECK: ret i1 %c
|
|
}
|
|
|
|
define i1 @test2(i32 %X, i32 %Y) {
|
|
%A = bitcast i32 %X to i32 ; <i32> [#uses=1]
|
|
%B = bitcast i32 %Y to i32 ; <i32> [#uses=1]
|
|
; Convert to setne int %X, %Y
|
|
%c = icmp ne i32 %A, %B ; <i1> [#uses=1]
|
|
ret i1 %c
|
|
; CHECK: %c = icmp ne i32 %X, %Y
|
|
; CHECK: ret i1 %c
|
|
}
|
|
|
|
define i32 @test4(i32 %A) {
|
|
%B = bitcast i32 %A to i32 ; <i32> [#uses=1]
|
|
%C = shl i32 %B, 2 ; <i32> [#uses=1]
|
|
%D = bitcast i32 %C to i32 ; <i32> [#uses=1]
|
|
ret i32 %D
|
|
; CHECK: %C = shl i32 %A, 2
|
|
; CHECK: ret i32 %C
|
|
}
|
|
|
|
define i16 @test5(i16 %A) {
|
|
%B = sext i16 %A to i32 ; <i32> [#uses=1]
|
|
%C = and i32 %B, 15 ; <i32> [#uses=1]
|
|
%D = trunc i32 %C to i16 ; <i16> [#uses=1]
|
|
ret i16 %D
|
|
; CHECK: %C = and i16 %A, 15
|
|
; CHECK: ret i16 %C
|
|
}
|
|
|
|
define i1 @test6(i1 %A) {
|
|
%B = zext i1 %A to i32 ; <i32> [#uses=1]
|
|
%C = icmp ne i32 %B, 0 ; <i1> [#uses=1]
|
|
ret i1 %C
|
|
; CHECK: ret i1 %A
|
|
}
|
|
|
|
define i1 @test6a(i1 %A) {
|
|
%B = zext i1 %A to i32 ; <i32> [#uses=1]
|
|
%C = icmp ne i32 %B, -1 ; <i1> [#uses=1]
|
|
ret i1 %C
|
|
; CHECK: ret i1 true
|
|
}
|
|
|
|
define i1 @test7(i8* %A) {
|
|
%B = bitcast i8* %A to i32* ; <i32*> [#uses=1]
|
|
%C = icmp eq i32* %B, null ; <i1> [#uses=1]
|
|
ret i1 %C
|
|
; CHECK: %C = icmp eq i8* %A, null
|
|
; CHECK: ret i1 %C
|
|
}
|