<div dir="ltr">Hello Krzysztof,<div><br></div><div>The LLVM :: CodeGen/Hexagon/late_instr.ll <wbr>test has failed on the 

<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">llvm-clang-x86_64-expensive-<wbr>checks-win buildbot:</span></div><div><a href="http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/8989/steps/test-check-all/logs/stdio" target="_blank">http://lab.llvm.org:8011/<wbr>builders/llvm-clang-x86_64-<wbr>expensive-checks-win/builds/<wbr>8989/steps/test-check-all/<wbr>logs/stdio</a></div><div><br></div><div>Could you take care of this, please?</div><div><br></div><div><span>Log File contents</span>      <pre><span class="m_-7380710464718618997gmail-stdout">FAIL: LLVM :: CodeGen/Hexagon/late_instr.ll (20125 of 37095)
******************** TEST 'LLVM :: CodeGen/Hexagon/late_instr.ll' FAILED ********************
Script:
--
C:\ps4-buildslave2\llvm-clang-<wbr>x86_64-expensive-checks-win\<wbr>build\bin\llc.EXE -march=hexagon -disable-hsdr < C:\ps4-buildslave2\llvm-clang-<wbr>x86_64-expensive-checks-win\<wbr>llvm\test\CodeGen\Hexagon\<wbr>late_instr.ll | C:\ps4-buildslave2\llvm-clang-<wbr>x86_64-expensive-checks-win\<wbr>build\bin\FileCheck.EXE C:\ps4-buildslave2\llvm-clang-<wbr>x86_64-expensive-checks-win\<wbr>llvm\test\CodeGen\Hexagon\<wbr>late_instr.ll
--
Exit Code: 1

Command Output (stdout):
--
$ "C:\ps4-buildslave2\llvm-<wbr>clang-x86_64-expensive-checks-<wbr>win\build\bin\llc.EXE" "-march=hexagon" "-disable-hsdr"
$ "C:\ps4-buildslave2\llvm-<wbr>clang-x86_64-expensive-checks-<wbr>win\build\bin\FileCheck.EXE" "C:\ps4-buildslave2\llvm-<wbr>clang-x86_64-expensive-checks-<wbr>win\llvm\test\CodeGen\Hexagon\<wbr>late_instr.ll"
# command stderr:
<stdin>:196:2: error: CHECK-NOT: string occurred!

 }

 ^

C:\ps4-buildslave2\llvm-clang-<wbr>x86_64-expensive-checks-win\<wbr>llvm\test\CodeGen\Hexagon\<wbr>late_instr.ll:6:14: note: CHECK-NOT: pattern specified here

; CHECK-NOT: }

             ^


error: command failed with exit status: 1
</span></pre><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Mar 20, 2018 at 12:35 PM, Krzysztof Parzyszek via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: kparzysz<br>
Date: Tue Mar 20 12:35:09 2018<br>
New Revision: 328023<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=328023&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=328023&view=rev</a><br>
Log:<br>
[Hexagon] Add a few more lit tests, NFC<br>
<br>
Added:<br>
    llvm/trunk/test/CodeGen/<wbr>Hexagon/hexagon-cond-jumpr31.<wbr>ll<br>
    llvm/trunk/test/CodeGen/<wbr>Hexagon/jump-prob.ll<br>
    llvm/trunk/test/CodeGen/<wbr>Hexagon/late_instr.ll<br>
    llvm/trunk/test/CodeGen/<wbr>Hexagon/mlong-calls.ll<br>
    llvm/trunk/test/CodeGen/<wbr>Hexagon/simplify64bitops_7223.<wbr>ll<br>
    llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-carried-1.ll<br>
    llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-change-deps.ll<br>
    llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-epilog-numphis.ll<br>
    llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-epilog-phi9.ll<br>
    llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-phi-ref.ll<br>
    llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-phi-start.ll<br>
    llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-rename.ll<br>
    llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-xxh2.ll<br>
    llvm/trunk/test/CodeGen/<wbr>Hexagon/vect-downscale.ll<br>
