Nikita Popov 158d72d728
[Clang] Set writable and dead_on_unwind attributes on sret arguments (#77116)
Set the writable and dead_on_unwind attributes for sret arguments. These
indicate that the argument points to writable memory (and it's legal to
introduce spurious writes to it on entry to the function) and that the
argument memory will not be used if the call unwinds.

This enables additional MemCpyOpt/DSE/LICM optimizations.
2024-01-11 09:46:54 +01:00

53 lines
1.4 KiB
C

// RUN: %clang_cc1 -target-feature +altivec -triple powerpc64-unknown-linux-gnu -emit-llvm -o - %s | FileCheck %s
typedef short v2i16 __attribute__((vector_size (4)));
typedef short v3i16 __attribute__((vector_size (6)));
typedef short v4i16 __attribute__((vector_size (8)));
typedef short v6i16 __attribute__((vector_size (12)));
typedef short v8i16 __attribute__((vector_size (16)));
typedef short v16i16 __attribute__((vector_size (32)));
struct v16i16 { v16i16 x; };
// CHECK: define{{.*}} i32 @test_v2i16(i32 noundef %x.coerce)
v2i16 test_v2i16(v2i16 x)
{
return x;
}
// CHECK: define{{.*}} i64 @test_v3i16(i64 %x.coerce)
v3i16 test_v3i16(v3i16 x)
{
return x;
}
// CHECK: define{{.*}} i64 @test_v4i16(i64 noundef %x.coerce)
v4i16 test_v4i16(v4i16 x)
{
return x;
}
// CHECK: define{{.*}} <6 x i16> @test_v6i16(<6 x i16> noundef %x)
v6i16 test_v6i16(v6i16 x)
{
return x;
}
// CHECK: define{{.*}} <8 x i16> @test_v8i16(<8 x i16> noundef %x)
v8i16 test_v8i16(v8i16 x)
{
return x;
}
// CHECK: define{{.*}} void @test_v16i16(ptr dead_on_unwind noalias writable sret(<16 x i16>) align 32 %agg.result, ptr noundef %0)
v16i16 test_v16i16(v16i16 x)
{
return x;
}
// CHECK: define{{.*}} void @test_struct_v16i16(ptr dead_on_unwind noalias writable sret(%struct.v16i16) align 32 %agg.result, [2 x i128] %x.coerce)
struct v16i16 test_struct_v16i16(struct v16i16 x)
{
return x;
}