| ; RUN: llc -mtriple=hexagon < %s | FileCheck %s | |
| ; Unsigned comparisons of short integers should not force a sign-extending | |
| ; load, since sign-extending the operands only makes the compared constant | |
| ; harder to encode. | |
| ; CHECK-LABEL: f0: | |
| ; CHECK-NOT: memh( | |
| ; CHECK: r[[R0:[0-9]+]] = memuh(r0+#4) | |
| ; CHECK: cmp.gtu(r[[R0]],#12) | |
| define i32 @f0(ptr %p) nounwind { | |
| entry: | |
| %a = getelementptr inbounds i16, ptr %p, i32 2 | |
| %v = load i16, ptr %a, align 2 | |
| %c = icmp ugt i16 %v, 12 | |
| br i1 %c, label %exit0, label %exit1 | |
| exit0: | |
| ret i32 0 | |
| exit1: | |
| ret i32 1 | |
| } | |
| ; A constant with the sign bit of the short type set does not have to be | |
| ; materialized in a register. | |
| ; CHECK-LABEL: f1: | |
| ; CHECK-NOT: memh( | |
| ; CHECK: r[[R1:[0-9]+]] = memuh(r0+#0) | |
| ; CHECK: cmp.gtu(r[[R1]],##65523) | |
| define i32 @f1(ptr %p) nounwind { | |
| entry: | |
| %v = load i16, ptr %p, align 2 | |
| %c = icmp ult i16 %v, 65524 | |
| %r = zext i1 %c to i32 | |
| ret i32 %r | |
| } |