Index: llvm/lib/Target/AArch64/AArch64InstrInfo.td =================================================================== --- llvm/lib/Target/AArch64/AArch64InstrInfo.td +++ llvm/lib/Target/AArch64/AArch64InstrInfo.td @@ -7345,7 +7345,12 @@ (i64 (i64shift_sext_i16 imm0_63:$imm)))>; def : Pat<(shl (i64 (sext GPR32:$Rn)), (i64 imm0_63:$imm)), - (SBFMXri (INSERT_SUBREG (i64 (IMPLICIT_DEF)), GPR32:$Rn, sub_32), + (SBFMXri (SUBREG_TO_REG (i64 0), GPR32:$Rn, sub_32), + (i64 (i64shift_a imm0_63:$imm)), + (i64 (i64shift_sext_i32 imm0_63:$imm)))>; + +def : Pat<(shl (i64 (zext GPR32:$Rn)), (i64 imm0_63:$imm)), + (UBFMXri (SUBREG_TO_REG (i64 0), GPR32:$Rn, sub_32), (i64 (i64shift_a imm0_63:$imm)), (i64 (i64shift_sext_i32 imm0_63:$imm)))>; Index: llvm/test/CodeGen/AArch64/aarch64-dynamic-stack-layout.ll =================================================================== --- llvm/test/CodeGen/AArch64/aarch64-dynamic-stack-layout.ll +++ llvm/test/CodeGen/AArch64/aarch64-dynamic-stack-layout.ll @@ -305,12 +305,11 @@ ; CHECK: ldr w[[IARG:[0-9]+]], [x29, #40] ; CHECK: ldr d[[DARG:[0-9]+]], [x29, #56] ; Check correct reservation of 16-byte aligned VLA (size in w0) on stack -; CHECK: mov w9, w0 -; CHECK: mov x10, sp -; CHECK: lsl x9, x9, #2 -; CHECK: add x9, x9, #15 -; CHECK: and x9, x9, #0x7fffffff0 -; CHECK: sub x[[VLASPTMP:[0-9]+]], x10, x9 +; CHECK: mov x9, sp +; CHECK: ubfiz x10, x0, #2, #32 +; CHECK: add x10, x10, #15 +; CHECK: and x10, x10, #0x7fffffff0 +; CHECK: sub x[[VLASPTMP:[0-9]+]], x9, x10 ; CHECK: mov sp, x[[VLASPTMP]] ; Check correct access to local variable, through frame pointer ; CHECK: ldur w[[ILOC:[0-9]+]], [x29, #-4] @@ -352,13 +351,12 @@ ; CHECK: ldr w[[IARG:[0-9]+]], [x29, #24] ; CHECK: ldr d[[DARG:[0-9]+]], [x29, #40] ; Check correct reservation of 16-byte aligned VLA (size in w0) on stack -; CHECK: mov w9, w0 -; CHECK: mov x10, sp -; CHECK: lsl x9, x9, #2 -; CHECK: add x9, x9, #15 -; CHECK: and x9, x9, #0x7fffffff0 -; CHECK: sub x[[VLASPTMP:[0-9]+]], x10, x9 -; CHECK: mov sp, x[[VLASPTMP]] +; CHECK: mov x9, sp +; CHECK: ubfiz x10, x0, #2, #32 +; CHECK: add x10, x10, #15 +; CHECK: and x10, x10, #0x7fffffff0 +; CHECK: sub x[[VLASPTMP:[0-9]+]], x9, x10 +; CHECK: mov sp, x[[VLASPTMP]] ; Check correct access to local variable, through frame pointer ; CHECK: ldur w[[ILOC:[0-9]+]], [x29, #-4] ; Check correct accessing of the VLA variable through the base pointer @@ -414,12 +412,11 @@ ; CHECK: ldr d[[DARG:[0-9]+]], [x29, #72] ; Check correct reservation of 16-byte aligned VLA (size in w0) on stack ; and set-up of base pointer (x19). -; CHECK: mov w9, w0 -; CHECK: mov x10, sp -; CHECK: lsl x9, x9, #2 -; CHECK: add x9, x9, #15 -; CHECK: and x9, x9, #0x7fffffff0 -; CHECK: sub x[[VLASPTMP:[0-9]+]], x10, x9 +; CHECK: mov x9, sp +; CHECK: ubfiz x10, x0, #2, #32 +; CHECK: add x10, x10, #15 +; CHECK: and x10, x10, #0x7fffffff0 +; CHECK: sub x[[VLASPTMP:[0-9]+]], x9, x10 ; CHECK: mov sp, x[[VLASPTMP]] ; Check correct access to local variable, through base pointer ; CHECK: ldr w[[ILOC:[0-9]+]], [x19] @@ -462,12 +459,11 @@ ; CHECK-MACHO: ldr d[[DARG:[0-9]+]], [x29, #32] ; Check correct reservation of 16-byte aligned VLA (size in w0) on stack ; and set-up of base pointer (x19). -; CHECK-MACHO: mov w9, w0 -; CHECK-MACHO: mov x10, sp -; CHECK-MACHO: lsl x9, x9, #2 -; CHECK-MACHO: add x9, x9, #15 -; CHECK-MACHO: and x9, x9, #0x7fffffff0 -; CHECK-MACHO: sub x[[VLASPTMP:[0-9]+]], x10, x9 +; CHECK-MACHO: mov x9, sp +; CHECK-MACHO: ubfiz x10, x0, #2, #32 +; CHECK-MACHO: add x10, x10, #15 +; CHECK-MACHO: and x10, x10, #0x7fffffff0 +; CHECK-MACHO: sub x[[VLASPTMP:[0-9]+]], x9, x10 ; CHECK-MACHO: mov sp, x[[VLASPTMP]] ; Check correct access to local variable, through base pointer ; CHECK-MACHO: ldr w[[ILOC:[0-9]+]], [x19] @@ -515,12 +511,11 @@ ; CHECK: ldr d[[DARG:[0-9]+]], [x29, #56] ; Check correct reservation of 16-byte aligned VLA (size in w0) on stack ; and set-up of base pointer (x19). -; CHECK: mov w9, w0 -; CHECK: mov x10, sp -; CHECK: lsl x9, x9, #2 -; CHECK: add x9, x9, #15 -; CHECK: and x9, x9, #0x7fffffff0 -; CHECK: sub x[[VLASPTMP:[0-9]+]], x10, x9 +; CHECK: mov x9, sp +; CHECK: ubfiz x10, x0, #2, #32 +; CHECK: add x10, x10, #15 +; CHECK: and x10, x10, #0x7fffffff0 +; CHECK: sub x[[VLASPTMP:[0-9]+]], x9, x10 ; CHECK: mov sp, x[[VLASPTMP]] ; Check correct access to local variable, through base pointer ; CHECK: ldr w[[ILOC:[0-9]+]], [x19] @@ -550,12 +545,11 @@ ; CHECK-MACHO: ldr d[[DARG:[0-9]+]], [x29, #32] ; Check correct reservation of 16-byte aligned VLA (size in w0) on stack ; and set-up of base pointer (x19). -; CHECK-MACHO: mov w9, w0 -; CHECK-MACHO: mov x10, sp -; CHECK-MACHO: lsl x9, x9, #2 -; CHECK-MACHO: add x9, x9, #15 -; CHECK-MACHO: and x9, x9, #0x7fffffff0 -; CHECK-MACHO: sub x[[VLASPTMP:[0-9]+]], x10, x9 +; CHECK-MACHO: mov x9, sp +; CHECK-MACHO: ubfiz x10, x0, #2, #32 +; CHECK-MACHO: add x10, x10, #15 +; CHECK-MACHO: and x10, x10, #0x7fffffff0 +; CHECK-MACHO: sub x[[VLASPTMP:[0-9]+]], x9, x10 ; CHECK-MACHO: mov sp, x[[VLASPTMP]] ; Check correct access to local variable, through base pointer ; CHECK-MACHO: ldr w[[ILOC:[0-9]+]], [x19] @@ -601,12 +595,11 @@ ; CHECK: ldr d[[DARG:[0-9]+]], [x29, #56] ; Check correct reservation of 16-byte aligned VLA (size in w0) on stack ; and set-up of base pointer (x19). -; CHECK: mov w9, w0 -; CHECK: mov x10, sp -; CHECK: lsl x9, x9, #2 -; CHECK: add x9, x9, #15 -; CHECK: and x9, x9, #0x7fffffff0 -; CHECK: sub x[[VLASPTMP:[0-9]+]], x10, x9 +; CHECK: mov x9, sp +; CHECK: ubfiz x10, x0, #2, #32 +; CHECK: add x10, x10, #15 +; CHECK: and x10, x10, #0x7fffffff0 +; CHECK: sub x[[VLASPTMP:[0-9]+]], x9, x10 ; CHECK: mov sp, x[[VLASPTMP]] ; Check correct access to local variable, through base pointer ; CHECK: ldr w[[ILOC:[0-9]+]], [x19] @@ -636,12 +629,11 @@ ; CHECK-MACHO: ldr d[[DARG:[0-9]+]], [x29, #32] ; Check correct reservation of 16-byte aligned VLA (size in w0) on stack ; and set-up of base pointer (x19). -; CHECK-MACHO: mov w9, w0 -; CHECK-MACHO: mov x10, sp -; CHECK-MACHO: lsl x9, x9, #2 -; CHECK-MACHO: add x9, x9, #15 -; CHECK-MACHO: and x9, x9, #0x7fffffff0 -; CHECK-MACHO: sub x[[VLASPTMP:[0-9]+]], x10, x9 +; CHECK-MACHO: mov x9, sp +; CHECK-MACHO: ubfiz x10, x0, #2, #32 +; CHECK-MACHO: add x10, x10, #15 +; CHECK-MACHO: and x10, x10, #0x7fffffff0 +; CHECK-MACHO: sub x[[VLASPTMP:[0-9]+]], x9, x10 ; CHECK-MACHO: mov sp, x[[VLASPTMP]] ; Check correct access to local variable, through base pointer ; CHECK-MACHO: ldr w[[ILOC:[0-9]+]], [x19] Index: llvm/test/CodeGen/AArch64/aarch64-matrix-umull-smull.ll =================================================================== --- llvm/test/CodeGen/AArch64/aarch64-matrix-umull-smull.ll +++ llvm/test/CodeGen/AArch64/aarch64-matrix-umull-smull.ll @@ -137,13 +137,13 @@ ; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0 ; CHECK-NEXT: dup v0.4h, w8 ; CHECK-NEXT: and x8, x0, #0xfffffff8 +; CHECK-NEXT: // kill: def $w0 killed $w0 killed $x0 def $x0 ; CHECK-NEXT: .LBB2_1: // %vector.body ; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 ; CHECK-NEXT: ldrh w9, [x2], #16 ; CHECK-NEXT: subs x8, x8, #8 ; CHECK-NEXT: dup v1.4h, w9 -; CHECK-NEXT: mov w9, w0 -; CHECK-NEXT: lsl x9, x9, #2 +; CHECK-NEXT: ubfiz x9, x0, #2, #32 ; CHECK-NEXT: add w0, w0, #8 ; CHECK-NEXT: umull v1.4s, v0.4h, v1.4h ; CHECK-NEXT: str q1, [x1, x9] Index: llvm/test/CodeGen/AArch64/select_cc.ll =================================================================== --- llvm/test/CodeGen/AArch64/select_cc.ll +++ llvm/test/CodeGen/AArch64/select_cc.ll @@ -6,7 +6,7 @@ ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: fcmp s0, s1 ; CHECK-NEXT: cset w8, gt -; CHECK-NEXT: lsl x0, x8, #2 +; CHECK-NEXT: ubfiz x0, x8, #2, #32 ; CHECK-NEXT: ret entry: %cc = fcmp ogt float %a, %b @@ -19,7 +19,7 @@ ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: fcmp s0, s1 ; CHECK-NEXT: cset w8, gt -; CHECK-NEXT: lsl x0, x8, #2 +; CHECK-NEXT: ubfiz x0, x8, #2, #32 ; CHECK-NEXT: ret entry: %cc = fcmp ule float %a, %b @@ -32,7 +32,7 @@ ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: cmp w0, w1 ; CHECK-NEXT: cset w8, eq -; CHECK-NEXT: lsl x0, x8, #2 +; CHECK-NEXT: ubfiz x0, x8, #2, #32 ; CHECK-NEXT: ret entry: %cc = icmp eq i32 %a, %b @@ -45,7 +45,7 @@ ; CHECK: // %bb.0: // %entry ; CHECK-NEXT: cmp w0, w1 ; CHECK-NEXT: cset w8, eq -; CHECK-NEXT: lsl x0, x8, #2 +; CHECK-NEXT: ubfiz x0, x8, #2, #32 ; CHECK-NEXT: ret entry: %cc = icmp ne i32 %a, %b Index: llvm/test/CodeGen/AArch64/shrink-wrapping-vla.ll =================================================================== --- llvm/test/CodeGen/AArch64/shrink-wrapping-vla.ll +++ llvm/test/CodeGen/AArch64/shrink-wrapping-vla.ll @@ -86,12 +86,13 @@ ; VLA allocation -; CHECK: mov [[X2:x[0-9]+]], sp -; CHECK: mov [[SAVE:x[0-9]+]], sp -; CHECK: add [[X1:x[0-9]+]], [[X1]], #15 -; CHECK: and [[X1]], [[X1]], #0x7fffffff0 +; CHECK: ubfiz x9, x0, #2, #32 +; CHECK: mov x8, sp +; CHECK: add x9, x9, #15 +; CHECK: mov [[SAVE:x[0-9]+]], sp +; CHECK: and [[X1:x[0-9]+]], [[X1]], #0x7fffffff0 ; Saving the SP via llvm.stacksave() -; CHECK: sub [[X2]], [[X2]], [[X1]] +; CHECK: sub [[X2:x[0-9]+]], [[X2]], [[X1]] ; The next instruction comes from llvm.stackrestore() ; CHECK: mov sp, [[SAVE]] Index: llvm/test/CodeGen/AArch64/tbl-loops.ll =================================================================== --- llvm/test/CodeGen/AArch64/tbl-loops.ll +++ llvm/test/CodeGen/AArch64/tbl-loops.ll @@ -151,7 +151,7 @@ ; CHECK-NEXT: cmp w8, #2 ; CHECK-NEXT: b.ls .LBB1_4 ; CHECK-NEXT: // %bb.2: // %vector.memcheck -; CHECK-NEXT: lsl x9, x8, #1 +; CHECK-NEXT: ubfiz x9, x8, #1, #32 ; CHECK-NEXT: add x9, x9, #2 ; CHECK-NEXT: add x10, x1, x9, lsl #2 ; CHECK-NEXT: cmp x10, x0 @@ -535,7 +535,7 @@ ; CHECK-NEXT: cmp w8, #2 ; CHECK-NEXT: b.ls .LBB3_4 ; CHECK-NEXT: // %bb.2: // %vector.memcheck -; CHECK-NEXT: lsl x9, x8, #2 +; CHECK-NEXT: ubfiz x9, x8, #2, #32 ; CHECK-NEXT: add x9, x9, #4 ; CHECK-NEXT: add x10, x1, x9, lsl #2 ; CHECK-NEXT: cmp x10, x0