Skip to content

Commit 48453bb

Browse files
committed
[Tests] Add anyextend tests for unordered atomics
Motivated by work on changing our representation of unordered atomics in SelectionDAG, but as an aside, all our lowerings for O3 are terrible. Even the ones which ignore the atomicity. llvm-svn: 371449
1 parent 4bd6eb8 commit 48453bb

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed

llvm/test/CodeGen/X86/atomic-unordered.ll

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3064,3 +3064,108 @@ define i64 @fold_invariant_fence(i64* dereferenceable(8) %p, i64 %arg) {
30643064
ret i64 %ret
30653065
}
30663066

3067+
3068+
; Exercise a few cases involving any extend idioms
3069+
3070+
define i16 @load_i8_anyext_i16(i8* %ptr) {
3071+
; CHECK-O0-LABEL: load_i8_anyext_i16:
3072+
; CHECK-O0: # %bb.0:
3073+
; CHECK-O0-NEXT: movb (%rdi), %al
3074+
; CHECK-O0-NEXT: movzbl %al, %ecx
3075+
; CHECK-O0-NEXT: # kill: def $cx killed $cx killed $ecx
3076+
; CHECK-O0-NEXT: movw %cx, %ax
3077+
; CHECK-O0-NEXT: retq
3078+
;
3079+
; CHECK-O3-LABEL: load_i8_anyext_i16:
3080+
; CHECK-O3: # %bb.0:
3081+
; CHECK-O3-NEXT: movzbl (%rdi), %eax
3082+
; CHECK-O3-NEXT: # kill: def $ax killed $ax killed $eax
3083+
; CHECK-O3-NEXT: retq
3084+
;
3085+
; CHECK-EX-LABEL: load_i8_anyext_i16:
3086+
; CHECK-EX: # %bb.0:
3087+
; CHECK-EX-NEXT: vpbroadcastb (%rdi), %xmm0
3088+
; CHECK-EX-NEXT: vmovd %xmm0, %eax
3089+
; CHECK-EX-NEXT: # kill: def $ax killed $ax killed $eax
3090+
; CHECK-EX-NEXT: retq
3091+
%v = load atomic i8, i8* %ptr unordered, align 2
3092+
%vec = insertelement <2 x i8> undef, i8 %v, i32 0
3093+
%res = bitcast <2 x i8> %vec to i16
3094+
ret i16 %res
3095+
}
3096+
3097+
define i32 @load_i8_anyext_i32(i8* %ptr) {
3098+
; CHECK-O0-LABEL: load_i8_anyext_i32:
3099+
; CHECK-O0: # %bb.0:
3100+
; CHECK-O0-NEXT: movb (%rdi), %al
3101+
; CHECK-O0-NEXT: movzbl %al, %eax
3102+
; CHECK-O0-NEXT: retq
3103+
;
3104+
; CHECK-O3-LABEL: load_i8_anyext_i32:
3105+
; CHECK-O3: # %bb.0:
3106+
; CHECK-O3-NEXT: movzbl (%rdi), %eax
3107+
; CHECK-O3-NEXT: retq
3108+
;
3109+
; CHECK-EX-LABEL: load_i8_anyext_i32:
3110+
; CHECK-EX: # %bb.0:
3111+
; CHECK-EX-NEXT: vpbroadcastb (%rdi), %xmm0
3112+
; CHECK-EX-NEXT: vmovd %xmm0, %eax
3113+
; CHECK-EX-NEXT: retq
3114+
%v = load atomic i8, i8* %ptr unordered, align 4
3115+
%vec = insertelement <4 x i8> undef, i8 %v, i32 0
3116+
%res = bitcast <4 x i8> %vec to i32
3117+
ret i32 %res
3118+
}
3119+
3120+
define i32 @load_i16_anyext_i32(i16* %ptr) {
3121+
; CHECK-O0-LABEL: load_i16_anyext_i32:
3122+
; CHECK-O0: # %bb.0:
3123+
; CHECK-O0-NEXT: movw (%rdi), %ax
3124+
; CHECK-O0-NEXT: # implicit-def: $ecx
3125+
; CHECK-O0-NEXT: movw %ax, %cx
3126+
; CHECK-O0-NEXT: movl %ecx, %eax
3127+
; CHECK-O0-NEXT: retq
3128+
;
3129+
; CHECK-O3-LABEL: load_i16_anyext_i32:
3130+
; CHECK-O3: # %bb.0:
3131+
; CHECK-O3-NEXT: movzwl (%rdi), %eax
3132+
; CHECK-O3-NEXT: retq
3133+
;
3134+
; CHECK-EX-LABEL: load_i16_anyext_i32:
3135+
; CHECK-EX: # %bb.0:
3136+
; CHECK-EX-NEXT: vpbroadcastw (%rdi), %xmm0
3137+
; CHECK-EX-NEXT: vmovd %xmm0, %eax
3138+
; CHECK-EX-NEXT: retq
3139+
%v = load atomic i16, i16* %ptr unordered, align 4
3140+
%vec = insertelement <2 x i16> undef, i16 %v, i64 0
3141+
%res = bitcast <2 x i16> %vec to i32
3142+
ret i32 %res
3143+
}
3144+
3145+
define i64 @load_i16_anyext_i64(i16* %ptr) {
3146+
; CHECK-O0-LABEL: load_i16_anyext_i64:
3147+
; CHECK-O0: # %bb.0:
3148+
; CHECK-O0-NEXT: movw (%rdi), %ax
3149+
; CHECK-O0-NEXT: # implicit-def: $ecx
3150+
; CHECK-O0-NEXT: movw %ax, %cx
3151+
; CHECK-O0-NEXT: vmovd %ecx, %xmm0
3152+
; CHECK-O0-NEXT: vmovq %xmm0, %rax
3153+
; CHECK-O0-NEXT: retq
3154+
;
3155+
; CHECK-O3-LABEL: load_i16_anyext_i64:
3156+
; CHECK-O3: # %bb.0:
3157+
; CHECK-O3-NEXT: movzwl (%rdi), %eax
3158+
; CHECK-O3-NEXT: vmovd %eax, %xmm0
3159+
; CHECK-O3-NEXT: vmovq %xmm0, %rax
3160+
; CHECK-O3-NEXT: retq
3161+
;
3162+
; CHECK-EX-LABEL: load_i16_anyext_i64:
3163+
; CHECK-EX: # %bb.0:
3164+
; CHECK-EX-NEXT: vpbroadcastw (%rdi), %xmm0
3165+
; CHECK-EX-NEXT: vmovq %xmm0, %rax
3166+
; CHECK-EX-NEXT: retq
3167+
%v = load atomic i16, i16* %ptr unordered, align 8
3168+
%vec = insertelement <4 x i16> undef, i16 %v, i64 0
3169+
%res = bitcast <4 x i16> %vec to i64
3170+
ret i64 %res
3171+
}

0 commit comments

Comments
 (0)