Skip to content

Commit 1e5d7e2

Browse files
committed
Split clone value and instruction in the echo C API test
Summary: This is a bit of refactoring required to be able to generate instruction in forward basic block. This, for instance, is a requirement for phi in loops. Reviewers: bogner, chandlerc, echristo, dblaikie, joker.eph, Wallbraker Differential Revision: http://reviews.llvm.org/D17050 llvm-svn: 260324
1 parent 7432c04 commit 1e5d7e2

File tree

1 file changed

+77
-73
lines changed

1 file changed

+77
-73
lines changed

llvm/tools/llvm-c-test/echo.cpp

+77-73
Original file line numberDiff line numberDiff line change
@@ -125,46 +125,26 @@ static LLVMTypeRef clone_type(LLVMTypeRef Src, LLVMContextRef Ctx) {
125125
exit(-1);
126126
}
127127

128-
static LLVMValueRef clone_literal(LLVMValueRef Src, LLVMContextRef Ctx) {
129-
LLVMTypeRef Ty = clone_type(LLVMTypeOf(Src), Ctx);
130-
131-
LLVMTypeKind Kind = LLVMGetTypeKind(Ty);
132-
switch (Kind) {
133-
case LLVMIntegerTypeKind:
134-
return LLVMConstInt(Ty, LLVMConstIntGetZExtValue(Src), false);
135-
default:
136-
break;
137-
}
138-
139-
fprintf(stderr, "%d is not a supported constant typekind\n", Kind);
140-
exit(-1);
141-
}
142-
143-
static LLVMModuleRef get_module(LLVMBuilderRef Builder) {
144-
LLVMBasicBlockRef BB = LLVMGetInsertBlock(Builder);
145-
LLVMValueRef Fn = LLVMGetBasicBlockParent(BB);
146-
return LLVMGetGlobalParent(Fn);
147-
}
148-
149128
static ValueMap clone_params(LLVMValueRef Src, LLVMValueRef Dst);
150129

