authorgravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2022-01-07 22:09:35+01:00
committergravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2022-01-07 22:10:36+01:00
logd5093b6c1395d4a60a923e1911321784ce368bda
tree6bf3b906f3779e4b60b8b93b7eef8684ffcc1fea
parenta68e6cd3d73680282d06e2d7676f0bca3056c71b

Shift right is a noop if rhs is comptime known to be zero


1 files changed, 8 insertions(+), 2 deletions(-)

src/Sema.zig+8-2
...@@ -7318,8 +7318,8 @@ fn zirShr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins...@@ -7318,8 +7318,8 @@ fn zirShr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins
7318 const lhs = sema.resolveInst(extra.lhs);7318 const lhs = sema.resolveInst(extra.lhs);
7319 const rhs = sema.resolveInst(extra.rhs);7319 const rhs = sema.resolveInst(extra.rhs);
73207320
7321 if (try sema.resolveMaybeUndefVal(block, lhs_src, lhs)) |lhs_val| {7321 if (try sema.resolveMaybeUndefVal(block, rhs_src, rhs)) |rhs_val| {
7322 if (try sema.resolveMaybeUndefVal(block, rhs_src, rhs)) |rhs_val| {7322 if (try sema.resolveMaybeUndefVal(block, lhs_src, lhs)) |lhs_val| {
7323 const lhs_ty = sema.typeOf(lhs);7323 const lhs_ty = sema.typeOf(lhs);
7324 if (lhs_val.isUndef() or rhs_val.isUndef()) {7324 if (lhs_val.isUndef() or rhs_val.isUndef()) {
7325 return sema.addConstUndef(lhs_ty);7325 return sema.addConstUndef(lhs_ty);
...@@ -7331,6 +7331,12 @@ fn zirShr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins...@@ -7331,6 +7331,12 @@ fn zirShr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Ins
7331 const val = try lhs_val.shr(rhs_val, sema.arena);7331 const val = try lhs_val.shr(rhs_val, sema.arena);
7332 return sema.addConstant(lhs_ty, val);7332 return sema.addConstant(lhs_ty, val);
7333 }7333 }
7334 // Even if lhs is not comptime known, we can still deduce certain things based
7335 // on rhs.
7336 // If rhs is 0, return lhs without doing any calculations.
7337 else if (rhs_val.compareWithZero(.eq)) {
7338 return lhs;
7339 }
7334 }7340 }
73357341
7336 try sema.requireRuntimeBlock(block, src);7342 try sema.requireRuntimeBlock(block, src);