<br>
Added: llvm/trunk/test/CodeGen/<wbr>Hexagon/hexagon-cond-jumpr31.<wbr>ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/hexagon-cond-jumpr31.ll?rev=328023&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/Hexagon/hexagon-cond-<wbr>jumpr31.ll?rev=328023&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>Hexagon/hexagon-cond-jumpr31.<wbr>ll (added)<br>
+++ llvm/trunk/test/CodeGen/<wbr>Hexagon/hexagon-cond-jumpr31.<wbr>ll Tue Mar 20 12:35:09 2018<br>
@@ -0,0 +1,24 @@<br>
+; RUN: llc -march=hexagon -O3 < %s | FileCheck %s<br>
+; CHECK: if (!p{{[0-3]}}.new) jumpr:nt r31<br>
+; CHECK-NOT: .falign<br>
+<br>
+@g0 = common global i8 0, align 1<br>
+@g1 = common global i32 0, align 4<br>
+<br>
+define i32 @f0(i32* nocapture %a0) {<br>
+b0:<br>
+  %v0 = load i8, i8* @g0, align 1<br>
+  %v1 = icmp eq i8 %v0, 65<br>
+  br i1 %v1, label %b1, label %b2<br>
+<br>
+b1:                                               ; preds = %b0<br>
+  %v2 = load i32, i32* %a0, align 4<br>
+  %v3 = add nsw i32 %v2, 9<br>
+  %v4 = load i32, i32* @g1, align 4<br>
+  %v5 = sub i32 %v3, %v4<br>
+  store i32 %v5, i32* %a0, align 4<br>
+  br label %b2<br>
+<br>
+b2:                                               ; preds = %b1, %b0<br>
+  ret i32 undef<br>
+}<br>
<br>
Added: llvm/trunk/test/CodeGen/<wbr>Hexagon/jump-prob.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/jump-prob.ll?rev=328023&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/Hexagon/jump-prob.ll?<wbr>rev=328023&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>Hexagon/jump-prob.ll (added)<br>
+++ llvm/trunk/test/CodeGen/<wbr>Hexagon/jump-prob.ll Tue Mar 20 12:35:09 2018<br>
@@ -0,0 +1,164 @@<br>
+; RUN: llc -march=hexagon < %s | FileCheck %s<br>
+<br>
+; CHECK: {<br>
+; CHECK: jump .LBB0_<br>
+; CHECK: r{{[0-9]+}} =<br>
+; CHECK: memw<br>
+; CHECK: }<br>
+<br>
+target triple = "hexagon-unknown--elf"<br>
+<br>
+%s.0 = type { i8, i8, i8, [6 x i32] }<br>
+%s.1 = type { %s.2 }<br>
+%s.2 = type { i32, i8* }<br>
+%s.3 = type <{ i8*, i8*, i16, i8, i8, i8 }><br>
+<br>
+@g0 = internal global [2 x %s.0] [%s.0 { i8 0, i8 6, i8 7, [6 x i32] zeroinitializer }, %s.0 { i8 0, i8 6, i8 7, [6 x i32] zeroinitializer }], align 8<br>
+@g1 = internal constant [60 x i8] c"<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxx\<wbr>00", section "xxxxxxxxxxx.rodata.", align 4<br>
+@g2 = internal constant %s.1 { %s.2 { i32 24, i8* getelementptr inbounds ([60 x i8], [60 x i8]* @g1, i32 0, i32 0) } }, section ".rodata.xxxxxxxxxx.", align 4<br>
+@g3 = internal constant [115 x i8] c"<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxxxxxxxxxxxxx\00", section "xxxxxxxxxxx.rodata.", align 4<br>
+@g4 = internal constant %s.3 <{ i8* getelementptr inbounds ([120 x i8], [120 x i8]* @g5, i32 0, i32 0), i8* getelementptr inbounds ([31 x i8], [31 x i8]* @g6, i32 0, i32 0), i16 215, i8 4, i8 0, i8 1 }>, align 1<br>
+@g5 = private unnamed_addr constant [120 x i8] c"<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxx\<wbr>00", align 1<br>
+@g6 = private unnamed_addr constant [31 x i8] c"<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>\00", align 1<br>
+@g7 = internal constant %s.3 <{ i8* getelementptr inbounds ([120 x i8], [120 x i8]* @g5, i32 0, i32 0), i8* getelementptr inbounds ([91 x i8], [91 x i8]* @g8, i32 0, i32 0), i16 225, i8 2, i8 2, i8 2 }>, align 1<br>
+@g8 = private unnamed_addr constant [91 x i8] c"<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>\00", align 1<br>
+@g9 = internal constant %s.3 <{ i8* getelementptr inbounds ([120 x i8], [120 x i8]* @g5, i32 0, i32 0), i8* getelementptr inbounds ([109 x i8], [109 x i8]* @g10, i32 0, i32 0), i16 233, i8 2, i8 2, i8 4 }>, align 1<br>
+@g10 = private unnamed_addr constant [109 x i8] c"<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxxxxxxx\00", align 1<br>
+@g11 = internal constant [116 x i8] c"<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxxxxxxxxxxxxxx\00", section "xxxxxxxxxxx.rodata.", align 4<br>
+@g12 = internal constant [134 x i8] c"<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxx\00", section "xxxxxxxxxxx.rodata.", align 4<br>
+@g13 = internal constant %s.3 <{ i8* getelementptr inbounds ([120 x i8], [120 x i8]* @g5, i32 0, i32 0), i8* getelementptr inbounds ([31 x i8], [31 x i8]* @g6, i32 0, i32 0), i16 264, i8 4, i8 0, i8 1 }>, align 1<br>
+@g14 = internal constant [116 x i8] c"<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxxxxxxxxxxxxxx\00", section "xxxxxxxxxxx.rodata.", align 4<br>
+@g15 = internal constant [134 x i8] c"<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<wbr>xxxxxxxxxxxxx\00", section "xxxxxxxxxxx.rodata.", align 4<br>
+<br>
+; Function Attrs: nounwind<br>
+define zeroext i8 @f0(i8 zeroext %a0, i8 zeroext %a1, i8* nocapture %a2) #0 {<br>
+b0:<br>
+  store i8 -1, i8* %a2, align 1, !tbaa !0<br>
+  %v0 = zext i8 %a0 to i32<br>
+  %v1 = icmp ugt i8 %a0, 7<br>
+  %v2 = zext i8 %a1 to i32<br>
+  %v3 = icmp ugt i8 %a1, 5<br>
+  %v4 = or i1 %v1, %v3<br>
+  br i1 %v4, label %b1, label %b2<br>
+<br>
+b1:                                               ; preds = %b0<br>
+  tail call void @f1(%s.1* @g2, i32 2, i32 %v0, i32 %v2)<br>
+  br label %b12<br>
+<br>
+b2:                                               ; preds = %b0<br>
+  %v5 = load i8, i8* getelementptr inbounds ([2 x %s.0], [2 x %s.0]* @g0, i32 0, i32 0, i32 2), align 2, !tbaa !0<br>
+  %v6 = icmp eq i8 %v5, %a0<br>
+  %v7 = load i8, i8* getelementptr inbounds ([2 x %s.0], [2 x %s.0]* @g0, i32 0, i32 1, i32 2), align 2, !tbaa !0<br>
+  %v8 = icmp eq i8 %v7, %a0<br>
+  %v9 = and i1 %v6, %v8<br>
+  br i1 %v9, label %b3, label %b4<br>
+<br>
+b3:                                               ; preds = %b2<br>
+  %v10 = getelementptr inbounds [2 x %s.0], [2 x %s.0]* @g0, i32 0, i32 0, i32 3, i32 %v2<br>
+  %v11 = load i32, i32* %v10, align 4, !tbaa !3<br>
+  %v12 = getelementptr inbounds [2 x %s.0], [2 x %s.0]* @g0, i32 0, i32 1, i32 3, i32 %v2<br>
+  %v13 = load i32, i32* %v12, align 4, !tbaa !3<br>
+  tail call void @f1(%s.1* @g2, i32 2, i32 %v0, i32 %v2)<br>
+  br label %b12<br>
+<br>
+b4:                                               ; preds = %b2<br>
+  %v14 = load i8, i8* getelementptr inbounds ([2 x %s.0], [2 x %s.0]* @g0, i32 0, i32 0, i32 0), align 8, !tbaa !0<br>
+  %v15 = icmp eq i8 %v14, 1<br>
+  %v16 = and i1 %v15, %v6<br>
+  br i1 %v16, label %b5, label %b8<br>
+<br>
+b5:                                               ; preds = %b4<br>
+  store i8 0, i8* %a2, align 1, !tbaa !0<br>
+  %v17 = getelementptr inbounds [2 x %s.0], [2 x %s.0]* @g0, i32 0, i32 0, i32 3, i32 %v2<br>
+  %v18 = tail call i32 asm sideeffect "1:     $0 = memw_locked($2)\0A       $0 = add($0, $3)\0A       memw_locked($2, p0) = $0\0A       if !p0 jump 1b\0A", "=&r,=*m,r,r,*m,~{p0}"(i32* %v17, i32* %v17, i32 1, i32* %v17) #0, !srcloc !5<br>
+  %v19 = load i32, i32* %v17, align 4, !tbaa !3<br>
+  %v20 = icmp eq i32 %v19, 255<br>
+  br i1 %v20, label %b6, label %b7<br>
+<br>
+b6:                                               ; preds = %b5<br>
+  tail call void @f2(%s.3* @g4, i32 %v2) #2<br>
+  unreachable<br>
+<br>
+b7:                                               ; preds = %b5<br>
+  store i8 %a1, i8* getelementptr inbounds ([2 x %s.0], [2 x %s.0]* @g0, i32 0, i32 0, i32 1), align 1, !tbaa !0<br>
+  %v21 = load i8, i8* %a2, align 1, !tbaa !0<br>
+  %v22 = zext i8 %v21 to i32<br>
+  tail call void @f3(%s.3* @g7, i32 %v2, i32 %v22) #0<br>
+  %v23 = load i32, i32* bitcast ([2 x %s.0]* @g0 to i32*), align 8<br>
+  %v24 = and i32 %v23, 255<br>
+  %v25 = lshr i32 %v23, 8<br>
+  %v26 = and i32 %v25, 255<br>
+  %v27 = lshr i32 %v23, 16<br>
+  %v28 = and i32 %v27, 255<br>
+  %v29 = load i32, i32* %v17, align 4, !tbaa !3<br>
+  tail call void @f4(%s.3* @g9, i32 %v24, i32 %v26, i32 %v28, i32 %v29) #0<br>
+  %v30 = load i8, i8* %a2, align 1, !tbaa !0<br>
+  %v31 = zext i8 %v30 to i32<br>
+  tail call void @f1(%s.1* @g2, i32 2, i32 %v0, i32 %v2)<br>
+  %v32 = load i32, i32* bitcast ([2 x %s.0]* @g0 to i32*), align 8<br>
+  %v33 = and i32 %v32, 255<br>
+  %v34 = lshr i32 %v32, 8<br>
+  %v35 = and i32 %v34, 255<br>
+  %v36 = lshr i32 %v32, 16<br>
+  %v37 = and i32 %v36, 255<br>
+  %v38 = load i32, i32* %v17, align 4, !tbaa !3<br>
+  tail call void @f1(%s.1* @g2, i32 2, i32 %v0, i32 %v2)<br>
+  br label %b12<br>
+<br>
+b8:                                               ; preds = %b4<br>
+  %v39 = load i8, i8* getelementptr inbounds ([2 x %s.0], [2 x %s.0]* @g0, i32 0, i32 1, i32 0), align 4, !tbaa !0<br>
+  %v40 = icmp eq i8 %v39, 1<br>
+  %v41 = and i1 %v40, %v8<br>
+  br i1 %v41, label %b9, label %b12<br>
+<br>
+b9:                                               ; preds = %b8<br>
+  store i8 1, i8* %a2, align 1, !tbaa !0<br>
+  %v42 = getelementptr inbounds [2 x %s.0], [2 x %s.0]* @g0, i32 0, i32 1, i32 3, i32 %v2<br>
+  %v43 = tail call i32 asm sideeffect "1:     $0 = memw_locked($2)\0A       $0 = add($0, $3)\0A       memw_locked($2, p0) = $0\0A       if !p0 jump 1b\0A", "=&r,=*m,r,r,*m,~{p0}"(i32* %v42, i32* %v42, i32 1, i32* %v42) #0, !srcloc !5<br>
+  %v44 = load i32, i32* %v42, align 4, !tbaa !3<br>
+  %v45 = icmp eq i32 %v44, 255<br>
+  br i1 %v45, label %b10, label %b11<br>
+<br>
+b10:                                              ; preds = %b9<br>
+  tail call void @f2(%s.3* @g13, i32 %v2) #2<br>
+  unreachable<br>
+<br>
+b11:                                              ; preds = %b9<br>
+  store i8 %a1, i8* getelementptr inbounds ([2 x %s.0], [2 x %s.0]* @g0, i32 0, i32 1, i32 1), align 1, !tbaa !0<br>
+  %v46 = load i8, i8* %a2, align 1, !tbaa !0<br>
+  %v47 = zext i8 %v46 to i32<br>
+  tail call void @f1(%s.1* @g2, i32 2, i32 %v0, i32 %v2)<br>
+  %v48 = load i32, i32* bitcast (i8* getelementptr inbounds ([2 x %s.0], [2 x %s.0]* @g0, i32 0, i32 1, i32 0) to i32*), align 4<br>
+  %v49 = and i32 %v48, 255<br>
+  %v50 = lshr i32 %v48, 8<br>
+  %v51 = and i32 %v50, 255<br>
+  %v52 = lshr i32 %v48, 16<br>
+  %v53 = and i32 %v52, 255<br>
+  %v54 = load i32, i32* %v42, align 4, !tbaa !3<br>
+  tail call void @f1(%s.1* @g2, i32 2, i32 %v0, i32 %v2)<br>
+  br label %b12<br>
+<br>
+b12:                                              ; preds = %b11, %b8, %b7, %b3, %b1<br>
+  %v55 = phi i8 [ 0, %b1 ], [ 0, %b3 ], [ 1, %b7 ], [ 1, %b11 ], [ 0, %b8 ]<br>
+  ret i8 %v55<br>
+}<br>
+<br>
+declare void @f1(%s.1*, i32, i32, i32)<br>
+<br>
+; Function Attrs: noreturn<br>
+declare void @f2(%s.3*, i32) #1<br>
+<br>
+declare void @f3(%s.3*, i32, i32)<br>
+<br>
+declare void @f4(%s.3*, i32, i32, i32, i32)<br>
+<br>
+attributes #0 = { nounwind "target-cpu"="hexagonv55" }<br>
+attributes #1 = { noreturn }<br>
+attributes #2 = { noreturn nounwind }<br>
+<br>
+!0 = !{!1, !1, i64 0}<br>
+!1 = !{!"omnipotent char", !2}<br>
+!2 = !{!"Simple C/C++ TBAA"}<br>
+!3 = !{!4, !4, i64 0}<br>
+!4 = !{!"long", !1}<br>
+!5 = !{i32 86170, i32 86211, i32 86247, i32 86291}<br>
<br>
Added: llvm/trunk/test/CodeGen/<wbr>Hexagon/late_instr.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/late_instr.ll?rev=328023&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/Hexagon/late_instr.ll?<wbr>rev=328023&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>Hexagon/late_instr.ll (added)<br>
+++ llvm/trunk/test/CodeGen/<wbr>Hexagon/late_instr.ll Tue Mar 20 12:35:09 2018<br>
@@ -0,0 +1,231 @@<br>
+; RUN: llc -march=hexagon -disable-hsdr < %s | FileCheck %s<br>
+<br>
+; Check if instruction vandqrt.acc and its predecessor are scheduled in consecutive packets.<br>
+; CHECK: or(q{{[0-3]+}},q{{[0-3]+}})<br>
+; CHECK: }<br>
+; CHECK-NOT: }<br>
+; CHECK: |= vand(q{{[0-3]+}},r{{[0-9]+}})<br>
+; CHECK: endloop0<br>
+<br>
+target triple = "hexagon-unknown-linux-gnu"<br>
+<br>
+; Function Attrs: nounwind<br>
+define void @f0(i8* noalias nocapture readonly %a0, i32 %a1, i32 %a2, i32 %a3, i32* noalias nocapture %a4, i32 %a5) #0 {<br>
+b0:<br>
+  %v0 = mul i32 %a2, 3<br>
+  %v1 = bitcast i32* %a4 to <16 x i32>*<br>
+  %v2 = mul i32 %a5, -2<br>
+  %v3 = add i32 %v2, %a1<br>
+  %v4 = and i32 %a5, 63<br>
+  %v5 = add i32 %v3, %v4<br>
+  %v6 = tail call <16 x i32> @llvm.hexagon.V6.lvsplatw(i32 -1)<br>
+  %v7 = lshr i32 %v5, 6<br>
+  %v8 = and i32 %v7, 7<br>
+  %v9 = and i32 %v5, 511<br>
+  %v10 = icmp eq i32 %v9, 0<br>
+  %v11 = shl i32 -1, %v8<br>
+  %v12 = select i1 %v10, i32 0, i32 %v11<br>
+  %v13 = tail call i32 @llvm.hexagon.S2.vsplatrb(i32 %v12)<br>
+  %v14 = tail call <16 x i32> @llvm.hexagon.V6.lvsplatw(i32 %v13)<br>
+  %v15 = tail call <16 x i32> @llvm.hexagon.V6.vnot(<16 x i32> %v14)<br>
+  %v16 = tail call <512 x i1> @llvm.hexagon.V6.pred.scalar2(<wbr>i32 %v5)<br>
+  %v17 = shl i32 1, %v8<br>
+  %v18 = tail call i32 @llvm.hexagon.S2.vsplatrb(i32 %v17)<br>
+  %v19 = tail call <16 x i32> @llvm.hexagon.V6.vandqrt.acc(<<wbr>16 x i32> %v15, <512 x i1> %v16, i32 %v18)<br>
+  %v20 = tail call i32 @llvm.hexagon.S2.vsplatrb(i32 %a3)<br>
+  %v21 = tail call <16 x i32> @llvm.hexagon.V6.lvsplatw(i32 %v20)<br>
+  %v22 = icmp sgt i32 %v5, 0<br>
+  br i1 %v22, label %b1, label %b8<br>
+<br>
+b1:                                               ; preds = %b0<br>
+  %v23 = getelementptr inbounds i8, i8* %a0, i32 %a5<br>
+  %v24 = bitcast i8* %v23 to <16 x i32>*<br>
+  %v25 = load <16 x i32>, <16 x i32>* %v24, align 64, !tbaa !0<br>
+  %v26 = add i32 %a5, 64<br>
+  %v27 = getelementptr inbounds i8, i8* %a0, i32 %v26<br>
+  %v28 = bitcast i8* %v27 to <16 x i32>*<br>
+  %v29 = add i32 %a5, -64<br>
+  %v30 = getelementptr inbounds i8, i8* %a0, i32 %v29<br>
+  %v31 = bitcast i8* %v30 to <16 x i32>*<br>
+  %v32 = load <16 x i32>, <16 x i32>* %v31, align 64, !tbaa !0<br>
+  %v33 = tail call <512 x i1> @llvm.hexagon.V6.pred.scalar2(<wbr>i32 %a5)<br>
+  %v34 = tail call <16 x i32> @llvm.hexagon.V6.vandqrt(<512 x i1> %v33, i32 16843009)<br>
+  %v35 = tail call <16 x i32> @llvm.hexagon.V6.vnot(<16 x i32> %v34)<br>
+  %v36 = add i32 %v0, %a5<br>
+  %v37 = getelementptr inbounds i8, i8* %a0, i32 %v36<br>
+  %v38 = bitcast i8* %v37 to <16 x i32>*<br>
+  %v39 = sub i32 %a5, %v0<br>
+  %v40 = getelementptr inbounds i8, i8* %a0, i32 %v39<br>
+  %v41 = bitcast i8* %v40 to <16 x i32>*<br>
+  %v42 = tail call <16 x i32> @llvm.hexagon.V6.vd0()<br>
+  %v43 = add i32 %v4, %a1<br>
+  %v44 = mul i32 %a5, 2<br>
+  %v45 = sub i32 %v43, %v44<br>
+  %v46 = xor i32 %v45, -1<br>
+  %v47 = icmp sgt i32 %v46, -513<br>
+  %v48 = select i1 %v47, i32 %v46, i32 -513<br>
+  %v49 = add i32 %v48, %a1<br>
+  %v50 = add i32 %v49, %v4<br>
+  %v51 = add i32 %v50, 512<br>
+  %v52 = sub i32 %v51, %v44<br>
+  %v53 = lshr i32 %v52, 9<br>
+  %v54 = mul nuw nsw i32 %v53, 16<br>
+  %v55 = add nuw nsw i32 %v54, 16<br>
+  %v56 = getelementptr i32, i32* %a4, i32 %v55<br>
+  br label %b2<br>
+<br>
+b2:                                               ; preds = %b6, %b1<br>
+  %v57 = phi i32 [ %v46, %b1 ], [ %v125, %b6 ]<br>
+  %v58 = phi i32 [ %v5, %b1 ], [ %v123, %b6 ]<br>
+  %v59 = phi <16 x i32>* [ %v1, %b1 ], [ %v122, %b6 ]<br>
+  %v60 = phi <16 x i32>* [ %v38, %b1 ], [ %v114, %b6 ]<br>
+  %v61 = phi <16 x i32>* [ %v41, %b1 ], [ %v115, %b6 ]<br>
+  %v62 = phi <16 x i32>* [ %v28, %b1 ], [ %v116, %b6 ]<br>
+  %v63 = phi i32 [ 512, %b1 ], [ %v69, %b6 ]<br>
+  %v64 = phi i32 [ -2139062144, %b1 ], [ %v117, %b6 ]<br>
+  %v65 = phi <16 x i32> [ %v32, %b1 ], [ %v118, %b6 ]<br>
+  %v66 = phi <16 x i32> [ %v25, %b1 ], [ %v119, %b6 ]<br>
+  %v67 = phi <16 x i32> [ %v35, %b1 ], [ %v6, %b6 ]<br>
+  %v68 = icmp slt i32 %v58, %v63<br>
+  %v69 = select i1 %v68, i32 %v58, i32 %v63<br>
+  %v70 = icmp sgt i32 %v69, 0<br>
+  br i1 %v70, label %b3, label %b6<br>
+<br>
+b3:                                               ; preds = %b2<br>
+  %v71 = xor i32 %v63, -1<br>
+  %v72 = icmp sgt i32 %v57, %v71<br>
+  %v73 = select i1 %v72, i32 %v57, i32 %v71<br>
+  %v74 = icmp sgt i32 %v73, -65<br>
+  %v75 = add i32 %v73, 63<br>
+  %v76 = select i1 %v74, i32 %v75, i32 -2<br>
+  %v77 = sub i32 %v76, %v73<br>
+  %v78 = lshr i32 %v77, 6<br>
+  br label %b4<br>
+<br>
+b4:                                               ; preds = %b4, %b3<br>
+  %v79 = phi i32 [ %v69, %b3 ], [ %v108, %b4 ]<br>
+  %v80 = phi <16 x i32>* [ %v60, %b3 ], [ %v89, %b4 ]<br>
+  %v81 = phi <16 x i32>* [ %v61, %b3 ], [ %v87, %b4 ]<br>
+  %v82 = phi <16 x i32>* [ %v62, %b3 ], [ %v92, %b4 ]<br>
+  %v83 = phi i32 [ %v64, %b3 ], [ %v106, %b4 ]<br>
+  %v84 = phi <16 x i32> [ %v65, %b3 ], [ %v85, %b4 ]<br>
+  %v85 = phi <16 x i32> [ %v66, %b3 ], [ %v93, %b4 ]<br>
+  %v86 = phi <16 x i32> [ %v42, %b3 ], [ %v107, %b4 ]<br>
+  %v87 = getelementptr inbounds <16 x i32>, <16 x i32>* %v81, i32 1<br>
+  %v88 = load <16 x i32>, <16 x i32>* %v81, align 64, !tbaa !0<br>
+  %v89 = getelementptr inbounds <16 x i32>, <16 x i32>* %v80, i32 1<br>
+  %v90 = load <16 x i32>, <16 x i32>* %v80, align 64, !tbaa !0<br>
+  %v91 = tail call <16 x i32> @llvm.hexagon.V6.vlalignbi(<16 x i32> %v85, <16 x i32> %v84, i32 3)<br>
+  %v92 = getelementptr inbounds <16 x i32>, <16 x i32>* %v82, i32 1<br>
+  %v93 = load <16 x i32>, <16 x i32>* %v82, align 64, !tbaa !0<br>
+  %v94 = tail call <16 x i32> @llvm.hexagon.V6.valignbi(<16 x i32> %v93, <16 x i32> %v85, i32 3)<br>
+  %v95 = tail call <16 x i32> @llvm.hexagon.V6.vsububsat(<16 x i32> %v85, <16 x i32> %v21)<br>
+  %v96 = tail call <16 x i32> @llvm.hexagon.V6.vaddubsat(<16 x i32> %v85, <16 x i32> %v21)<br>
+  %v97 = tail call <16 x i32> @llvm.hexagon.V6.vmaxub(<16 x i32> %v88, <16 x i32> %v90)<br>
+  %v98 = tail call <16 x i32> @llvm.hexagon.V6.vminub(<16 x i32> %v88, <16 x i32> %v90)<br>
+  %v99 = tail call <16 x i32> @llvm.hexagon.V6.vmaxub(<16 x i32> %v94, <16 x i32> %v91)<br>
+  %v100 = tail call <16 x i32> @llvm.hexagon.V6.vminub(<16 x i32> %v94, <16 x i32> %v91)<br>
+  %v101 = tail call <16 x i32> @llvm.hexagon.V6.vminub(<16 x i32> %v97, <16 x i32> %v99)<br>
+  %v102 = tail call <16 x i32> @llvm.hexagon.V6.vmaxub(<16 x i32> %v98, <16 x i32> %v100)<br>
+  %v103 = tail call <512 x i1> @llvm.hexagon.V6.vgtub(<16 x i32> %v101, <16 x i32> %v96)<br>
+  %v104 = tail call <512 x i1> @llvm.hexagon.V6.vgtub(<16 x i32> %v95, <16 x i32> %v102)<br>
+  %v105 = tail call <512 x i1> @llvm.hexagon.V6.pred.or(<512 x i1> %v103, <512 x i1> %v104)<br>
+  %v106 = tail call i32 @llvm.hexagon.S6.rol.i.r(i32 %v83, i32 1)<br>
+  %v107 = tail call <16 x i32> @llvm.hexagon.V6.vandqrt.acc(<<wbr>16 x i32> %v86, <512 x i1> %v105, i32 %v106)<br>
+  %v108 = add nsw i32 %v79, -64<br>
+  %v109 = icmp sgt i32 %v79, 64<br>
+  br i1 %v109, label %b4, label %b5<br>
+<br>
+b5:                                               ; preds = %b4<br>
+  %v110 = add nuw nsw i32 %v78, 1<br>
+  %v111 = getelementptr <16 x i32>, <16 x i32>* %v62, i32 %v110<br>
+  %v112 = getelementptr <16 x i32>, <16 x i32>* %v60, i32 %v110<br>
+  %v113 = getelementptr <16 x i32>, <16 x i32>* %v61, i32 %v110<br>
+  br label %b6<br>
+<br>
+b6:                                               ; preds = %b5, %b2<br>
+  %v114 = phi <16 x i32>* [ %v112, %b5 ], [ %v60, %b2 ]<br>
+  %v115 = phi <16 x i32>* [ %v113, %b5 ], [ %v61, %b2 ]<br>
+  %v116 = phi <16 x i32>* [ %v111, %b5 ], [ %v62, %b2 ]<br>
+  %v117 = phi i32 [ %v106, %b5 ], [ %v64, %b2 ]<br>
+  %v118 = phi <16 x i32> [ %v85, %b5 ], [ %v65, %b2 ]<br>
+  %v119 = phi <16 x i32> [ %v93, %b5 ], [ %v66, %b2 ]<br>
+  %v120 = phi <16 x i32> [ %v107, %b5 ], [ %v42, %b2 ]<br>
+  %v121 = tail call <16 x i32> @llvm.hexagon.V6.vand(<16 x i32> %v120, <16 x i32> %v67)<br>
+  %v122 = getelementptr inbounds <16 x i32>, <16 x i32>* %v59, i32 1<br>
+  store <16 x i32> %v121, <16 x i32>* %v59, align 64, !tbaa !0<br>
+  %v123 = add nsw i32 %v58, -512<br>
+  %v124 = icmp sgt i32 %v58, 512<br>
+  %v125 = add i32 %v57, 512<br>
+  br i1 %v124, label %b2, label %b7<br>
+<br>
+b7:                                               ; preds = %b6<br>
+  %v126 = bitcast i32* %v56 to <16 x i32>*<br>
+  br label %b8<br>
+<br>
+b8:                                               ; preds = %b7, %b0<br>
+  %v127 = phi <16 x i32>* [ %v126, %b7 ], [ %v1, %b0 ]<br>
+  %v128 = getelementptr inbounds <16 x i32>, <16 x i32>* %v127, i32 -1<br>
+  %v129 = load <16 x i32>, <16 x i32>* %v128, align 64, !tbaa !0<br>
+  %v130 = tail call <16 x i32> @llvm.hexagon.V6.vand(<16 x i32> %v129, <16 x i32> %v19)<br>
+  store <16 x i32> %v130, <16 x i32>* %v128, align 64, !tbaa !0<br>
+  ret void<br>
+}<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.lvsplatw(i32) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.vnot(<16 x i32>) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.vandqrt(<512 x i1>, i32) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <512 x i1> @llvm.hexagon.V6.pred.scalar2(<wbr>i32) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare i32 @llvm.hexagon.S2.vsplatrb(i32) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.vandqrt.acc(<<wbr>16 x i32>, <512 x i1>, i32) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.vd0() #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.vlalignbi(<16 x i32>, <16 x i32>, i32) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.valignbi(<16 x i32>, <16 x i32>, i32) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.vsububsat(<16 x i32>, <16 x i32>) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.vaddubsat(<16 x i32>, <16 x i32>) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.vmaxub(<16 x i32>, <16 x i32>) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.vminub(<16 x i32>, <16 x i32>) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <512 x i1> @llvm.hexagon.V6.vgtub(<16 x i32>, <16 x i32>) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <512 x i1> @llvm.hexagon.V6.pred.or(<512 x i1>, <512 x i1>) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare i32 @llvm.hexagon.S6.rol.i.r(i32, i32) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.vand(<16 x i32>, <16 x i32>) #1<br>
+<br>
+attributes #0 = { nounwind "target-cpu"="hexagonv60" "target-features"="+hvxv60,+<wbr>hvx-length64b" }<br>
+attributes #1 = { nounwind readnone }<br>
+<br>
+!0 = !{!1, !1, i64 0}<br>
+!1 = !{!"omnipotent char", !2, i64 0}<br>
+!2 = !{!"Simple C/C++ TBAA"}<br>
<br>
Added: llvm/trunk/test/CodeGen/<wbr>Hexagon/mlong-calls.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/mlong-calls.ll?rev=328023&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/Hexagon/mlong-calls.<wbr>ll?rev=328023&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>Hexagon/mlong-calls.ll (added)<br>
+++ llvm/trunk/test/CodeGen/<wbr>Hexagon/mlong-calls.ll Tue Mar 20 12:35:09 2018<br>
@@ -0,0 +1,41 @@<br>
+; RUN: llc -hexagon-long-calls -march=hexagon -enable-save-restore-long=true < %s | FileCheck %s<br>
+<br>
+; CHECK: call ##f1<br>
+; CHECK: jump ##__restore<br>
+<br>
+; Function Attrs: minsize nounwind<br>
+define i64 @f0(i32 %a0, i32 %a1) #0 {<br>
+b0:<br>
+  %v0 = add nsw i32 %a0, 5<br>
+  %v1 = tail call i64 @f1(i32 %v0) #1<br>
+  %v2 = sext i32 %a1 to i64<br>
+  %v3 = add nsw i64 %v1, %v2<br>
+  ret i64 %v3<br>
+}<br>
+<br>
+; Function Attrs: minsize nounwind<br>
+declare i64 @f1(i32) #0<br>
+<br>
+; Function Attrs: nounwind<br>
+define i64 @f2(i32 %a0, i32 %a1) #1 {<br>
+b0:<br>
+  %v0 = add nsw i32 %a0, 5<br>
+  %v1 = tail call i64 @f1(i32 %v0) #1<br>
+  ret i64 %v1<br>
+}<br>
+<br>
+; Function Attrs: noreturn nounwind<br>
+define i64 @f3(i32 %a0, i32 %a1) #2 {<br>
+b0:<br>
+  %v0 = add nsw i32 %a0, 5<br>
+  %v1 = tail call i64 @f4(i32 %v0) #2<br>
+  unreachable<br>
+}<br>
+<br>
+; Function Attrs: noreturn<br>
+declare i64 @f4(i32) #3<br>
+<br>
+attributes #0 = { minsize nounwind }<br>
+attributes #1 = { nounwind }<br>
+attributes #2 = { noreturn nounwind }<br>
+attributes #3 = { noreturn }<br>
<br>
Added: llvm/trunk/test/CodeGen/<wbr>Hexagon/simplify64bitops_7223.<wbr>ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/simplify64bitops_7223.ll?rev=328023&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/Hexagon/<wbr>simplify64bitops_7223.ll?rev=<wbr>328023&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>Hexagon/simplify64bitops_7223.<wbr>ll (added)<br>
+++ llvm/trunk/test/CodeGen/<wbr>Hexagon/simplify64bitops_7223.<wbr>ll Tue Mar 20 12:35:09 2018<br>
@@ -0,0 +1,61 @@<br>
+; RUN: llc -march=hexagon -enable-pipeliner=false < %s | FileCheck %s<br>
+; RUN: llc -march=hexagon -enable-pipeliner < %s<br>
+; REQUIRES: asserts<br>
+; CHECK-NOT: and(<br>
+; CHECK-NOT: or(<br>
+; CHECK-NOT: combine(0<br>
+; CHECK: add<br>
+; CHECK: add(<br>
+; CHECK-NEXT: memuh(<br>
+; CHECK-NEXT: endloop<br>
+<br>
+%s.22 = type { i64 }<br>
+<br>
+@g0 = common global i32 0, align 4<br>
+<br>
+; Function Attrs: nounwind<br>
+define i64 @f0(%s.22* nocapture %a0, i32 %a1) #0 {<br>
+b0:<br>
+  %v0 = bitcast %s.22* %a0 to i16*<br>
+  %v1 = load i16, i16* %v0, align 2, !tbaa !0<br>
+  %v2 = zext i16 %v1 to i64<br>
+  %v3 = icmp sgt i32 %a1, 0<br>
+  br i1 %v3, label %b1, label %b4<br>
+<br>
+b1:                                               ; preds = %b0<br>
+  br label %b2<br>
+<br>
+b2:                                               ; preds = %b2, %b1<br>
+  %v4 = phi i16* [ %v8, %b2 ], [ %v0, %b1 ]<br>
+  %v5 = phi i32 [ %v10, %b2 ], [ undef, %b1 ]<br>
+  %v6 = phi i32 [ %v15, %b2 ], [ 0, %b1 ]<br>
+  %v7 = phi i64 [ %v14, %b2 ], [ %v2, %b1 ]<br>
+  %v8 = getelementptr inbounds i16, i16* %v4, i32 1<br>
+  %v9 = trunc i64 %v7 to i32<br>
+  %v10 = add i32 %v5, %v9<br>
+  %v11 = load i16, i16* %v8, align 2, !tbaa !0<br>
+  %v12 = zext i16 %v11 to i64<br>
+  %v13 = and i64 %v7, -4294967296<br>
+  %v14 = or i64 %v12, %v13<br>
+  %v15 = add nsw i32 %v6, 1<br>
+  %v16 = icmp eq i32 %v15, %a1<br>
+  br i1 %v16, label %b3, label %b2<br>
+<br>
+b3:                                               ; preds = %b2<br>
+  br label %b4<br>
+<br>
+b4:                                               ; preds = %b3, %b0<br>
+  %v17 = phi i32 [ undef, %b0 ], [ %v10, %b3 ]<br>
+  %v18 = phi i64 [ %v2, %b0 ], [ %v14, %b3 ]<br>
+  store volatile i32 %v17, i32* @g0, align 4, !tbaa !4<br>
+  ret i64 %v18<br>
+}<br>
+<br>
+attributes #0 = { nounwind }<br>
+<br>
+!0 = !{!1, !1, i64 0}<br>
+!1 = !{!"short", !2}<br>
+!2 = !{!"omnipotent char", !3}<br>
+!3 = !{!"Simple C/C++ TBAA"}<br>
+!4 = !{!5, !5, i64 0}<br>
+!5 = !{!"long", !2}<br>
<br>
Added: llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-carried-1.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/swp-carried-1.ll?rev=328023&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/Hexagon/swp-carried-1.<wbr>ll?rev=328023&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-carried-1.ll (added)<br>
+++ llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-carried-1.ll Tue Mar 20 12:35:09 2018<br>
@@ -0,0 +1,62 @@<br>
+; RUN: llc -march=hexagon -rdf-opt=0 -disable-hexagon-misched < %s | FileCheck %s<br>
+<br>
+; Test that we generate the correct code when a loop carried value<br>
+; is scheduled one stage earlier than it's use. The code in<br>
+; isLoopCarried was returning false in this case, and the generated<br>
+; code was missing an copy.<br>
+<br>
+; CHECK: loop0(.LBB0_[[LOOP:.]],<br>
+; CHECK: .LBB0_[[LOOP]]:<br>
+; CHECK: += mpy([[REG0:(r[0-9]+)]],r{{[0-<wbr>9]+}})<br>
+; CHECK: [[REG0]] = r{{[0-9]+}}<br>
+; CHECK-NOT: [[REG0]] = memw<br>
+; CHECK: endloop0<br>
+<br>
+@g0 = external global [256 x i32], align 8<br>
+<br>
+define void @f0() #0 {<br>
+b0:<br>
+  br label %b1<br>
+<br>
+b1:                                               ; preds = %b1, %b0<br>
+  br i1 undef, label %b2, label %b1<br>
+<br>
+b2:                                               ; preds = %b1<br>
+  br label %b3<br>
+<br>
+b3:                                               ; preds = %b3, %b2<br>
+  %v0 = phi i32* [ getelementptr inbounds ([256 x i32], [256 x i32]* @g0, i32 0, i32 0), %b2 ], [ %v1, %b3 ]<br>
+  %v1 = getelementptr i32, i32* %v0, i32 6<br>
+  br i1 undef, label %b4, label %b3<br>
+<br>
+b4:                                               ; preds = %b3<br>
+  br i1 undef, label %b6, label %b5<br>
+<br>
+b5:                                               ; preds = %b5, %b4<br>
+  %v2 = phi i64 [ %v19, %b5 ], [ undef, %b4 ]<br>
+  %v3 = phi i32* [ %v8, %b5 ], [ %v1, %b4 ]<br>
+  %v4 = phi i32 [ %v9, %b5 ], [ undef, %b4 ]<br>
+  %v5 = phi i32 [ %v11, %b5 ], [ undef, %b4 ]<br>
+  %v6 = phi i32 [ %v5, %b5 ], [ undef, %b4 ]<br>
+  %v7 = phi i32 [ %v10, %b5 ], [ 0, %b4 ]<br>
+  %v8 = getelementptr i32, i32* %v3, i32 1<br>
+  %v9 = add nsw i32 %v4, 1<br>
+  %v10 = load i32, i32* %v8, align 4<br>
+  %v11 = load i32, i32* null, align 4<br>
+  %v12 = sext i32 %v6 to i64<br>
+  %v13 = sext i32 %v10 to i64<br>
+  %v14 = sext i32 %v7 to i64<br>
+  %v15 = mul nsw i64 %v14, %v12<br>
+  %v16 = add i64 %v12, %v2<br>
+  %v17 = add i64 %v16, %v13<br>
+  %v18 = add i64 %v17, 0<br>
+  %v19 = add i64 %v18, %v15<br>
+  %v20 = icmp eq i32 %v9, 128<br>
+  br i1 %v20, label %b6, label %b5<br>
+<br>
+b6:                                               ; preds = %b5, %b4<br>
+  %v21 = phi i64 [ undef, %b4 ], [ %v19, %b5 ]<br>
+  unreachable<br>
+}<br>
+<br>
+attributes #0 = { nounwind "target-cpu"="hexagonv62" }<br>
<br>
Added: llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-change-deps.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/swp-change-deps.ll?rev=328023&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/Hexagon/swp-change-<wbr>deps.ll?rev=328023&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-change-deps.ll (added)<br>
+++ llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-change-deps.ll Tue Mar 20 12:35:09 2018<br>
@@ -0,0 +1,61 @@<br>
+; RUN: llc -march=hexagon < %s | FileCheck %s<br>
+<br>
+; Test that we generate the correct offsets for loads in the prolog<br>
+; after removing dependences on a post-increment instructions of the<br>
+; base register.<br>
+<br>
+; CHECK: memh([[REG0:(r[0-9]+)]]+#0)<br>
+; CHECK: memh([[REG0]]+#2)<br>
+; CHECK: loop0<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare i32 @llvm.hexagon.A2.sath(i32) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare i32 @llvm.hexagon.S2.asr.r.r.sat(<wbr>i32, i32) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare i32 @llvm.hexagon.A2.asrh(i32) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare i32 @llvm.hexagon.A2.addsat(i32, i32) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare i32 @llvm.hexagon.M2.mpy.sat.ll.<wbr>s1(i32, i32) #1<br>
+<br>
+define void @f0() #0 align 2 {<br>
+b0:<br>
+  br label %b1<br>
+<br>
+b1:                                               ; preds = %b0<br>
+  br label %b2<br>
+<br>
+b2:                                               ; preds = %b2, %b1<br>
+  %v0 = phi i16* [ undef, %b1 ], [ %v14, %b2 ]<br>
+  %v1 = phi i32 [ 0, %b1 ], [ %v12, %b2 ]<br>
+  %v2 = load i16, i16* %v0, align 2<br>
+  %v3 = sext i16 %v2 to i32<br>
+  %v4 = call i32 @llvm.hexagon.M2.mpy.sat.ll.<wbr>s1(i32 undef, i32 %v3)<br>
+  %v5 = call i32 @llvm.hexagon.S2.asr.r.r.sat(<wbr>i32 %v4, i32 undef)<br>
+  %v6 = call i32 @llvm.hexagon.A2.addsat(i32 %v5, i32 32768)<br>
+  %v7 = call i32 @llvm.hexagon.A2.asrh(i32 %v6)<br>
+  %v8 = call i32 @llvm.hexagon.S2.asr.r.r.sat(<wbr>i32 %v7, i32 undef)<br>
+  %v9 = call i32 @llvm.hexagon.A2.sath(i32 %v8)<br>
+  %v10 = trunc i32 %v9 to i16<br>
+  store i16 %v10, i16* null, align 2<br>
+  %v11 = trunc i32 %v7 to i16<br>
+  store i16 %v11, i16* %v0, align 2<br>
+  %v12 = add nsw i32 %v1, 1<br>
+  %v13 = icmp slt i32 %v12, undef<br>
+  %v14 = getelementptr i16, i16* %v0, i32 1<br>
+  br i1 %v13, label %b2, label %b3<br>
+<br>
+b3:                                               ; preds = %b2<br>
+  unreachable<br>
+<br>
+b4:                                               ; No predecessors!<br>
+  unreachable<br>
+}<br>
+<br>
+attributes #0 = { nounwind "target-cpu"="hexagonv55" }<br>
+attributes #1 = { nounwind readnone }<br>
<br>
Added: llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-epilog-numphis.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/swp-epilog-numphis.ll?rev=328023&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/Hexagon/swp-epilog-<wbr>numphis.ll?rev=328023&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-epilog-numphis.ll (added)<br>
+++ llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-epilog-numphis.ll Tue Mar 20 12:35:09 2018<br>
@@ -0,0 +1,82 @@<br>
+; RUN: llc -march=hexagon < %s | FileCheck %s<br>
+<br>
+; CHECK: endloop0<br>
+; CHECK: vmem<br>
+; CHECK: vmem([[REG:r([0-9]+)]]+#1) =<br>
+; CHECK: vmem([[REG]]+#0) =<br>
+<br>
+define void @f0(i32 %a0) local_unnamed_addr #0 {<br>
+b0:<br>
+  br label %b1<br>
+<br>
+b1:                                               ; preds = %b1, %b0<br>
+  %v0 = phi i32 [ %v33, %b1 ], [ %a0, %b0 ]<br>
+  %v1 = phi <16 x i32>* [ %v32, %b1 ], [ undef, %b0 ]<br>
+  %v2 = phi <16 x i32>* [ %v23, %b1 ], [ undef, %b0 ]<br>
+  %v3 = phi <16 x i32>* [ %v10, %b1 ], [ undef, %b0 ]<br>
+  %v4 = phi <16 x i32>* [ %v8, %b1 ], [ null, %b0 ]<br>
+  %v5 = phi <32 x i32> [ %v12, %b1 ], [ undef, %b0 ]<br>
+  %v6 = tail call <16 x i32> @llvm.hexagon.V6.hi(<32 x i32> %v5)<br>
+  %v7 = tail call <16 x i32> @llvm.hexagon.V6.vlalignbi(<16 x i32> %v6, <16 x i32> undef, i32 6)<br>
+  %v8 = getelementptr inbounds <16 x i32>, <16 x i32>* %v4, i32 1<br>
+  %v9 = load <16 x i32>, <16 x i32>* %v4, align 64<br>
+  %v10 = getelementptr inbounds <16 x i32>, <16 x i32>* %v3, i32 1<br>
+  %v11 = load <16 x i32>, <16 x i32>* %v3, align 64<br>
+  %v12 = tail call <32 x i32> @llvm.hexagon.V6.vsububh(<16 x i32> %v11, <16 x i32> %v9)<br>
+  %v13 = tail call <16 x i32> @llvm.hexagon.V6.lo(<32 x i32> %v12)<br>
+  %v14 = tail call <16 x i32> @llvm.hexagon.V6.vaddh(<16 x i32> %v13, <16 x i32> undef)<br>
+  %v15 = tail call <16 x i32> @llvm.hexagon.V6.vlalignbi(<16 x i32> %v14, <16 x i32> undef, i32 4)<br>
+  %v16 = tail call <16 x i32> @llvm.hexagon.V6.vaddh(<16 x i32> %v14, <16 x i32> %v15)<br>
+  %v17 = tail call <16 x i32> @llvm.hexagon.V6.valignbi(<16 x i32> %v14, <16 x i32> undef, i32 4)<br>
+  %v18 = tail call <16 x i32> @llvm.hexagon.V6.valignbi(<16 x i32> %v16, <16 x i32> undef, i32 2)<br>
+  %v19 = tail call <16 x i32> @llvm.hexagon.V6.vaddh(<16 x i32> undef, <16 x i32> %v17)<br>
+  %v20 = tail call <16 x i32> @llvm.hexagon.V6.vaddh(<16 x i32> %v18, <16 x i32> %v19)<br>
+  %v21 = getelementptr inbounds <16 x i32>, <16 x i32>* %v2, i32 1<br>
+  %v22 = load <16 x i32>, <16 x i32>* %v2, align 64<br>
+  %v23 = getelementptr inbounds <16 x i32>, <16 x i32>* %v2, i32 2<br>
+  %v24 = load <16 x i32>, <16 x i32>* %v21, align 64<br>
+  %v25 = tail call <16 x i32> @llvm.hexagon.V6.vaddh(<16 x i32> %v22, <16 x i32> %v7)<br>
+  %v26 = tail call <16 x i32> @llvm.hexagon.V6.vaddh(<16 x i32> %v24, <16 x i32> undef)<br>
+  %v27 = tail call <16 x i32> @llvm.hexagon.V6.vaddh(<16 x i32> %v25, <16 x i32> %v20)<br>
+  %v28 = tail call <16 x i32> @llvm.hexagon.V6.vaddh(<16 x i32> %v26, <16 x i32> %v20)<br>
+  store <16 x i32> %v27, <16 x i32>* %v2, align 64<br>
+  store <16 x i32> %v28, <16 x i32>* %v21, align 64<br>
+  %v29 = tail call <16 x i32> @llvm.hexagon.V6.vmpyhsrs(<16 x i32> %v27, i32 17760527)<br>
+  %v30 = tail call <16 x i32> @llvm.hexagon.V6.vmpyhsrs(<16 x i32> %v28, i32 17760527)<br>
+  %v31 = tail call <16 x i32> @llvm.hexagon.V6.vsathub(<16 x i32> %v30, <16 x i32> %v29)<br>
+  %v32 = getelementptr inbounds <16 x i32>, <16 x i32>* %v1, i32 1<br>
+  store <16 x i32> %v31, <16 x i32>* %v1, align 64<br>
+  %v33 = add nsw i32 %v0, -64<br>
+  %v34 = icmp sgt i32 %v0, 192<br>
+  br i1 %v34, label %b1, label %b2<br>
+<br>
+b2:                                               ; preds = %b1<br>
+  unreachable<br>
+}<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <32 x i32> @llvm.hexagon.V6.vsububh(<16 x i32>, <16 x i32>) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.vaddh(<16 x i32>, <16 x i32>) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.lo(<32 x i32>) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.hi(<32 x i32>) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.vlalignbi(<16 x i32>, <16 x i32>, i32) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.valignbi(<16 x i32>, <16 x i32>, i32) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.vmpyhsrs(<16 x i32>, i32) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.vsathub(<16 x i32>, <16 x i32>) #1<br>
+<br>
+attributes #0 = { nounwind "target-cpu"="hexagonv65" "target-features"="+hvxv65,+<wbr>hvx-length64b" }<br>
+attributes #1 = { nounwind readnone }<br>
<br>
Added: llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-epilog-phi9.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/swp-epilog-phi9.ll?rev=328023&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/Hexagon/swp-epilog-<wbr>phi9.ll?rev=328023&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-epilog-phi9.ll (added)<br>
+++ llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-epilog-phi9.ll Tue Mar 20 12:35:09 2018<br>
@@ -0,0 +1,55 @@<br>
+; RUN: llc -march=hexagon < %s | FileCheck %s<br>
+<br>
+; Test that we generate the correct Phi name in the last couple of epilog<br>
+; blocks, when there are 3 epilog blocks. The Phi was scheduled in stage<br>
+; 2, so the computation for the number of Phis needs to be adjusted when<br>
+; the incoming prolog block is from prolog 0 or prolog 1.<br>
+; Note: the pipeliner no longer generates a 3 stage pipeline for this test.<br>
+<br>
+; CHECK: loop0<br>
+; CHECK: [[REG0:r([0-9]+)]] = add(r{{[0-8]+}},#8)<br>
+; CHECK: endloop0<br>
+; CHECK: [[REG0]] = add(r{{[0-9]+}},#8)<br>
+<br>
+; Function Attrs: nounwind<br>
+define void @f0(i16* nocapture readonly %a0) #0 {<br>
+b0:<br>
+  %v0 = alloca [129 x i32], align 8<br>
+  br i1 undef, label %b1, label %b3<br>
+<br>
+b1:                                               ; preds = %b0<br>
+  br label %b2<br>
+<br>
+b2:                                               ; preds = %b2, %b1<br>
+  %v1 = phi i16* [ %a0, %b1 ], [ %v2, %b2 ]<br>
+  %v2 = phi i16* [ undef, %b1 ], [ %v15, %b2 ]<br>
+  %v3 = phi i32* [ null, %b1 ], [ %v4, %b2 ]<br>
+  %v4 = phi i32* [ null, %b1 ], [ %v14, %b2 ]<br>
+  %v5 = phi i32 [ 0, %b1 ], [ %v13, %b2 ]<br>
+  %v6 = phi i16* [ undef, %b1 ], [ %v12, %b2 ]<br>
+  %v7 = load i16, i16* %v2, align 2<br>
+  %v8 = sext i16 %v7 to i32<br>
+  %v9 = call i32 @llvm.hexagon.M2.mpy.ll.s0(i32 %v8, i32 %v8) #2<br>
+  %v10 = load i16, i16* %v6, align 2<br>
+  %v11 = call i32 @llvm.hexagon.M2.mpy.acc.sat.<wbr>ll.s0(i32 %v9, i32 undef, i32 undef) #2<br>
+  store i32 %v11, i32* %v4, align 4<br>
+  %v12 = getelementptr inbounds i16, i16* %v6, i32 -1<br>
+  %v13 = add i32 %v5, 1<br>
+  %v14 = getelementptr inbounds i32, i32* %v3, i32 2<br>
+  %v15 = getelementptr inbounds i16, i16* %v1, i32 2<br>
+  %v16 = icmp slt i32 %v13, undef<br>
+  br i1 %v16, label %b2, label %b3<br>
+<br>
+b3:                                               ; preds = %b2, %b0<br>
+  unreachable<br>
+}<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare i32 @llvm.hexagon.M2.mpy.ll.s0(<wbr>i32, i32) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare i32 @llvm.hexagon.M2.mpy.acc.sat.<wbr>ll.s0(i32, i32, i32) #1<br>
+<br>
+attributes #0 = { nounwind "target-cpu"="hexagonv60" }<br>
+attributes #1 = { nounwind readnone }<br>
+attributes #2 = { nounwind }<br>
<br>
Added: llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-phi-ref.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/swp-phi-ref.ll?rev=328023&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/Hexagon/swp-phi-ref.<wbr>ll?rev=328023&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-phi-ref.ll (added)<br>
+++ llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-phi-ref.ll Tue Mar 20 12:35:09 2018<br>
@@ -0,0 +1,45 @@<br>
+; RUN: llc -march=hexagon -enable-pipeliner -enable-bsb-sched=0 -join-liveintervals=false < %s | FileCheck %s<br>
+<br>
+; Test that we generate the correct Phi values when there is a Phi that<br>
+; references another Phi. We need to examine the other Phi to get the<br>
+; correct value. We need to do this even if we haven't generated the<br>
+; kernel code for the other Phi yet.<br>
+<br>
+; CHECK: [[REG0:(v[0-9]+)]] = [[REG1:(v[0-9]+)]]<br>
+; CHECK: loop0<br>
+; CHECK: [[REG0]] = [[REG1]]<br>
+; CHECK: endloop0<br>
+<br>
+; Function Attrs: nounwind<br>
+define void @f0() #0 {<br>
+b0:<br>
+  br i1 undef, label %b1, label %b2<br>
+<br>
+b1:                                               ; preds = %b1, %b0<br>
+  %v0 = phi i32 [ %v7, %b1 ], [ 0, %b0 ]<br>
+  %v1 = phi <16 x i32> [ %v4, %b1 ], [ undef, %b0 ]<br>
+  %v2 = phi <16 x i32> [ %v1, %b1 ], [ undef, %b0 ]<br>
+  %v3 = tail call <16 x i32> @llvm.hexagon.V6.valignb(<16 x i32> %v1, <16 x i32> %v2, i32 62)<br>
+  %v4 = tail call <16 x i32> @llvm.hexagon.V6.vaddh(<16 x i32> undef, <16 x i32> undef)<br>
+  %v5 = tail call <16 x i32> @llvm.hexagon.V6.valignb(<16 x i32> %v4, <16 x i32> %v1, i32 2)<br>
+  %v6 = tail call <16 x i32> @llvm.hexagon.V6.vabsdiffh(<16 x i32> %v3, <16 x i32> %v5)<br>
+  store <16 x i32> %v6, <16 x i32>* null, align 64<br>
+  %v7 = add nsw i32 %v0, 1<br>
+  %v8 = icmp slt i32 %v7, undef<br>
+  br i1 %v8, label %b1, label %b2<br>
+<br>
+b2:                                               ; preds = %b1, %b0<br>
+  ret void<br>
+}<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.vaddh(<16 x i32>, <16 x i32>) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.valignb(<16 x i32>, <16 x i32>, i32) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.vabsdiffh(<16 x i32>, <16 x i32>) #1<br>
+<br>
+attributes #0 = { nounwind "target-cpu"="hexagonv60" "target-features"="+hvxv60,+<wbr>hvx-length64b" }<br>
+attributes #1 = { nounwind readnone }<br>
<br>
Added: llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-phi-start.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/swp-phi-start.ll?rev=328023&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/Hexagon/swp-phi-start.<wbr>ll?rev=328023&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-phi-start.ll (added)<br>
+++ llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-phi-start.ll Tue Mar 20 12:35:09 2018<br>
@@ -0,0 +1,44 @@<br>
+; RUN: llc -march=hexagon -enable-pipeliner -pipeliner-max-stages=2 -disable-packetizer < %s | FileCheck %s<br>
+<br>
+; Test that the early start and late start values are computed correctly<br>
+; when a Phi depends on another Phi. In this case, they should occur in<br>
+; the same stage.<br>
+<br>
+; CHECK-DAG: [[REG3:(r[0-9]+)]] = add([[REG1:(r[0-9]+)]],#-1)<br>
+; CHECK-DAG: [[REG2:(r[0-9]+)]] = add([[REG1]],#-1)<br>
+; CHECK-DAG: loop0(.LBB0_[[LOOP:.]],[[REG3]<wbr>])<br>
+; CHECK-NOT: = [[REG2]]<br>
+; CHECK: .LBB0_[[LOOP]]:<br>
+; CHECK: }{{[ \t]*}}:endloop<br>
+<br>
+; Function Attrs: nounwind<br>
+define void @f0(i32 %a0, i16* nocapture %a1) #0 {<br>
+b0:<br>
+  br i1 undef, label %b1, label %b2<br>
+<br>
+b1:                                               ; preds = %b0<br>
+  %v0 = add nsw i32 undef, -8<br>
+  br i1 undef, label %b3, label %b2<br>
+<br>
+b2:                                               ; preds = %b2, %b1, %b0<br>
+  %v1 = phi i32 [ %v7, %b2 ], [ undef, %b0 ], [ %v0, %b1 ]<br>
+  %v2 = phi i32 [ %v1, %b2 ], [ %a0, %b0 ], [ undef, %b1 ]<br>
+  %v3 = add nsw i32 %v2, -2<br>
+  %v4 = getelementptr inbounds i16, i16* %a1, i32 %v3<br>
+  %v5 = load i16, i16* %v4, align 2, !tbaa !0<br>
+  %v6 = getelementptr inbounds i16, i16* %a1, i32 %v1<br>
+  store i16 %v5, i16* %v6, align 2, !tbaa !0<br>
+  %v7 = add nsw i32 %v1, -1<br>
+  %v8 = icmp sgt i32 %v7, 0<br>
+  br i1 %v8, label %b2, label %b3<br>
+<br>
+b3:                                               ; preds = %b2, %b1<br>
+  ret void<br>
+}<br>
+<br>
+attributes #0 = { nounwind "target-cpu"="hexagonv55" }<br>
+<br>
+!0 = !{!1, !1, i64 0}<br>
+!1 = !{!"short", !2, i64 0}<br>
+!2 = !{!"omnipotent char", !3, i64 0}<br>
+!3 = !{!"Simple C/C++ TBAA"}<br>
<br>
Added: llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-rename.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/swp-rename.ll?rev=328023&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/Hexagon/swp-rename.ll?<wbr>rev=328023&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-rename.ll (added)<br>
+++ llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-rename.ll Tue Mar 20 12:35:09 2018<br>
@@ -0,0 +1,30 @@<br>
+; RUN: llc -march=hexagon -enable-pipeliner < %s | FileCheck %s<br>
+<br>
+; A test that the Phi rewrite logic is correct.<br>
+<br>
+; CHECK: [[REG0:(r[0-9]+)]] = #0<br>
+; CHECK: loop0(.LBB0_[[LOOP:.]],<br>
+; CHECK: .LBB0_[[LOOP]]:<br>
+; CHECK: memh([[REG0]]+#0) = #0<br>
+<br>
+define void @f0() #0 {<br>
+b0:<br>
+  %v0 = add i32 undef, -4<br>
+  br label %b1<br>
+<br>
+b1:                                               ; preds = %b1, %b0<br>
+  %v1 = phi i16* [ %v4, %b1 ], [ null, %b0 ]<br>
+  %v2 = phi i32 [ %v5, %b1 ], [ 0, %b0 ]<br>
+  %v3 = getelementptr inbounds i16, i16* %v1, i32 1<br>
+  store i16 0, i16* %v1, align 2<br>
+  %v4 = getelementptr inbounds i16, i16* %v1, i32 2<br>
+  store i16 0, i16* %v3, align 2<br>
+  %v5 = add nsw i32 %v2, 8<br>
+  %v6 = icmp slt i32 %v5, %v0<br>
+  br i1 %v6, label %b1, label %b2<br>
+<br>
+b2:                                               ; preds = %b1<br>
+  ret void<br>
+}<br>
+<br>
+attributes #0 = { nounwind "target-cpu"="hexagonv55" }<br>
<br>
Added: llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-xxh2.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/swp-xxh2.ll?rev=328023&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/Hexagon/swp-xxh2.ll?<wbr>rev=328023&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-xxh2.ll (added)<br>
+++ llvm/trunk/test/CodeGen/<wbr>Hexagon/swp-xxh2.ll Tue Mar 20 12:35:09 2018<br>
@@ -0,0 +1,57 @@<br>
+; RUN: llc -march=hexagon -enable-pipeliner -debug-only=pipeliner < %s -o - 2>&1 > /dev/null | FileCheck %s<br>
+; REQUIRES: asserts<br>
+<br>
+; Fix bug when pipelining xxh benchmark at O3, mv55, and with vectorization.<br>
+; The problem is choosing the correct name for the Phis in the epilog.<br>
+<br>
+; CHECK: New block<br>
+; CHECK: %{{.*}}, %[[REG:([0-9]+)]]{{.*}} = L2_loadri_pi<br>
+; CHECK: epilog:<br>
+; CHECK: = PHI<br>
+; CHECK-NOT: = PHI %{{[0-9]+}}, {{.*}}, %[[REG]]<br>
+; CHECK: = PHI<br>
+<br>
+; Function Attrs: nounwind<br>
+define void @f0(i32 %a0, i32* %a1) #0 {<br>
+b0:<br>
+  %v0 = ashr i32 %a0, 1<br>
+  br label %b1<br>
+<br>
+b1:                                               ; preds = %b1, %b0<br>
+  %v1 = phi i64 [ %v8, %b1 ], [ undef, %b0 ]<br>
+  %v2 = phi i32 [ %v9, %b1 ], [ 0, %b0 ]<br>
+  %v3 = phi i32 [ %v7, %b1 ], [ undef, %b0 ]<br>
+  %v4 = inttoptr i32 %v3 to i32*<br>
+  %v5 = load i32, i32* %v4, align 4, !tbaa !0<br>
+  %v6 = tail call i64 @llvm.hexagon.S2.packhl(i32 %v5, i32 undef)<br>
+  %v7 = add nsw i32 %v3, -16<br>
+  %v8 = tail call i64 @llvm.hexagon.M2.vdmacs.s0(i64 %v1, i64 undef, i64 %v6)<br>
+  %v9 = add nsw i32 %v2, 1<br>
+  %v10 = icmp eq i32 %v9, %v0<br>
+  br i1 %v10, label %b2, label %b1<br>
+<br>
+b2:                                               ; preds = %b1<br>
+  %v11 = trunc i64 %v8 to i32<br>
+  %v12 = getelementptr inbounds i32, i32* %a1, i32 8<br>
+  store i32 %v11, i32* %v12, align 4, !tbaa !0<br>
+  call void @llvm.trap()<br>
+  unreachable<br>
+}<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare i64 @llvm.hexagon.M2.vdmacs.s0(<wbr>i64, i64, i64) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare i64 @llvm.hexagon.S2.packhl(i32, i32) #1<br>
+<br>
+; Function Attrs: noreturn nounwind<br>
+declare void @llvm.trap() #2<br>
+<br>
+attributes #0 = { nounwind "target-cpu"="hexagonv55" }<br>
+attributes #1 = { nounwind readnone }<br>
+attributes #2 = { noreturn nounwind }<br>
+<br>
+!0 = !{!1, !1, i64 0}<br>
+!1 = !{!"int", !2, i64 0}<br>
+!2 = !{!"omnipotent char", !3, i64 0}<br>
+!3 = !{!"Simple C/C++ TBAA"}<br>
<br>
Added: llvm/trunk/test/CodeGen/<wbr>Hexagon/vect-downscale.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Hexagon/vect-downscale.ll?rev=328023&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/<wbr>CodeGen/Hexagon/vect-<wbr>downscale.ll?rev=328023&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/CodeGen/<wbr>Hexagon/vect-downscale.ll (added)<br>
+++ llvm/trunk/test/CodeGen/<wbr>Hexagon/vect-downscale.ll Tue Mar 20 12:35:09 2018<br>
@@ -0,0 +1,177 @@<br>
+; RUN: llc -march=hexagon < %s | FileCheck %s<br>
+<br>
+; Make sure we generate a hardware loop and pipeline the inner loop using<br>
+; 4 packets, which is equivalent to the hand-coded version.<br>
+<br>
+; CHECK: loop0(.LBB0_[[LOOP:.]],<br>
+; CHECK: .LBB0_[[LOOP]]:<br>
+; CHECK: {<br>
+; CHECK: }<br>
+; CHECK: {<br>
+; CHECK: }<br>
+; CHECK: {<br>
+; CHECK: }<br>
+; CHECK: {<br>
+; CHECK-NOT: }<br>
+; CHECK: }{{[ \t]*}}:endloop0<br>
+<br>
+define void @f0(i8* noalias %a0, i32 %a1, i32 %a2, i32 %a3, i8* noalias nocapture %a4, i32 %a5, i32 %a6) #0 {<br>
+b0:<br>
+  %v0 = tail call <16 x i32> @llvm.hexagon.V6.lvsplatw(i32 8388736)<br>
+  %v1 = zext i32 %a3 to i64<br>
+  %v2 = shl nuw i64 %v1, 32<br>
+  %v3 = zext i32 %a1 to i64<br>
+  %v4 = shl nuw nsw i64 %v3, 16<br>
+  %v5 = or i64 %v4, %v2<br>
+  %v6 = or i64 %v5, 281474976710658<br>
+  tail call void asm sideeffect "    l2fetch($0, $1)\0A", "r,r"(i8* %a0, i64 %v6) #2, !srcloc !0<br>
+  %v7 = tail call i32 @llvm.hexagon.S2.ct0(i32 %a6)<br>
+  %v8 = add i32 %v7, 1<br>
+  %v9 = lshr i32 %a1, %v8<br>
+  %v10 = mul i32 %a6, 2<br>
+  %v11 = mul i32 %v10, %v9<br>
+  %v12 = sub i32 %a1, %v11<br>
+  %v13 = lshr i32 %v12, 1<br>
+  %v14 = tail call <512 x i1> @llvm.hexagon.V6.pred.scalar2(<wbr>i32 %v13)<br>
+  %v15 = icmp eq i32 %a2, 0<br>
+  br i1 %v15, label %b11, label %b1<br>
+<br>
+b1:                                               ; preds = %b0<br>
+  %v16 = mul i32 %a3, 2<br>
+  %v17 = icmp eq i32 %v9, 0<br>
+  %v18 = icmp eq i32 %v11, %a1<br>
+  %v19 = icmp ugt i32 %v12, %a6<br>
+  %v20 = mul i32 %v9, 64<br>
+  %v21 = getelementptr i8, i8* %a4, i32 %v20<br>
+  %v22 = mul i32 %v9, 128<br>
+  %v23 = add i32 %v22, %a3<br>
+  %v24 = getelementptr i8, i8* %a0, i32 %v23<br>
+  %v25 = getelementptr i8, i8* %a0, i32 %v22<br>
+  br label %b2<br>
+<br>
+b2:                                               ; preds = %b10, %b1<br>
+  %v26 = phi i8* [ %v25, %b1 ], [ %v90, %b10 ]<br>
+  %v27 = phi i8* [ %v24, %b1 ], [ %v89, %b10 ]<br>
+  %v28 = phi i8* [ %v21, %b1 ], [ %v88, %b10 ]<br>
+  %v29 = phi <16 x i32> [ undef, %b1 ], [ %v85, %b10 ]<br>
+  %v30 = phi <16 x i32> [ undef, %b1 ], [ %v84, %b10 ]<br>
+  %v31 = phi i8* [ %a0, %b1 ], [ %v86, %b10 ]<br>
+  %v32 = phi i8* [ %a4, %b1 ], [ %v87, %b10 ]<br>
+  %v33 = phi i32 [ 0, %b1 ], [ %v37, %b10 ]<br>
+  %v34 = bitcast i8* %v26 to <16 x i32>*<br>
+  %v35 = bitcast i8* %v27 to <16 x i32>*<br>
+  %v36 = bitcast i8* %v28 to <16 x i32>*<br>
+  %v37 = add nsw i32 %v33, 2<br>
+  %v38 = icmp ult i32 %v37, %a2<br>
+  br i1 %v38, label %b3, label %b4<br>
+<br>
+b3:                                               ; preds = %b2<br>
+  %v39 = getelementptr inbounds i8, i8* %v31, i32 %v16<br>
+  tail call void asm sideeffect "    l2fetch($0, $1)\0A", "r,r"(i8* %v39, i64 %v6) #2, !srcloc !1<br>
+  br label %b4<br>
+<br>
+b4:                                               ; preds = %b3, %b2<br>
+  %v40 = bitcast i8* %v32 to <16 x i32>*<br>
+  %v41 = bitcast i8* %v31 to <16 x i32>*<br>
+  %v42 = getelementptr inbounds i8, i8* %v31, i32 %a3<br>
+  %v43 = bitcast i8* %v42 to <16 x i32>*<br>
+  br i1 %v17, label %b6, label %b5<br>
+<br>
+b5:                                               ; preds = %b5, %b4<br>
+  %v44 = phi <16 x i32>* [ %v54, %b5 ], [ %v43, %b4 ]<br>
+  %v45 = phi <16 x i32>* [ %v52, %b5 ], [ %v41, %b4 ]<br>
+  %v46 = phi <16 x i32>* [ %v61, %b5 ], [ %v40, %b4 ]<br>
+  %v47 = phi i32 [ %v62, %b5 ], [ 0, %b4 ]<br>
+  %v48 = getelementptr inbounds <16 x i32>, <16 x i32>* %v45, i32 1<br>
+  %v49 = load <16 x i32>, <16 x i32>* %v45, align 64, !tbaa !2<br>
+  %v50 = getelementptr inbounds <16 x i32>, <16 x i32>* %v44, i32 1<br>
+  %v51 = load <16 x i32>, <16 x i32>* %v44, align 64, !tbaa !2<br>
+  %v52 = getelementptr inbounds <16 x i32>, <16 x i32>* %v45, i32 2<br>
+  %v53 = load <16 x i32>, <16 x i32>* %v48, align 64, !tbaa !2<br>
+  %v54 = getelementptr inbounds <16 x i32>, <16 x i32>* %v44, i32 2<br>
+  %v55 = load <16 x i32>, <16 x i32>* %v50, align 64, !tbaa !2<br>
+  %v56 = tail call <16 x i32> @llvm.hexagon.V6.vdmpybus.acc(<wbr><16 x i32> %v0, <16 x i32> %v49, i32 1077952576)<br>
+  %v57 = tail call <16 x i32> @llvm.hexagon.V6.vdmpybus.acc(<wbr><16 x i32> %v0, <16 x i32> %v53, i32 1077952576)<br>
+  %v58 = tail call <16 x i32> @llvm.hexagon.V6.vdmpybus.acc(<wbr><16 x i32> %v56, <16 x i32> %v51, i32 1077952576)<br>
+  %v59 = tail call <16 x i32> @llvm.hexagon.V6.vdmpybus.acc(<wbr><16 x i32> %v57, <16 x i32> %v55, i32 1077952576)<br>
+  %v60 = tail call <16 x i32> @llvm.hexagon.V6.vpackob(<16 x i32> %v59, <16 x i32> %v58)<br>
+  %v61 = getelementptr inbounds <16 x i32>, <16 x i32>* %v46, i32 1<br>
+  store <16 x i32> %v60, <16 x i32>* %v46, align 64, !tbaa !2<br>
+  %v62 = add nsw i32 %v47, 1<br>
+  %v63 = icmp eq i32 %v62, %v9<br>
+  br i1 %v63, label %b6, label %b5<br>
+<br>
+b6:                                               ; preds = %b5, %b4<br>
+  %v64 = phi <16 x i32> [ %v29, %b4 ], [ %v55, %b5 ]<br>
+  %v65 = phi <16 x i32> [ %v30, %b4 ], [ %v53, %b5 ]<br>
+  %v66 = phi <16 x i32>* [ %v43, %b4 ], [ %v35, %b5 ]<br>
+  %v67 = phi <16 x i32>* [ %v41, %b4 ], [ %v34, %b5 ]<br>
+  %v68 = phi <16 x i32>* [ %v40, %b4 ], [ %v36, %b5 ]<br>
+  br i1 %v18, label %b10, label %b7<br>
+<br>
+b7:                                               ; preds = %b6<br>
+  %v69 = load <16 x i32>, <16 x i32>* %v67, align 64, !tbaa !2<br>
+  %v70 = load <16 x i32>, <16 x i32>* %v66, align 64, !tbaa !2<br>
+  br i1 %v19, label %b8, label %b9<br>
+<br>
+b8:                                               ; preds = %b7<br>
+  %v71 = getelementptr inbounds <16 x i32>, <16 x i32>* %v66, i32 1<br>
+  %v72 = getelementptr inbounds <16 x i32>, <16 x i32>* %v67, i32 1<br>
+  %v73 = load <16 x i32>, <16 x i32>* %v72, align 64, !tbaa !2<br>
+  %v74 = load <16 x i32>, <16 x i32>* %v71, align 64, !tbaa !2<br>
+  br label %b9<br>
+<br>
+b9:                                               ; preds = %b8, %b7<br>
+  %v75 = phi <16 x i32> [ %v73, %b8 ], [ %v65, %b7 ]<br>
+  %v76 = phi <16 x i32> [ %v74, %b8 ], [ %v64, %b7 ]<br>
+  %v77 = tail call <16 x i32> @llvm.hexagon.V6.vdmpybus.acc(<wbr><16 x i32> %v0, <16 x i32> %v69, i32 1077952576)<br>
+  %v78 = tail call <16 x i32> @llvm.hexagon.V6.vdmpybus.acc(<wbr><16 x i32> %v0, <16 x i32> %v75, i32 1077952576)<br>
+  %v79 = tail call <16 x i32> @llvm.hexagon.V6.vdmpybus.acc(<wbr><16 x i32> %v77, <16 x i32> %v70, i32 1077952576)<br>
+  %v80 = tail call <16 x i32> @llvm.hexagon.V6.vdmpybus.acc(<wbr><16 x i32> %v78, <16 x i32> %v76, i32 1077952576)<br>
+  %v81 = tail call <16 x i32> @llvm.hexagon.V6.vpackob(<16 x i32> %v80, <16 x i32> %v79)<br>
+  %v82 = load <16 x i32>, <16 x i32>* %v68, align 64, !tbaa !2<br>
+  %v83 = tail call <16 x i32> @llvm.hexagon.V6.vmux(<512 x i1> %v14, <16 x i32> %v81, <16 x i32> %v82)<br>
+  store <16 x i32> %v83, <16 x i32>* %v68, align 64, !tbaa !2<br>
+  br label %b10<br>
+<br>
+b10:                                              ; preds = %b9, %b6<br>
+  %v84 = phi <16 x i32> [ %v75, %b9 ], [ %v65, %b6 ]<br>
+  %v85 = phi <16 x i32> [ %v76, %b9 ], [ %v64, %b6 ]<br>
+  %v86 = getelementptr inbounds i8, i8* %v31, i32 %v16<br>
+  %v87 = getelementptr inbounds i8, i8* %v32, i32 %a5<br>
+  %v88 = getelementptr i8, i8* %v28, i32 %a5<br>
+  %v89 = getelementptr i8, i8* %v27, i32 %v16<br>
+  %v90 = getelementptr i8, i8* %v26, i32 %v16<br>
+  br i1 %v38, label %b2, label %b11<br>
+<br>
+b11:                                              ; preds = %b10, %b0<br>
+  ret void<br>
+}<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.lvsplatw(i32) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare i32 @llvm.hexagon.S2.ct0(i32) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <512 x i1> @llvm.hexagon.V6.pred.scalar2(<wbr>i32) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.vdmpybus.acc(<wbr><16 x i32>, <16 x i32>, i32) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.vpackob(<16 x i32>, <16 x i32>) #1<br>
+<br>
+; Function Attrs: nounwind readnone<br>
+declare <16 x i32> @llvm.hexagon.V6.vmux(<512 x i1>, <16 x i32>, <16 x i32>) #1<br>
+<br>
+attributes #0 = { nounwind "target-cpu"="hexagonv60" "target-features"="+hvxv60,+<wbr>hvx-length64b" }<br>
+attributes #1 = { nounwind readnone }<br>
+attributes #2 = { nounwind }<br>
+<br>
+!0 = !{i32 -2146401371}<br>
+!1 = !{i32 -2146401153}<br>
+!2 = !{!3, !3, i64 0}<br>
+!3 = !{!"omnipotent char", !4, i64 0}<br>
+!4 = !{!"Simple C/C++ TBAA"}<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>