From df43e6862918eba86dd8b608bc2ae202225092dc Mon Sep 17 00:00:00 2001 From: Brendon Cahoon Date: Fri, 8 May 2015 16:16:29 +0000 Subject: [Hexagon] Update AnalyzeBranch, etc target hooks Improved the AnalyzeBranch, InsertBranch, and RemoveBranch functions in order to handle more of our branch instructions. This requires changes to analyzeCompare and PredicateInstructions. Specifically, we've added support for new value compare jumps, improved handling of endloop, added more compare instructions, and improved support for predicate instructions. Differential Revision: http://reviews.llvm.org/D9559 llvm-svn: 236876 --- llvm/test/CodeGen/Hexagon/alu64.ll | 599 ++++++++++++++++++++++++++++ llvm/test/CodeGen/Hexagon/remove-endloop.ll | 56 +++ 2 files changed, 655 insertions(+) create mode 100644 llvm/test/CodeGen/Hexagon/alu64.ll create mode 100644 llvm/test/CodeGen/Hexagon/remove-endloop.ll (limited to 'llvm/test') diff --git a/llvm/test/CodeGen/Hexagon/alu64.ll b/llvm/test/CodeGen/Hexagon/alu64.ll new file mode 100644 index 00000000000..d0824a4ecad --- /dev/null +++ b/llvm/test/CodeGen/Hexagon/alu64.ll @@ -0,0 +1,599 @@ +; RUN: llc -march=hexagon < %s | FileCheck %s + +; CHECK-LABEL: @test00 +; CHECK: p0 = cmp.eq(r1:0, r3:2) +define i32 @test00(i64 %Rs, i64 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.C2.cmpeqp(i64 %Rs, i64 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test01 +; CHECK: p0 = cmp.gt(r1:0, r3:2) +define i32 @test01(i64 %Rs, i64 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.C2.cmpgtp(i64 %Rs, i64 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test02 +; CHECK: p0 = cmp.gtu(r1:0, r3:2) +define i32 @test02(i64 %Rs, i64 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.C2.cmpgtup(i64 %Rs, i64 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test10 +; CHECK: r0 = cmp.eq(r0, r1) +define i32 @test10(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A4.rcmpeq(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test11 +; CHECK: r0 = !cmp.eq(r0, r1) +define i32 @test11(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A4.rcmpneq(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test12 +; CHECK: r0 = cmp.eq(r0, #23) +define i32 @test12(i32 %Rs) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A4.rcmpeqi(i32 %Rs, i32 23) + ret i32 %0 +} + +; CHECK-LABEL: @test13 +; CHECK: r0 = !cmp.eq(r0, #47) +define i32 @test13(i32 %Rs) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A4.rcmpneqi(i32 %Rs, i32 47) + ret i32 %0 +} + +; CHECK-LABEL: @test20 +; CHECK: p0 = cmpb.eq(r0, r1) +define i32 @test20(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A4.cmpbeq(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test21 +; CHECK: p0 = cmpb.gt(r0, r1) +define i32 @test21(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A4.cmpbgt(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test22 +; CHECK: p0 = cmpb.gtu(r0, r1) +define i32 @test22(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A4.cmpbgtu(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test23 +; CHECK: p0 = cmpb.eq(r0, #56) +define i32 @test23(i32 %Rs) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A4.cmpbeqi(i32 %Rs, i32 56) + ret i32 %0 +} + +; CHECK-LABEL: @test24 +; CHECK: p0 = cmpb.gt(r0, #29) +define i32 @test24(i32 %Rs) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A4.cmpbgti(i32 %Rs, i32 29) + ret i32 %0 +} + +; CHECK-LABEL: @test25 +; CHECK: p0 = cmpb.gtu(r0, #111) +define i32 @test25(i32 %Rs) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A4.cmpbgtui(i32 %Rs, i32 111) + ret i32 %0 +} + +; CHECK-LABEL: @test30 +; CHECK: p0 = cmph.eq(r0, r1) +define i32 @test30(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A4.cmpheq(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test31 +; CHECK: p0 = cmph.gt(r0, r1) +define i32 @test31(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A4.cmphgt(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test32 +; CHECK: p0 = cmph.gtu(r0, r1) +define i32 @test32(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A4.cmphgtu(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test33 +; CHECK: p0 = cmph.eq(r0, #-123) +define i32 @test33(i32 %Rs) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A4.cmpheqi(i32 %Rs, i32 -123) + ret i32 %0 +} + +; CHECK-LABEL: @test34 +; CHECK: p0 = cmph.gt(r0, #-3) +define i32 @test34(i32 %Rs) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A4.cmphgti(i32 %Rs, i32 -3) + ret i32 %0 +} + +; CHECK-LABEL: @test35 +; CHECK: p0 = cmph.gtu(r0, #13) +define i32 @test35(i32 %Rs) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A4.cmphgtui(i32 %Rs, i32 13) + ret i32 %0 +} + +; CHECK-LABEL: @test40 +; CHECK: r1:0 = vmux(p0, r3:2, r5:4) +define i64 @test40(i32 %Pu, i64 %Rs, i64 %Rt) #0 { +entry: + %0 = tail call i64 @llvm.hexagon.C2.vmux(i32 %Pu, i64 %Rs, i64 %Rt) + ret i64 %0 +} + +; CHECK-LABEL: @test41 +; CHECK: p0 = any8(vcmpb.eq(r1:0, r3:2)) +define i32 @test41(i64 %Rs, i64 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A4.vcmpbeq.any(i64 %Rs, i64 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test50 +; CHECK: r1:0 = add(r1:0, r3:2) +define i64 @test50(i64 %Rs, i64 %Rt) #0 { +entry: + %0 = tail call i64 @llvm.hexagon.A2.addp(i64 %Rs, i64 %Rt) + ret i64 %0 +} + +; CHECK-LABEL: @test51 +; CHECK: r1:0 = add(r1:0, r3:2):sat +define i64 @test51(i64 %Rs, i64 %Rt) #0 { +entry: + %0 = tail call i64 @llvm.hexagon.A2.addpsat(i64 %Rs, i64 %Rt) + ret i64 %0 +} + +; CHECK-LABEL: @test52 +; CHECK: r1:0 = sub(r1:0, r3:2) +define i64 @test52(i64 %Rs, i64 %Rt) #0 { +entry: + %0 = tail call i64 @llvm.hexagon.A2.subp(i64 %Rs, i64 %Rt) + ret i64 %0 +} + +; CHECK-LABEL: @test53 +; CHECK: r1:0 = add(r0, r3:2) +define i64 @test53(i32 %Rs, i64 %Rt) #0 { +entry: + %0 = tail call i64 @llvm.hexagon.A2.addsp(i32 %Rs, i64 %Rt) + ret i64 %0 +} + +; CHECK-LABEL: @test54 +; CHECK: r1:0 = and(r1:0, r3:2) +define i64 @test54(i64 %Rs, i64 %Rt) #0 { +entry: + %0 = tail call i64 @llvm.hexagon.A2.andp(i64 %Rs, i64 %Rt) + ret i64 %0 +} + +; CHECK-LABEL: @test55 +; CHECK: r1:0 = or(r1:0, r3:2) +define i64 @test55(i64 %Rs, i64 %Rt) #0 { +entry: + %0 = tail call i64 @llvm.hexagon.A2.orp(i64 %Rs, i64 %Rt) + ret i64 %0 +} + +; CHECK-LABEL: @test56 +; CHECK: r1:0 = xor(r1:0, r3:2) +define i64 @test56(i64 %Rs, i64 %Rt) #0 { +entry: + %0 = tail call i64 @llvm.hexagon.A2.xorp(i64 %Rs, i64 %Rt) + ret i64 %0 +} + +; CHECK-LABEL: @test57 +; CHECK: r1:0 = and(r1:0, ~r3:2) +define i64 @test57(i64 %Rs, i64 %Rt) #0 { +entry: + %0 = tail call i64 @llvm.hexagon.A4.andnp(i64 %Rs, i64 %Rt) + ret i64 %0 +} + +; CHECK-LABEL: @test58 +; CHECK: r1:0 = or(r1:0, ~r3:2) +define i64 @test58(i64 %Rs, i64 %Rt) #0 { +entry: + %0 = tail call i64 @llvm.hexagon.A4.ornp(i64 %Rs, i64 %Rt) + ret i64 %0 +} + +; CHECK-LABEL: @test60 +; CHECK: r0 = add(r0.l, r1.l) +define i32 @test60(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A2.addh.l16.ll(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test61 +; CHECK: r0 = add(r0.l, r1.h) +define i32 @test61(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A2.addh.l16.hl(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test62 +; CHECK: r0 = add(r0.l, r1.l):sat +define i32 @test62(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A2.addh.l16.sat.ll(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test63 +; CHECK: r0 = add(r0.l, r1.h):sat +define i32 @test63(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A2.addh.l16.sat.hl(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test64 +; CHECK: r0 = add(r0.l, r1.l):<<16 +define i32 @test64(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A2.addh.h16.ll(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test65 +; CHECK: r0 = add(r0.l, r1.h):<<16 +define i32 @test65(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A2.addh.h16.lh(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test66 +; CHECK: r0 = add(r0.h, r1.l):<<16 +define i32 @test66(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A2.addh.h16.hl(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test67 +; CHECK: r0 = add(r0.h, r1.h):<<16 +define i32 @test67(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A2.addh.h16.hh(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test68 +; CHECK: r0 = add(r0.l, r1.l):sat:<<16 +define i32 @test68(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A2.addh.h16.sat.ll(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test69 +; CHECK: r0 = add(r0.l, r1.h):sat:<<16 +define i32 @test69(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A2.addh.h16.sat.lh(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test6A +; CHECK: r0 = add(r0.h, r1.l):sat:<<16 +define i32 @test6A(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A2.addh.h16.sat.hl(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test6B +; CHECK: r0 = add(r0.h, r1.h):sat:<<16 +define i32 @test6B(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A2.addh.h16.sat.hh(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test70 +; CHECK: r0 = sub(r0.l, r1.l) +define i32 @test70(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A2.subh.l16.ll(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test71 +; CHECK: r0 = sub(r0.l, r1.h) +define i32 @test71(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A2.subh.l16.hl(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test72 +; CHECK: r0 = sub(r0.l, r1.l):sat +define i32 @test72(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A2.subh.l16.sat.ll(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test73 +; CHECK: r0 = sub(r0.l, r1.h):sat +define i32 @test73(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A2.subh.l16.sat.hl(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test74 +; CHECK: r0 = sub(r0.l, r1.l):<<16 +define i32 @test74(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A2.subh.h16.ll(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test75 +; CHECK: r0 = sub(r0.l, r1.h):<<16 +define i32 @test75(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A2.subh.h16.lh(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test76 +; CHECK: r0 = sub(r0.h, r1.l):<<16 +define i32 @test76(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A2.subh.h16.hl(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test77 +; CHECK: r0 = sub(r0.h, r1.h):<<16 +define i32 @test77(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A2.subh.h16.hh(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test78 +; CHECK: r0 = sub(r0.l, r1.l):sat:<<16 +define i32 @test78(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A2.subh.h16.sat.ll(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test79 +; CHECK: r0 = sub(r0.l, r1.h):sat:<<16 +define i32 @test79(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A2.subh.h16.sat.lh(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test7A +; CHECK: r0 = sub(r0.h, r1.l):sat:<<16 +define i32 @test7A(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A2.subh.h16.sat.hl(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test7B +; CHECK: r0 = sub(r0.h, r1.h):sat:<<16 +define i32 @test7B(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A2.subh.h16.sat.hh(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test90 +; CHECK: r0 = and(#1, asl(r0, #2)) +define i32 @test90(i32 %Rs) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.S4.andi.asl.ri(i32 1, i32 %Rs, i32 2) + ret i32 %0 +} + +; CHECK-LABEL: @test91 +; CHECK: r0 = or(#1, asl(r0, #2)) +define i32 @test91(i32 %Rs) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.S4.ori.asl.ri(i32 1, i32 %Rs, i32 2) + ret i32 %0 +} + +; CHECK-LABEL: @test92 +; CHECK: r0 = add(#1, asl(r0, #2)) +define i32 @test92(i32 %Rs) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.S4.addi.asl.ri(i32 1, i32 %Rs, i32 2) + ret i32 %0 +} + +; CHECK-LABEL: @test93 +; CHECK: r0 = sub(#1, asl(r0, #2)) +define i32 @test93(i32 %Rs) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.S4.subi.asl.ri(i32 1, i32 %Rs, i32 2) + ret i32 %0 +} + +; CHECK-LABEL: @test94 +; CHECK: r0 = and(#1, lsr(r0, #2)) +define i32 @test94(i32 %Rs) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.S4.andi.lsr.ri(i32 1, i32 %Rs, i32 2) + ret i32 %0 +} + +; CHECK-LABEL: @test95 +; CHECK: r0 = or(#1, lsr(r0, #2)) +define i32 @test95(i32 %Rs) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.S4.ori.lsr.ri(i32 1, i32 %Rs, i32 2) + ret i32 %0 +} + +; CHECK-LABEL: @test96 +; CHECK: r0 = add(#1, lsr(r0, #2)) +define i32 @test96(i32 %Rs) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.S4.addi.lsr.ri(i32 1, i32 %Rs, i32 2) + ret i32 %0 +} + +; CHECK-LABEL: @test97 +; CHECK: r0 = sub(#1, lsr(r0, #2)) +define i32 @test97(i32 %Rs) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.S4.subi.lsr.ri(i32 1, i32 %Rs, i32 2) + ret i32 %0 +} + +; CHECK-LABEL: @test100 +; CHECK: r1:0 = bitsplit(r0, r1) +define i64 @test100(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i64 @llvm.hexagon.A4.bitsplit(i32 %Rs, i32 %Rt) + ret i64 %0 +} + +; CHECK-LABEL: @test101 +; CHECK: r0 = modwrap(r0, r1) +define i32 @test101(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.A4.modwrapu(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test102 +; CHECK: r0 = parity(r1:0, r3:2) +define i32 @test102(i64 %Rs, i64 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.S2.parityp(i64 %Rs, i64 %Rt) + ret i32 %0 +} + +; CHECK-LABEL: @test103 +; CHECK: r0 = parity(r0, r1) +define i32 @test103(i32 %Rs, i32 %Rt) #0 { +entry: + %0 = tail call i32 @llvm.hexagon.S4.parity(i32 %Rs, i32 %Rt) + ret i32 %0 +} + +declare i32 @llvm.hexagon.C2.cmpeqp(i64, i64) #1 +declare i32 @llvm.hexagon.C2.cmpgtp(i64, i64) #1 +declare i32 @llvm.hexagon.C2.cmpgtup(i64, i64) #1 +declare i32 @llvm.hexagon.A4.rcmpeq(i32, i32) #1 +declare i32 @llvm.hexagon.A4.rcmpneq(i32, i32) #1 +declare i32 @llvm.hexagon.A4.rcmpeqi(i32, i32) #1 +declare i32 @llvm.hexagon.A4.rcmpneqi(i32, i32) #1 +declare i32 @llvm.hexagon.A4.cmpbeq(i32, i32) #1 +declare i32 @llvm.hexagon.A4.cmpbgt(i32, i32) #1 +declare i32 @llvm.hexagon.A4.cmpbgtu(i32, i32) #1 +declare i32 @llvm.hexagon.A4.cmpbeqi(i32, i32) #1 +declare i32 @llvm.hexagon.A4.cmpbgti(i32, i32) #1 +declare i32 @llvm.hexagon.A4.cmpbgtui(i32, i32) #1 +declare i32 @llvm.hexagon.A4.cmpheq(i32, i32) #1 +declare i32 @llvm.hexagon.A4.cmphgt(i32, i32) #1 +declare i32 @llvm.hexagon.A4.cmphgtu(i32, i32) #1 +declare i32 @llvm.hexagon.A4.cmpheqi(i32, i32) #1 +declare i32 @llvm.hexagon.A4.cmphgti(i32, i32) #1 +declare i32 @llvm.hexagon.A4.cmphgtui(i32, i32) #1 +declare i64 @llvm.hexagon.C2.vmux(i32, i64, i64) #1 +declare i32 @llvm.hexagon.A4.vcmpbeq.any(i64, i64) #1 +declare i64 @llvm.hexagon.A2.addp(i64, i64) #1 +declare i64 @llvm.hexagon.A2.addpsat(i64, i64) #1 +declare i64 @llvm.hexagon.A2.subp(i64, i64) #1 +declare i64 @llvm.hexagon.A2.addsp(i32, i64) #1 +declare i64 @llvm.hexagon.A2.andp(i64, i64) #1 +declare i64 @llvm.hexagon.A2.orp(i64, i64) #1 +declare i64 @llvm.hexagon.A2.xorp(i64, i64) #1 +declare i64 @llvm.hexagon.A4.ornp(i64, i64) #1 +declare i64 @llvm.hexagon.A4.andnp(i64, i64) #1 +declare i32 @llvm.hexagon.A2.addh.l16.ll(i32, i32) #1 +declare i32 @llvm.hexagon.A2.addh.l16.hl(i32, i32) #1 +declare i32 @llvm.hexagon.A2.addh.l16.sat.ll(i32, i32) #1 +declare i32 @llvm.hexagon.A2.addh.l16.sat.hl(i32, i32) #1 +declare i32 @llvm.hexagon.A2.addh.h16.ll(i32, i32) #1 +declare i32 @llvm.hexagon.A2.addh.h16.lh(i32, i32) #1 +declare i32 @llvm.hexagon.A2.addh.h16.hl(i32, i32) #1 +declare i32 @llvm.hexagon.A2.addh.h16.hh(i32, i32) #1 +declare i32 @llvm.hexagon.A2.addh.h16.sat.ll(i32, i32) #1 +declare i32 @llvm.hexagon.A2.addh.h16.sat.lh(i32, i32) #1 +declare i32 @llvm.hexagon.A2.addh.h16.sat.hl(i32, i32) #1 +declare i32 @llvm.hexagon.A2.addh.h16.sat.hh(i32, i32) #1 +declare i32 @llvm.hexagon.A2.subh.l16.ll(i32, i32) #1 +declare i32 @llvm.hexagon.A2.subh.l16.hl(i32, i32) #1 +declare i32 @llvm.hexagon.A2.subh.l16.sat.ll(i32, i32) #1 +declare i32 @llvm.hexagon.A2.subh.l16.sat.hl(i32, i32) #1 +declare i32 @llvm.hexagon.A2.subh.h16.ll(i32, i32) #1 +declare i32 @llvm.hexagon.A2.subh.h16.lh(i32, i32) #1 +declare i32 @llvm.hexagon.A2.subh.h16.hl(i32, i32) #1 +declare i32 @llvm.hexagon.A2.subh.h16.hh(i32, i32) #1 +declare i32 @llvm.hexagon.A2.subh.h16.sat.ll(i32, i32) #1 +declare i32 @llvm.hexagon.A2.subh.h16.sat.lh(i32, i32) #1 +declare i32 @llvm.hexagon.A2.subh.h16.sat.hl(i32, i32) #1 +declare i32 @llvm.hexagon.A2.subh.h16.sat.hh(i32, i32) #1 +declare i64 @llvm.hexagon.A4.bitsplit(i32, i32) #1 +declare i32 @llvm.hexagon.A4.modwrapu(i32, i32) #1 +declare i32 @llvm.hexagon.S2.parityp(i64, i64) #1 +declare i32 @llvm.hexagon.S4.parity(i32, i32) #1 +declare i32 @llvm.hexagon.S4.andi.asl.ri(i32, i32, i32) #1 +declare i32 @llvm.hexagon.S4.ori.asl.ri(i32, i32, i32) #1 +declare i32 @llvm.hexagon.S4.addi.asl.ri(i32, i32, i32) #1 +declare i32 @llvm.hexagon.S4.subi.asl.ri(i32, i32, i32) #1 +declare i32 @llvm.hexagon.S4.andi.lsr.ri(i32, i32, i32) #1 +declare i32 @llvm.hexagon.S4.ori.lsr.ri(i32, i32, i32) #1 +declare i32 @llvm.hexagon.S4.addi.lsr.ri(i32, i32, i32) #1 +declare i32 @llvm.hexagon.S4.subi.lsr.ri(i32, i32, i32) #1 + +attributes #0 = { nounwind readnone "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } +attributes #1 = { nounwind readnone } diff --git a/llvm/test/CodeGen/Hexagon/remove-endloop.ll b/llvm/test/CodeGen/Hexagon/remove-endloop.ll new file mode 100644 index 00000000000..73e1ad02cd8 --- /dev/null +++ b/llvm/test/CodeGen/Hexagon/remove-endloop.ll @@ -0,0 +1,56 @@ +; RUN: llc -march=hexagon -O2 < %s | FileCheck %s + +define void @foo(i32 %n, i32* nocapture %A, i32* nocapture %B) nounwind optsize { +entry: + %cmp = icmp sgt i32 %n, 100 + br i1 %cmp, label %for.body.preheader, label %for.cond4.preheader + +; CHECK: endloop0 +; CHECK: endloop0 +; CHECK-NOT: endloop0 + +for.body.preheader: + br label %for.body + +for.cond4.preheader: + %cmp113 = icmp sgt i32 %n, 0 + br i1 %cmp113, label %for.body7.preheader, label %if.end + +for.body7.preheader: + br label %for.body7 + +for.body: + %arrayidx.phi = phi i32* [ %arrayidx.inc, %for.body ], [ %B, %for.body.preheader ] + %arrayidx3.phi = phi i32* [ %arrayidx3.inc, %for.body ], [ %A, %for.body.preheader ] + %i.014 = phi i32 [ %inc, %for.body ], [ 0, %for.body.preheader ] + %0 = load i32, i32* %arrayidx.phi, align 4 + %sub = add nsw i32 %0, -1 + store i32 %sub, i32* %arrayidx3.phi, align 4 + %inc = add nsw i32 %i.014, 1 + %exitcond = icmp eq i32 %inc, %n + %arrayidx.inc = getelementptr i32, i32* %arrayidx.phi, i32 1 + %arrayidx3.inc = getelementptr i32, i32* %arrayidx3.phi, i32 1 + br i1 %exitcond, label %if.end.loopexit, label %for.body + +for.body7: + %arrayidx8.phi = phi i32* [ %arrayidx8.inc, %for.body7 ], [ %B, %for.body7.preheader ] + %arrayidx9.phi = phi i32* [ %arrayidx9.inc, %for.body7 ], [ %A, %for.body7.preheader ] + %i.117 = phi i32 [ %inc11, %for.body7 ], [ 0, %for.body7.preheader ] + %1 = load i32, i32* %arrayidx8.phi, align 4 + %add = add nsw i32 %1, 1 + store i32 %add, i32* %arrayidx9.phi, align 4 + %inc11 = add nsw i32 %i.117, 1 + %exitcond18 = icmp eq i32 %inc11, %n + %arrayidx8.inc = getelementptr i32, i32* %arrayidx8.phi, i32 1 + %arrayidx9.inc = getelementptr i32, i32* %arrayidx9.phi, i32 1 + br i1 %exitcond18, label %if.end.loopexit21, label %for.body7 + +if.end.loopexit: + br label %if.end + +if.end.loopexit21: + br label %if.end + +if.end: + ret void +} -- cgit v1.2.3