Skip to content

Conversation

@AZero13
Copy link
Contributor

@AZero13 AZero13 commented Jul 1, 2025

It works perfectly for ARM too.

@llvmbot
Copy link
Member

llvmbot commented Jul 1, 2025

@llvm/pr-subscribers-backend-arm

Author: AZero13 (AZero13)

Changes

It works perfectly for ARM too.


Full diff: https://github.com/llvm/llvm-project/pull/146561.diff

2 Files Affected:

  • (modified) llvm/lib/Target/ARM/ARMISelLowering.cpp (+15)
  • (added) llvm/test/CodeGen/ARM/cmp-select-sign.ll (+136)
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp
index 2f89e23993385..735184115e3b8 100644
--- a/llvm/lib/Target/ARM/ARMISelLowering.cpp
+++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp
@@ -5510,6 +5510,21 @@ SDValue ARMTargetLowering::LowerSELECT_CC(SDValue Op, SelectionDAG &DAG) const {
   SDValue FalseVal = Op.getOperand(3);
   ConstantSDNode *CFVal = dyn_cast<ConstantSDNode>(FalseVal);
   ConstantSDNode *CTVal = dyn_cast<ConstantSDNode>(TrueVal);
+  ConstantSDNode *RHSC = dyn_cast<ConstantSDNode>(RHS);
+  if (LHS.getValueType() == MVT::i32 && RHS.getValueType() == MVT::i32) {
+    // Check for sign pattern (SELECT_CC setgt, iN lhs, -1, 1, -1) and transform
+    // into (OR (ASR lhs, N-1), 1), which requires less instructions for the
+    // supported types.
+    if (CC == ISD::SETGT && RHSC && RHSC->isAllOnes() && CTVal && CFVal &&
+        CTVal->isOne() && CFVal->isAllOnes() &&
+        LHS.getValueType() == TrueVal.getValueType()) {
+      EVT VT = LHS.getValueType();
+      SDValue Shift =
+          DAG.getNode(ISD::SRA, dl, VT, LHS,
+                      DAG.getConstant(VT.getSizeInBits() - 1, dl, VT));
+      return DAG.getNode(ISD::OR, dl, VT, Shift, DAG.getConstant(1, dl, VT));
+    }
+  }
 
   if (Subtarget->hasV8_1MMainlineOps() && CFVal && CTVal &&
       LHS.getValueType() == MVT::i32 && RHS.getValueType() == MVT::i32) {
diff --git a/llvm/test/CodeGen/ARM/cmp-select-sign.ll b/llvm/test/CodeGen/ARM/cmp-select-sign.ll
new file mode 100644
index 0000000000000..34f342e2f207e
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/cmp-select-sign.ll
@@ -0,0 +1,136 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=armv7a < %s | FileCheck %s --check-prefix=ARM
+; RUN: llc -mtriple=armv6m < %s | FileCheck %s --check-prefix=THUMB
+; RUN: llc -mtriple=armv7m < %s | FileCheck %s --check-prefix=THUMB2
+
+define i3 @sign_i3(i3 %a) {
+; ARM-LABEL: sign_i3:
+; ARM:       @ %bb.0:
+; ARM-NEXT:    lsl r0, r0, #29
+; ARM-NEXT:    mov r1, #1
+; ARM-NEXT:    orr r0, r1, r0, asr #31
+; ARM-NEXT:    bx lr
+;
+; THUMB-LABEL: sign_i3:
+; THUMB:       @ %bb.0:
+; THUMB-NEXT:    lsls r0, r0, #29
+; THUMB-NEXT:    asrs r1, r0, #31
+; THUMB-NEXT:    movs r0, #1
+; THUMB-NEXT:    orrs r0, r1
+; THUMB-NEXT:    bx lr
+;
+; THUMB2-LABEL: sign_i3:
+; THUMB2:       @ %bb.0:
+; THUMB2-NEXT:    lsls r0, r0, #29
+; THUMB2-NEXT:    movs r1, #1
+; THUMB2-NEXT:    orr.w r0, r1, r0, asr #31
+; THUMB2-NEXT:    bx lr
+  %c = icmp sgt i3 %a, -1
+  %res = select i1 %c, i3 1, i3 -1
+  ret i3 %res
+}
+
+define i4 @sign_i4(i4 %a) {
+; ARM-LABEL: sign_i4:
+; ARM:       @ %bb.0:
+; ARM-NEXT:    lsl r0, r0, #28
+; ARM-NEXT:    mov r1, #1
+; ARM-NEXT:    orr r0, r1, r0, asr #31
+; ARM-NEXT:    bx lr
+;
+; THUMB-LABEL: sign_i4:
+; THUMB:       @ %bb.0:
+; THUMB-NEXT:    lsls r0, r0, #28
+; THUMB-NEXT:    asrs r1, r0, #31
+; THUMB-NEXT:    movs r0, #1
+; THUMB-NEXT:    orrs r0, r1
+; THUMB-NEXT:    bx lr
+;
+; THUMB2-LABEL: sign_i4:
+; THUMB2:       @ %bb.0:
+; THUMB2-NEXT:    lsls r0, r0, #28
+; THUMB2-NEXT:    movs r1, #1
+; THUMB2-NEXT:    orr.w r0, r1, r0, asr #31
+; THUMB2-NEXT:    bx lr
+  %c = icmp sgt i4 %a, -1
+  %res = select i1 %c, i4 1, i4 -1
+  ret i4 %res
+}
+
+define i8 @sign_i8(i8 %a) {
+; ARM-LABEL: sign_i8:
+; ARM:       @ %bb.0:
+; ARM-NEXT:    lsl r0, r0, #24
+; ARM-NEXT:    mov r1, #1
+; ARM-NEXT:    orr r0, r1, r0, asr #31
+; ARM-NEXT:    bx lr
+;
+; THUMB-LABEL: sign_i8:
+; THUMB:       @ %bb.0:
+; THUMB-NEXT:    lsls r0, r0, #24
+; THUMB-NEXT:    asrs r1, r0, #31
+; THUMB-NEXT:    movs r0, #1
+; THUMB-NEXT:    orrs r0, r1
+; THUMB-NEXT:    bx lr
+;
+; THUMB2-LABEL: sign_i8:
+; THUMB2:       @ %bb.0:
+; THUMB2-NEXT:    lsls r0, r0, #24
+; THUMB2-NEXT:    movs r1, #1
+; THUMB2-NEXT:    orr.w r0, r1, r0, asr #31
+; THUMB2-NEXT:    bx lr
+  %c = icmp sgt i8 %a, -1
+  %res = select i1 %c, i8 1, i8 -1
+  ret i8 %res
+}
+
+define i16 @sign_i16(i16 %a) {
+; ARM-LABEL: sign_i16:
+; ARM:       @ %bb.0:
+; ARM-NEXT:    lsl r0, r0, #16
+; ARM-NEXT:    mov r1, #1
+; ARM-NEXT:    orr r0, r1, r0, asr #31
+; ARM-NEXT:    bx lr
+;
+; THUMB-LABEL: sign_i16:
+; THUMB:       @ %bb.0:
+; THUMB-NEXT:    lsls r0, r0, #16
+; THUMB-NEXT:    asrs r1, r0, #31
+; THUMB-NEXT:    movs r0, #1
+; THUMB-NEXT:    orrs r0, r1
+; THUMB-NEXT:    bx lr
+;
+; THUMB2-LABEL: sign_i16:
+; THUMB2:       @ %bb.0:
+; THUMB2-NEXT:    lsls r0, r0, #16
+; THUMB2-NEXT:    movs r1, #1
+; THUMB2-NEXT:    orr.w r0, r1, r0, asr #31
+; THUMB2-NEXT:    bx lr
+  %c = icmp sgt i16 %a, -1
+  %res = select i1 %c, i16 1, i16 -1
+  ret i16 %res
+}
+
+define i32 @sign_i32(i32 %a) {
+; ARM-LABEL: sign_i32:
+; ARM:       @ %bb.0:
+; ARM-NEXT:    mov r1, #1
+; ARM-NEXT:    orr r0, r1, r0, asr #31
+; ARM-NEXT:    bx lr
+;
+; THUMB-LABEL: sign_i32:
+; THUMB:       @ %bb.0:
+; THUMB-NEXT:    asrs r1, r0, #31
+; THUMB-NEXT:    movs r0, #1
+; THUMB-NEXT:    orrs r0, r1
+; THUMB-NEXT:    bx lr
+;
+; THUMB2-LABEL: sign_i32:
+; THUMB2:       @ %bb.0:
+; THUMB2-NEXT:    movs r1, #1
+; THUMB2-NEXT:    orr.w r0, r1, r0, asr #31
+; THUMB2-NEXT:    bx lr
+  %c = icmp sgt i32 %a, -1
+  %res = select i1 %c, i32 1, i32 -1
+  ret i32 %res
+}

@AZero13
Copy link
Contributor Author

AZero13 commented Jul 1, 2025

@davemgreen

Copy link
Collaborator

@davemgreen davemgreen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM, thanks.

@AZero13 AZero13 force-pushed the king branch 5 times, most recently from 1895360 to 506bc31 Compare July 4, 2025 00:24
@AZero13
Copy link
Contributor Author

AZero13 commented Jul 4, 2025

@davemgreen Done!

Copy link
Collaborator

@davemgreen davemgreen left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks. LGTM

@AZero13
Copy link
Contributor Author

AZero13 commented Jul 4, 2025

Thanks. LGTM

Thank you. Can you please merge?

@davemgreen davemgreen merged commit 7d65cb1 into llvm:main Jul 5, 2025
9 checks passed
@AZero13 AZero13 deleted the king branch July 5, 2025 17:22
@llvm-ci
Copy link
Collaborator

llvm-ci commented Jul 5, 2025

LLVM Buildbot has detected a new failure on builder lldb-x86_64-debian running on lldb-x86_64-debian while building llvm at step 6 "test".

Full details are available at: https://lab.llvm.org/buildbot/#/builders/162/builds/26100

Here is the relevant piece of the build log for the reference
Step 6 (test) failure: build (failure)
...
UNSUPPORTED: lldb-shell :: Process/Windows/msstl_smoke.cpp (3060 of 3071)
UNSUPPORTED: lldb-shell :: ScriptInterpreter/Lua/nested_sessions.test (3061 of 3071)
UNSUPPORTED: lldb-shell :: ScriptInterpreter/Lua/lua-python.test (3062 of 3071)
UNSUPPORTED: lldb-shell :: Expr/TestIRMemoryMapWindows.test (3063 of 3071)
UNSUPPORTED: lldb-shell :: ScriptInterpreter/Lua/io.test (3064 of 3071)
UNSUPPORTED: lldb-shell :: ScriptInterpreter/Lua/breakpoint_callback.test (3065 of 3071)
UNSUPPORTED: lldb-shell :: Process/Windows/exception_access_violation.cpp (3066 of 3071)
PASS: lldb-api :: api/multithreaded/TestMultithreaded.py (3067 of 3071)
PASS: lldb-api :: terminal/TestEditlineCompletions.py (3068 of 3071)
UNRESOLVED: lldb-api :: tools/lldb-dap/launch/TestDAP_launch.py (3069 of 3071)
******************** TEST 'lldb-api :: tools/lldb-dap/launch/TestDAP_launch.py' FAILED ********************
Script:
--
/usr/bin/python3 /home/worker/2.0.1/lldb-x86_64-debian/llvm-project/lldb/test/API/dotest.py -u CXXFLAGS -u CFLAGS --env LLVM_LIBS_DIR=/home/worker/2.0.1/lldb-x86_64-debian/build/./lib --env LLVM_INCLUDE_DIR=/home/worker/2.0.1/lldb-x86_64-debian/build/include --env LLVM_TOOLS_DIR=/home/worker/2.0.1/lldb-x86_64-debian/build/./bin --arch x86_64 --build-dir /home/worker/2.0.1/lldb-x86_64-debian/build/lldb-test-build.noindex --lldb-module-cache-dir /home/worker/2.0.1/lldb-x86_64-debian/build/lldb-test-build.noindex/module-cache-lldb/lldb-api --clang-module-cache-dir /home/worker/2.0.1/lldb-x86_64-debian/build/lldb-test-build.noindex/module-cache-clang/lldb-api --executable /home/worker/2.0.1/lldb-x86_64-debian/build/./bin/lldb --compiler /home/worker/2.0.1/lldb-x86_64-debian/build/./bin/clang --dsymutil /home/worker/2.0.1/lldb-x86_64-debian/build/./bin/dsymutil --make /usr/bin/gmake --llvm-tools-dir /home/worker/2.0.1/lldb-x86_64-debian/build/./bin --lldb-obj-root /home/worker/2.0.1/lldb-x86_64-debian/build/tools/lldb --lldb-libs-dir /home/worker/2.0.1/lldb-x86_64-debian/build/./lib --cmake-build-type Release -t /home/worker/2.0.1/lldb-x86_64-debian/llvm-project/lldb/test/API/tools/lldb-dap/launch -p TestDAP_launch.py
--
Exit Code: 1

Command Output (stdout):
--
lldb version 21.0.0git (https://github.com/llvm/llvm-project.git revision 7d65cb1952dc77f1562659fafcb512ddd1a488fa)
  clang revision 7d65cb1952dc77f1562659fafcb512ddd1a488fa
  llvm revision 7d65cb1952dc77f1562659fafcb512ddd1a488fa
Skipping the following test categories: ['libc++', 'dsym', 'gmodules', 'debugserver', 'objc']

--
Command Output (stderr):
--
Change dir to: /home/worker/2.0.1/lldb-x86_64-debian/llvm-project/lldb/test/API/tools/lldb-dap/launch
runCmd: settings clear --all

output: 

runCmd: settings set symbols.enable-external-lookup false

output: 

runCmd: settings set target.inherit-tcc true

output: 

runCmd: settings set target.disable-aslr false

output: 

runCmd: settings set target.detach-on-error false

output: 

runCmd: settings set target.auto-apply-fixits false

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants