Skip to content

Commit afbfb86

Browse files
committed
[ARM] Add tests showing missing truncation
1 parent 51a48e3 commit afbfb86

File tree

1 file changed

+248
-0
lines changed

1 file changed

+248
-0
lines changed

llvm/test/CodeGen/ARM/thumbv6m-atomic32.ll

Lines changed: 248 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,3 +359,251 @@ define i64 @cmpxchg64(ptr %p) {
359359
%res.0 = extractvalue { i64, i1 } %res, 0
360360
ret i64 %res.0
361361
}
362+
363+
define void @trunc_store8(ptr %p, i32 %val) {
364+
; NO-ATOMIC32-LABEL: trunc_store8:
365+
; NO-ATOMIC32: @ %bb.0:
366+
; NO-ATOMIC32-NEXT: .save {r7, lr}
367+
; NO-ATOMIC32-NEXT: push {r7, lr}
368+
; NO-ATOMIC32-NEXT: movs r2, #5
369+
; NO-ATOMIC32-NEXT: bl __atomic_store_1
370+
; NO-ATOMIC32-NEXT: pop {r7, pc}
371+
;
372+
; ATOMIC32-LABEL: trunc_store8:
373+
; ATOMIC32: @ %bb.0:
374+
; ATOMIC32-NEXT: dmb sy
375+
; ATOMIC32-NEXT: strb r1, [r0]
376+
; ATOMIC32-NEXT: dmb sy
377+
; ATOMIC32-NEXT: bx lr
378+
%trunc = trunc i32 %val to i8
379+
store atomic i8 %trunc, ptr %p seq_cst, align 1
380+
ret void
381+
}
382+
383+
define i8 @trunc_rmw8(ptr %p, i32 %val) {
384+
; NO-ATOMIC32-LABEL: trunc_rmw8:
385+
; NO-ATOMIC32: @ %bb.0:
386+
; NO-ATOMIC32-NEXT: .save {r7, lr}
387+
; NO-ATOMIC32-NEXT: push {r7, lr}
388+
; NO-ATOMIC32-NEXT: movs r2, #5
389+
; NO-ATOMIC32-NEXT: bl __atomic_fetch_add_1
390+
; NO-ATOMIC32-NEXT: pop {r7, pc}
391+
;
392+
; ATOMIC32-LABEL: trunc_rmw8:
393+
; ATOMIC32: @ %bb.0:
394+
; ATOMIC32-NEXT: .save {r7, lr}
395+
; ATOMIC32-NEXT: push {r7, lr}
396+
; ATOMIC32-NEXT: dmb sy
397+
; ATOMIC32-NEXT: bl __sync_fetch_and_add_1
398+
; ATOMIC32-NEXT: dmb sy
399+
; ATOMIC32-NEXT: pop {r7, pc}
400+
%trunc = trunc i32 %val to i8
401+
%v = atomicrmw add ptr %p, i8 %trunc seq_cst, align 1
402+
ret i8 %v
403+
}
404+
405+
define i8 @trunc_rmw8_signed(ptr %p, i32 %val) {
406+
; NO-ATOMIC32-LABEL: trunc_rmw8_signed:
407+
; NO-ATOMIC32: @ %bb.0:
408+
; NO-ATOMIC32-NEXT: .save {r4, r5, r6, lr}
409+
; NO-ATOMIC32-NEXT: push {r4, r5, r6, lr}
410+
; NO-ATOMIC32-NEXT: .pad #8
411+
; NO-ATOMIC32-NEXT: sub sp, #8
412+
; NO-ATOMIC32-NEXT: mov r4, r1
413+
; NO-ATOMIC32-NEXT: mov r5, r0
414+
; NO-ATOMIC32-NEXT: ldrb r2, [r0]
415+
; NO-ATOMIC32-NEXT: b .LBB18_2
416+
; NO-ATOMIC32-NEXT: .LBB18_1: @ %atomicrmw.start
417+
; NO-ATOMIC32-NEXT: @ in Loop: Header=BB18_2 Depth=1
418+
; NO-ATOMIC32-NEXT: mov r0, r5
419+
; NO-ATOMIC32-NEXT: bl __atomic_compare_exchange_1
420+
; NO-ATOMIC32-NEXT: ldr r2, [sp, #4]
421+
; NO-ATOMIC32-NEXT: cmp r0, #0
422+
; NO-ATOMIC32-NEXT: bne .LBB18_4
423+
; NO-ATOMIC32-NEXT: .LBB18_2: @ %atomicrmw.start
424+
; NO-ATOMIC32-NEXT: @ =>This Inner Loop Header: Depth=1
425+
; NO-ATOMIC32-NEXT: add r1, sp, #4
426+
; NO-ATOMIC32-NEXT: strb r2, [r1]
427+
; NO-ATOMIC32-NEXT: movs r3, #5
428+
; NO-ATOMIC32-NEXT: str r3, [sp]
429+
; NO-ATOMIC32-NEXT: sxtb r0, r4
430+
; NO-ATOMIC32-NEXT: sxtb r6, r2
431+
; NO-ATOMIC32-NEXT: cmp r6, r0
432+
; NO-ATOMIC32-NEXT: bgt .LBB18_1
433+
; NO-ATOMIC32-NEXT: @ %bb.3: @ %atomicrmw.start
434+
; NO-ATOMIC32-NEXT: @ in Loop: Header=BB18_2 Depth=1
435+
; NO-ATOMIC32-NEXT: mov r2, r4
436+
; NO-ATOMIC32-NEXT: b .LBB18_1
437+
; NO-ATOMIC32-NEXT: .LBB18_4: @ %atomicrmw.end
438+
; NO-ATOMIC32-NEXT: mov r0, r2
439+
; NO-ATOMIC32-NEXT: add sp, #8
440+
; NO-ATOMIC32-NEXT: pop {r4, r5, r6, pc}
441+
;
442+
; ATOMIC32-LABEL: trunc_rmw8_signed:
443+
; ATOMIC32: @ %bb.0:
444+
; ATOMIC32-NEXT: .save {r7, lr}
445+
; ATOMIC32-NEXT: push {r7, lr}
446+
; ATOMIC32-NEXT: dmb sy
447+
; ATOMIC32-NEXT: bl __sync_fetch_and_max_1
448+
; ATOMIC32-NEXT: dmb sy
449+
; ATOMIC32-NEXT: pop {r7, pc}
450+
%trunc = trunc i32 %val to i8
451+
%v = atomicrmw max ptr %p, i8 %trunc seq_cst, align 1
452+
ret i8 %v
453+
}
454+
455+
define i8 @trunc_cmpxchg8(ptr %p, i32 %cmp, i32 %new) {
456+
; NO-ATOMIC32-LABEL: trunc_cmpxchg8:
457+
; NO-ATOMIC32: @ %bb.0:
458+
; NO-ATOMIC32-NEXT: .save {r4, lr}
459+
; NO-ATOMIC32-NEXT: push {r4, lr}
460+
; NO-ATOMIC32-NEXT: .pad #8
461+
; NO-ATOMIC32-NEXT: sub sp, #8
462+
; NO-ATOMIC32-NEXT: add r4, sp, #4
463+
; NO-ATOMIC32-NEXT: strb r1, [r4]
464+
; NO-ATOMIC32-NEXT: movs r3, #5
465+
; NO-ATOMIC32-NEXT: str r3, [sp]
466+
; NO-ATOMIC32-NEXT: mov r1, r4
467+
; NO-ATOMIC32-NEXT: bl __atomic_compare_exchange_1
468+
; NO-ATOMIC32-NEXT: ldr r0, [sp, #4]
469+
; NO-ATOMIC32-NEXT: add sp, #8
470+
; NO-ATOMIC32-NEXT: pop {r4, pc}
471+
;
472+
; ATOMIC32-LABEL: trunc_cmpxchg8:
473+
; ATOMIC32: @ %bb.0:
474+
; ATOMIC32-NEXT: .save {r7, lr}
475+
; ATOMIC32-NEXT: push {r7, lr}
476+
; ATOMIC32-NEXT: dmb sy
477+
; ATOMIC32-NEXT: bl __sync_val_compare_and_swap_1
478+
; ATOMIC32-NEXT: dmb sy
479+
; ATOMIC32-NEXT: pop {r7, pc}
480+
%trunc_cmp = trunc i32 %cmp to i8
481+
%trunc_new = trunc i32 %new to i8
482+
%res = cmpxchg ptr %p, i8 %trunc_cmp, i8 %trunc_new seq_cst seq_cst, align 1
483+
%res.0 = extractvalue { i8, i1 } %res, 0
484+
ret i8 %res.0
485+
}
486+
487+
define void @trunc_store16(ptr %p, i32 %val) {
488+
; NO-ATOMIC32-LABEL: trunc_store16:
489+
; NO-ATOMIC32: @ %bb.0:
490+
; NO-ATOMIC32-NEXT: .save {r7, lr}
491+
; NO-ATOMIC32-NEXT: push {r7, lr}
492+
; NO-ATOMIC32-NEXT: movs r2, #5
493+
; NO-ATOMIC32-NEXT: bl __atomic_store_2
494+
; NO-ATOMIC32-NEXT: pop {r7, pc}
495+
;
496+
; ATOMIC32-LABEL: trunc_store16:
497+
; ATOMIC32: @ %bb.0:
498+
; ATOMIC32-NEXT: dmb sy
499+
; ATOMIC32-NEXT: strh r1, [r0]
500+
; ATOMIC32-NEXT: dmb sy
501+
; ATOMIC32-NEXT: bx lr
502+
%trunc = trunc i32 %val to i16
503+
store atomic i16 %trunc, ptr %p seq_cst, align 2
504+
ret void
505+
}
506+
507+
define i16 @trunc_rmw16(ptr %p, i32 %val) {
508+
; NO-ATOMIC32-LABEL: trunc_rmw16:
509+
; NO-ATOMIC32: @ %bb.0:
510+
; NO-ATOMIC32-NEXT: .save {r7, lr}
511+
; NO-ATOMIC32-NEXT: push {r7, lr}
512+
; NO-ATOMIC32-NEXT: movs r2, #5
513+
; NO-ATOMIC32-NEXT: bl __atomic_fetch_add_2
514+
; NO-ATOMIC32-NEXT: pop {r7, pc}
515+
;
516+
; ATOMIC32-LABEL: trunc_rmw16:
517+
; ATOMIC32: @ %bb.0:
518+
; ATOMIC32-NEXT: .save {r7, lr}
519+
; ATOMIC32-NEXT: push {r7, lr}
520+
; ATOMIC32-NEXT: dmb sy
521+
; ATOMIC32-NEXT: bl __sync_fetch_and_add_2
522+
; ATOMIC32-NEXT: dmb sy
523+
; ATOMIC32-NEXT: pop {r7, pc}
524+
%trunc = trunc i32 %val to i16
525+
%v = atomicrmw add ptr %p, i16 %trunc seq_cst, align 2
526+
ret i16 %v
527+
}
528+
529+
define i16 @trunc_rmw16_signed(ptr %p, i32 %val) {
530+
; NO-ATOMIC32-LABEL: trunc_rmw16_signed:
531+
; NO-ATOMIC32: @ %bb.0:
532+
; NO-ATOMIC32-NEXT: .save {r4, r5, r6, lr}
533+
; NO-ATOMIC32-NEXT: push {r4, r5, r6, lr}
534+
; NO-ATOMIC32-NEXT: .pad #8
535+
; NO-ATOMIC32-NEXT: sub sp, #8
536+
; NO-ATOMIC32-NEXT: mov r4, r1
537+
; NO-ATOMIC32-NEXT: mov r5, r0
538+
; NO-ATOMIC32-NEXT: ldrh r2, [r0]
539+
; NO-ATOMIC32-NEXT: b .LBB22_2
540+
; NO-ATOMIC32-NEXT: .LBB22_1: @ %atomicrmw.start
541+
; NO-ATOMIC32-NEXT: @ in Loop: Header=BB22_2 Depth=1
542+
; NO-ATOMIC32-NEXT: mov r0, r5
543+
; NO-ATOMIC32-NEXT: bl __atomic_compare_exchange_2
544+
; NO-ATOMIC32-NEXT: ldr r2, [sp, #4]
545+
; NO-ATOMIC32-NEXT: cmp r0, #0
546+
; NO-ATOMIC32-NEXT: bne .LBB22_4
547+
; NO-ATOMIC32-NEXT: .LBB22_2: @ %atomicrmw.start
548+
; NO-ATOMIC32-NEXT: @ =>This Inner Loop Header: Depth=1
549+
; NO-ATOMIC32-NEXT: add r1, sp, #4
550+
; NO-ATOMIC32-NEXT: strh r2, [r1]
551+
; NO-ATOMIC32-NEXT: movs r3, #5
552+
; NO-ATOMIC32-NEXT: str r3, [sp]
553+
; NO-ATOMIC32-NEXT: sxth r0, r4
554+
; NO-ATOMIC32-NEXT: sxth r6, r2
555+
; NO-ATOMIC32-NEXT: cmp r6, r0
556+
; NO-ATOMIC32-NEXT: bgt .LBB22_1
557+
; NO-ATOMIC32-NEXT: @ %bb.3: @ %atomicrmw.start
558+
; NO-ATOMIC32-NEXT: @ in Loop: Header=BB22_2 Depth=1
559+
; NO-ATOMIC32-NEXT: mov r2, r4
560+
; NO-ATOMIC32-NEXT: b .LBB22_1
561+
; NO-ATOMIC32-NEXT: .LBB22_4: @ %atomicrmw.end
562+
; NO-ATOMIC32-NEXT: mov r0, r2
563+
; NO-ATOMIC32-NEXT: add sp, #8
564+
; NO-ATOMIC32-NEXT: pop {r4, r5, r6, pc}
565+
;
566+
; ATOMIC32-LABEL: trunc_rmw16_signed:
567+
; ATOMIC32: @ %bb.0:
568+
; ATOMIC32-NEXT: .save {r7, lr}
569+
; ATOMIC32-NEXT: push {r7, lr}
570+
; ATOMIC32-NEXT: dmb sy
571+
; ATOMIC32-NEXT: bl __sync_fetch_and_max_2
572+
; ATOMIC32-NEXT: dmb sy
573+
; ATOMIC32-NEXT: pop {r7, pc}
574+
%trunc = trunc i32 %val to i16
575+
%v = atomicrmw max ptr %p, i16 %trunc seq_cst, align 2
576+
ret i16 %v
577+
}
578+
579+
define i16 @trunc_cmpxchg16(ptr %p, i32 %cmp, i32 %new) {
580+
; NO-ATOMIC32-LABEL: trunc_cmpxchg16:
581+
; NO-ATOMIC32: @ %bb.0:
582+
; NO-ATOMIC32-NEXT: .save {r4, lr}
583+
; NO-ATOMIC32-NEXT: push {r4, lr}
584+
; NO-ATOMIC32-NEXT: .pad #8
585+
; NO-ATOMIC32-NEXT: sub sp, #8
586+
; NO-ATOMIC32-NEXT: add r4, sp, #4
587+
; NO-ATOMIC32-NEXT: strh r1, [r4]
588+
; NO-ATOMIC32-NEXT: movs r3, #5
589+
; NO-ATOMIC32-NEXT: str r3, [sp]
590+
; NO-ATOMIC32-NEXT: mov r1, r4
591+
; NO-ATOMIC32-NEXT: bl __atomic_compare_exchange_2
592+
; NO-ATOMIC32-NEXT: ldr r0, [sp, #4]
593+
; NO-ATOMIC32-NEXT: add sp, #8
594+
; NO-ATOMIC32-NEXT: pop {r4, pc}
595+
;
596+
; ATOMIC32-LABEL: trunc_cmpxchg16:
597+
; ATOMIC32: @ %bb.0:
598+
; ATOMIC32-NEXT: .save {r7, lr}
599+
; ATOMIC32-NEXT: push {r7, lr}
600+
; ATOMIC32-NEXT: dmb sy
601+
; ATOMIC32-NEXT: bl __sync_val_compare_and_swap_2
602+
; ATOMIC32-NEXT: dmb sy
603+
; ATOMIC32-NEXT: pop {r7, pc}
604+
%trunc_cmp = trunc i32 %cmp to i16
605+
%trunc_new = trunc i32 %new to i16
606+
%res = cmpxchg ptr %p, i16 %trunc_cmp, i16 %trunc_new seq_cst seq_cst, align 2
607+
%res.0 = extractvalue { i16, i1 } %res, 0
608+
ret i16 %res.0
609+
}

0 commit comments

Comments
 (0)