151130
struct FunCloner {
152131
LLVMValueRef Fun;
132+
LLVMModuleRef M;
133+
LLVMContextRef Ctx;
153134

154135
ValueMap VMap;
155136
BasicBlockMap BBMap;
156137

157138
FunCloner(LLVMValueRef Src, LLVMValueRef Dst)
158-
: Fun(Dst), VMap(clone_params(Src, Dst)) {}
139+
: Fun(Dst), M(LLVMGetGlobalParent(Fun)), Ctx(LLVMGetModuleContext(M)),
140+
VMap(clone_params(Src, Dst)) {}
159141

160142
// Try to clone everything in the llvm::Value hierarchy.
161-
LLVMValueRef CloneValue(LLVMValueRef Src, LLVMBuilderRef Builder) {
143+
LLVMValueRef CloneValue(LLVMValueRef Src) {
162144
const char *Name = LLVMGetValueName(Src);
163145

164146
// First, the value may be constant.
165147
if (LLVMIsAConstant(Src)) {
166-
LLVMModuleRef M = get_module(Builder);
167-
168148
// Maybe it is a symbol
169149
if (LLVMIsAGlobalValue(Src)) {
170150
// Try function
@@ -182,17 +162,44 @@ struct FunCloner {
182162
}
183163

184164
// Try literal
185-
LLVMContextRef Ctx = LLVMGetModuleContext(M);
186-
return clone_literal(Src, Ctx);
165+
if (LLVMIsAConstantInt(Src)) {
166+
LLVMTypeRef Ty = clone_type(LLVMTypeOf(Src), Ctx);
167+
return LLVMConstInt(Ty, LLVMConstIntGetZExtValue(Src), false);
168+
}
169+
170+
// Try undef
171+
if (LLVMIsUndef(Src))
172+
return LLVMGetUndef(clone_type(LLVMTypeOf(Src), Ctx));
173+
174+
// This kind of constant is not supported.
175+
report_fatal_error("Unsupported contant type");
176+
}
177+
178+
// Function argument should always be in the map already.
179+
if (LLVMIsAArgument(Src)) {
180+
auto i = VMap.find(Src);
181+
if (i != VMap.end())
182+
return i->second;
187183
}
188184

189-
// Try undef
190-
if (LLVMIsUndef(Src)) {
191-
LLVMContextRef Ctx = LLVMGetModuleContext(get_module(Builder));
192-
LLVMTypeRef Ty = clone_type(LLVMTypeOf(Src), Ctx);
193-
return LLVMGetUndef(Ty);
185+
if (LLVMIsAInstruction(Src)) {
186+
auto Builder = LLVMCreateBuilderInContext(Ctx);
187+
auto BB = DeclareBB(LLVMGetInstructionParent(Src));
188+
LLVMPositionBuilderAtEnd(Builder, BB);
189+
auto Dst = CloneInstruction(Src, Builder);
190+
LLVMDisposeBuilder(Builder);
191+
return Dst;
194192
}
195193

194+
fprintf(stderr, "Could not determine the type of %s\n", Name);
195+
exit(-1);
196+
}
197+
198+
LLVMValueRef CloneInstruction(LLVMValueRef Src, LLVMBuilderRef Builder) {
199+
const char *Name = LLVMGetValueName(Src);
200+
if (!LLVMIsAInstruction(Src))
201+
report_fatal_error("Expected an instruction");
202+
196203
// Check if this is something we already computed.
197204
{
198205
auto i = VMap.find(Src);
@@ -211,8 +218,7 @@ struct FunCloner {
211218
if (OpCount == 0)
212219
Dst = LLVMBuildRetVoid(Builder);
213220
else
214-
Dst = LLVMBuildRet(Builder, CloneValue(LLVMGetOperand(Src, 0),
215-
Builder));
221+
Dst = LLVMBuildRet(Builder, CloneValue(LLVMGetOperand(Src, 0)));
216222
break;
217223
}
218224
case LLVMBr: {
@@ -239,102 +245,101 @@ struct FunCloner {
239245
Dst = LLVMBuildUnreachable(Builder);
240246
break;
241247
case LLVMAdd: {
242-
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
243-
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
248+
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
249+
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
244250
Dst = LLVMBuildAdd(Builder, LHS, RHS, Name);
245251
break;
246252
}
247253
case LLVMSub: {
248-
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
249-
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
254+
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
255+
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
250256
Dst = LLVMBuildSub(Builder, LHS, RHS, Name);
251257
break;
252258
}
253259
case LLVMMul: {
254-
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
255-
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
260+
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
261+
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
256262
Dst = LLVMBuildMul(Builder, LHS, RHS, Name);
257263
break;
258264
}
259265
case LLVMUDiv: {
260-
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
261-
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
266+
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
267+
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
262268
Dst = LLVMBuildUDiv(Builder, LHS, RHS, Name);
263269
break;
264270
}
265271
case LLVMSDiv: {
266-
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
267-
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
272+
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
273+
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
268274
Dst = LLVMBuildSDiv(Builder, LHS, RHS, Name);
269275
break;
270276
}
271277
case LLVMURem: {
272-
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
273-
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
278+
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
279+
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
274280
Dst = LLVMBuildURem(Builder, LHS, RHS, Name);
275281
break;
276282
}
277283
case LLVMSRem: {
278-
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
279-
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
284+
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
285+
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
280286
Dst = LLVMBuildSRem(Builder, LHS, RHS, Name);
281287
break;
282288
}
283289
case LLVMShl: {
284-
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
285-
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
290+
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
291+
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
286292
Dst = LLVMBuildShl(Builder, LHS, RHS, Name);
287293
break;
288294
}
289295
case LLVMLShr: {
290-
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
291-
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
296+
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
297+
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
292298
Dst = LLVMBuildLShr(Builder, LHS, RHS, Name);
293299
break;
294300
}
295301
case LLVMAShr: {
296-
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
297-
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
302+
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
303+
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
298304
Dst = LLVMBuildAShr(Builder, LHS, RHS, Name);
299305
break;
300306
}
301307
case LLVMAnd: {
302-
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
303-
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
308+
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
309+
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
304310
Dst = LLVMBuildAnd(Builder, LHS, RHS, Name);
305311
break;
306312
}
307313
case LLVMOr: {
308-
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
309-
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
314+
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
315+
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
310316
Dst = LLVMBuildOr(Builder, LHS, RHS, Name);
311317
break;
312318
}
313319
case LLVMXor: {
314-
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
315-
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
320+
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
321+
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
316322
Dst = LLVMBuildXor(Builder, LHS, RHS, Name);
317323
break;
318324
}
319325
case LLVMAlloca: {
320-
LLVMContextRef Ctx = LLVMGetModuleContext(get_module(Builder));
321326
LLVMTypeRef Ty = clone_type(LLVMGetAllocatedType(Src), Ctx);
322327
Dst = LLVMBuildAlloca(Builder, Ty, Name);
323328
break;
324329
}
325330
case LLVMICmp: {
326331
LLVMIntPredicate Pred = LLVMGetICmpPredicate(Src);
327-
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0), Builder);
328-
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1), Builder);
332+
LLVMValueRef LHS = CloneValue(LLVMGetOperand(Src, 0));
333+
LLVMValueRef RHS = CloneValue(LLVMGetOperand(Src, 1));
329334
Dst = LLVMBuildICmp(Builder, Pred, LHS, RHS, Name);
330335
break;
331336
}
332337
case LLVMCall: {
333-
int ArgCount = LLVMGetNumOperands(Src) - 1;
334338
SmallVector<LLVMValueRef, 8> Args;
339+
int ArgCount = LLVMGetNumOperands(Src) - 1;
335340
for (int i = 0; i < ArgCount; i++)
336-
Args.push_back(CloneValue(LLVMGetOperand(Src, i), Builder));
337-
LLVMValueRef Fn = CloneValue(LLVMGetOperand(Src, ArgCount), Builder);
341+
Args.push_back(CloneValue(LLVMGetOperand(Src, i)));
342+
LLVMValueRef Fn = CloneValue(LLVMGetOperand(Src, ArgCount));
338343
Dst = LLVMBuildCall(Builder, Fn, Args.data(), ArgCount, Name);
339344
break;
340345
}
@@ -363,7 +368,7 @@ struct FunCloner {
363368

364369
LLVMValueRef V = LLVMBasicBlockAsValue(Src);
365370
if (!LLVMValueIsBasicBlock(V) || LLVMValueAsBasicBlock(V) != Src)
366-
report_fatal_error("Basic block is not a basic block\n");
371+
report_fatal_error("Basic block is not a basic block");
367372

368373
const char *VName = LLVMGetValueName(V);
369374
if (Name != VName)
@@ -393,14 +398,13 @@ struct FunCloner {
393398
return BB;
394399
}
395400

396-
LLVMContextRef Ctx = LLVMGetModuleContext(LLVMGetGlobalParent(Fun));
397401
LLVMBuilderRef Builder = LLVMCreateBuilderInContext(Ctx);
398402
LLVMPositionBuilderAtEnd(Builder, BB);
399403

400404
LLVMValueRef Cur = First;
401405
LLVMValueRef Next = nullptr;
402406
while(true) {
403-
CloneValue(Cur, Builder);
407+
CloneInstruction(Cur, Builder);
404408
Next = LLVMGetNextInstruction(Cur);
405409
if (Next == nullptr) {
406410
if (Cur != Last) {
@@ -540,17 +544,17 @@ static ValueMap clone_params(LLVMValueRef Src, LLVMValueRef Dst) {
540544
return VMap;
541545
}
542546

543-
static LLVMValueRef clone_function(LLVMValueRef Src, LLVMModuleRef Dst) {
547+
static LLVMValueRef clone_function(LLVMValueRef Src, LLVMModuleRef M) {
544548
const char *Name = LLVMGetValueName(Src);
545-
LLVMValueRef Fun = LLVMGetNamedFunction(Dst, Name);
549+
LLVMValueRef Fun = LLVMGetNamedFunction(M, Name);
546550
if (Fun != nullptr)
547551
return Fun;
548552

549553
LLVMTypeRef SrcTy = LLVMTypeOf(Src);
550-
LLVMTypeRef DstTy = clone_type(SrcTy, LLVMGetModuleContext(Dst));
554+
LLVMTypeRef DstTy = clone_type(SrcTy, LLVMGetModuleContext(M));
551555
LLVMTypeRef FunTy = LLVMGetElementType(DstTy);
552556

553-
Fun = LLVMAddFunction(Dst, Name, FunTy);
557+
Fun = LLVMAddFunction(M, Name, FunTy);
554558
FunCloner FC(Src, Fun);
555559
FC.CloneBBs(Src);
556560

0 commit comments

Comments
 (0)