@@ -83,3 +83,46 @@ return:
83
83
ret void
84
84
}
85
85
86
+ @a = common global i8 0 , align 1
87
+ @d = common global i8 0 , align 1
88
+
89
+ declare void @external_a ()
90
+ declare void @external_b ()
91
+ declare {i8 , i1 } @llvm.uadd.with.overflow.i8 (i8 , i8 )
92
+
93
+ define void @test_tail_call (i32* %ptr ) nounwind optsize {
94
+ ; CHECK-LABEL: test_tail_call:
95
+ ; CHECK: # %bb.0: # %entry
96
+ ; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax
97
+ ; CHECK-NEXT: addl $1, (%eax)
98
+ ; CHECK-NEXT: setae %al
99
+ ; CHECK-NEXT: addb $1, a
100
+ ; CHECK-NEXT: setb d
101
+ ; CHECK-NEXT: testb %al, %al
102
+ ; CHECK-NEXT: jne external_b # TAILCALL
103
+ ; CHECK-NEXT: # %bb.1: # %then
104
+ ; CHECK-NEXT: jmp external_a # TAILCALL
105
+ entry:
106
+ %val = load i32 , i32* %ptr
107
+ %add_ov = call {i32 , i1 } @llvm.uadd.with.overflow.i32 (i32 %val , i32 1 )
108
+ %inc = extractvalue { i32 , i1 } %add_ov , 0
109
+ store i32 %inc , i32* %ptr
110
+ %cmp = extractvalue { i32 , i1 } %add_ov , 1
111
+ %aval = load volatile i8 , i8* @a
112
+ %add_ov2 = call {i8 , i1 } @llvm.uadd.with.overflow.i8 (i8 %aval , i8 1 )
113
+ %inc2 = extractvalue { i8 , i1 } %add_ov2 , 0
114
+ store volatile i8 %inc2 , i8* @a
115
+ %cmp2 = extractvalue { i8 , i1 } %add_ov2 , 1
116
+ %conv5 = zext i1 %cmp2 to i8
117
+ store i8 %conv5 , i8* @d
118
+ br i1 %cmp , label %then , label %else
119
+
120
+ then:
121
+ tail call void @external_a ()
122
+ ret void
123
+
124
+ else:
125
+ tail call void @external_b ()
126
+ ret void
127
+ }
128
+
0 commit comments