Hi Oliver,

I've done some more thinking about this, and posted an RFC to llvmdev and 
cfe-dev with the direction I'd like to pursue here longer term.

Regardless of the outcome of that more general proposal, I don't think the 
AArch64 backend is ready to cope with the code this patch produces yet. 
Allowing "half" as a function argument immediately introduces more possible 
operations to the IR we have to deal with: bitcast and load/store for one.

For example, all three of these functions exhibit poor behaviour at the moment:

    __fp16 varFloat;

    short foo(__fp16 in) {
      // __fp16 bitcast lowered to load/store
      return *(short *)∈
    }

    __fp16 bar(short in) {
      // __fp16 bitcast lowered to load/store
      return *(__fp16 *)∈
    }

    float baz() {
      // extload would be created in DAG and crash ISel. Crashes clang instead.
      return varFloat;
    }

The last one actually crashes in Clang itself, which is worrying, since I was 
expecting an LLVM backend crash and hadn't spotted anything obviously wrong 
with this patch. I've not investigated exactly what's wrong there though.

The bitcasts are particularly nasty because, as far as I can see, there *is* no 
generic way to express a "half <-> i16" bitcast when the latter type is illegal 
(as it is for us). The best I've come up with this afternoon is EXTRACT_SUBREG 
or SUBREG_TO_REG, but creating those during ISelLowering is really ugly; if you 
have any suggestions...

Cheers.

Tim.

http://reviews.llvm.org/D4456



_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to