blob: 893440424c4c9a633385a85207e3b0183794616a [file] [log] [blame]
Chris Lattnere600cec2003-11-03 05:30:34 +00001; This tests for various complex cast elimination cases instcombine should
2; handle.
Chris Lattner593a74a2002-08-12 19:18:49 +00003
Chris Lattnerc77d24b2009-11-07 19:11:46 +00004target 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"
5
Edward O'Callaghancbf75a52009-10-12 07:18:14 +00006; RUN: opt < %s -instcombine -S | FileCheck %s
Chris Lattner4b474fc562002-05-15 17:22:01 +00007
Tanya Lattneraa6f5c92008-03-09 08:16:40 +00008define i1 @test1(i32 %X) {
9 %A = bitcast i32 %X to i32 ; <i32> [#uses=1]
10 ; Convert to setne int %X, 12
11 %c = icmp ne i32 %A, 12 ; <i1> [#uses=1]
12 ret i1 %c
Edward O'Callaghancbf75a52009-10-12 07:18:14 +000013; CHECK: %c = icmp ne i32 %X, 12
14; CHECK: ret i1 %c
Chris Lattner4b474fc562002-05-15 17:22:01 +000015}
16
Tanya Lattneraa6f5c92008-03-09 08:16:40 +000017define i1 @test2(i32 %X, i32 %Y) {
18 %A = bitcast i32 %X to i32 ; <i32> [#uses=1]
19 %B = bitcast i32 %Y to i32 ; <i32> [#uses=1]
20 ; Convert to setne int %X, %Y
21 %c = icmp ne i32 %A, %B ; <i1> [#uses=1]
22 ret i1 %c
Edward O'Callaghancbf75a52009-10-12 07:18:14 +000023; CHECK: %c = icmp ne i32 %X, %Y
24; CHECK: ret i1 %c
Chris Lattner4b474fc562002-05-15 17:22:01 +000025}
26
Tanya Lattneraa6f5c92008-03-09 08:16:40 +000027define i32 @test4(i32 %A) {
28 %B = bitcast i32 %A to i32 ; <i32> [#uses=1]
29 %C = shl i32 %B, 2 ; <i32> [#uses=1]
30 %D = bitcast i32 %C to i32 ; <i32> [#uses=1]
31 ret i32 %D
Edward O'Callaghancbf75a52009-10-12 07:18:14 +000032; CHECK: %C = shl i32 %A, 2
33; CHECK: ret i32 %C
Chris Lattner1d485282003-03-05 22:50:55 +000034}
35
Tanya Lattneraa6f5c92008-03-09 08:16:40 +000036define i16 @test5(i16 %A) {
37 %B = sext i16 %A to i32 ; <i32> [#uses=1]
38 %C = and i32 %B, 15 ; <i32> [#uses=1]
39 %D = trunc i32 %C to i16 ; <i16> [#uses=1]
40 ret i16 %D
Edward O'Callaghancbf75a52009-10-12 07:18:14 +000041; CHECK: %C = and i16 %A, 15
42; CHECK: ret i16 %C
Chris Lattner14f75222003-07-23 23:21:08 +000043}
Chris Lattnerc75cfac2003-11-03 03:51:26 +000044
Tanya Lattneraa6f5c92008-03-09 08:16:40 +000045define i1 @test6(i1 %A) {
46 %B = zext i1 %A to i32 ; <i32> [#uses=1]
47 %C = icmp ne i32 %B, 0 ; <i1> [#uses=1]
48 ret i1 %C
Edward O'Callaghancbf75a52009-10-12 07:18:14 +000049; CHECK: ret i1 %A
Chris Lattnerc75cfac2003-11-03 03:51:26 +000050}
Chris Lattnerefde7682003-11-03 03:52:34 +000051
Tanya Lattneraa6f5c92008-03-09 08:16:40 +000052define i1 @test6a(i1 %A) {
53 %B = zext i1 %A to i32 ; <i32> [#uses=1]
54 %C = icmp ne i32 %B, -1 ; <i1> [#uses=1]
55 ret i1 %C
Edward O'Callaghancbf75a52009-10-12 07:18:14 +000056; CHECK: ret i1 true
Chris Lattner11bea4f2003-11-03 05:08:53 +000057}
58
Tanya Lattneraa6f5c92008-03-09 08:16:40 +000059define i1 @test7(i8* %A) {
60 %B = bitcast i8* %A to i32* ; <i32*> [#uses=1]
61 %C = icmp eq i32* %B, null ; <i1> [#uses=1]
62 ret i1 %C
Edward O'Callaghancbf75a52009-10-12 07:18:14 +000063; CHECK: %C = icmp eq i8* %A, null
64; CHECK: ret i1 %C
Chris Lattnerefde7682003-11-03 03:52:34 +000065}