@@ -49,6 +49,65 @@ define void @func5(i32 %0) {
49
49
ret void
50
50
}
51
51
52
+ define i32 @musttailCall (i32 %0 ) {
53
+ ; CHECK-LABEL: @musttailCall(
54
+ ; CHECK-NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP0:%.*]], 0
55
+ ; CHECK-NEXT: [[TMP3:%.*]] = select i1 [[TMP2]], ptr @func4, ptr @func3
56
+ ; CHECK-NEXT: [[C:%.*]] = musttail call i32 [[TMP3]](i32 0)
57
+ ; CHECK-NEXT: ret i32 [[C]]
58
+ ;
59
+ %2 = icmp ne i32 %0 , 0
60
+ %3 = select i1 %2 , ptr @func4 , ptr @func3
61
+ %c = musttail call i32 (i32 ) %3 (i32 0 )
62
+ ret i32 %c
63
+ }
64
+
65
+ declare i32 @retI32 ()
66
+ declare void @takeI32 (i32 )
67
+ declare float @retFloatTakeFloat (float )
68
+ declare void @void ()
69
+
70
+ define i32 @non_matching_fp1 (i1 %c1 , i1 %c2 , i1 %c ) {
71
+ ; CHECK-LABEL: @non_matching_fp1(
72
+ ; CHECK-NEXT: [[FP1:%.*]] = select i1 [[C1:%.*]], ptr @retI32, ptr @takeI32
73
+ ; CHECK-NEXT: [[FP2:%.*]] = select i1 [[C2:%.*]], ptr @retFloatTakeFloat, ptr @void
74
+ ; CHECK-NEXT: [[FP:%.*]] = select i1 [[C:%.*]], ptr [[FP1]], ptr [[FP2]]
75
+ ; CHECK-NEXT: [[CALL:%.*]] = call i32 [[FP]](i32 42)
76
+ ; CHECK-NEXT: ret i32 [[CALL]]
77
+ ;
78
+ %fp1 = select i1 %c1 , ptr @retI32 , ptr @takeI32
79
+ %fp2 = select i1 %c2 , ptr @retFloatTakeFloat , ptr @void
80
+ %fp = select i1 %c , ptr %fp1 , ptr %fp2
81
+ %call = call i32 %fp (i32 42 )
82
+ ret i32 %call
83
+ }
84
+
85
+ define void @non_matching_fp2 (i1 %c1 , i1 %c2 , i1 %c , ptr %unknown ) {
86
+ ; CHECK-LABEL: @non_matching_fp2(
87
+ ; CHECK-NEXT: [[FP1:%.*]] = select i1 [[C1:%.*]], ptr @retI32, ptr @takeI32
88
+ ; CHECK-NEXT: [[FP2:%.*]] = select i1 [[C2:%.*]], ptr @retFloatTakeFloat, ptr [[UNKNOWN:%.*]]
89
+ ; CHECK-NEXT: [[FP:%.*]] = select i1 [[C:%.*]], ptr [[FP1]], ptr [[FP2]]
90
+ ; CHECK-NEXT: call void [[FP]]()
91
+ ; CHECK-NEXT: ret void
92
+ ;
93
+ %fp1 = select i1 %c1 , ptr @retI32 , ptr @takeI32
94
+ %fp2 = select i1 %c2 , ptr @retFloatTakeFloat , ptr %unknown
95
+ %fp = select i1 %c , ptr %fp1 , ptr %fp2
96
+ call void %fp ()
97
+ ret void
98
+ }
99
+
100
+ define i32 @non_matching_unknown (i1 %c , ptr %fn ) {
101
+ ; CHECK-LABEL: @non_matching_unknown(
102
+ ; CHECK-NEXT: [[FP:%.*]] = select i1 [[C:%.*]], ptr @retI32, ptr [[FN:%.*]]
103
+ ; CHECK-NEXT: [[CALL:%.*]] = call i32 [[FP]](i32 42)
104
+ ; CHECK-NEXT: ret i32 [[CALL]]
105
+ ;
106
+ %fp = select i1 %c , ptr @retI32 , ptr %fn
107
+ %call = call i32 %fp (i32 42 )
108
+ ret i32 %call
109
+ }
110
+
52
111
define void @broker (ptr %unknown ) !callback !0 {
53
112
; CHECK-LABEL: @broker(
54
113
; CHECK-NEXT: call void [[UNKNOWN:%.*]]()
0 commit comments