diff options
| author | gingerBill <bill@gingerbill.org> | 2021-11-06 17:23:33 +0000 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2021-11-06 17:23:33 +0000 |
| commit | 3d3785a7f1535cfa213f074704085f42ae02638a (patch) | |
| tree | f7387a64a44d747b02b3a1ff481e9cbbd969abd2 /src/llvm_backend_utility.cpp | |
| parent | 5df15b5724e1c25366d39b4bbb2f24b33068d5f6 (diff) | |
Remove many LLVM optimization passes which were causes UB due to them assuming C-like behaviour incompatible with Odin
Diffstat (limited to 'src/llvm_backend_utility.cpp')
| -rw-r--r-- | src/llvm_backend_utility.cpp | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/src/llvm_backend_utility.cpp b/src/llvm_backend_utility.cpp index 2ff54342a..46f7a22a3 100644 --- a/src/llvm_backend_utility.cpp +++ b/src/llvm_backend_utility.cpp @@ -1544,6 +1544,19 @@ LLVMValueRef llvm_mask_zero(lbModule *m, unsigned count) { return LLVMConstNull(LLVMVectorType(lb_type(m, t_u32), count)); } +#define LLVM_VECTOR_DUMMY_VALUE(type) LLVMGetUndef((type)) +// #define LLVM_VECTOR_DUMMY_VALUE(type) LLVMConstNull((type)) + + +LLVMValueRef llvm_basic_shuffle(lbProcedure *p, LLVMValueRef vector, LLVMValueRef mask) { + return LLVMBuildShuffleVector(p->builder, vector, LLVM_VECTOR_DUMMY_VALUE(LLVMTypeOf(vector)), mask, ""); +} +LLVMValueRef llvm_basic_const_shuffle(LLVMValueRef vector, LLVMValueRef mask) { + return LLVMConstShuffleVector(vector, LLVM_VECTOR_DUMMY_VALUE(LLVMTypeOf(vector)), mask); +} + + + LLVMValueRef llvm_vector_broadcast(lbProcedure *p, LLVMValueRef value, unsigned count) { GB_ASSERT(count > 0); if (LLVMIsConstant(value)) { @@ -1552,7 +1565,7 @@ LLVMValueRef llvm_vector_broadcast(lbProcedure *p, LLVMValueRef value, unsigned return single; } LLVMValueRef mask = llvm_mask_zero(p->module, count); - return LLVMConstShuffleVector(single, LLVMGetUndef(LLVMTypeOf(single)), mask); + return llvm_basic_const_shuffle(single, mask); } LLVMTypeRef single_type = LLVMVectorType(LLVMTypeOf(value), 1); @@ -1561,7 +1574,7 @@ LLVMValueRef llvm_vector_broadcast(lbProcedure *p, LLVMValueRef value, unsigned return single; } LLVMValueRef mask = llvm_mask_zero(p->module, count); - return LLVMBuildShuffleVector(p->builder, single, LLVMGetUndef(LLVMTypeOf(single)), mask, ""); + return llvm_basic_shuffle(p, single, mask); } LLVMValueRef llvm_vector_shuffle_reduction(lbProcedure *p, LLVMValueRef value, LLVMOpcode op_code) { @@ -1582,8 +1595,8 @@ LLVMValueRef llvm_vector_shuffle_reduction(lbProcedure *p, LLVMValueRef value, L LLVMValueRef rhs_mask = llvm_mask_iota(p->module, mask_len, mask_len); GB_ASSERT(LLVMTypeOf(lhs_mask) == LLVMTypeOf(rhs_mask)); - LLVMValueRef lhs = LLVMBuildShuffleVector(p->builder, value, LLVMGetUndef(LLVMTypeOf(value)), lhs_mask, ""); - LLVMValueRef rhs = LLVMBuildShuffleVector(p->builder, value, LLVMGetUndef(LLVMTypeOf(value)), rhs_mask, ""); + LLVMValueRef lhs = llvm_basic_shuffle(p, value, lhs_mask); + LLVMValueRef rhs = llvm_basic_shuffle(p, value, rhs_mask); GB_ASSERT(LLVMTypeOf(lhs) == LLVMTypeOf(rhs)); value = LLVMBuildBinOp(p->builder, op_code, lhs, rhs, ""); @@ -1675,8 +1688,8 @@ LLVMValueRef llvm_vector_reduce_add(lbProcedure *p, LLVMValueRef value) { GB_ASSERT(len_pow_2 < len); LLVMValueRef lower_mask = llvm_mask_iota(p->module, 0, len_pow_2); LLVMValueRef upper_mask = llvm_mask_iota(p->module, len_pow_2, len-len_pow_2); - LLVMValueRef lower = LLVMBuildShuffleVector(p->builder, value, LLVMGetUndef(LLVMTypeOf(value)), lower_mask, ""); - LLVMValueRef upper = LLVMBuildShuffleVector(p->builder, value, LLVMGetUndef(LLVMTypeOf(value)), upper_mask, ""); + LLVMValueRef lower = llvm_basic_shuffle(p, value, lower_mask); + LLVMValueRef upper = llvm_basic_shuffle(p, value, upper_mask); upper = llvm_vector_expand_to_power_of_two(p, upper); LLVMValueRef lower_reduced = llvm_vector_shuffle_reduction(p, lower, op_code); |