Quuxplusone added a comment.

In D114425#3216802 <https://reviews.llvm.org/D114425#3216802>, @majnemer wrote:

> OOC, how hard would it be to generalize this builtin a little? It is nice 
> that we have builtins like `__builtin_add_overflow` which do the right thing 
> regardless of their input.
>
> It seems like it would be nice if we started to expose more intrinsics which 
> did the right thing regardless of operand width; another bonus is that it 
> composes well with language features like `_BitInt`.

IMHO such builtins are nice iff the programmer can be 100% sure that the 
compiler will interpret them the same way as a human reader. 
`__builtin_add_overflow` is easy because its first two arguments are 
"mathematical integers" (where integer promotion doesn't matter) and its third 
argument is a pointer (where integer promotion can't happen). So you can really 
throw any combination of types at it, and it'll do "the right thing" 
https://godbolt.org/z/sa7b894oa (although I admit I was surprised that this 
worked).
For a hypothetical `__builtin_bswap`, you would probably need a similar 
pointer-based interface like

  short s16 = 0xFEDC;
  __builtin_bswap(&s16);  // hypothetically
  assert(s16 == 0xDCFE);
  
  assert(__builtin_bswap16(s16) == 0x0000DCFE);
  assert(__builtin_bswap32(s16) == 0xDCFEFFFF);  // the problem to solve: s16 
eagerly promotes to int, which changes the result

The downside is that the pointer-based interface is less ergonomic than today's 
value-based signatures, and probably worse codegen at `-O0` (because the 
programmer has to materialize the operand into a named variable, and then the 
compiler won't remove that variable because you might want to debug it). The 
upside (as you said) is that a generic builtin could work with `_ExtInt` types 
and so on.



================
Comment at: clang/lib/CodeGen/CGBuiltin.cpp:2930
+  }
+  [[fallthrough]];
   case Builtin::BI__builtin_bswap16:
----------------
Re clang-format's complaint: I would either move `[[fallthrough]];` inside the 
curly braces, or (probably better) just eliminate the fallthrough by either 
duplicating line 2934 or else doing
```
  case Builtin::BI__builtin_bswap64:
  case Builtin::BI__builtin_bswap128: {
    if (BuiltinIDIfNoAsmLabel == Builtin::BI__builtin_bswap128 && 
!Target.hasInt128Type())
      CGM.ErrorUnsupported(E, "__builtin_bswap128");
    return RValue::get(emitUnaryBuiltin(*this, E, Intrinsic::bswap));
  }
```


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D114425/new/

https://reviews.llvm.org/D114425

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to