aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2006-12-12 14:03:29 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2006-12-12 14:03:29 +0000
commit2426775c81b32ab0f12eb15e45001303737060c8 (patch)
tree70f91551e16aa8a2051b8418ad5f59754c294155
parent78f97f3118c0d7fbebf4084e24689c596d5e4fb7 (diff)
don't use "ordinary" addressing mode 1 when mvn is appropriate
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32482 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/ARM/ARMISelDAGToDAG.cpp2
-rw-r--r--test/CodeGen/ARM/mvn.ll13
2 files changed, 14 insertions, 1 deletions
diff --git a/lib/Target/ARM/ARMISelDAGToDAG.cpp b/lib/Target/ARM/ARMISelDAGToDAG.cpp
index 48d918c1d6..a796431ae7 100644
--- a/lib/Target/ARM/ARMISelDAGToDAG.cpp
+++ b/lib/Target/ARM/ARMISelDAGToDAG.cpp
@@ -849,6 +849,8 @@ bool ARMDAGToDAGISel::SelectAddrMode1(SDOperand Op,
case ISD::Constant: {
uint32_t val = cast<ConstantSDNode>(N)->getValue();
if(!isRotInt8Immediate(val)) {
+ if (isRotInt8Immediate(~val))
+ return false; //use MVN
Constant *C = ConstantInt::get(Type::UIntTy, val);
int alignment = 2;
SDOperand Addr = CurDAG->getTargetConstantPool(C, MVT::i32, alignment);
diff --git a/test/CodeGen/ARM/mvn.ll b/test/CodeGen/ARM/mvn.ll
index d425498ea7..b825cf8ea9 100644
--- a/test/CodeGen/ARM/mvn.ll
+++ b/test/CodeGen/ARM/mvn.ll
@@ -1,5 +1,5 @@
; RUN: llvm-upgrade < %s | llvm-as | llc -march=arm &&
-; RUN: llvm-upgrade < %s | llvm-as | llc -march=arm | grep mvn | wc -l | grep 5
+; RUN: llvm-upgrade < %s | llvm-as | llc -march=arm | grep mvn | wc -l | grep 6
int %f1() {
entry:
@@ -53,3 +53,14 @@ entry:
%tmp3not = xor int %tmp3, -1 ; <int> [#uses=1]
ret int %tmp3not
}
+
+int %f9() {
+entry:
+ %tmp4845 = add int 0, 0
+ br label %cond_true4848
+
+cond_true4848: ; preds = %bb4835
+ %tmp4851 = sub int -3, 0 ; <int> [#uses=1]
+ %abc = add int %tmp4851, %tmp4845
+ ret int %abc
+}