diff options
| author | 2022-08-30 19:03:08 +0200 | |
|---|---|---|
| committer | 2022-08-30 19:03:08 +0200 | |
| commit | 25987b70e70713213a9ea91bf753130fd051ce33 (patch) | |
| tree | 6f3caf5c3dc763d2ce5b252504d45d332ed80a02 /src | |
| parent | bbb6779bed7abcc9fec24ddc513e09bc8f876481 (diff) | |
ptr diff fix
Diffstat (limited to 'src')
| -rw-r--r-- | src/llvm.cff | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/src/llvm.cff b/src/llvm.cff index 789db91..def9346 100644 --- a/src/llvm.cff +++ b/src/llvm.cff @@ -572,7 +572,8 @@ fn genexpr(f *Fn, ex *Expr) Value { let $l = gentmp(ty_isize, "ptrtoint ptr %v to %t", &lhs, ty_isize); let $r = gentmp(ty_isize, "ptrtoint ptr %v to %t", &rhs, ty_isize); let $diff = gentmp(ty_isize, "sub %t %v, %v", ty_isize, &$l, &$r); - let $res = gentmp(ty_isize, "sdiv %t %v, %v", ty_isize, &$l, &$r); + let $res = gentmp(ty_isize, "sdiv %t %v, %z", ty_isize, &$diff, + lhs.ty.u.Ptr == ty_void ? 1 : lhs.ty.u.Ptr.size); return $res; } else { assert(#f, "bad sub"); @@ -619,7 +620,6 @@ fn genexpr(f *Fn, ex *Expr) Value { case '='; let ref = genref(f, b.lhs); let rhs = convert(f, b.lhs.ty, b.rhs); - gen("; %t\n",b.lhs.ty); genstore(f, ref, rhs); return genload(f, ref); // load again because value could have overflowed when storing it @@ -1080,18 +1080,21 @@ fn genstmt(f *Fn, block *Block, st *Stmt) void { case For loop; genblock(f, loop.ini); - gen("\tbr label %%Cont%d\n", loop.id); - gen("Cont%d:", loop.id); + gen("\tbr label %%Test%d\n", loop.id); + gen("Test%d:", loop.id); nop(); let test = llvmbool(f, &loop.test); gen("\tbr i1 %v, label %%Next%d, label %%Brk%d\n", &test, loop.id, loop.id); gen("Next%d:", loop.id); nop(); genblock(f, loop.body); + gen("\tbr label %%Cont%d\n", loop.id); + gen("Cont%d:", loop.id); + nop(); if !loop.next->empty() { genexpr(f, &loop.next.Some); } - gen("\tbr label %%Cont%d\n", loop.id); + gen("\tbr label %%Test%d\n", loop.id); gen("Brk%d:",loop.id); nop(); |