1/**************************************************************************
2 *
3 * Copyright 2009 VMware, Inc.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28/**
29 * LLVM control flow build helpers.
30 *
31 * @author Jose Fonseca <jfonseca@vmware.com>
32 */
33
34#include "util/u_debug.h"
35#include "util/u_memory.h"
36
37#include "lp_bld_init.h"
38#include "lp_bld_type.h"
39#include "lp_bld_flow.h"
40
41
42/**
43 * Insert a new block, right where builder is pointing to.
44 *
45 * This is useful important not only for aesthetic reasons, but also for
46 * performance reasons, as frequently run blocks should be laid out next to
47 * each other and fall-throughs maximized.
48 *
49 * See also llvm/lib/Transforms/Scalar/BasicBlockPlacement.cpp.
50 *
51 * Note: this function has no dependencies on the flow code and could
52 * be used elsewhere.
53 */
54LLVMBasicBlockRef
55lp_build_insert_new_block(struct gallivm_state *gallivm, const char *name)
56{
57   LLVMBasicBlockRef current_block;
58   LLVMBasicBlockRef next_block;
59   LLVMBasicBlockRef new_block;
60
61   /* get current basic block */
62   current_block = LLVMGetInsertBlock(gallivm->builder);
63
64   /* check if there's another block after this one */
65   next_block = LLVMGetNextBasicBlock(current_block);
66   if (next_block) {
67      /* insert the new block before the next block */
68      new_block = LLVMInsertBasicBlockInContext(gallivm->context, next_block, name);
69   }
70   else {
71      /* append new block after current block */
72      LLVMValueRef function = LLVMGetBasicBlockParent(current_block);
73      new_block = LLVMAppendBasicBlockInContext(gallivm->context, function, name);
74   }
75
76   return new_block;
77}
78
79
80/**
81 * Begin a "skip" block.  Inside this block we can test a condition and
82 * skip to the end of the block if the condition is false.
83 */
84void
85lp_build_flow_skip_begin(struct lp_build_skip_context *skip,
86                         struct gallivm_state *gallivm)
87{
88   skip->gallivm = gallivm;
89   /* create new basic block */
90   skip->block = lp_build_insert_new_block(gallivm, "skip");
91}
92
93
94/**
95 * Insert code to test a condition and branch to the end of the current
96 * skip block if the condition is true.
97 */
98void
99lp_build_flow_skip_cond_break(struct lp_build_skip_context *skip,
100                              LLVMValueRef cond)
101{
102   LLVMBasicBlockRef new_block;
103
104   new_block = lp_build_insert_new_block(skip->gallivm, "");
105
106   /* if cond is true, goto skip->block, else goto new_block */
107   LLVMBuildCondBr(skip->gallivm->builder, cond, skip->block, new_block);
108
109   LLVMPositionBuilderAtEnd(skip->gallivm->builder, new_block);
110}
111
112
113void
114lp_build_flow_skip_end(struct lp_build_skip_context *skip)
115{
116   /* goto block */
117   LLVMBuildBr(skip->gallivm->builder, skip->block);
118   LLVMPositionBuilderAtEnd(skip->gallivm->builder, skip->block);
119}
120
121
122/**
123 * Check if the mask predicate is zero.  If so, jump to the end of the block.
124 */
125void
126lp_build_mask_check(struct lp_build_mask_context *mask)
127{
128   LLVMBuilderRef builder = mask->skip.gallivm->builder;
129   LLVMValueRef value;
130   LLVMValueRef cond;
131
132   value = lp_build_mask_value(mask);
133
134   /*
135    * XXX this doesn't quite generate the most efficient code possible, if
136    * the masks are vectors which have all bits set to the same value
137    * in each element.
138    * movmskps/pmovmskb would be more efficient to get the required value
139    * into ordinary reg (certainly with 8 floats).
140    * Not sure if llvm could figure that out on its own.
141    */
142
143   /* cond = (mask == 0) */
144   cond = LLVMBuildICmp(builder,
145                        LLVMIntEQ,
146                        LLVMBuildBitCast(builder, value, mask->reg_type, ""),
147                        LLVMConstNull(mask->reg_type),
148                        "");
149
150   /* if cond, goto end of block */
151   lp_build_flow_skip_cond_break(&mask->skip, cond);
152}
153
154
155/**
156 * Begin a section of code which is predicated on a mask.
157 * \param mask  the mask context, initialized here
158 * \param flow  the flow context
159 * \param type  the type of the mask
160 * \param value  storage for the mask
161 */
162void
163lp_build_mask_begin(struct lp_build_mask_context *mask,
164                    struct gallivm_state *gallivm,
165                    struct lp_type type,
166                    LLVMValueRef value)
167{
168   memset(mask, 0, sizeof *mask);
169
170   mask->reg_type = LLVMIntTypeInContext(gallivm->context, type.width * type.length);
171   mask->var_type = lp_build_int_vec_type(gallivm, type);
172   mask->var = lp_build_alloca(gallivm,
173                               mask->var_type,
174                               "execution_mask");
175
176   LLVMBuildStore(gallivm->builder, value, mask->var);
177
178   lp_build_flow_skip_begin(&mask->skip, gallivm);
179}
180
181
182LLVMValueRef
183lp_build_mask_value(struct lp_build_mask_context *mask)
184{
185   return LLVMBuildLoad2(mask->skip.gallivm->builder, mask->var_type, mask->var, "");
186}
187
188
189/**
190 * Update boolean mask with given value (bitwise AND).
191 * Typically used to update the quad's pixel alive/killed mask
192 * after depth testing, alpha testing, TGSI_OPCODE_KILL_IF, etc.
193 */
194void
195lp_build_mask_update(struct lp_build_mask_context *mask,
196                     LLVMValueRef value)
197{
198   value = LLVMBuildAnd(mask->skip.gallivm->builder,
199                        lp_build_mask_value(mask),
200                        value, "");
201   LLVMBuildStore(mask->skip.gallivm->builder, value, mask->var);
202}
203
204/*
205 * Update boolean mask with given value.
206 * Used for per-sample shading to force per-sample execution masks.
207 */
208void
209lp_build_mask_force(struct lp_build_mask_context *mask,
210                    LLVMValueRef value)
211{
212   LLVMBuildStore(mask->skip.gallivm->builder, value, mask->var);
213}
214
215/**
216 * End section of code which is predicated on a mask.
217 */
218LLVMValueRef
219lp_build_mask_end(struct lp_build_mask_context *mask)
220{
221   lp_build_flow_skip_end(&mask->skip);
222   return lp_build_mask_value(mask);
223}
224
225
226
227void
228lp_build_loop_begin(struct lp_build_loop_state *state,
229                    struct gallivm_state *gallivm,
230                    LLVMValueRef start)
231
232{
233   LLVMBuilderRef builder = gallivm->builder;
234
235   state->block = lp_build_insert_new_block(gallivm, "loop_begin");
236
237   state->counter_type = LLVMTypeOf(start);
238   state->counter_var = lp_build_alloca(gallivm, state->counter_type, "loop_counter");
239   state->gallivm = gallivm;
240
241   LLVMBuildStore(builder, start, state->counter_var);
242
243   LLVMBuildBr(builder, state->block);
244
245   LLVMPositionBuilderAtEnd(builder, state->block);
246
247   state->counter = LLVMBuildLoad2(builder, state->counter_type, state->counter_var, "");
248}
249
250
251void
252lp_build_loop_end_cond(struct lp_build_loop_state *state,
253                       LLVMValueRef end,
254                       LLVMValueRef step,
255                       LLVMIntPredicate llvm_cond)
256{
257   LLVMBuilderRef builder = state->gallivm->builder;
258   LLVMValueRef next;
259   LLVMValueRef cond;
260   LLVMBasicBlockRef after_block;
261
262   if (!step)
263      step = LLVMConstInt(LLVMTypeOf(end), 1, 0);
264
265   next = LLVMBuildAdd(builder, state->counter, step, "");
266
267   LLVMBuildStore(builder, next, state->counter_var);
268
269   cond = LLVMBuildICmp(builder, llvm_cond, next, end, "");
270
271   after_block = lp_build_insert_new_block(state->gallivm, "loop_end");
272
273   LLVMBuildCondBr(builder, cond, after_block, state->block);
274
275   LLVMPositionBuilderAtEnd(builder, after_block);
276
277   state->counter = LLVMBuildLoad2(builder, state->counter_type, state->counter_var, "");
278}
279
280void
281lp_build_loop_force_set_counter(struct lp_build_loop_state *state,
282                          LLVMValueRef end)
283{
284   LLVMBuilderRef builder = state->gallivm->builder;
285   LLVMBuildStore(builder, end, state->counter_var);
286}
287
288void
289lp_build_loop_force_reload_counter(struct lp_build_loop_state *state)
290{
291   LLVMBuilderRef builder = state->gallivm->builder;
292   state->counter = LLVMBuildLoad2(builder, state->counter_type, state->counter_var, "");
293}
294
295void
296lp_build_loop_end(struct lp_build_loop_state *state,
297                  LLVMValueRef end,
298                  LLVMValueRef step)
299{
300   lp_build_loop_end_cond(state, end, step, LLVMIntNE);
301}
302
303/**
304 * Creates a c-style for loop,
305 * contrasts lp_build_loop as this checks condition on entry
306 * e.g. for(i = start; i cmp_op end; i += step)
307 * \param state      the for loop state, initialized here
308 * \param gallivm    the gallivm state
309 * \param start      starting value of iterator
310 * \param cmp_op     comparison operator used for comparing current value with end value
311 * \param end        value used to compare against iterator
312 * \param step       value added to iterator at end of each loop
313 */
314void
315lp_build_for_loop_begin(struct lp_build_for_loop_state *state,
316                        struct gallivm_state *gallivm,
317                        LLVMValueRef start,
318                        LLVMIntPredicate cmp_op,
319                        LLVMValueRef end,
320                        LLVMValueRef step)
321{
322   LLVMBuilderRef builder = gallivm->builder;
323
324   assert(LLVMTypeOf(start) == LLVMTypeOf(end));
325   assert(LLVMTypeOf(start) == LLVMTypeOf(step));
326
327   state->begin = lp_build_insert_new_block(gallivm, "loop_begin");
328   state->step  = step;
329   state->counter_type = LLVMTypeOf(start);
330   state->counter_var = lp_build_alloca(gallivm, state->counter_type, "loop_counter");
331   state->gallivm = gallivm;
332   state->cond = cmp_op;
333   state->end = end;
334
335   LLVMBuildStore(builder, start, state->counter_var);
336   LLVMBuildBr(builder, state->begin);
337
338   LLVMPositionBuilderAtEnd(builder, state->begin);
339   state->counter = LLVMBuildLoad2(builder, state->counter_type, state->counter_var, "");
340
341   state->body = lp_build_insert_new_block(gallivm, "loop_body");
342   LLVMPositionBuilderAtEnd(builder, state->body);
343}
344
345/**
346 * End the for loop.
347 */
348void
349lp_build_for_loop_end(struct lp_build_for_loop_state *state)
350{
351   LLVMValueRef next, cond;
352   LLVMBuilderRef builder = state->gallivm->builder;
353
354   next = LLVMBuildAdd(builder, state->counter, state->step, "");
355   LLVMBuildStore(builder, next, state->counter_var);
356   LLVMBuildBr(builder, state->begin);
357
358   state->exit = lp_build_insert_new_block(state->gallivm, "loop_exit");
359
360   /*
361    * We build the comparison for the begin block here,
362    * if we build it earlier the output llvm ir is not human readable
363    * as the code produced is not in the standard begin -> body -> end order.
364    */
365   LLVMPositionBuilderAtEnd(builder, state->begin);
366   cond = LLVMBuildICmp(builder, state->cond, state->counter, state->end, "");
367   LLVMBuildCondBr(builder, cond, state->body, state->exit);
368
369   LLVMPositionBuilderAtEnd(builder, state->exit);
370}
371
372
373/*
374  Example of if/then/else building:
375
376     int x;
377     if (cond) {
378        x = 1 + 2;
379     }
380     else {
381        x = 2 + 3;
382     }
383
384  Is built with:
385
386     // x needs an alloca variable
387     x = lp_build_alloca(builder, type, "x");
388
389
390     lp_build_if(ctx, builder, cond);
391        LLVMBuildStore(LLVMBuildAdd(1, 2), x);
392     lp_build_else(ctx);
393        LLVMBuildStore(LLVMBuildAdd(2, 3). x);
394     lp_build_endif(ctx);
395
396 */
397
398
399
400/**
401 * Begin an if/else/endif construct.
402 */
403void
404lp_build_if(struct lp_build_if_state *ifthen,
405            struct gallivm_state *gallivm,
406            LLVMValueRef condition)
407{
408   LLVMBasicBlockRef block = LLVMGetInsertBlock(gallivm->builder);
409
410   memset(ifthen, 0, sizeof *ifthen);
411   ifthen->gallivm = gallivm;
412   ifthen->condition = condition;
413   ifthen->entry_block = block;
414
415   /* create endif/merge basic block for the phi functions */
416   ifthen->merge_block = lp_build_insert_new_block(gallivm, "endif-block");
417
418   /* create/insert true_block before merge_block */
419   ifthen->true_block =
420      LLVMInsertBasicBlockInContext(gallivm->context,
421                                    ifthen->merge_block,
422                                    "if-true-block");
423
424   /* successive code goes into the true block */
425   LLVMPositionBuilderAtEnd(gallivm->builder, ifthen->true_block);
426}
427
428
429/**
430 * Begin else-part of a conditional
431 */
432void
433lp_build_else(struct lp_build_if_state *ifthen)
434{
435   LLVMBuilderRef builder = ifthen->gallivm->builder;
436
437   /* Append an unconditional Br(anch) instruction on the true_block */
438   LLVMBuildBr(builder, ifthen->merge_block);
439
440   /* create/insert false_block before the merge block */
441   ifthen->false_block =
442      LLVMInsertBasicBlockInContext(ifthen->gallivm->context,
443                                    ifthen->merge_block,
444                                    "if-false-block");
445
446   /* successive code goes into the else block */
447   LLVMPositionBuilderAtEnd(builder, ifthen->false_block);
448}
449
450
451/**
452 * End a conditional.
453 */
454void
455lp_build_endif(struct lp_build_if_state *ifthen)
456{
457   LLVMBuilderRef builder = ifthen->gallivm->builder;
458
459   /* Insert branch to the merge block from current block */
460   LLVMBuildBr(builder, ifthen->merge_block);
461
462   /*
463    * Now patch in the various branch instructions.
464    */
465
466   /* Insert the conditional branch instruction at the end of entry_block */
467   LLVMPositionBuilderAtEnd(builder, ifthen->entry_block);
468   if (ifthen->false_block) {
469      /* we have an else clause */
470      LLVMBuildCondBr(builder, ifthen->condition,
471                      ifthen->true_block, ifthen->false_block);
472   }
473   else {
474      /* no else clause */
475      LLVMBuildCondBr(builder, ifthen->condition,
476                      ifthen->true_block, ifthen->merge_block);
477   }
478
479   /* Resume building code at end of the ifthen->merge_block */
480   LLVMPositionBuilderAtEnd(builder, ifthen->merge_block);
481}
482
483
484static LLVMBuilderRef
485create_builder_at_entry(struct gallivm_state *gallivm)
486{
487   LLVMBuilderRef builder = gallivm->builder;
488   LLVMBasicBlockRef current_block = LLVMGetInsertBlock(builder);
489   LLVMValueRef function = LLVMGetBasicBlockParent(current_block);
490   LLVMBasicBlockRef first_block = LLVMGetEntryBasicBlock(function);
491   LLVMValueRef first_instr = LLVMGetFirstInstruction(first_block);
492   LLVMBuilderRef first_builder = LLVMCreateBuilderInContext(gallivm->context);
493
494   if (first_instr) {
495      LLVMPositionBuilderBefore(first_builder, first_instr);
496   } else {
497      LLVMPositionBuilderAtEnd(first_builder, first_block);
498   }
499
500   return first_builder;
501}
502
503
504/**
505 * Allocate a scalar (or vector) variable.
506 *
507 * Although not strictly part of control flow, control flow has deep impact in
508 * how variables should be allocated.
509 *
510 * The mem2reg optimization pass is the recommended way to dealing with mutable
511 * variables, and SSA. It looks for allocas and if it can handle them, it
512 * promotes them, but only looks for alloca instructions in the entry block of
513 * the function. Being in the entry block guarantees that the alloca is only
514 * executed once, which makes analysis simpler.
515 *
516 * See also:
517 * - http://www.llvm.org/docs/tutorial/OCamlLangImpl7.html#memory
518 */
519LLVMValueRef
520lp_build_alloca(struct gallivm_state *gallivm,
521                LLVMTypeRef type,
522                const char *name)
523{
524   LLVMBuilderRef builder = gallivm->builder;
525   LLVMBuilderRef first_builder = create_builder_at_entry(gallivm);
526   LLVMValueRef res;
527
528   res = LLVMBuildAlloca(first_builder, type, name);
529   LLVMBuildStore(builder, LLVMConstNull(type), res);
530
531   LLVMDisposeBuilder(first_builder);
532
533   return res;
534}
535
536
537/**
538 * Like lp_build_alloca, but do not zero-initialize the variable.
539 */
540LLVMValueRef
541lp_build_alloca_undef(struct gallivm_state *gallivm,
542                      LLVMTypeRef type,
543                      const char *name)
544{
545   LLVMBuilderRef first_builder = create_builder_at_entry(gallivm);
546   LLVMValueRef res;
547
548   res = LLVMBuildAlloca(first_builder, type, name);
549
550   LLVMDisposeBuilder(first_builder);
551
552   return res;
553}
554
555
556/**
557 * Allocate an array of scalars/vectors.
558 *
559 * mem2reg pass is not capable of promoting structs or arrays to registers, but
560 * we still put it in the first block anyway as failure to put allocas in the
561 * first block may prevent the X86 backend from successfully align the stack as
562 * required.
563 *
564 * Also the scalarrepl pass is supposedly more powerful and can promote
565 * arrays in many cases.
566 *
567 * See also:
568 * - http://www.llvm.org/docs/tutorial/OCamlLangImpl7.html#memory
569 */
570LLVMValueRef
571lp_build_array_alloca(struct gallivm_state *gallivm,
572                      LLVMTypeRef type,
573                      LLVMValueRef count,
574                      const char *name)
575{
576   LLVMBuilderRef first_builder = create_builder_at_entry(gallivm);
577   LLVMValueRef res;
578
579   res = LLVMBuildArrayAlloca(first_builder, type, count, name);
580
581   LLVMDisposeBuilder(first_builder);
582
583   return res;
584}
585