pawosm-arm wrote:

> The bigger problem is that int->vector casts already have a different 
> meaning. Compare:
> 
> ```
> typedef int x __attribute((vector_size(8))); x f1(long long a) { return (x)a; 
> }
> typedef int y __attribute((ext_vector_type(2))); y f2(long long a) { return 
> (y)a; }
> ```

Ok, that says a lot:

```
; Function Attrs: mustprogress noinline nounwind optnone uwtable
define dso_local noundef <2 x i32> @_Z2f1x(i64 noundef %a) #0 {
entry:
  %a.addr = alloca i64, align 8
  store i64 %a, ptr %a.addr, align 8
  %0 = load i64, ptr %a.addr, align 8
  %1 = bitcast i64 %0 to <2 x i32>
  ret <2 x i32> %1
}

; Function Attrs: mustprogress noinline nounwind optnone uwtable
define dso_local noundef <2 x i32> @_Z2f2x(i64 noundef %a) #0 {
entry:
  %a.addr = alloca i64, align 8
  store i64 %a, ptr %a.addr, align 8
  %0 = load i64, ptr %a.addr, align 8
  %conv = trunc i64 %0 to i32
  %splat.splatinsert = insertelement <2 x i32> poison, i32 %conv, i64 0
  %splat.splat = shufflevector <2 x i32> %splat.splatinsert, <2 x i32> poison, 
<2 x i32> zeroinitializer
  ret <2 x i32> %splat.splat
}
```
I wonder what was the point in creating two different meanings for the same 
operation. I suspect the `ext_vector_type` supporters had also found that 
adding a new builtin did require an enormous amount of hassle, so they've 
decided to 'redefine' an existing operation for it.



https://github.com/llvm/llvm-project/pull/205432
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to