aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_utility.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-11-06 17:23:33 +0000
committergingerBill <bill@gingerbill.org>2021-11-06 17:23:33 +0000
commit3d3785a7f1535cfa213f074704085f42ae02638a (patch)
treef7387a64a44d747b02b3a1ff481e9cbbd969abd2 /src/llvm_backend_utility.cpp
parent5df15b5724e1c25366d39b4bbb2f24b33068d5f6 (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.cpp25
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);