1; RUN: llc -march=hexagon < %s | FileCheck %s 2 3target triple = "hexagon" 4 5; FP elimination enabled. 6; 7; CHECK-LABEL: danny: 8; CHECK: r29 = add(r29,#-[[SIZE:[0-9]+]]) 9; CHECK: r29 = add(r29,#[[SIZE]]) 10define i32 @danny(i32 %a0, i32 %a1) local_unnamed_addr #0 { 11b2: 12 %v3 = alloca [32 x i32], align 8 13 %v4 = bitcast [32 x i32]* %v3 to i8* 14 call void @llvm.lifetime.start.p0i8(i64 128, i8* nonnull %v4) #3 15 br label %b5 16 17b5: ; preds = %b5, %b2 18 %v6 = phi i32 [ 0, %b2 ], [ %v8, %b5 ] 19 %v7 = getelementptr inbounds [32 x i32], [32 x i32]* %v3, i32 0, i32 %v6 20 store i32 %v6, i32* %v7, align 4 21 %v8 = add nuw nsw i32 %v6, 1 22 %v9 = icmp eq i32 %v8, 32 23 br i1 %v9, label %b10, label %b5 24 25b10: ; preds = %b5 26 %v11 = getelementptr inbounds [32 x i32], [32 x i32]* %v3, i32 0, i32 %a0 27 store i32 %a1, i32* %v11, align 4 28 br label %b12 29 30b12: ; preds = %b12, %b10 31 %v13 = phi i32 [ 0, %b10 ], [ %v18, %b12 ] 32 %v14 = phi i32 [ 0, %b10 ], [ %v17, %b12 ] 33 %v15 = getelementptr inbounds [32 x i32], [32 x i32]* %v3, i32 0, i32 %v13 34 %v16 = load i32, i32* %v15, align 4 35 %v17 = add nsw i32 %v16, %v14 36 %v18 = add nuw nsw i32 %v13, 1 37 %v19 = icmp eq i32 %v18, 32 38 br i1 %v19, label %b20, label %b12 39 40b20: ; preds = %b12 41 call void @llvm.lifetime.end.p0i8(i64 128, i8* nonnull %v4) #3 42 ret i32 %v17 43} 44 45; FP elimination disabled. 46; 47; CHECK-LABEL: sammy: 48; CHECK: allocframe 49; CHECK: dealloc_return 50define i32 @sammy(i32 %a0, i32 %a1) local_unnamed_addr #1 { 51b2: 52 %v3 = alloca [32 x i32], align 8 53 %v4 = bitcast [32 x i32]* %v3 to i8* 54 call void @llvm.lifetime.start.p0i8(i64 128, i8* nonnull %v4) #3 55 br label %b5 56 57b5: ; preds = %b5, %b2 58 %v6 = phi i32 [ 0, %b2 ], [ %v8, %b5 ] 59 %v7 = getelementptr inbounds [32 x i32], [32 x i32]* %v3, i32 0, i32 %v6 60 store i32 %v6, i32* %v7, align 4 61 %v8 = add nuw nsw i32 %v6, 1 62 %v9 = icmp eq i32 %v8, 32 63 br i1 %v9, label %b10, label %b5 64 65b10: ; preds = %b5 66 %v11 = getelementptr inbounds [32 x i32], [32 x i32]* %v3, i32 0, i32 %a0 67 store i32 %a1, i32* %v11, align 4 68 br label %b12 69 70b12: ; preds = %b12, %b10 71 %v13 = phi i32 [ 0, %b10 ], [ %v18, %b12 ] 72 %v14 = phi i32 [ 0, %b10 ], [ %v17, %b12 ] 73 %v15 = getelementptr inbounds [32 x i32], [32 x i32]* %v3, i32 0, i32 %v13 74 %v16 = load i32, i32* %v15, align 4 75 %v17 = add nsw i32 %v16, %v14 76 %v18 = add nuw nsw i32 %v13, 1 77 %v19 = icmp eq i32 %v18, 32 78 br i1 %v19, label %b20, label %b12 79 80b20: ; preds = %b12 81 call void @llvm.lifetime.end.p0i8(i64 128, i8* nonnull %v4) #3 82 ret i32 %v17 83} 84 85declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) #2 86declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #2 87 88attributes #0 = { nounwind readnone "no-frame-pointer-elim"="false" "target-cpu"="hexagonv60" } 89attributes #1 = { nounwind readnone "no-frame-pointer-elim"="true" "target-cpu"="hexagonv60" } 90attributes #2 = { argmemonly nounwind } 91attributes #3 = { nounwind } 92