1 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 2 // RUN: %clang_cc1 -triple s390x-linux-gnu -target-cpu z14 -fzvector \ 3 // RUN: -O -emit-llvm -o - -W -Wall -Werror %s | FileCheck %s 4 5 volatile vector float ff, ff2; 6 volatile vector bool int bi; 7 8 // CHECK-LABEL: define dso_local void @test_assign( 9 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0:[0-9]+]] { 10 // CHECK-NEXT: [[ENTRY:.*:]] 11 // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3:![0-9]+]] 12 // CHECK-NEXT: store volatile <4 x float> [[TMP0]], ptr @ff, align 8, !tbaa [[TBAA3]] 13 // CHECK-NEXT: ret void 14 // 15 void test_assign (void) 16 { 17 ff = ff2; 18 } 19 20 // CHECK-LABEL: define dso_local void @test_pos( 21 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { 22 // CHECK-NEXT: [[ENTRY:.*:]] 23 // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] 24 // CHECK-NEXT: store volatile <4 x float> [[TMP0]], ptr @ff, align 8, !tbaa [[TBAA3]] 25 // CHECK-NEXT: ret void 26 // 27 void test_pos (void) 28 { 29 ff = +ff2; 30 } 31 32 // CHECK-LABEL: define dso_local void @test_neg( 33 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { 34 // CHECK-NEXT: [[ENTRY:.*:]] 35 // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] 36 // CHECK-NEXT: [[FNEG:%.*]] = fneg <4 x float> [[TMP0]] 37 // CHECK-NEXT: store volatile <4 x float> [[FNEG]], ptr @ff, align 8, !tbaa [[TBAA3]] 38 // CHECK-NEXT: ret void 39 // 40 void test_neg (void) 41 { 42 ff = -ff2; 43 } 44 45 // CHECK-LABEL: define dso_local void @test_preinc( 46 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { 47 // CHECK-NEXT: [[ENTRY:.*:]] 48 // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] 49 // CHECK-NEXT: [[INC:%.*]] = fadd <4 x float> [[TMP0]], splat (float 1.000000e+00) 50 // CHECK-NEXT: store volatile <4 x float> [[INC]], ptr @ff2, align 8, !tbaa [[TBAA3]] 51 // CHECK-NEXT: ret void 52 // 53 void test_preinc (void) 54 { 55 ++ff2; 56 } 57 58 // CHECK-LABEL: define dso_local void @test_postinc( 59 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { 60 // CHECK-NEXT: [[ENTRY:.*:]] 61 // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] 62 // CHECK-NEXT: [[INC:%.*]] = fadd <4 x float> [[TMP0]], splat (float 1.000000e+00) 63 // CHECK-NEXT: store volatile <4 x float> [[INC]], ptr @ff2, align 8, !tbaa [[TBAA3]] 64 // CHECK-NEXT: ret void 65 // 66 void test_postinc (void) 67 { 68 ff2++; 69 } 70 71 // CHECK-LABEL: define dso_local void @test_predec( 72 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { 73 // CHECK-NEXT: [[ENTRY:.*:]] 74 // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] 75 // CHECK-NEXT: [[DEC:%.*]] = fadd <4 x float> [[TMP0]], splat (float -1.000000e+00) 76 // CHECK-NEXT: store volatile <4 x float> [[DEC]], ptr @ff2, align 8, !tbaa [[TBAA3]] 77 // CHECK-NEXT: ret void 78 // 79 void test_predec (void) 80 { 81 --ff2; 82 } 83 84 // CHECK-LABEL: define dso_local void @test_postdec( 85 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { 86 // CHECK-NEXT: [[ENTRY:.*:]] 87 // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] 88 // CHECK-NEXT: [[DEC:%.*]] = fadd <4 x float> [[TMP0]], splat (float -1.000000e+00) 89 // CHECK-NEXT: store volatile <4 x float> [[DEC]], ptr @ff2, align 8, !tbaa [[TBAA3]] 90 // CHECK-NEXT: ret void 91 // 92 void test_postdec (void) 93 { 94 ff2--; 95 } 96 97 // CHECK-LABEL: define dso_local void @test_add( 98 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { 99 // CHECK-NEXT: [[ENTRY:.*:]] 100 // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] 101 // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] 102 // CHECK-NEXT: [[ADD:%.*]] = fadd <4 x float> [[TMP0]], [[TMP1]] 103 // CHECK-NEXT: store volatile <4 x float> [[ADD]], ptr @ff, align 8, !tbaa [[TBAA3]] 104 // CHECK-NEXT: ret void 105 // 106 void test_add (void) 107 { 108 ff = ff + ff2; 109 } 110 111 // CHECK-LABEL: define dso_local void @test_add_assign( 112 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { 113 // CHECK-NEXT: [[ENTRY:.*:]] 114 // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] 115 // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] 116 // CHECK-NEXT: [[ADD:%.*]] = fadd <4 x float> [[TMP0]], [[TMP1]] 117 // CHECK-NEXT: store volatile <4 x float> [[ADD]], ptr @ff, align 8, !tbaa [[TBAA3]] 118 // CHECK-NEXT: ret void 119 // 120 void test_add_assign (void) 121 { 122 ff += ff2; 123 } 124 125 // CHECK-LABEL: define dso_local void @test_sub( 126 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { 127 // CHECK-NEXT: [[ENTRY:.*:]] 128 // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] 129 // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] 130 // CHECK-NEXT: [[SUB:%.*]] = fsub <4 x float> [[TMP0]], [[TMP1]] 131 // CHECK-NEXT: store volatile <4 x float> [[SUB]], ptr @ff, align 8, !tbaa [[TBAA3]] 132 // CHECK-NEXT: ret void 133 // 134 void test_sub (void) 135 { 136 ff = ff - ff2; 137 } 138 139 // CHECK-LABEL: define dso_local void @test_sub_assign( 140 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { 141 // CHECK-NEXT: [[ENTRY:.*:]] 142 // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] 143 // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] 144 // CHECK-NEXT: [[SUB:%.*]] = fsub <4 x float> [[TMP1]], [[TMP0]] 145 // CHECK-NEXT: store volatile <4 x float> [[SUB]], ptr @ff, align 8, !tbaa [[TBAA3]] 146 // CHECK-NEXT: ret void 147 // 148 void test_sub_assign (void) 149 { 150 ff -= ff2; 151 } 152 153 // CHECK-LABEL: define dso_local void @test_mul( 154 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { 155 // CHECK-NEXT: [[ENTRY:.*:]] 156 // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] 157 // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] 158 // CHECK-NEXT: [[MUL:%.*]] = fmul <4 x float> [[TMP0]], [[TMP1]] 159 // CHECK-NEXT: store volatile <4 x float> [[MUL]], ptr @ff, align 8, !tbaa [[TBAA3]] 160 // CHECK-NEXT: ret void 161 // 162 void test_mul (void) 163 { 164 ff = ff * ff2; 165 } 166 167 // CHECK-LABEL: define dso_local void @test_mul_assign( 168 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { 169 // CHECK-NEXT: [[ENTRY:.*:]] 170 // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] 171 // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] 172 // CHECK-NEXT: [[MUL:%.*]] = fmul <4 x float> [[TMP0]], [[TMP1]] 173 // CHECK-NEXT: store volatile <4 x float> [[MUL]], ptr @ff, align 8, !tbaa [[TBAA3]] 174 // CHECK-NEXT: ret void 175 // 176 void test_mul_assign (void) 177 { 178 ff *= ff2; 179 } 180 181 // CHECK-LABEL: define dso_local void @test_div( 182 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { 183 // CHECK-NEXT: [[ENTRY:.*:]] 184 // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] 185 // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] 186 // CHECK-NEXT: [[DIV:%.*]] = fdiv <4 x float> [[TMP0]], [[TMP1]] 187 // CHECK-NEXT: store volatile <4 x float> [[DIV]], ptr @ff, align 8, !tbaa [[TBAA3]] 188 // CHECK-NEXT: ret void 189 // 190 void test_div (void) 191 { 192 ff = ff / ff2; 193 } 194 195 // CHECK-LABEL: define dso_local void @test_div_assign( 196 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { 197 // CHECK-NEXT: [[ENTRY:.*:]] 198 // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] 199 // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] 200 // CHECK-NEXT: [[DIV:%.*]] = fdiv <4 x float> [[TMP1]], [[TMP0]] 201 // CHECK-NEXT: store volatile <4 x float> [[DIV]], ptr @ff, align 8, !tbaa [[TBAA3]] 202 // CHECK-NEXT: ret void 203 // 204 void test_div_assign (void) 205 { 206 ff /= ff2; 207 } 208 209 // CHECK-LABEL: define dso_local void @test_cmpeq( 210 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { 211 // CHECK-NEXT: [[ENTRY:.*:]] 212 // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] 213 // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] 214 // CHECK-NEXT: [[CMP:%.*]] = fcmp oeq <4 x float> [[TMP0]], [[TMP1]] 215 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32> 216 // CHECK-NEXT: store volatile <4 x i32> [[SEXT]], ptr @bi, align 8, !tbaa [[TBAA3]] 217 // CHECK-NEXT: ret void 218 // 219 void test_cmpeq (void) 220 { 221 bi = ff == ff2; 222 } 223 224 // CHECK-LABEL: define dso_local void @test_cmpne( 225 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { 226 // CHECK-NEXT: [[ENTRY:.*:]] 227 // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] 228 // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] 229 // CHECK-NEXT: [[CMP:%.*]] = fcmp une <4 x float> [[TMP0]], [[TMP1]] 230 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32> 231 // CHECK-NEXT: store volatile <4 x i32> [[SEXT]], ptr @bi, align 8, !tbaa [[TBAA3]] 232 // CHECK-NEXT: ret void 233 // 234 void test_cmpne (void) 235 { 236 bi = ff != ff2; 237 } 238 239 // CHECK-LABEL: define dso_local void @test_cmpge( 240 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { 241 // CHECK-NEXT: [[ENTRY:.*:]] 242 // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] 243 // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] 244 // CHECK-NEXT: [[CMP:%.*]] = fcmp oge <4 x float> [[TMP0]], [[TMP1]] 245 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32> 246 // CHECK-NEXT: store volatile <4 x i32> [[SEXT]], ptr @bi, align 8, !tbaa [[TBAA3]] 247 // CHECK-NEXT: ret void 248 // 249 void test_cmpge (void) 250 { 251 bi = ff >= ff2; 252 } 253 254 // CHECK-LABEL: define dso_local void @test_cmpgt( 255 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { 256 // CHECK-NEXT: [[ENTRY:.*:]] 257 // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] 258 // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] 259 // CHECK-NEXT: [[CMP:%.*]] = fcmp ogt <4 x float> [[TMP0]], [[TMP1]] 260 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32> 261 // CHECK-NEXT: store volatile <4 x i32> [[SEXT]], ptr @bi, align 8, !tbaa [[TBAA3]] 262 // CHECK-NEXT: ret void 263 // 264 void test_cmpgt (void) 265 { 266 bi = ff > ff2; 267 } 268 269 // CHECK-LABEL: define dso_local void @test_cmple( 270 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { 271 // CHECK-NEXT: [[ENTRY:.*:]] 272 // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] 273 // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] 274 // CHECK-NEXT: [[CMP:%.*]] = fcmp ole <4 x float> [[TMP0]], [[TMP1]] 275 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32> 276 // CHECK-NEXT: store volatile <4 x i32> [[SEXT]], ptr @bi, align 8, !tbaa [[TBAA3]] 277 // CHECK-NEXT: ret void 278 // 279 void test_cmple (void) 280 { 281 bi = ff <= ff2; 282 } 283 284 // CHECK-LABEL: define dso_local void @test_cmplt( 285 // CHECK-SAME: ) local_unnamed_addr #[[ATTR0]] { 286 // CHECK-NEXT: [[ENTRY:.*:]] 287 // CHECK-NEXT: [[TMP0:%.*]] = load volatile <4 x float>, ptr @ff, align 8, !tbaa [[TBAA3]] 288 // CHECK-NEXT: [[TMP1:%.*]] = load volatile <4 x float>, ptr @ff2, align 8, !tbaa [[TBAA3]] 289 // CHECK-NEXT: [[CMP:%.*]] = fcmp olt <4 x float> [[TMP0]], [[TMP1]] 290 // CHECK-NEXT: [[SEXT:%.*]] = sext <4 x i1> [[CMP]] to <4 x i32> 291 // CHECK-NEXT: store volatile <4 x i32> [[SEXT]], ptr @bi, align 8, !tbaa [[TBAA3]] 292 // CHECK-NEXT: ret void 293 // 294 void test_cmplt (void) 295 { 296 bi = ff < ff2; 297 } 298 299 //. 300 // CHECK: [[TBAA3]] = !{[[META4:![0-9]+]], [[META4]], i64 0} 301 // CHECK: [[META4]] = !{!"omnipotent char", [[META5:![0-9]+]], i64 0} 302 // CHECK: [[META5]] = !{!"Simple C/C++ TBAA"} 303 //. 304