[llvm] 1000245 - [NFC][SROA] Precommit tests for promotion-with-spilling
Roman Lebedev via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 9 14:53:52 PST 2021
Author: Roman Lebedev
Date: 2021-11-10T01:52:31+03:00
New Revision: 1000245e3a4f8495edd1c37c7525fde7af8b4d41
URL: https://github.com/llvm/llvm-project/commit/1000245e3a4f8495edd1c37c7525fde7af8b4d41
DIFF: https://github.com/llvm/llvm-project/commit/1000245e3a4f8495edd1c37c7525fde7af8b4d41.diff
LOG: [NFC][SROA] Precommit tests for promotion-with-spilling
Tests mainly stolen from https://reviews.llvm.org/D109749
Added:
llvm/test/Transforms/SROA/non-capturing-call.ll
Modified:
Removed:
################################################################################
diff --git a/llvm/test/Transforms/SROA/non-capturing-call.ll b/llvm/test/Transforms/SROA/non-capturing-call.ll
new file mode 100644
index 0000000000000..f6421f6def20d
--- /dev/null
+++ b/llvm/test/Transforms/SROA/non-capturing-call.ll
@@ -0,0 +1,351 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -sroa -S | FileCheck %s
+; RUN: opt < %s -passes=sroa -S | FileCheck %s
+
+define i32 @alloca_used_in_call(i32* nocapture nonnull readonly %data, i64 %n) {
+; CHECK-LABEL: @alloca_used_in_call(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
+; CHECK-NEXT: store i32 0, i32* [[RETVAL]], align 4
+; CHECK-NEXT: br label [[LOOP:%.*]]
+; CHECK: loop:
+; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[LOOP]] ]
+; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[DATA:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT: [[LD:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT: [[RDX:%.*]] = load i32, i32* [[RETVAL]], align 4
+; CHECK-NEXT: [[RDX_INC:%.*]] = add nsw i32 [[RDX]], [[LD]]
+; CHECK-NEXT: store i32 [[RDX_INC]], i32* [[RETVAL]], align 4
+; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], 1
+; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT]], [[N:%.*]]
+; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT:%.*]]
+; CHECK: exit:
+; CHECK-NEXT: [[TMP0:%.*]] = call i32 @user_of_alloca(i32* nocapture nonnull [[RETVAL]])
+; CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* [[RETVAL]], align 4
+; CHECK-NEXT: ret i32 [[TMP1]]
+;
+entry:
+ %retval = alloca i32, align 4
+ store i32 0, i32* %retval, align 4
+ br label %loop
+
+loop:
+ %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %loop ]
+ %arrayidx = getelementptr inbounds i32, i32* %data, i64 %indvars.iv
+ %ld = load i32, i32* %arrayidx, align 4
+ %rdx = load i32, i32* %retval, align 4
+ %rdx.inc = add nsw i32 %rdx, %ld
+ store i32 %rdx.inc, i32* %retval, align 4
+ %indvars.iv.next = add nsw i64 %indvars.iv, 1
+ %exitcond = icmp ne i64 %indvars.iv.next, %n
+ br i1 %exitcond, label %loop, label %exit
+
+exit:
+ %0 = call i32 @user_of_alloca(i32* nocapture nonnull %retval)
+ %1 = load i32, i32* %retval, align 4
+ ret i32 %1
+}
+
+define i32 @alloca_captured_in_call(i32* nocapture nonnull readonly %data, i64 %n) {
+; CHECK-LABEL: @alloca_captured_in_call(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
+; CHECK-NEXT: store i32 0, i32* [[RETVAL]], align 4
+; CHECK-NEXT: br label [[LOOP:%.*]]
+; CHECK: loop:
+; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[LOOP]] ]
+; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[DATA:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT: [[LD:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT: [[RDX:%.*]] = load i32, i32* [[RETVAL]], align 4
+; CHECK-NEXT: [[RDX_INC:%.*]] = add nsw i32 [[RDX]], [[LD]]
+; CHECK-NEXT: store i32 [[RDX_INC]], i32* [[RETVAL]], align 4
+; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], 1
+; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT]], [[N:%.*]]
+; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT:%.*]]
+; CHECK: exit:
+; CHECK-NEXT: [[TMP0:%.*]] = call i32 @capture_of_alloca(i32* nonnull [[RETVAL]])
+; CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* [[RETVAL]], align 4
+; CHECK-NEXT: ret i32 [[TMP1]]
+;
+entry:
+ %retval = alloca i32, align 4
+ store i32 0, i32* %retval, align 4
+ br label %loop
+
+loop:
+ %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %loop ]
+ %arrayidx = getelementptr inbounds i32, i32* %data, i64 %indvars.iv
+ %ld = load i32, i32* %arrayidx, align 4
+ %rdx = load i32, i32* %retval, align 4
+ %rdx.inc = add nsw i32 %rdx, %ld
+ store i32 %rdx.inc, i32* %retval, align 4
+ %indvars.iv.next = add nsw i64 %indvars.iv, 1
+ %exitcond = icmp ne i64 %indvars.iv.next, %n
+ br i1 %exitcond, label %loop, label %exit
+
+exit:
+ %0 = call i32 @capture_of_alloca(i32* nonnull %retval)
+ %1 = load i32, i32* %retval, align 4
+ ret i32 %1
+}
+
+define i32 @alloca_with_gep_used_in_call(i32* nocapture nonnull readonly %data, i64 %n) {
+; CHECK-LABEL: @alloca_with_gep_used_in_call(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
+; CHECK-NEXT: store i32 0, i32* [[RETVAL]], align 4
+; CHECK-NEXT: br label [[LOOP:%.*]]
+; CHECK: loop:
+; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[LOOP]] ]
+; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[DATA:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT: [[LD:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT: [[RDX:%.*]] = load i32, i32* [[RETVAL]], align 4
+; CHECK-NEXT: [[RDX_INC:%.*]] = add nsw i32 [[RDX]], [[LD]]
+; CHECK-NEXT: store i32 [[RDX_INC]], i32* [[RETVAL]], align 4
+; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], 1
+; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT]], [[N:%.*]]
+; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT:%.*]]
+; CHECK: exit:
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, i32* [[RETVAL]], i32 0
+; CHECK-NEXT: [[TMP0:%.*]] = call i32 @user_of_alloca(i32* nocapture nonnull [[GEP]])
+; CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* [[RETVAL]], align 4
+; CHECK-NEXT: ret i32 [[TMP1]]
+;
+entry:
+ %retval = alloca i32, align 4
+ store i32 0, i32* %retval, align 4
+ br label %loop
+
+loop:
+ %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %loop ]
+ %arrayidx = getelementptr inbounds i32, i32* %data, i64 %indvars.iv
+ %ld = load i32, i32* %arrayidx, align 4
+ %rdx = load i32, i32* %retval, align 4
+ %rdx.inc = add nsw i32 %rdx, %ld
+ store i32 %rdx.inc, i32* %retval, align 4
+ %indvars.iv.next = add nsw i64 %indvars.iv, 1
+ %exitcond = icmp ne i64 %indvars.iv.next, %n
+ br i1 %exitcond, label %loop, label %exit
+
+exit:
+ %gep = getelementptr i32, i32* %retval, i32 0
+ %0 = call i32 @user_of_alloca(i32* nocapture nonnull %gep)
+ %1 = load i32, i32* %retval, align 4
+ ret i32 %1
+}
+
+define i32 @alloca_captured_second_arg(i32* nocapture nonnull readonly %data, i64 %n) {
+; CHECK-LABEL: @alloca_captured_second_arg(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
+; CHECK-NEXT: store i32 0, i32* [[RETVAL]], align 4
+; CHECK-NEXT: br label [[LOOP:%.*]]
+; CHECK: loop:
+; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[LOOP]] ]
+; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[DATA:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT: [[LD:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT: [[RDX:%.*]] = load i32, i32* [[RETVAL]], align 4
+; CHECK-NEXT: [[RDX_INC:%.*]] = add nsw i32 [[RDX]], [[LD]]
+; CHECK-NEXT: store i32 [[RDX_INC]], i32* [[RETVAL]], align 4
+; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], 1
+; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT]], [[N:%.*]]
+; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT:%.*]]
+; CHECK: exit:
+; CHECK-NEXT: [[TMP0:%.*]] = call i32 @capture_with_multiple_args(i32* nocapture nonnull [[RETVAL]], i32* nonnull [[RETVAL]])
+; CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* [[RETVAL]], align 4
+; CHECK-NEXT: ret i32 [[TMP1]]
+;
+entry:
+ %retval = alloca i32, align 4
+ store i32 0, i32* %retval, align 4
+ br label %loop
+
+loop:
+ %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %loop ]
+ %arrayidx = getelementptr inbounds i32, i32* %data, i64 %indvars.iv
+ %ld = load i32, i32* %arrayidx, align 4
+ %rdx = load i32, i32* %retval, align 4
+ %rdx.inc = add nsw i32 %rdx, %ld
+ store i32 %rdx.inc, i32* %retval, align 4
+ %indvars.iv.next = add nsw i64 %indvars.iv, 1
+ %exitcond = icmp ne i64 %indvars.iv.next, %n
+ br i1 %exitcond, label %loop, label %exit
+
+exit:
+ %0 = call i32 @capture_with_multiple_args(i32* nocapture nonnull %retval, i32* nonnull %retval)
+ %1 = load i32, i32* %retval, align 4
+ ret i32 %1
+}
+
+define i32 @alloca_used_in_maybe_throwing_call(i32* nocapture nonnull readonly %data, i64 %n) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
+; CHECK-LABEL: @alloca_used_in_maybe_throwing_call(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
+; CHECK-NEXT: store i32 0, i32* [[RETVAL]], align 4
+; CHECK-NEXT: br label [[LOOP:%.*]]
+; CHECK: loop:
+; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[LOOP]] ]
+; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[DATA:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT: [[LD:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT: [[RDX:%.*]] = load i32, i32* [[RETVAL]], align 4
+; CHECK-NEXT: [[RDX_INC:%.*]] = add nsw i32 [[RDX]], [[LD]]
+; CHECK-NEXT: store i32 [[RDX_INC]], i32* [[RETVAL]], align 4
+; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], 1
+; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT]], [[N:%.*]]
+; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT:%.*]]
+; CHECK: exit:
+; CHECK-NEXT: [[TMP0:%.*]] = invoke i32 @user_of_alloca(i32* nocapture nonnull [[RETVAL]])
+; CHECK-NEXT: to label [[CONT:%.*]] unwind label [[UW:%.*]]
+; CHECK: cont:
+; CHECK-NEXT: br label [[END:%.*]]
+; CHECK: uw:
+; CHECK-NEXT: [[TMP1:%.*]] = landingpad { i8*, i32 }
+; CHECK-NEXT: catch i8* null
+; CHECK-NEXT: br label [[END]]
+; CHECK: end:
+; CHECK-NEXT: [[TMP2:%.*]] = load i32, i32* [[RETVAL]], align 4
+; CHECK-NEXT: ret i32 [[TMP2]]
+;
+entry:
+ %retval = alloca i32, align 4
+ store i32 0, i32* %retval, align 4
+ br label %loop
+
+loop:
+ %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %loop ]
+ %arrayidx = getelementptr inbounds i32, i32* %data, i64 %indvars.iv
+ %ld = load i32, i32* %arrayidx, align 4
+ %rdx = load i32, i32* %retval, align 4
+ %rdx.inc = add nsw i32 %rdx, %ld
+ store i32 %rdx.inc, i32* %retval, align 4
+ %indvars.iv.next = add nsw i64 %indvars.iv, 1
+ %exitcond = icmp ne i64 %indvars.iv.next, %n
+ br i1 %exitcond, label %loop, label %exit
+
+exit:
+ %0 = invoke i32 @user_of_alloca(i32* nocapture nonnull %retval) to label %cont unwind label %uw
+
+cont:
+ br label %end
+
+uw:
+ %1 = landingpad { i8*, i32 } catch i8* null
+ br label %end
+
+end:
+ %2 = load i32, i32* %retval, align 4
+ ret i32 %2
+}
+
+define i32 @alloca_used_in_maybe_throwing_call_with_same_dests(i32* nocapture nonnull readonly %data, i64 %n) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
+; CHECK-LABEL: @alloca_used_in_maybe_throwing_call_with_same_dests(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[RETVAL:%.*]] = alloca i32, align 4
+; CHECK-NEXT: store i32 0, i32* [[RETVAL]], align 4
+; CHECK-NEXT: br label [[LOOP:%.*]]
+; CHECK: loop:
+; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[LOOP]] ]
+; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[DATA:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT: [[LD:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT: [[RDX:%.*]] = load i32, i32* [[RETVAL]], align 4
+; CHECK-NEXT: [[RDX_INC:%.*]] = add nsw i32 [[RDX]], [[LD]]
+; CHECK-NEXT: store i32 [[RDX_INC]], i32* [[RETVAL]], align 4
+; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], 1
+; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT]], [[N:%.*]]
+; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT:%.*]]
+; CHECK: exit:
+; CHECK-NEXT: [[TMP0:%.*]] = invoke i32 @user_of_alloca(i32* nocapture nonnull [[RETVAL]])
+; CHECK-NEXT: to label [[END:%.*]] unwind label [[UW:%.*]]
+; CHECK: uw:
+; CHECK-NEXT: [[TMP1:%.*]] = landingpad { i8*, i32 }
+; CHECK-NEXT: catch i8* null
+; CHECK-NEXT: br label [[END]]
+; CHECK: end:
+; CHECK-NEXT: [[TMP2:%.*]] = load i32, i32* [[RETVAL]], align 4
+; CHECK-NEXT: ret i32 [[TMP2]]
+;
+entry:
+ %retval = alloca i32, align 4
+ store i32 0, i32* %retval, align 4
+ br label %loop
+
+loop:
+ %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %loop ]
+ %arrayidx = getelementptr inbounds i32, i32* %data, i64 %indvars.iv
+ %ld = load i32, i32* %arrayidx, align 4
+ %rdx = load i32, i32* %retval, align 4
+ %rdx.inc = add nsw i32 %rdx, %ld
+ store i32 %rdx.inc, i32* %retval, align 4
+ %indvars.iv.next = add nsw i64 %indvars.iv, 1
+ %exitcond = icmp ne i64 %indvars.iv.next, %n
+ br i1 %exitcond, label %loop, label %exit
+
+exit:
+ %0 = invoke i32 @user_of_alloca(i32* nocapture nonnull %retval) to label %end unwind label %uw
+
+uw:
+ %1 = landingpad { i8*, i32 } catch i8* null
+ br label %end
+
+end:
+ %2 = load i32, i32* %retval, align 4
+ ret i32 %2
+}
+
+define [2 x i32] @part_of_alloca_used_in_call(i32* nocapture nonnull readonly %data, i64 %n) {
+; CHECK-LABEL: @part_of_alloca_used_in_call(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[RETVAL_FULL:%.*]] = alloca [2 x i32], align 4
+; CHECK-NEXT: [[DOTFCA_0_GEP:%.*]] = getelementptr inbounds [2 x i32], [2 x i32]* [[RETVAL_FULL]], i32 0, i32 0
+; CHECK-NEXT: store i32 0, i32* [[DOTFCA_0_GEP]], align 4
+; CHECK-NEXT: [[DOTFCA_1_GEP:%.*]] = getelementptr inbounds [2 x i32], [2 x i32]* [[RETVAL_FULL]], i32 0, i32 1
+; CHECK-NEXT: store i32 0, i32* [[DOTFCA_1_GEP]], align 4
+; CHECK-NEXT: [[RETVAL:%.*]] = getelementptr inbounds [2 x i32], [2 x i32]* [[RETVAL_FULL]], i64 0, i64 1
+; CHECK-NEXT: br label [[LOOP:%.*]]
+; CHECK: loop:
+; CHECK-NEXT: [[INDVARS_IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INDVARS_IV_NEXT:%.*]], [[LOOP]] ]
+; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[DATA:%.*]], i64 [[INDVARS_IV]]
+; CHECK-NEXT: [[LD:%.*]] = load i32, i32* [[ARRAYIDX]], align 4
+; CHECK-NEXT: [[RDX:%.*]] = load i32, i32* [[RETVAL]], align 4
+; CHECK-NEXT: [[RDX_INC:%.*]] = add nsw i32 [[RDX]], [[LD]]
+; CHECK-NEXT: store i32 [[RDX_INC]], i32* [[RETVAL]], align 4
+; CHECK-NEXT: [[INDVARS_IV_NEXT]] = add nsw i64 [[INDVARS_IV]], 1
+; CHECK-NEXT: [[EXITCOND:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT]], [[N:%.*]]
+; CHECK-NEXT: br i1 [[EXITCOND]], label [[LOOP]], label [[EXIT:%.*]]
+; CHECK: exit:
+; CHECK-NEXT: [[TMP0:%.*]] = call i32 @user_of_alloca(i32* nocapture nonnull [[RETVAL]])
+; CHECK-NEXT: [[DOTFCA_0_GEP1:%.*]] = getelementptr inbounds [2 x i32], [2 x i32]* [[RETVAL_FULL]], i32 0, i32 0
+; CHECK-NEXT: [[DOTFCA_0_LOAD:%.*]] = load i32, i32* [[DOTFCA_0_GEP1]], align 4
+; CHECK-NEXT: [[DOTFCA_0_INSERT:%.*]] = insertvalue [2 x i32] undef, i32 [[DOTFCA_0_LOAD]], 0
+; CHECK-NEXT: [[DOTFCA_1_GEP2:%.*]] = getelementptr inbounds [2 x i32], [2 x i32]* [[RETVAL_FULL]], i32 0, i32 1
+; CHECK-NEXT: [[DOTFCA_1_LOAD:%.*]] = load i32, i32* [[DOTFCA_1_GEP2]], align 4
+; CHECK-NEXT: [[DOTFCA_1_INSERT:%.*]] = insertvalue [2 x i32] [[DOTFCA_0_INSERT]], i32 [[DOTFCA_1_LOAD]], 1
+; CHECK-NEXT: ret [2 x i32] [[DOTFCA_1_INSERT]]
+;
+entry:
+ %retval.full = alloca [2 x i32], align 4
+ store [2 x i32] zeroinitializer, [2 x i32]* %retval.full, align 4
+ %retval = getelementptr inbounds [2 x i32], [2 x i32]* %retval.full, i64 0, i64 1
+ br label %loop
+
+loop:
+ %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %loop ]
+ %arrayidx = getelementptr inbounds i32, i32* %data, i64 %indvars.iv
+ %ld = load i32, i32* %arrayidx, align 4
+ %rdx = load i32, i32* %retval, align 4
+ %rdx.inc = add nsw i32 %rdx, %ld
+ store i32 %rdx.inc, i32* %retval, align 4
+ %indvars.iv.next = add nsw i64 %indvars.iv, 1
+ %exitcond = icmp ne i64 %indvars.iv.next, %n
+ br i1 %exitcond, label %loop, label %exit
+
+exit:
+ %0 = call i32 @user_of_alloca(i32* nocapture nonnull %retval)
+ %1 = load [2 x i32], [2 x i32]* %retval.full, align 4
+ ret [2 x i32] %1
+}
+
+declare dso_local i32 @user_of_alloca(i32* nocapture nonnull)
+declare dso_local i32 @capture_of_alloca(i32 *nonnull)
+declare dso_local i32 @capture_with_multiple_args(i32* nocapture nonnull, i32* nonnull)
+
+declare dso_local i32 @__gxx_personality_v0(...)
More information about the llvm-commits
mailing list