@@ -3064,3 +3064,108 @@ define i64 @fold_invariant_fence(i64* dereferenceable(8) %p, i64 %arg) {
3064
3064
ret i64 %ret
3065
3065
}
3066
3066
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