xref: /llvm-project/clang/test/CodeGenSYCL/address-space-deduction.cpp (revision 7eca38ce76d5d1915f4ab7e665964062c0b37697)
1 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
2 // RUN: %clang_cc1 -triple spir64 -fsycl-is-device -disable-llvm-passes -emit-llvm %s -o - | FileCheck %s
3 
4 // CHECK-LABEL: @_Z4testv(
5 // CHECK-NEXT:  entry:
6 // CHECK-NEXT:    [[I:%.*]] = alloca i32, align 4
7 // CHECK-NEXT:    [[PPTR:%.*]] = alloca ptr addrspace(4), align 8
8 // CHECK-NEXT:    [[IS_I_PTR:%.*]] = alloca i8, align 1
9 // CHECK-NEXT:    [[VAR23:%.*]] = alloca i32, align 4
10 // CHECK-NEXT:    [[CP:%.*]] = alloca ptr addrspace(4), align 8
11 // CHECK-NEXT:    [[ARR:%.*]] = alloca [42 x i32], align 4
12 // CHECK-NEXT:    [[CPP:%.*]] = alloca ptr addrspace(4), align 8
13 // CHECK-NEXT:    [[APTR:%.*]] = alloca ptr addrspace(4), align 8
14 // CHECK-NEXT:    [[STR:%.*]] = alloca ptr addrspace(4), align 8
15 // CHECK-NEXT:    [[PHI_STR:%.*]] = alloca ptr addrspace(4), align 8
16 // CHECK-NEXT:    [[SELECT_NULL:%.*]] = alloca ptr addrspace(4), align 8
17 // CHECK-NEXT:    [[SELECT_STR_TRIVIAL1:%.*]] = alloca ptr addrspace(4), align 8
18 // CHECK-NEXT:    [[SELECT_STR_TRIVIAL2:%.*]] = alloca ptr addrspace(4), align 8
19 // CHECK-NEXT:    [[I_ASCAST:%.*]] = addrspacecast ptr [[I]] to ptr addrspace(4)
20 // CHECK-NEXT:    [[PPTR_ASCAST:%.*]] = addrspacecast ptr [[PPTR]] to ptr addrspace(4)
21 // CHECK-NEXT:    [[IS_I_PTR_ASCAST:%.*]] = addrspacecast ptr [[IS_I_PTR]] to ptr addrspace(4)
22 // CHECK-NEXT:    [[VAR23_ASCAST:%.*]] = addrspacecast ptr [[VAR23]] to ptr addrspace(4)
23 // CHECK-NEXT:    [[CP_ASCAST:%.*]] = addrspacecast ptr [[CP]] to ptr addrspace(4)
24 // CHECK-NEXT:    [[ARR_ASCAST:%.*]] = addrspacecast ptr [[ARR]] to ptr addrspace(4)
25 // CHECK-NEXT:    [[CPP_ASCAST:%.*]] = addrspacecast ptr [[CPP]] to ptr addrspace(4)
26 // CHECK-NEXT:    [[APTR_ASCAST:%.*]] = addrspacecast ptr [[APTR]] to ptr addrspace(4)
27 // CHECK-NEXT:    [[STR_ASCAST:%.*]] = addrspacecast ptr [[STR]] to ptr addrspace(4)
28 // CHECK-NEXT:    [[PHI_STR_ASCAST:%.*]] = addrspacecast ptr [[PHI_STR]] to ptr addrspace(4)
29 // CHECK-NEXT:    [[SELECT_NULL_ASCAST:%.*]] = addrspacecast ptr [[SELECT_NULL]] to ptr addrspace(4)
30 // CHECK-NEXT:    [[SELECT_STR_TRIVIAL1_ASCAST:%.*]] = addrspacecast ptr [[SELECT_STR_TRIVIAL1]] to ptr addrspace(4)
31 // CHECK-NEXT:    [[SELECT_STR_TRIVIAL2_ASCAST:%.*]] = addrspacecast ptr [[SELECT_STR_TRIVIAL2]] to ptr addrspace(4)
32 // CHECK-NEXT:    store i32 0, ptr addrspace(4) [[I_ASCAST]], align 4
33 // CHECK-NEXT:    store ptr addrspace(4) [[I_ASCAST]], ptr addrspace(4) [[PPTR_ASCAST]], align 8
34 // CHECK-NEXT:    [[TMP0:%.*]] = load ptr addrspace(4), ptr addrspace(4) [[PPTR_ASCAST]], align 8
35 // CHECK-NEXT:    [[CMP:%.*]] = icmp eq ptr addrspace(4) [[TMP0]], [[I_ASCAST]]
36 // CHECK-NEXT:    [[STOREDV:%.*]] = zext i1 [[CMP]] to i8
37 // CHECK-NEXT:    store i8 [[STOREDV]], ptr addrspace(4) [[IS_I_PTR_ASCAST]], align 1
38 // CHECK-NEXT:    [[TMP1:%.*]] = load ptr addrspace(4), ptr addrspace(4) [[PPTR_ASCAST]], align 8
39 // CHECK-NEXT:    store i32 66, ptr addrspace(4) [[TMP1]], align 4
40 // CHECK-NEXT:    store i32 23, ptr addrspace(4) [[VAR23_ASCAST]], align 4
41 // CHECK-NEXT:    store ptr addrspace(4) [[VAR23_ASCAST]], ptr addrspace(4) [[CP_ASCAST]], align 8
42 // CHECK-NEXT:    [[TMP2:%.*]] = load ptr addrspace(4), ptr addrspace(4) [[CP_ASCAST]], align 8
43 // CHECK-NEXT:    store i8 41, ptr addrspace(4) [[TMP2]], align 1
44 // CHECK-NEXT:    [[ARRAYDECAY:%.*]] = getelementptr inbounds [42 x i32], ptr addrspace(4) [[ARR_ASCAST]], i64 0, i64 0
45 // CHECK-NEXT:    store ptr addrspace(4) [[ARRAYDECAY]], ptr addrspace(4) [[CPP_ASCAST]], align 8
46 // CHECK-NEXT:    [[TMP3:%.*]] = load ptr addrspace(4), ptr addrspace(4) [[CPP_ASCAST]], align 8
47 // CHECK-NEXT:    store i8 43, ptr addrspace(4) [[TMP3]], align 1
48 // CHECK-NEXT:    [[ARRAYDECAY1:%.*]] = getelementptr inbounds [42 x i32], ptr addrspace(4) [[ARR_ASCAST]], i64 0, i64 0
49 // CHECK-NEXT:    [[ADD_PTR:%.*]] = getelementptr inbounds i32, ptr addrspace(4) [[ARRAYDECAY1]], i64 10
50 // CHECK-NEXT:    store ptr addrspace(4) [[ADD_PTR]], ptr addrspace(4) [[APTR_ASCAST]], align 8
51 // CHECK-NEXT:    [[TMP4:%.*]] = load ptr addrspace(4), ptr addrspace(4) [[APTR_ASCAST]], align 8
52 // CHECK-NEXT:    [[ARRAYDECAY2:%.*]] = getelementptr inbounds [42 x i32], ptr addrspace(4) [[ARR_ASCAST]], i64 0, i64 0
53 // CHECK-NEXT:    [[ADD_PTR3:%.*]] = getelementptr inbounds nuw i32, ptr addrspace(4) [[ARRAYDECAY2]], i64 168
54 // CHECK-NEXT:    [[CMP4:%.*]] = icmp ult ptr addrspace(4) [[TMP4]], [[ADD_PTR3]]
55 // CHECK-NEXT:    br i1 [[CMP4]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
56 // CHECK:       if.then:
57 // CHECK-NEXT:    [[TMP5:%.*]] = load ptr addrspace(4), ptr addrspace(4) [[APTR_ASCAST]], align 8
58 // CHECK-NEXT:    store i32 44, ptr addrspace(4) [[TMP5]], align 4
59 // CHECK-NEXT:    br label [[IF_END]]
60 // CHECK:       if.end:
61 // CHECK-NEXT:    store ptr addrspace(4) addrspacecast (ptr addrspace(1) @.str to ptr addrspace(4)), ptr addrspace(4) [[STR_ASCAST]], align 8
62 // CHECK-NEXT:    [[TMP6:%.*]] = load ptr addrspace(4), ptr addrspace(4) [[STR_ASCAST]], align 8
63 // CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr addrspace(4) [[TMP6]], i64 0
64 // CHECK-NEXT:    [[TMP7:%.*]] = load i8, ptr addrspace(4) [[ARRAYIDX]], align 1
65 // CHECK-NEXT:    [[CONV:%.*]] = sext i8 [[TMP7]] to i32
66 // CHECK-NEXT:    store i32 [[CONV]], ptr addrspace(4) [[I_ASCAST]], align 4
67 // CHECK-NEXT:    [[TMP8:%.*]] = load i32, ptr addrspace(4) [[I_ASCAST]], align 4
68 // CHECK-NEXT:    [[CMP5:%.*]] = icmp sgt i32 [[TMP8]], 2
69 // CHECK-NEXT:    br i1 [[CMP5]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
70 // CHECK:       cond.true:
71 // CHECK-NEXT:    [[TMP9:%.*]] = load ptr addrspace(4), ptr addrspace(4) [[STR_ASCAST]], align 8
72 // CHECK-NEXT:    br label [[COND_END:%.*]]
73 // CHECK:       cond.false:
74 // CHECK-NEXT:    br label [[COND_END]]
75 // CHECK:       cond.end:
76 // CHECK-NEXT:    [[COND:%.*]] = phi ptr addrspace(4) [ [[TMP9]], [[COND_TRUE]] ], [ addrspacecast (ptr addrspace(1) @.str.1 to ptr addrspace(4)), [[COND_FALSE]] ]
77 // CHECK-NEXT:    store ptr addrspace(4) [[COND]], ptr addrspace(4) [[PHI_STR_ASCAST]], align 8
78 // CHECK-NEXT:    [[TMP10:%.*]] = load i32, ptr addrspace(4) [[I_ASCAST]], align 4
79 // CHECK-NEXT:    [[CMP6:%.*]] = icmp sgt i32 [[TMP10]], 2
80 // CHECK-NEXT:    [[TMP11:%.*]] = zext i1 [[CMP6]] to i64
81 // CHECK-NEXT:    [[COND7:%.*]] = select i1 [[CMP6]], ptr addrspace(4) addrspacecast (ptr addrspace(1) @.str.2 to ptr addrspace(4)), ptr addrspace(4) null
82 // CHECK-NEXT:    store ptr addrspace(4) [[COND7]], ptr addrspace(4) [[SELECT_NULL_ASCAST]], align 8
83 // CHECK-NEXT:    [[TMP12:%.*]] = load ptr addrspace(4), ptr addrspace(4) [[STR_ASCAST]], align 8
84 // CHECK-NEXT:    store ptr addrspace(4) [[TMP12]], ptr addrspace(4) [[SELECT_STR_TRIVIAL1_ASCAST]], align 8
85 // CHECK-NEXT:    store ptr addrspace(4) addrspacecast (ptr addrspace(1) @.str.1 to ptr addrspace(4)), ptr addrspace(4) [[SELECT_STR_TRIVIAL2_ASCAST]], align 8
86 // CHECK-NEXT:    ret void
87 //
88 void test() {
89   static const int foo = 0x42;
90 
91 
92   int i = 0;
93   int *pptr = &i;
94   bool is_i_ptr = (pptr == &i);
95   *pptr = foo;
96 
97   int var23 = 23;
98   char *cp = (char *)&var23;
99   *cp = 41;
100 
101   int arr[42];
102   char *cpp = (char *)arr;
103   *cpp = 43;
104 
105   int *aptr = arr + 10;
106   if (aptr < arr + sizeof(arr))
107     *aptr = 44;
108 
109   const char *str = "Hello, world!";
110 
111   i = str[0];
112 
113   const char *phi_str = i > 2 ? str : "Another hello world!";
114   (void)phi_str;
115 
116 
117 
118 
119   const char *select_null = i > 2 ? "Yet another Hello world" : nullptr;
120   (void)select_null;
121 
122   const char *select_str_trivial1 = true ? str : "Another hello world!";
123   (void)select_str_trivial1;
124 
125   const char *select_str_trivial2 = false ? str : "Another hello world!";
126   (void)select_str_trivial2;
127 }
128