1; RUN: llvm-as < %s | llvm-dis | FileCheck %s 2; RUN: verify-uselistorder %s 3 4@addr = external global i64 5@addr_as1 = external addrspace(1) global i64 6 7define i64 @add_unsigned(i64 %x, i64 %y) { 8; CHECK: %z = add nuw i64 %x, %y 9 %z = add nuw i64 %x, %y 10 ret i64 %z 11} 12 13define i64 @sub_unsigned(i64 %x, i64 %y) { 14; CHECK: %z = sub nuw i64 %x, %y 15 %z = sub nuw i64 %x, %y 16 ret i64 %z 17} 18 19define i64 @mul_unsigned(i64 %x, i64 %y) { 20; CHECK: %z = mul nuw i64 %x, %y 21 %z = mul nuw i64 %x, %y 22 ret i64 %z 23} 24 25define i64 @add_signed(i64 %x, i64 %y) { 26; CHECK: %z = add nsw i64 %x, %y 27 %z = add nsw i64 %x, %y 28 ret i64 %z 29} 30 31define i64 @sub_signed(i64 %x, i64 %y) { 32; CHECK: %z = sub nsw i64 %x, %y 33 %z = sub nsw i64 %x, %y 34 ret i64 %z 35} 36 37define i64 @mul_signed(i64 %x, i64 %y) { 38; CHECK: %z = mul nsw i64 %x, %y 39 %z = mul nsw i64 %x, %y 40 ret i64 %z 41} 42 43define i64 @add_plain(i64 %x, i64 %y) { 44; CHECK: %z = add i64 %x, %y 45 %z = add i64 %x, %y 46 ret i64 %z 47} 48 49define i64 @sub_plain(i64 %x, i64 %y) { 50; CHECK: %z = sub i64 %x, %y 51 %z = sub i64 %x, %y 52 ret i64 %z 53} 54 55define i64 @mul_plain(i64 %x, i64 %y) { 56; CHECK: %z = mul i64 %x, %y 57 %z = mul i64 %x, %y 58 ret i64 %z 59} 60 61define i64 @add_both(i64 %x, i64 %y) { 62; CHECK: %z = add nuw nsw i64 %x, %y 63 %z = add nuw nsw i64 %x, %y 64 ret i64 %z 65} 66 67define i64 @sub_both(i64 %x, i64 %y) { 68; CHECK: %z = sub nuw nsw i64 %x, %y 69 %z = sub nuw nsw i64 %x, %y 70 ret i64 %z 71} 72 73define i64 @mul_both(i64 %x, i64 %y) { 74; CHECK: %z = mul nuw nsw i64 %x, %y 75 %z = mul nuw nsw i64 %x, %y 76 ret i64 %z 77} 78 79define i64 @add_both_reversed(i64 %x, i64 %y) { 80; CHECK: %z = add nuw nsw i64 %x, %y 81 %z = add nsw nuw i64 %x, %y 82 ret i64 %z 83} 84 85define i64 @sub_both_reversed(i64 %x, i64 %y) { 86; CHECK: %z = sub nuw nsw i64 %x, %y 87 %z = sub nsw nuw i64 %x, %y 88 ret i64 %z 89} 90 91define i64 @mul_both_reversed(i64 %x, i64 %y) { 92; CHECK: %z = mul nuw nsw i64 %x, %y 93 %z = mul nsw nuw i64 %x, %y 94 ret i64 %z 95} 96 97define i64 @shl_both(i64 %x, i64 %y) { 98; CHECK: %z = shl nuw nsw i64 %x, %y 99 %z = shl nuw nsw i64 %x, %y 100 ret i64 %z 101} 102 103define i64 @sdiv_exact(i64 %x, i64 %y) { 104; CHECK: %z = sdiv exact i64 %x, %y 105 %z = sdiv exact i64 %x, %y 106 ret i64 %z 107} 108 109define i64 @sdiv_plain(i64 %x, i64 %y) { 110; CHECK: %z = sdiv i64 %x, %y 111 %z = sdiv i64 %x, %y 112 ret i64 %z 113} 114 115define i64 @udiv_exact(i64 %x, i64 %y) { 116; CHECK: %z = udiv exact i64 %x, %y 117 %z = udiv exact i64 %x, %y 118 ret i64 %z 119} 120 121define i64 @udiv_plain(i64 %x, i64 %y) { 122; CHECK: %z = udiv i64 %x, %y 123 %z = udiv i64 %x, %y 124 ret i64 %z 125} 126 127define i64 @ashr_plain(i64 %x, i64 %y) { 128; CHECK: %z = ashr i64 %x, %y 129 %z = ashr i64 %x, %y 130 ret i64 %z 131} 132 133define i64 @ashr_exact(i64 %x, i64 %y) { 134; CHECK: %z = ashr exact i64 %x, %y 135 %z = ashr exact i64 %x, %y 136 ret i64 %z 137} 138 139define i64 @lshr_plain(i64 %x, i64 %y) { 140; CHECK: %z = lshr i64 %x, %y 141 %z = lshr i64 %x, %y 142 ret i64 %z 143} 144 145define i64 @lshr_exact(i64 %x, i64 %y) { 146; CHECK: %z = lshr exact i64 %x, %y 147 %z = lshr exact i64 %x, %y 148 ret i64 %z 149} 150 151define ptr @gep_nw(ptr %p, i64 %x) { 152; CHECK: %z = getelementptr inbounds i64, ptr %p, i64 %x 153 %z = getelementptr inbounds i64, ptr %p, i64 %x 154 ret ptr %z 155} 156 157define ptr @gep_plain(ptr %p, i64 %x) { 158; CHECK: %z = getelementptr i64, ptr %p, i64 %x 159 %z = getelementptr i64, ptr %p, i64 %x 160 ret ptr %z 161} 162 163define i64 @add_both_ce() { 164; CHECK: ret i64 add nuw nsw (i64 ptrtoint (ptr @addr to i64), i64 91) 165 ret i64 add nsw nuw (i64 ptrtoint (ptr @addr to i64), i64 91) 166} 167 168define i64 @sub_both_ce() { 169; CHECK: ret i64 sub nuw nsw (i64 ptrtoint (ptr @addr to i64), i64 91) 170 ret i64 sub nsw nuw (i64 ptrtoint (ptr @addr to i64), i64 91) 171} 172 173define i64 @mul_both_ce() { 174; CHECK: ret i64 mul nuw nsw (i64 ptrtoint (ptr @addr to i64), i64 91) 175 ret i64 mul nuw nsw (i64 ptrtoint (ptr @addr to i64), i64 91) 176} 177 178define ptr @gep_nw_ce() { 179; CHECK: ret ptr getelementptr inbounds (i64, ptr @addr, i64 171) 180 ret ptr getelementptr inbounds (i64, ptr @addr, i64 171) 181} 182 183define i64 @add_plain_ce() { 184; CHECK: ret i64 add (i64 ptrtoint (ptr @addr to i64), i64 91) 185 ret i64 add (i64 ptrtoint (ptr @addr to i64), i64 91) 186} 187 188define i64 @sub_plain_ce() { 189; CHECK: ret i64 sub (i64 ptrtoint (ptr @addr to i64), i64 91) 190 ret i64 sub (i64 ptrtoint (ptr @addr to i64), i64 91) 191} 192 193define i64 @mul_plain_ce() { 194; CHECK: ret i64 mul (i64 ptrtoint (ptr @addr to i64), i64 91) 195 ret i64 mul (i64 ptrtoint (ptr @addr to i64), i64 91) 196} 197 198define ptr @gep_plain_ce() { 199; CHECK: ret ptr getelementptr (i64, ptr @addr, i64 171) 200 ret ptr getelementptr (i64, ptr @addr, i64 171) 201} 202 203define i64 @add_both_reversed_ce() { 204; CHECK: ret i64 add nuw nsw (i64 ptrtoint (ptr @addr to i64), i64 91) 205 ret i64 add nsw nuw (i64 ptrtoint (ptr @addr to i64), i64 91) 206} 207 208define i64 @sub_both_reversed_ce() { 209; CHECK: ret i64 sub nuw nsw (i64 ptrtoint (ptr @addr to i64), i64 91) 210 ret i64 sub nsw nuw (i64 ptrtoint (ptr @addr to i64), i64 91) 211} 212 213define i64 @mul_both_reversed_ce() { 214; CHECK: ret i64 mul nuw nsw (i64 ptrtoint (ptr @addr to i64), i64 91) 215 ret i64 mul nsw nuw (i64 ptrtoint (ptr @addr to i64), i64 91) 216} 217 218define i64 @add_signed_ce() { 219; CHECK: ret i64 add nsw (i64 ptrtoint (ptr @addr to i64), i64 91) 220 ret i64 add nsw (i64 ptrtoint (ptr @addr to i64), i64 91) 221} 222 223define i64 @sub_signed_ce() { 224; CHECK: ret i64 sub nsw (i64 ptrtoint (ptr @addr to i64), i64 91) 225 ret i64 sub nsw (i64 ptrtoint (ptr @addr to i64), i64 91) 226} 227 228define i64 @mul_signed_ce() { 229; CHECK: ret i64 mul nsw (i64 ptrtoint (ptr @addr to i64), i64 91) 230 ret i64 mul nsw (i64 ptrtoint (ptr @addr to i64), i64 91) 231} 232 233define i64 @add_unsigned_ce() { 234; CHECK: ret i64 add nuw (i64 ptrtoint (ptr @addr to i64), i64 91) 235 ret i64 add nuw (i64 ptrtoint (ptr @addr to i64), i64 91) 236} 237 238define i64 @sub_unsigned_ce() { 239; CHECK: ret i64 sub nuw (i64 ptrtoint (ptr @addr to i64), i64 91) 240 ret i64 sub nuw (i64 ptrtoint (ptr @addr to i64), i64 91) 241} 242 243define i64 @mul_unsigned_ce() { 244; CHECK: ret i64 mul nuw (i64 ptrtoint (ptr @addr to i64), i64 91) 245 ret i64 mul nuw (i64 ptrtoint (ptr @addr to i64), i64 91) 246} 247 248define i64 @test_zext(i32 %a) { 249; CHECK: %res = zext nneg i32 %a to i64 250 %res = zext nneg i32 %a to i64 251 ret i64 %res 252} 253 254define float @test_uitofp(i32 %a) { 255; CHECK: %res = uitofp nneg i32 %a to float 256 %res = uitofp nneg i32 %a to float 257 ret float %res 258} 259 260 261define i64 @test_or(i64 %a, i64 %b) { 262; CHECK: %res = or disjoint i64 %a, %b 263 %res = or disjoint i64 %a, %b 264 ret i64 %res 265} 266 267define i32 @test_trunc_signed(i64 %a) { 268; CHECK: %res = trunc nsw i64 %a to i32 269 %res = trunc nsw i64 %a to i32 270 ret i32 %res 271} 272 273define i32 @test_trunc_unsigned(i64 %a) { 274; CHECK: %res = trunc nuw i64 %a to i32 275 %res = trunc nuw i64 %a to i32 276 ret i32 %res 277} 278 279define i32 @test_trunc_both(i64 %a) { 280; CHECK: %res = trunc nuw nsw i64 %a to i32 281 %res = trunc nuw nsw i64 %a to i32 282 ret i32 %res 283} 284 285define i32 @test_trunc_both_reversed(i64 %a) { 286; CHECK: %res = trunc nuw nsw i64 %a to i32 287 %res = trunc nsw nuw i64 %a to i32 288 ret i32 %res 289} 290 291define <2 x i32> @test_trunc_signed_vector(<2 x i64> %a) { 292; CHECK: %res = trunc nsw <2 x i64> %a to <2 x i32> 293 %res = trunc nsw <2 x i64> %a to <2 x i32> 294 ret <2 x i32> %res 295} 296 297define <2 x i32> @test_trunc_unsigned_vector(<2 x i64> %a) { 298; CHECK: %res = trunc nuw <2 x i64> %a to <2 x i32> 299 %res = trunc nuw <2 x i64> %a to <2 x i32> 300 ret <2 x i32> %res 301} 302 303define <2 x i32> @test_trunc_both_vector(<2 x i64> %a) { 304; CHECK: %res = trunc nuw nsw <2 x i64> %a to <2 x i32> 305 %res = trunc nuw nsw <2 x i64> %a to <2 x i32> 306 ret <2 x i32> %res 307} 308 309define <2 x i32> @test_trunc_both_reversed_vector(<2 x i64> %a) { 310; CHECK: %res = trunc nuw nsw <2 x i64> %a to <2 x i32> 311 %res = trunc nsw nuw <2 x i64> %a to <2 x i32> 312 ret <2 x i32> %res 313} 314 315define i1 @test_icmp_samesign(i32 %a, i32 %b) { 316 ; CHECK: %res = icmp samesign ult i32 %a, %b 317 %res = icmp samesign ult i32 %a, %b 318 ret i1 %res 319} 320 321define <2 x i1> @test_icmp_samesign2(<2 x i32> %a, <2 x i32> %b) { 322 ; CHECK: %res = icmp samesign ult <2 x i32> %a, %b 323 %res = icmp samesign ult <2 x i32> %a, %b 324 ret <2 x i1> %res 325} 326 327define ptr @gep_nuw(ptr %p, i64 %idx) { 328; CHECK: %gep = getelementptr nuw i8, ptr %p, i64 %idx 329 %gep = getelementptr nuw i8, ptr %p, i64 %idx 330 ret ptr %gep 331} 332 333define ptr @gep_inbounds_nuw(ptr %p, i64 %idx) { 334; CHECK: %gep = getelementptr inbounds nuw i8, ptr %p, i64 %idx 335 %gep = getelementptr inbounds nuw i8, ptr %p, i64 %idx 336 ret ptr %gep 337} 338 339define ptr @gep_nusw(ptr %p, i64 %idx) { 340; CHECK: %gep = getelementptr nusw i8, ptr %p, i64 %idx 341 %gep = getelementptr nusw i8, ptr %p, i64 %idx 342 ret ptr %gep 343} 344 345; inbounds implies nusw, so the flag is not printed back. 346define ptr @gep_inbounds_nusw(ptr %p, i64 %idx) { 347; CHECK: %gep = getelementptr inbounds i8, ptr %p, i64 %idx 348 %gep = getelementptr inbounds nusw i8, ptr %p, i64 %idx 349 ret ptr %gep 350} 351 352define ptr @gep_nusw_nuw(ptr %p, i64 %idx) { 353; CHECK: %gep = getelementptr nusw nuw i8, ptr %p, i64 %idx 354 %gep = getelementptr nusw nuw i8, ptr %p, i64 %idx 355 ret ptr %gep 356} 357 358define ptr @gep_inbounds_nusw_nuw(ptr %p, i64 %idx) { 359; CHECK: %gep = getelementptr inbounds nuw i8, ptr %p, i64 %idx 360 %gep = getelementptr inbounds nusw nuw i8, ptr %p, i64 %idx 361 ret ptr %gep 362} 363 364define ptr @gep_nuw_nusw_inbounds(ptr %p, i64 %idx) { 365; CHECK: %gep = getelementptr inbounds nuw i8, ptr %p, i64 %idx 366 %gep = getelementptr nuw nusw inbounds i8, ptr %p, i64 %idx 367 ret ptr %gep 368} 369 370define ptr addrspace(1) @gep_nusw_nuw_as1(ptr addrspace(1) %p, i64 %idx) { 371; CHECK: %gep = getelementptr nusw nuw i8, ptr addrspace(1) %p, i64 %idx 372 %gep = getelementptr nusw nuw i8, ptr addrspace(1) %p, i64 %idx 373 ret ptr addrspace(1) %gep 374} 375 376define <2 x ptr> @gep_nusw_nuw_vec(<2 x ptr> %p, i64 %idx) { 377; CHECK: %gep = getelementptr nusw nuw i8, <2 x ptr> %p, i64 %idx 378 %gep = getelementptr nusw nuw i8, <2 x ptr> %p, i64 %idx 379 ret <2 x ptr> %gep 380} 381 382define ptr @const_gep_nuw() { 383; CHECK: ret ptr getelementptr nuw (i8, ptr @addr, i64 100) 384 ret ptr getelementptr nuw (i8, ptr @addr, i64 100) 385} 386 387define ptr @const_gep_inbounds_nuw() { 388; CHECK: ret ptr getelementptr inbounds nuw (i8, ptr @addr, i64 100) 389 ret ptr getelementptr inbounds nuw (i8, ptr @addr, i64 100) 390} 391 392define ptr @const_gep_nusw() { 393; CHECK: ret ptr getelementptr nusw (i8, ptr @addr, i64 100) 394 ret ptr getelementptr nusw (i8, ptr @addr, i64 100) 395} 396 397; inbounds implies nusw, so the flag is not printed back. 398define ptr @const_gep_inbounds_nusw() { 399; CHECK: ret ptr getelementptr inbounds (i8, ptr @addr, i64 100) 400 ret ptr getelementptr inbounds nusw (i8, ptr @addr, i64 100) 401} 402 403define ptr @const_gep_nusw_nuw() { 404; CHECK: ret ptr getelementptr nusw nuw (i8, ptr @addr, i64 100) 405 ret ptr getelementptr nusw nuw (i8, ptr @addr, i64 100) 406} 407 408define ptr @const_gep_inbounds_nusw_nuw() { 409; CHECK: ret ptr getelementptr inbounds nuw (i8, ptr @addr, i64 100) 410 ret ptr getelementptr inbounds nusw nuw (i8, ptr @addr, i64 100) 411} 412 413define ptr @const_gep_nuw_nusw_inbounds() { 414; CHECK: ret ptr getelementptr inbounds nuw (i8, ptr @addr, i64 100) 415 ret ptr getelementptr nuw nusw inbounds (i8, ptr @addr, i64 100) 416} 417 418define ptr @const_gep_nuw_inrange() { 419; CHECK: ret ptr getelementptr nuw inrange(-8, 16) (i8, ptr @addr, i64 100) 420 ret ptr getelementptr nuw inrange(-8, 16) (i8, ptr @addr, i64 100) 421} 422 423define ptr addrspace(1) @const_gep_nusw_nuw_as1() { 424; CHECK: ret ptr addrspace(1) getelementptr nusw nuw (i8, ptr addrspace(1) @addr_as1, i64 100) 425 ret ptr addrspace(1) getelementptr nusw nuw (i8, ptr addrspace(1) @addr_as1, i64 100) 426} 427