Emit explicit any-extend to avoid weird tstbit sequences.
// Copy the result values into the output registers.
for (unsigned i = 0; i != RVLocs.size(); ++i) {
CCValAssign &VA = RVLocs[i];
+ SDValue Val = OutVals[i];
- Chain = DAG.getCopyToReg(Chain, dl, VA.getLocReg(), OutVals[i], Flag);
+ switch (VA.getLocInfo()) {
+ default:
+ // Loc info must be one of Full, BCvt, SExt, ZExt, or AExt.
+ llvm_unreachable("Unknown loc info!");
+ case CCValAssign::Full:
+ break;
+ case CCValAssign::BCvt:
+ Val = DAG.getBitcast(VA.getLocVT(), Val);
+ break;
+ case CCValAssign::SExt:
+ Val = DAG.getNode(ISD::SIGN_EXTEND, dl, VA.getLocVT(), Val);
+ break;
+ case CCValAssign::ZExt:
+ Val = DAG.getNode(ISD::ZERO_EXTEND, dl, VA.getLocVT(), Val);
+ break;
+ case CCValAssign::AExt:
+ Val = DAG.getNode(ISD::ANY_EXTEND, dl, VA.getLocVT(), Val);
+ break;
+ }
+
+ Chain = DAG.getCopyToReg(Chain, dl, VA.getLocReg(), Val, Flag);
// Guarantee that all emitted copies are stuck together with flags.
Flag = Chain.getValue(1);
; CHECK-NEXT: p0 = and(p0,p1)
; CHECK-NEXT: }
; CHECK-NEXT: {
-; CHECK-NEXT: r2 = p0
-; CHECK-NEXT: }
-; CHECK-NEXT: {
-; CHECK-NEXT: p0 = tstbit(r2,#0)
-; CHECK-NEXT: }
-; CHECK-NEXT: {
; CHECK-NEXT: r0 = p0
; CHECK-NEXT: }
; CHECK-NEXT: {
; CHECK-NEXT: p0 = or(p0,p1)
; CHECK-NEXT: }
; CHECK-NEXT: {
-; CHECK-NEXT: r2 = p0
-; CHECK-NEXT: }
-; CHECK-NEXT: {
-; CHECK-NEXT: p0 = tstbit(r2,#0)
-; CHECK-NEXT: }
-; CHECK-NEXT: {
; CHECK-NEXT: r0 = p0
; CHECK-NEXT: }
; CHECK-NEXT: {
; CHECK-NEXT: p0 = xor(p0,p1)
; CHECK-NEXT: }
; CHECK-NEXT: {
-; CHECK-NEXT: r2 = p0
-; CHECK-NEXT: }
-; CHECK-NEXT: {
-; CHECK-NEXT: p0 = tstbit(r2,#0)
-; CHECK-NEXT: }
-; CHECK-NEXT: {
; CHECK-NEXT: r0 = p0
; CHECK-NEXT: }
; CHECK-NEXT: {
; CHECK-NEXT: p0 = and(p0,!p1)
; CHECK-NEXT: }
; CHECK-NEXT: {
-; CHECK-NEXT: r0 = p0
+; CHECK-NEXT: r0 = mux(p0,#1,#0)
; CHECK-NEXT: }
; CHECK-NEXT: {
; CHECK-NEXT: jumpr r31
; CHECK-NEXT: p0 = or(p0,!p1)
; CHECK-NEXT: }
; CHECK-NEXT: {
-; CHECK-NEXT: r0 = p0
+; CHECK-NEXT: r0 = mux(p0,#1,#0)
; CHECK-NEXT: }
; CHECK-NEXT: {
; CHECK-NEXT: jumpr r31
; CHECK-NEXT: p0 = and(p2,and(p0,p1))
; CHECK-NEXT: }
; CHECK-NEXT: {
-; CHECK-NEXT: r2 = p0
-; CHECK-NEXT: }
-; CHECK-NEXT: {
-; CHECK-NEXT: p0 = tstbit(r2,#0)
-; CHECK-NEXT: }
-; CHECK-NEXT: {
; CHECK-NEXT: r0 = p0
; CHECK-NEXT: }
; CHECK-NEXT: {
; CHECK-NEXT: p0 = and(p2,or(p0,p1))
; CHECK-NEXT: }
; CHECK-NEXT: {
-; CHECK-NEXT: r2 = p0
-; CHECK-NEXT: }
-; CHECK-NEXT: {
-; CHECK-NEXT: p0 = tstbit(r2,#0)
-; CHECK-NEXT: }
-; CHECK-NEXT: {
; CHECK-NEXT: r0 = p0
; CHECK-NEXT: }
; CHECK-NEXT: {
; CHECK-NEXT: p0 = or(p2,and(p0,p1))
; CHECK-NEXT: }
; CHECK-NEXT: {
-; CHECK-NEXT: r2 = p0
-; CHECK-NEXT: }
-; CHECK-NEXT: {
-; CHECK-NEXT: p0 = tstbit(r2,#0)
-; CHECK-NEXT: }
-; CHECK-NEXT: {
; CHECK-NEXT: r0 = p0
; CHECK-NEXT: }
; CHECK-NEXT: {
; CHECK-NEXT: p0 = or(p2,or(p0,p1))
; CHECK-NEXT: }
; CHECK-NEXT: {
-; CHECK-NEXT: r2 = p0
-; CHECK-NEXT: }
-; CHECK-NEXT: {
-; CHECK-NEXT: p0 = tstbit(r2,#0)
-; CHECK-NEXT: }
-; CHECK-NEXT: {
; CHECK-NEXT: r0 = p0
; CHECK-NEXT: }
; CHECK-NEXT: {
; CHECK-NEXT: p0 = and(p2,and(p0,!p1))
; CHECK-NEXT: }
; CHECK-NEXT: {
-; CHECK-NEXT: r0 = p0
+; CHECK-NEXT: r0 = mux(p0,#1,#0)
; CHECK-NEXT: }
; CHECK-NEXT: {
; CHECK-NEXT: jumpr r31
; CHECK-NEXT: p0 = and(p2,or(p0,!p1))
; CHECK-NEXT: }
; CHECK-NEXT: {
-; CHECK-NEXT: r0 = p0
+; CHECK-NEXT: r0 = mux(p0,#1,#0)
; CHECK-NEXT: }
; CHECK-NEXT: {
; CHECK-NEXT: jumpr r31
; CHECK-NEXT: p0 = or(p2,and(p0,!p1))
; CHECK-NEXT: }
; CHECK-NEXT: {
-; CHECK-NEXT: r0 = p0
+; CHECK-NEXT: r0 = mux(p0,#1,#0)
; CHECK-NEXT: }
; CHECK-NEXT: {
; CHECK-NEXT: jumpr r31
; CHECK-NEXT: p0 = or(p2,or(p0,!p1))
; CHECK-NEXT: }
; CHECK-NEXT: {
-; CHECK-NEXT: r0 = p0
+; CHECK-NEXT: r0 = mux(p0,#1,#0)
; CHECK-NEXT: }
; CHECK-NEXT: {
; CHECK-NEXT: jumpr r31
-; RUN: llc -march=hexagon -O3 < %s | FileCheck %s
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -march=hexagon < %s | FileCheck %s
-; CHECK: r{{[0-9]+}} = p{{[0-9]+}}
-
-define i1 @f0() #0 {
+define i1 @f0(i32 %a0) #0 {
+; CHECK-LABEL: f0:
+; CHECK: // %bb.0: // %b0
+; CHECK-NEXT: {
+; CHECK-NEXT: p0 = cmp.eq(r0,#0)
+; CHECK-NEXT: }
+; CHECK-NEXT: {
+; CHECK-NEXT: r0 = mux(p0,#0,#1)
+; CHECK-NEXT: jumpr r31
+; CHECK-NEXT: }
b0:
- ret i1 false
+ %v0 = icmp ne i32 %a0, 0
+ ret i1 %v0
}
-attributes #0 = { nounwind "target-cpu"="hexagonv5" }
+attributes #0 = { nounwind "target-cpu"="hexagonv66" }
;; RUN: llc -mtriple=hexagon-unknown-elf -filetype=obj %s -o - \
;; RUN: | llvm-objdump -d - | FileCheck %s
-define i1 @foo (i32 %a, i32 %b)
-{
- %1 = icmp eq i32 %a, %b
- ret i1 %1
+define i1 @f0(i32 %a0, i32 %a1) {
+ %v0 = icmp eq i32 %a0, %a1
+ ret i1 %v0
}
; CHECK: p0 = cmp.eq(r0,r1)
-; CHECK: r0 = p0
+; CHECK: r0 = mux(p0,#1,#0)
; CHECK: jumpr r31
;; RUN: llc -mtriple=hexagon-unknown-elf -filetype=obj %s -o - \
;; RUN: | llvm-objdump -d - | FileCheck %s
-define i1 @foo (i32 %a)
-{
- %1 = icmp eq i32 %a, 42
- ret i1 %1
+define i1 @f0(i32 %a0) {
+ %v0 = icmp eq i32 %a0, 42
+ ret i1 %v0
}
; CHECK: p0 = cmp.eq(r0,#42)
-; CHECK: r0 = p0
+; CHECK: r0 = mux(p0,#1,#0)
; CHECK: jumpr r31
;; RUN: llc -mtriple=hexagon-unknown-elf -filetype=obj %s -o - \
;; RUN: | llvm-objdump -d - | FileCheck %s
-define i1 @foo (i32 %a, i32 %b)
-{
- %1 = icmp sgt i32 %a, %b
- ret i1 %1
+define i1 @f0(i32 %a0, i32 %a1) {
+ %v0 = icmp sgt i32 %a0, %a1
+ ret i1 %v0
}
; CHECK: p0 = cmp.gt(r0,r1)
-; CHECK: r0 = p0
-; CHECK: jumpr r31 }
+; CHECK: r0 = mux(p0,#1,#0)
+; CHECK: jumpr r31
;; RUN: llc -mtriple=hexagon-unknown-elf -filetype=obj %s -o - \
;; RUN: | llvm-objdump -d - | FileCheck %s
-define i1 @foo (i32 %a)
-{
- %1 = icmp sgt i32 %a, 42
- ret i1 %1
+define i1 @f0(i32 %a0) {
+ %v0 = icmp sgt i32 %a0, 42
+ ret i1 %v0
}
; CHECK: p0 = cmp.gt(r0,#42)
-; CHECK: r0 = p0
+; CHECK: r0 = mux(p0,#1,#0)
; CHECK: jumpr r31
;; RUN: llc -mtriple=hexagon-unknown-elf -filetype=obj %s -o - \
;; RUN: | llvm-objdump -d - | FileCheck %s
-define i1 @foo (i32 %a, i32 %b)
-{
- %1 = icmp slt i32 %a, %b
- ret i1 %1
+define i1 @f0(i32 %a0, i32 %a1) {
+ %v0 = icmp slt i32 %a0, %a1
+ ret i1 %v0
}
; CHECK: p0 = cmp.gt(r1,r0)
-; CHECK: r0 = p0
+; CHECK: r0 = mux(p0,#1,#0)
; CHECK: jumpr r31
;; RUN: llc -mtriple=hexagon-unknown-elf -filetype=obj %s -o - \
;; RUN: | llvm-objdump -d - | FileCheck %s
-define i1 @foo (i32 %a, i32 %b)
-{
- %1 = icmp ugt i32 %a, %b
- ret i1 %1
+define i1 @f0(i32 %a0, i32 %a1) {
+ %v0 = icmp ugt i32 %a0, %a1
+ ret i1 %v0
}
; CHECK: p0 = cmp.gtu(r0,r1)
-; CHECK: r0 = p0
+; CHECK: r0 = mux(p0,#1,#0)
; CHECK: jumpr r31
;; RUN: llc -mtriple=hexagon-unknown-elf -filetype=obj %s -o - \
;; RUN: | llvm-objdump -d - | FileCheck %s
-define i1 @foo (i32 %a)
-{
- %1 = icmp ugt i32 %a, 42
- ret i1 %1
+define i1 @f0(i32 %a0) {
+ %v0 = icmp ugt i32 %a0, 42
+ ret i1 %v0
}
; CHECK: p0 = cmp.gtu(r0,#42)
-; CHECK: r0 = p0
+; CHECK: r0 = mux(p0,#1,#0)
; CHECK: jumpr r31
;; RUN: llc -mtriple=hexagon-unknown-elf -filetype=obj %s -o - \
;; RUN: | llvm-objdump -d - | FileCheck %s
-define i1 @foo (i32 %a, i32 %b)
-{
- %1 = icmp ult i32 %a, %b
- ret i1 %1
+define i1 @f0(i32 %a0, i32 %a1) {
+ %v0 = icmp ult i32 %a0, %a1
+ ret i1 %v0
}
; CHECK: p0 = cmp.gtu(r1,r0)
-; CHECK: r0 = p0
+; CHECK: r0 = mux(p0,#1,#0)
; CHECK: jumpr r31