• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; Ignore stderr, we expect warnings there
2; RUN: opt < %s -instcombine 2> /dev/null -S | FileCheck %s
3
4target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128"
5
6; Simple case, argument translatable without changing the value
7declare void @test1a(i8*)
8
9define void @test1(i32* %A) {
10        call void bitcast (void (i8*)* @test1a to void (i32*)*)( i32* %A )
11        ret void
12; CHECK: %1 = bitcast i32* %A to i8*
13; CHECK: call void @test1a(i8* %1)
14; CHECK: ret void
15}
16
17; More complex case, translate argument because of resolution.  This is safe
18; because we have the body of the function
19define void @test2a(i8 %A) {
20        ret void
21; CHECK: ret void
22}
23
24define i32 @test2(i32 %A) {
25        call void bitcast (void (i8)* @test2a to void (i32)*)( i32 %A )
26        ret i32 %A
27; CHECK: %1 = trunc i32 %A to i8
28; CHECK: call void @test2a(i8 %1)
29; CHECK: ret i32 %A
30}
31
32
33; Resolving this should insert a cast from sbyte to int, following the C
34; promotion rules.
35define void @test3a(i8, ...) {unreachable }
36
37define void @test3(i8 %A, i8 %B) {
38        call void bitcast (void (i8, ...)* @test3a to void (i8, i8)*)( i8 %A, i8 %B
39)
40        ret void
41; CHECK: %1 = zext i8 %B to i32
42; CHECK: call void (i8, ...)* @test3a(i8 %A, i32 %1)
43; CHECK: ret void
44}
45
46
47; test conversion of return value...
48define i8 @test4a() {
49        ret i8 0
50; CHECK: ret i8 0
51}
52
53define i32 @test4() {
54        %X = call i32 bitcast (i8 ()* @test4a to i32 ()*)( )            ; <i32> [#uses=1]
55        ret i32 %X
56; CHECK: %X = call i8 @test4a()
57; CHECK: %1 = zext i8 %X to i32
58; CHECK: ret i32 %1
59}
60
61
62; test conversion of return value... no value conversion occurs so we can do
63; this with just a prototype...
64declare i32 @test5a()
65
66define i32 @test5() {
67        %X = call i32 @test5a( )                ; <i32> [#uses=1]
68        ret i32 %X
69; CHECK: %X = call i32 @test5a()
70; CHECK: ret i32 %X
71}
72
73
74; test addition of new arguments...
75declare i32 @test6a(i32)
76
77define i32 @test6() {
78        %X = call i32 bitcast (i32 (i32)* @test6a to i32 ()*)( )
79        ret i32 %X
80; CHECK: %X = call i32 @test6a(i32 0)
81; CHECK: ret i32 %X
82}
83
84
85; test removal of arguments, only can happen with a function body
86define void @test7a() {
87        ret void
88; CHECK: ret void
89}
90
91define void @test7() {
92        call void bitcast (void ()* @test7a to void (i32)*)( i32 5 )
93        ret void
94; CHECK: call void @test7a()
95; CHECK: ret void
96}
97
98
99; rdar://7590304
100declare void @test8a()
101
102define i8* @test8() {
103  invoke void @test8a()
104          to label %invoke.cont unwind label %try.handler
105
106invoke.cont:                                      ; preds = %entry
107  unreachable
108
109try.handler:                                      ; preds = %entry
110  %exn = landingpad {i8*, i32} personality i32 (...)* @__gxx_personality_v0
111            cleanup
112  ret i8* null
113}
114
115declare i32 @__gxx_personality_v0(...)
116
117; Don't turn this into "unreachable": the callee and caller don't agree in
118; calling conv, but the implementation of test8a may actually end up using the
119; right calling conv.
120; CHECK: @test8() {
121; CHECK-NEXT: invoke void @test8a()
122
123
124
125; Don't turn this into a direct call, because test9x is just a prototype and
126; doing so will make it varargs.
127; rdar://9038601
128declare i8* @test9x(i8*, i8*, ...) noredzone
129define i8* @test9(i8* %arg, i8* %tmp3) nounwind ssp noredzone {
130entry:
131  %call = call i8* bitcast (i8* (i8*, i8*, ...)* @test9x to i8* (i8*, i8*)*)(i8* %arg, i8* %tmp3) noredzone
132  ret i8* %call
133; CHECK: @test9(
134; CHECK: call i8* bitcast
135}
136
137