diff --git a/llvm/lib/Target/ARM/ARMInstrThumb.td b/llvm/lib/Target/ARM/ARMInstrThumb.td --- a/llvm/lib/Target/ARM/ARMInstrThumb.td +++ b/llvm/lib/Target/ARM/ARMInstrThumb.td @@ -1659,19 +1659,16 @@ (tSTMIA_UPD tGPR:$Rn, tGPR:$Rt)>; // If it's impossible to use [r,r] address mode for sextload, select to -// ldr{b|h} + sxt{b|h} instead. -def : T1Pat<(sextloadi8 t_addrmode_is1:$addr), - (tSXTB (tLDRBi t_addrmode_is1:$addr))>, - Requires<[IsThumb, IsThumb1Only, HasV6]>; -def : T1Pat<(sextloadi8 t_addrmode_rr:$addr), - (tSXTB (tLDRBr t_addrmode_rr:$addr))>, +// ldsr{b|h} r, 0 instead, in a hope that the mov 0 will be more likely to be +// commoned out than a sxth. +let AddedComplexity = 10 in { +def : T1Pat<(sextloadi8 tGPR:$Rn), + (tLDRSB tGPR:$Rn, (tMOVi8 0))>, Requires<[IsThumb, IsThumb1Only, HasV6]>; -def : T1Pat<(sextloadi16 t_addrmode_is2:$addr), - (tSXTH (tLDRHi t_addrmode_is2:$addr))>, - Requires<[IsThumb, IsThumb1Only, HasV6]>; -def : T1Pat<(sextloadi16 t_addrmode_rr:$addr), - (tSXTH (tLDRHr t_addrmode_rr:$addr))>, +def : T1Pat<(sextloadi16 tGPR:$Rn), + (tLDRSH tGPR:$Rn, (tMOVi8 0))>, Requires<[IsThumb, IsThumb1Only, HasV6]>; +} def : T1Pat<(sextloadi8 t_addrmode_is1:$addr), (tASRri (tLSLri (tLDRBi t_addrmode_is1:$addr), 24), 24)>; diff --git a/llvm/test/CodeGen/ARM/load.ll b/llvm/test/CodeGen/ARM/load.ll --- a/llvm/test/CodeGen/ARM/load.ll +++ b/llvm/test/CodeGen/ARM/load.ll @@ -96,8 +96,8 @@ ; Immediate offset of zero ; CHECK-LABEL: ldrsb_ri_zero -; CHECK-T1: ldrb r0, [r0] -; CHECK-T1: sxtb r0, r0 +; CHECK-T1: movs r1, #0 +; CHECK-T1: ldrsb r0, [r0, r1] ; CHECK-T2: ldrsb.w r0, [r0] define i32 @ldrsb_ri_zero(i8* %p) { entry: @@ -107,8 +107,8 @@ } ; CHECK-LABEL: ldrsh_ri_zero -; CHECK-T1: ldrh r0, [r0] -; CHECK-T1: sxth r0, r0 +; CHECK-T1: movs r1, #0 +; CHECK-T1: ldrsh r0, [r0, r1] ; CHECK-T2: ldrsh.w r0, [r0] define i32 @ldrsh_ri_zero(i16* %p) { entry: diff --git a/llvm/test/CodeGen/ARM/select-imm.ll b/llvm/test/CodeGen/ARM/select-imm.ll --- a/llvm/test/CodeGen/ARM/select-imm.ll +++ b/llvm/test/CodeGen/ARM/select-imm.ll @@ -230,10 +230,9 @@ ; THUMB1-LABEL: t9: ; THUMB1: bl f -; THUMB1: sxtb r1, r4 -; THUMB1: uxtb r0, r1 +; THUMB1: uxtb r0, r4 ; THUMB1: cmp r0, r0 -; THUMB1: adds r1, r1, #1 +; THUMB1: adds r1, r4, #1 ; THUMB1: mov r2, r0 ; THUMB1: adds r1, r1, #1 ; THUMB1: adds r2, r2, #1 diff --git a/llvm/test/CodeGen/Thumb/ldr_ext.ll b/llvm/test/CodeGen/Thumb/ldr_ext.ll --- a/llvm/test/CodeGen/Thumb/ldr_ext.ll +++ b/llvm/test/CodeGen/Thumb/ldr_ext.ll @@ -26,8 +26,8 @@ ; V5: lsls ; V5: asrs -; V6: ldrb -; V6: sxtb +; V6: mov +; V6: ldrsb %tmp.s = load i8, i8* %t0 %tmp1.s = sext i8 %tmp.s to i32 ret i32 %tmp1.s @@ -38,8 +38,8 @@ ; V5: lsls ; V5: asrs -; V6: ldrh -; V6: sxth +; V6: mov +; V6: ldrsh %tmp.s = load i16, i16* %t0 %tmp1.s = sext i16 %tmp.s to i32 ret i32 %tmp1.s