226 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-- -mattr=+slow-3ops-lea | FileCheck %s3; RUN: llc < %s -mtriple=x86_64-- -mattr=-slow-3ops-lea | FileCheck %s4 5define i16 @and_i8_zext_shl_add_i16(i16 %t0, i8 %t1) {6; CHECK-LABEL: and_i8_zext_shl_add_i16:7; CHECK: # %bb.0:8; CHECK-NEXT: # kill: def $esi killed $esi def $rsi9; CHECK-NEXT: # kill: def $edi killed $edi def $rdi10; CHECK-NEXT: andl $8, %esi11; CHECK-NEXT: leal (%rdi,%rsi,4), %eax12; CHECK-NEXT: # kill: def $ax killed $ax killed $eax13; CHECK-NEXT: retq14 %t4 = and i8 %t1, 815 %t5 = zext i8 %t4 to i1616 %sh = shl i16 %t5, 217 %t6 = add i16 %sh, %t018 ret i16 %t619}20 21define i16 @and_i8_shl_zext_add_i16(i16 %t0, i8 %t1) {22; CHECK-LABEL: and_i8_shl_zext_add_i16:23; CHECK: # %bb.0:24; CHECK-NEXT: # kill: def $edi killed $edi def $rdi25; CHECK-NEXT: andb $8, %sil26; CHECK-NEXT: movzbl %sil, %eax27; CHECK-NEXT: leal (%rdi,%rax,4), %eax28; CHECK-NEXT: # kill: def $ax killed $ax killed $eax29; CHECK-NEXT: retq30 %t4 = and i8 %t1, 831 %sh = shl i8 %t4, 232 %t5 = zext i8 %sh to i1633 %t6 = add i16 %t5, %t034 ret i16 %t635}36 37define i32 @and_i8_zext_shl_add_i32(i32 %t0, i8 %t1) {38; CHECK-LABEL: and_i8_zext_shl_add_i32:39; CHECK: # %bb.0:40; CHECK-NEXT: # kill: def $esi killed $esi def $rsi41; CHECK-NEXT: # kill: def $edi killed $edi def $rdi42; CHECK-NEXT: andl $8, %esi43; CHECK-NEXT: leal (%rdi,%rsi,8), %eax44; CHECK-NEXT: retq45 %t4 = and i8 %t1, 846 %t5 = zext i8 %t4 to i3247 %sh = shl i32 %t5, 348 %t6 = add i32 %sh, %t049 ret i32 %t650}51 52define i32 @and_i8_shl_zext_add_i32(i32 %t0, i8 %t1) {53; CHECK-LABEL: and_i8_shl_zext_add_i32:54; CHECK: # %bb.0:55; CHECK-NEXT: # kill: def $edi killed $edi def $rdi56; CHECK-NEXT: andb $8, %sil57; CHECK-NEXT: movzbl %sil, %eax58; CHECK-NEXT: leal (%rdi,%rax,8), %eax59; CHECK-NEXT: retq60 %t4 = and i8 %t1, 861 %sh = shl i8 %t4, 362 %t5 = zext i8 %sh to i3263 %t6 = add i32 %t5, %t064 ret i32 %t665}66 67define i32 @and_i16_zext_shl_add_i32(i32 %t0, i16 %t1) {68; CHECK-LABEL: and_i16_zext_shl_add_i32:69; CHECK: # %bb.0:70; CHECK-NEXT: # kill: def $esi killed $esi def $rsi71; CHECK-NEXT: # kill: def $edi killed $edi def $rdi72; CHECK-NEXT: andl $8, %esi73; CHECK-NEXT: leal (%rdi,%rsi,4), %eax74; CHECK-NEXT: retq75 %t4 = and i16 %t1, 876 %t5 = zext i16 %t4 to i3277 %sh = shl i32 %t5, 278 %t6 = add i32 %sh, %t079 ret i32 %t680}81 82define i32 @and_i16_shl_zext_add_i32(i32 %t0, i16 %t1) {83; CHECK-LABEL: and_i16_shl_zext_add_i32:84; CHECK: # %bb.0:85; CHECK-NEXT: # kill: def $esi killed $esi def $rsi86; CHECK-NEXT: # kill: def $edi killed $edi def $rdi87; CHECK-NEXT: andl $8, %esi88; CHECK-NEXT: leal (%rdi,%rsi,4), %eax89; CHECK-NEXT: retq90 %t4 = and i16 %t1, 891 %sh = shl i16 %t4, 292 %t5 = zext i16 %sh to i3293 %t6 = add i32 %t5, %t094 ret i32 %t695}96 97define i64 @and_i8_zext_shl_add_i64(i64 %t0, i8 %t1) {98; CHECK-LABEL: and_i8_zext_shl_add_i64:99; CHECK: # %bb.0:100; CHECK-NEXT: # kill: def $esi killed $esi def $rsi101; CHECK-NEXT: andl $8, %esi102; CHECK-NEXT: leaq (%rdi,%rsi,2), %rax103; CHECK-NEXT: retq104 %t4 = and i8 %t1, 8105 %t5 = zext i8 %t4 to i64106 %sh = shl i64 %t5, 1107 %t6 = add i64 %sh, %t0108 ret i64 %t6109}110 111define i64 @and_i8_shl_zext_add_i64(i64 %t0, i8 %t1) {112; CHECK-LABEL: and_i8_shl_zext_add_i64:113; CHECK: # %bb.0:114; CHECK-NEXT: andb $8, %sil115; CHECK-NEXT: movzbl %sil, %eax116; CHECK-NEXT: leaq (%rdi,%rax,2), %rax117; CHECK-NEXT: retq118 %t4 = and i8 %t1, 8119 %sh = shl i8 %t4, 1120 %t5 = zext i8 %sh to i64121 %t6 = add i64 %t5, %t0122 ret i64 %t6123}124 125define i64 @and_i32_zext_shl_add_i64(i64 %t0, i32 %t1) {126; CHECK-LABEL: and_i32_zext_shl_add_i64:127; CHECK: # %bb.0:128; CHECK-NEXT: # kill: def $esi killed $esi def $rsi129; CHECK-NEXT: andl $8, %esi130; CHECK-NEXT: leaq (%rdi,%rsi,8), %rax131; CHECK-NEXT: retq132 %t4 = and i32 %t1, 8133 %t5 = zext i32 %t4 to i64134 %sh = shl i64 %t5, 3135 %t6 = add i64 %sh, %t0136 ret i64 %t6137}138 139define i64 @and_i32_shl_zext_add_i64(i64 %t0, i32 %t1) {140; CHECK-LABEL: and_i32_shl_zext_add_i64:141; CHECK: # %bb.0:142; CHECK-NEXT: # kill: def $esi killed $esi def $rsi143; CHECK-NEXT: andl $8, %esi144; CHECK-NEXT: leaq (%rdi,%rsi,8), %rax145; CHECK-NEXT: retq146 %t4 = and i32 %t1, 8147 %sh = shl i32 %t4, 3148 %t5 = zext i32 %sh to i64149 %t6 = add i64 %t5, %t0150 ret i64 %t6151}152 153define i64 @shl_and_i8_zext_add_i64(i64 %t0, i8 %t1) {154; CHECK-LABEL: shl_and_i8_zext_add_i64:155; CHECK: # %bb.0:156; CHECK-NEXT: andb $15, %sil157; CHECK-NEXT: movzbl %sil, %eax158; CHECK-NEXT: leaq (%rdi,%rax,4), %rax159; CHECK-NEXT: retq160 %s = shl i8 %t1, 2161 %m = and i8 %s, 60162 %z = zext i8 %m to i64163 %a = add i64 %t0, %z164 ret i64 %a165}166 167define i64 @shl_and_i16_zext_add_i64(i64 %t0, i16 %t1) {168; CHECK-LABEL: shl_and_i16_zext_add_i64:169; CHECK: # %bb.0:170; CHECK-NEXT: # kill: def $esi killed $esi def $rsi171; CHECK-NEXT: andl $8, %esi172; CHECK-NEXT: leaq (%rdi,%rsi,2), %rax173; CHECK-NEXT: retq174 %s = shl i16 %t1, 1175 %m = and i16 %s, 17176 %z = zext i16 %m to i64177 %a = add i64 %t0, %z178 ret i64 %a179}180 181define i64 @shl_and_i32_zext_add_i64(i64 %t0, i32 %t1) {182; CHECK-LABEL: shl_and_i32_zext_add_i64:183; CHECK: # %bb.0:184; CHECK-NEXT: # kill: def $esi killed $esi def $rsi185; CHECK-NEXT: andl $749, %esi # imm = 0x2ED186; CHECK-NEXT: leaq (%rdi,%rsi,8), %rax187; CHECK-NEXT: retq188 %s = shl i32 %t1, 3189 %m = and i32 %s, 5999190 %z = zext i32 %m to i64191 %a = add i64 %t0, %z192 ret i64 %a193}194 195; Negative test - shift can't be converted to scale factor.196 197define i64 @and_i32_zext_shl_add_i64_overshift(i64 %t0, i32 %t1) {198; CHECK-LABEL: and_i32_zext_shl_add_i64_overshift:199; CHECK: # %bb.0:200; CHECK-NEXT: # kill: def $esi killed $esi def $rsi201; CHECK-NEXT: andl $8, %esi202; CHECK-NEXT: shll $4, %esi203; CHECK-NEXT: leaq (%rsi,%rdi), %rax204; CHECK-NEXT: retq205 %t4 = and i32 %t1, 8206 %t5 = zext i32 %t4 to i64207 %sh = shl i64 %t5, 4208 %t6 = add i64 %sh, %t0209 ret i64 %t6210}211 212define i64 @and_i32_shl_zext_add_i64_overshift(i64 %t0, i32 %t1) {213; CHECK-LABEL: and_i32_shl_zext_add_i64_overshift:214; CHECK: # %bb.0:215; CHECK-NEXT: # kill: def $esi killed $esi def $rsi216; CHECK-NEXT: andl $8, %esi217; CHECK-NEXT: shll $4, %esi218; CHECK-NEXT: leaq (%rsi,%rdi), %rax219; CHECK-NEXT: retq220 %t4 = and i32 %t1, 8221 %sh = shl i32 %t4, 4222 %t5 = zext i32 %sh to i64223 %t6 = add i64 %t5, %t0224 ret i64 %t6225}226