Comments (4)
Yet another issue is that T
may have a larger alignment than the object. Since Pointer(T)#value
assumes the pointer to have T
's alignment, code like below can in general lead to bad codegen:
# `x` has byte alignment
x = uninitialized UInt8[16]
# `y` assumes `pointerof(x).address.divisible_by?(alignof(UInt128))`
y = pointerof(x).as(UInt128*).value
%x = alloca [16 x i8], align 1
%y = alloca i128, align 16
; ...
%0 = load i128, ptr %x, align 16
store i128 %0, ptr %y, align 16
If #unsafe_as
codegens to a fresh call stack, then everything will happen to work because stack frames are 16-byte-aligned for most targets, but this is not guaranteed for release builds. Instead one must write %0 = load i128, ptr %x, align 1
, and at the moment there is no language capability that could achieve this.
from crystal.
If LLVM cannot infer any stricter alignment it will generate individual byte reads for the load i128
.
from crystal.
There is a second issue here. #unsafe_as
can trigger dynamic dispatch: (contrast with #12846)
x = 123 || nil
alias T = UInt8[4]
x.unsafe_as(T) # => StaticArray[123, 0, 0, 0]
pointerof(x).as(T*).value # => StaticArray[183, 0, 0, 0]
x.crystal_type_id # => 183
It seems we actually want the second behavior, which can be done by simply rewriting Object#unsafe_as
as a class method:
class Object
def self.unsafe_cast(obj) : self
pointerof(obj).as(self*).value
end
end
T.unsafe_cast(x) # => StaticArray[183, 0, 0, 0]
Still, this formally involves copying obj
, which is undesirable for large structs. So maybe pseudo-method is the way to go?
On the other hand, if we are keeping the dynamic dispatch then I don't know what benefits a pseudo-method or primitive would bring.
from crystal.
@HertzDevil but then we'd read the i128 unaligned, right? would it work on ARM?
Could the compiler detect this and directly align x
as if it was an UInt128? maybe through a C union? Hum, I'm probably being very naive, here 😅
from crystal.
Related Issues (20)
- Nilable `Proc` types inside libs
- Cannot return `Proc`s from top-level funs
- `ReferenceStorage(T)` is always atomic even when `T` isn't HOT 1
- Add `crystal tool method_types` for listing method parameter types HOT 4
- Passing nil to Addrinfo.getaddrinfo gives unexpected error message HOT 1
- Package installation fails on Windows due to missing SQLite3 .lib files HOT 2
- `File#truncate` raises `File::AccessDeniedError` on Windows when file was opened in append mode HOT 3
- Cache compiler results for tools
- Include more types in `crystal tool hierarchy` HOT 9
- `close_on_exec` on Windows HOT 2
- Pointer equality for `Slice` HOT 4
- Forbid variable assignment in function call HOT 4
- Captured block parameter not recognised when used inside macro HOT 2
- Internal error when using `sizeof` as generic type argument in inferred ivar type
- ECR escape sequences do not work with `-`
- Customizing or hiding `Benchmark.ips`'s output format HOT 3
- Adding a Difference method to the Math module HOT 3
- Visit the Time.local in the macro. HOT 3
- Add Makefile support `--mcpu=native` as override FLAGS to permit build crystal compiler can enable this option optional for a better performance. HOT 4
- Compiler should Emit Warning/Notes when Deduced Type Differs from Annotated Type. HOT 5
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from crystal.