• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; This tests for various complex cast elimination cases instcombine should
2; handle.
3
4target 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
6; RUN: opt < %s -instcombine -S | FileCheck %s
7
8define 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
13; CHECK: %c = icmp ne i32 %X, 12
14; CHECK: ret i1 %c
15}
16
17define 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
23; CHECK: %c = icmp ne i32 %X, %Y
24; CHECK: ret i1 %c
25}
26
27define 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
32; CHECK: %C = shl i32 %A, 2
33; CHECK: ret i32 %C
34}
35
36define 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
41; CHECK: %C = and i16 %A, 15
42; CHECK: ret i16 %C
43}
44
45define 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
49; CHECK: ret i1 %A
50}
51
52define 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
56; CHECK: ret i1 true
57}
58
59define 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
63; CHECK: %C = icmp eq i8* %A, null
64; CHECK: ret i1 %C
65}
66