1 ; REQUIRES: asserts 2 ; RUN: llc -march=hexagon -enable-pipeliner -enable-aa-sched-mi < %s | FileCheck %s 3 4 ; CHECK: loop0( 5 ; CHECK: loop0(.LBB0_[[LOOP:.]], 6 ; CHECK: .LBB0_[[LOOP]]: 7 ; CHECK: or 8 ; CHECK: or 9 ; CHECK: } 10 ; CHECK: { 11 ; CHECK: } 12 ; CHECK: { 13 ; CHECK: memw 14 ; CHECK-NEXT: }{{[ \t]*}}:endloop0 15 16 ; Function Attrs: nounwind 17 define void @f0([576 x i32]* nocapture %a0, i32 %a1, i32* nocapture %a2) #0 { 18 b0: 19 %v0 = icmp sgt i32 %a1, 0 20 br i1 %v0, label %b1, label %b9 21 22 b1: ; preds = %b0 23 %v1 = icmp ugt i32 %a1, 3 24 %v2 = add i32 %a1, -3 25 br i1 %v1, label %b2, label %b5 26 27 b2: ; preds = %b1 28 br label %b3 29 30 b3: ; preds = %b3, %b2 31 %v3 = phi i32 [ %v48, %b3 ], [ 0, %b2 ] 32 %v4 = phi i32 [ %v46, %b3 ], [ 0, %b2 ] 33 %v5 = phi i32 [ %v49, %b3 ], [ 0, %b2 ] 34 %v6 = getelementptr inbounds [576 x i32], [576 x i32]* %a0, i32 0, i32 %v5 35 %v7 = load i32, i32* %v6, align 4, !tbaa !0 36 %v8 = getelementptr inbounds [576 x i32], [576 x i32]* %a0, i32 1, i32 %v5 37 %v9 = load i32, i32* %v8, align 4, !tbaa !0 38 %v10 = add nsw i32 %v9, %v7 39 store i32 %v10, i32* %v6, align 4, !tbaa !0 40 %v11 = sub nsw i32 %v7, %v9 41 store i32 %v11, i32* %v8, align 4, !tbaa !0 42 %v12 = tail call i32 @llvm.hexagon.A2.abs(i32 %v10) 43 %v13 = or i32 %v12, %v4 44 %v14 = tail call i32 @llvm.hexagon.A2.abs(i32 %v11) 45 %v15 = or i32 %v14, %v3 46 %v16 = add nsw i32 %v5, 1 47 %v17 = getelementptr inbounds [576 x i32], [576 x i32]* %a0, i32 0, i32 %v16 48 %v18 = load i32, i32* %v17, align 4, !tbaa !0 49 %v19 = getelementptr inbounds [576 x i32], [576 x i32]* %a0, i32 1, i32 %v16 50 %v20 = load i32, i32* %v19, align 4, !tbaa !0 51 %v21 = add nsw i32 %v20, %v18 52 store i32 %v21, i32* %v17, align 4, !tbaa !0 53 %v22 = sub nsw i32 %v18, %v20 54 store i32 %v22, i32* %v19, align 4, !tbaa !0 55 %v23 = tail call i32 @llvm.hexagon.A2.abs(i32 %v21) 56 %v24 = or i32 %v23, %v13 57 %v25 = tail call i32 @llvm.hexagon.A2.abs(i32 %v22) 58 %v26 = or i32 %v25, %v15 59 %v27 = add nsw i32 %v5, 2 60 %v28 = getelementptr inbounds [576 x i32], [576 x i32]* %a0, i32 0, i32 %v27 61 %v29 = load i32, i32* %v28, align 4, !tbaa !0 62 %v30 = getelementptr inbounds [576 x i32], [576 x i32]* %a0, i32 1, i32 %v27 63 %v31 = load i32, i32* %v30, align 4, !tbaa !0 64 %v32 = add nsw i32 %v31, %v29 65 store i32 %v32, i32* %v28, align 4, !tbaa !0 66 %v33 = sub nsw i32 %v29, %v31 67 store i32 %v33, i32* %v30, align 4, !tbaa !0 68 %v34 = tail call i32 @llvm.hexagon.A2.abs(i32 %v32) 69 %v35 = or i32 %v34, %v24 70 %v36 = tail call i32 @llvm.hexagon.A2.abs(i32 %v33) 71 %v37 = or i32 %v36, %v26 72 %v38 = add nsw i32 %v5, 3 73 %v39 = getelementptr inbounds [576 x i32], [576 x i32]* %a0, i32 0, i32 %v38 74 %v40 = load i32, i32* %v39, align 4, !tbaa !0 75 %v41 = getelementptr inbounds [576 x i32], [576 x i32]* %a0, i32 1, i32 %v38 76 %v42 = load i32, i32* %v41, align 4, !tbaa !0 77 %v43 = add nsw i32 %v42, %v40 78 store i32 %v43, i32* %v39, align 4, !tbaa !0 79 %v44 = sub nsw i32 %v40, %v42 80 store i32 %v44, i32* %v41, align 4, !tbaa !0 81 %v45 = tail call i32 @llvm.hexagon.A2.abs(i32 %v43) 82 %v46 = or i32 %v45, %v35 83 %v47 = tail call i32 @llvm.hexagon.A2.abs(i32 %v44) 84 %v48 = or i32 %v47, %v37 85 %v49 = add nsw i32 %v5, 4 86 %v50 = icmp slt i32 %v49, %v2 87 br i1 %v50, label %b3, label %b4 88 89 b4: ; preds = %b3 90 br label %b5 91 92 b5: ; preds = %b4, %b1 93 %v51 = phi i32 [ 0, %b1 ], [ %v49, %b4 ] 94 %v52 = phi i32 [ 0, %b1 ], [ %v48, %b4 ] 95 %v53 = phi i32 [ 0, %b1 ], [ %v46, %b4 ] 96 %v54 = icmp eq i32 %v51, %a1 97 br i1 %v54, label %b9, label %b6 98 99 b6: ; preds = %b5 100 br label %b7 101 102 b7: ; preds = %b7, %b6 103 %v55 = phi i32 [ %v67, %b7 ], [ %v52, %b6 ] 104 %v56 = phi i32 [ %v65, %b7 ], [ %v53, %b6 ] 105 %v57 = phi i32 [ %v68, %b7 ], [ %v51, %b6 ] 106 %v58 = getelementptr inbounds [576 x i32], [576 x i32]* %a0, i32 0, i32 %v57 107 %v59 = load i32, i32* %v58, align 4, !tbaa !0 108 %v60 = getelementptr inbounds [576 x i32], [576 x i32]* %a0, i32 1, i32 %v57 109 %v61 = load i32, i32* %v60, align 4, !tbaa !0 110 %v62 = add nsw i32 %v61, %v59 111 store i32 %v62, i32* %v58, align 4, !tbaa !0 112 %v63 = sub nsw i32 %v59, %v61 113 store i32 %v63, i32* %v60, align 4, !tbaa !0 114 %v64 = tail call i32 @llvm.hexagon.A2.abs(i32 %v62) 115 %v65 = or i32 %v64, %v56 116 %v66 = tail call i32 @llvm.hexagon.A2.abs(i32 %v63) 117 %v67 = or i32 %v66, %v55 118 %v68 = add nsw i32 %v57, 1 119 %v69 = icmp eq i32 %v68, %a1 120 br i1 %v69, label %b8, label %b7 121 122 b8: ; preds = %b7 123 br label %b9 124 125 b9: ; preds = %b8, %b5, %b0 126 %v70 = phi i32 [ 0, %b0 ], [ %v52, %b5 ], [ %v67, %b8 ] 127 %v71 = phi i32 [ 0, %b0 ], [ %v53, %b5 ], [ %v65, %b8 ] 128 %v72 = load i32, i32* %a2, align 4, !tbaa !0 129 %v73 = or i32 %v72, %v71 130 store i32 %v73, i32* %a2, align 4, !tbaa !0 131 %v74 = getelementptr inbounds i32, i32* %a2, i32 1 132 %v75 = load i32, i32* %v74, align 4, !tbaa !0 133 %v76 = or i32 %v75, %v70 134 store i32 %v76, i32* %v74, align 4, !tbaa !0 135 ret void 136 } 137 138 ; Function Attrs: nounwind readnone 139 declare i32 @llvm.hexagon.A2.abs(i32) #1 140 141 attributes #0 = { nounwind } 142 attributes #1 = { nounwind readnone } 143 144 !0 = !{!1, !1, i64 0} 145 !1 = !{!"int", !2} 146 !2 = !{!"omnipotent char", !3} 147 !3 = !{!"Simple C/C++ TBAA"} 148