14967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 %s -triple=renderscript32-none-linux-gnueabi -emit-llvm -o - -Werror | FileCheck %s -check-prefix=CHECK-RS32 24967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 %s -triple=renderscript64-none-linux-android -emit-llvm -o - -Werror | FileCheck %s -check-prefix=CHECK-RS64 34967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// RUN: %clang_cc1 %s -triple=armv7-none-linux-gnueabi -emit-llvm -o - -Werror | FileCheck %s -check-prefix=CHECK-ARM 44967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 54967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Ensure that the bitcode has the correct triple 64967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS32: target triple = "armv7-none-linux-gnueabi" 74967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS64: target triple = "aarch64-none-linux-android" 84967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM: target triple = "armv7-none-linux-gnueabi" 94967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Ensure that long data type has 8-byte size and alignment in RenderScript 114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#ifdef __RENDERSCRIPT__ 124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#define LONG_WIDTH_AND_ALIGN 8 134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#else 144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#define LONG_WIDTH_AND_ALIGN 4 154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif 164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar_Static_assert(sizeof(long) == LONG_WIDTH_AND_ALIGN, "sizeof long is wrong"); 184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar_Static_assert(_Alignof(long) == LONG_WIDTH_AND_ALIGN, "sizeof long is wrong"); 194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS32: i64 @test_long(i64 %v) 214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS64: i64 @test_long(i64 %v) 224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-ARM: i32 @test_long(i32 %v) 234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarlong test_long(long v) { 244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar return v + 1; 254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} 264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// ============================================================================= 284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// Test coercion of aggregate argument or return value into integer arrays 294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// ============================================================================= 304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// ============================================================================= 324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// aggregate parameter <= 4 bytes: coerced to [a x iNN] for both 32-bit and 334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 64-bit RenderScript 344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// ============================================================================== 354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartypedef struct {char c1, c2, c3; } sChar3; 374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartypedef struct {short s; char c;} sShortChar; 384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS32: void @argChar3([3 x i8] %s.coerce) 404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS64: void @argChar3([3 x i8] %s.coerce) 414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid argChar3(sChar3 s) {} 424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS32: void @argShortChar([2 x i16] %s.coerce) 444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS64: void @argShortChar([2 x i16] %s.coerce) 454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid argShortChar(sShortChar s) {} 464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// ============================================================================= 484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// aggregate return value <= 4 bytes: coerced to [a x iNN] for both 32-bit and 494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 64-bit RenderScript 504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// ============================================================================= 514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS32: [3 x i8] @retChar3() 534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS64: [3 x i8] @retChar3() 544967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarsChar3 retChar3() { sChar3 r; return r; } 554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS32: [2 x i16] @retShortChar() 574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS64: [2 x i16] @retShortChar() 584967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarsShortChar retShortChar() { sShortChar r; return r; } 594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// ============================================================================= 614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// aggregate parameter <= 16 bytes: coerced to [a x iNN] for both 32-bit and 624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 64-bit RenderScript 634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// ============================================================================= 644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartypedef struct {short s1; char c; short s2; } sShortCharShort; 664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartypedef struct {int i; short s; char c; } sIntShortChar; 674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartypedef struct {long l; int i; } sLongInt; 684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS32: void @argShortCharShort([3 x i16] %s.coerce) 704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS64: void @argShortCharShort([3 x i16] %s.coerce) 714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid argShortCharShort(sShortCharShort s) {} 724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS32: void @argIntShortChar([2 x i32] %s.coerce) 744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS64: void @argIntShortChar([2 x i32] %s.coerce) 754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid argIntShortChar(sIntShortChar s) {} 764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS32: void @argLongInt([2 x i64] %s.coerce) 784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS64: void @argLongInt([2 x i64] %s.coerce) 794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid argLongInt(sLongInt s) {} 804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// ============================================================================= 824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// aggregate return value <= 16 bytes: returned on stack for 32-bit RenderScript 834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// and coerced to [a x iNN] for 64-bit RenderScript 844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// ============================================================================= 854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS32: void @retShortCharShort(%struct.sShortCharShort* noalias sret %agg.result) 874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS64: [3 x i16] @retShortCharShort() 884967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarsShortCharShort retShortCharShort() { sShortCharShort r; return r; } 894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS32: void @retIntShortChar(%struct.sIntShortChar* noalias sret %agg.result) 914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS64: [2 x i32] @retIntShortChar() 924967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarsIntShortChar retIntShortChar() { sIntShortChar r; return r; } 934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS32: void @retLongInt(%struct.sLongInt* noalias sret %agg.result) 954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS64: [2 x i64] @retLongInt() 964967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarsLongInt retLongInt() { sLongInt r; return r; } 974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// ============================================================================= 994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// aggregate parameter <= 64 bytes: coerced to [a x iNN] for 32-bit RenderScript 1004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// and passed on the stack for 64-bit RenderScript 1014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// ============================================================================= 1024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartypedef struct {int i1, i2, i3, i4, i5; } sInt5; 1044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartypedef struct {long l1, l2; char c; } sLong2Char; 1054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS32: void @argInt5([5 x i32] %s.coerce) 1074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS64: void @argInt5(%struct.sInt5* %s) 1084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid argInt5(sInt5 s) {} 1094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS32: void @argLong2Char([3 x i64] %s.coerce) 1114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS64: void @argLong2Char(%struct.sLong2Char* %s) 1124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid argLong2Char(sLong2Char s) {} 1134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// ============================================================================= 1154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// aggregate return value <= 64 bytes: returned on stack for both 32-bit and 1164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 64-bit RenderScript 1174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// ============================================================================= 1184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS32: void @retInt5(%struct.sInt5* noalias sret %agg.result) 1204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS64: void @retInt5(%struct.sInt5* noalias sret %agg.result) 1214967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarsInt5 retInt5() { sInt5 r; return r;} 1224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS32: void @retLong2Char(%struct.sLong2Char* noalias sret %agg.result) 1244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS64: void @retLong2Char(%struct.sLong2Char* noalias sret %agg.result) 1254967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarsLong2Char retLong2Char() { sLong2Char r; return r;} 1264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// ============================================================================= 1284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// aggregate parameters and return values > 64 bytes: passed and returned on the 1294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// stack for both 32-bit and 64-bit RenderScript 1304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// ============================================================================= 1314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainartypedef struct {long l1, l2, l3, l4, l5, l6, l7, l8, l9; } sLong9; 1334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS32: void @argLong9(%struct.sLong9* byval align 8 %s) 1354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS64: void @argLong9(%struct.sLong9* %s) 1364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarvoid argLong9(sLong9 s) {} 1374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS32: void @retLong9(%struct.sLong9* noalias sret %agg.result) 1394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// CHECK-RS64: void @retLong9(%struct.sLong9* noalias sret %agg.result) 1404967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarsLong9 retLong9() { sLong9 r; return r; } 141