Index: lib/Target/ARM/ARMISelDAGToDAG.cpp =================================================================== --- lib/Target/ARM/ARMISelDAGToDAG.cpp +++ lib/Target/ARM/ARMISelDAGToDAG.cpp @@ -451,7 +451,8 @@ if (Subtarget->isThumb()) { if (Val <= 255) return 1; // MOV if (Subtarget->hasV6T2Ops() && - (Val <= 0xffff || ARM_AM::getT2SOImmValSplatVal(Val) != -1)) + (Val <= 0xffff || ARM_AM::getT2SOImmVal(Val) != -1 || // MOV + ARM_AM::getT2SOImmVal(~Val) != -1)) // MVN return 1; // MOVW if (Val <= 510) return 2; // MOV + ADDi8 if (~Val <= 255) return 2; // MOV + MVN Index: test/CodeGen/ARM/shifter_operand.ll =================================================================== --- test/CodeGen/ARM/shifter_operand.ll +++ test/CodeGen/ARM/shifter_operand.ll @@ -256,3 +256,28 @@ ret { i32, i32 } %ret } + +declare dso_local i32 @eat_const(i32) + +define hidden i32 @no_litpool() local_unnamed_addr #0 { +; CHECK-LABEL: no_litpool: +; CHECK: mov{{.*}} r0, #65536 +; CHECK: mov{{.*}} r0, #-134217728 +; CHECK: mvn r0, #-134217728 +entry: + %call0 = tail call i32 @eat_const(i32 65536) + %call1 = tail call i32 @eat_const(i32 -134217728) + %call2 = tail call i32 @eat_const(i32 134217727) + ret i32 %call2 +} + +define hidden i32 @litpool() local_unnamed_addr #0 { +; CHECK-LABEL: litpool: +; CHECK: ldr r0, {{.*}}LCPI{{.*}} +; CHECK-NEXT: b {{.*}}eat_const +entry: + %call1 = tail call i32 @eat_const(i32 8388601) + ret i32 %call1 +} + +attributes #0 = { minsize nounwind optsize }