Post and pre-decrement operators switched places for vector elements. #2010.

This commit is contained in:
Christoffer Lerno
2025-03-03 01:21:01 +01:00
parent c40198b016
commit 910fc6e364
4 changed files with 23 additions and 2 deletions

View File

@@ -18,6 +18,7 @@
### Fixes
- Fix address sanitizer to work on MachO targets (e.g. MacOS).
- Post and pre-decrement operators switched places for vector elements #2010.
### Stdlib changes
- `new_*` functions in general moved to version without `new_` prefix.

View File

@@ -2247,7 +2247,7 @@ static inline void llvm_emit_pre_post_inc_dec_vector(GenContext *c, BEValue *val
llvm_store_raw(c, &addr, vector);
// And set the return value.
llvm_value_set(value, pre ? current_res.value : new_value, element);
llvm_value_set(value, pre ? new_value : current_res.value, element);
}
/**

View File

@@ -0,0 +1,20 @@
// #target: macos-x64
module test;
fn void main()
{
float[<1>] myvar = { 3 };
myvar.x = ++myvar.x * 2;
}
/* #expect: test.ll
%0 = load <1 x float>, ptr %myvar, align 4
%1 = load <1 x float>, ptr %myvar, align 4
%2 = extractelement <1 x float> %1, i64 0
%fincdec = fadd float %2, 1.000000e+00
%3 = insertelement <1 x float> %1, float %fincdec, i64 0
store <1 x float> %3, ptr %myvar, align 4
%fmul = fmul float %fincdec, 2.000000e+00
%elemset = insertelement <1 x float> %0, float %fmul, i64 0
store <1 x float> %elemset, ptr %myvar, align 4
ret void

View File

@@ -9,7 +9,7 @@ fn void vector_inc_dec() @test
int[<3>] g = x--;
assert(x == { 0, 0, -1 });
assert(y == { 1, 0, 1 });
assert(z == 0 && zz == 1);
assert(z == 1 && zz == 0);
assert(g == { 1, 1, 0 });
}