don't use "ordinary" addressing mode 1 when mvn is appropriate
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 12 Dec 2006 14:03:29 +0000 (14:03 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 12 Dec 2006 14:03:29 +0000 (14:03 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32482 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMISelDAGToDAG.cpp
test/CodeGen/ARM/mvn.ll

index 48d918c1d6c52185cf2d85a40b8b47d2fd12f76f..a796431ae782d3ddbfabdefc231fadba09d1a8d9 100644 (file)
@@ -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);
index d425498ea7e68e88b2927f2790df9f5c10a33a5c..b825cf8ea9b52d7c75a2d08f178a44f2ad5ab1fd 100644 (file)
@@ -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
+}