diff --git a/llvm/test/Transforms/ArgumentPromotion/2008-02-01-ReturnAttrs.ll b/llvm/test/Transforms/ArgumentPromotion/2008-02-01-ReturnAttrs.ll --- a/llvm/test/Transforms/ArgumentPromotion/2008-02-01-ReturnAttrs.ll +++ b/llvm/test/Transforms/ArgumentPromotion/2008-02-01-ReturnAttrs.ll @@ -1,19 +1,30 @@ -; RUN: opt < %s -argpromotion -S | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt < %s -argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL -; CHECK: define internal i32 @deref(i32 %x.val) #0 { define internal i32 @deref(i32* %x) nounwind { +; ARGPROMOTION-LABEL: define {{[^@]+}}@deref +; ARGPROMOTION-SAME: (i32 [[X_VAL:%.*]]) +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: ret i32 [[X_VAL:%.*]] +; entry: %tmp2 = load i32, i32* %x, align 4 ret i32 %tmp2 } define i32 @f(i32 %x) { +; ARGPROMOTION-LABEL: define {{[^@]+}}@f +; ARGPROMOTION-SAME: (i32 [[X:%.*]]) +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[X_ADDR:%.*]] = alloca i32 +; ARGPROMOTION-NEXT: store i32 [[X:%.*]], i32* [[X_ADDR]], align 4 +; ARGPROMOTION-NEXT: [[X_ADDR_VAL:%.*]] = load i32, i32* [[X_ADDR]], align 4 +; ARGPROMOTION-NEXT: [[TMP1:%.*]] = call i32 @deref(i32 [[X_ADDR_VAL]]) +; ARGPROMOTION-NEXT: ret i32 [[TMP1]] +; entry: %x_addr = alloca i32 store i32 %x, i32* %x_addr, align 4 -; CHECK: %tmp1 = call i32 @deref(i32 %x_addr.val) [[NUW:#[0-9]+]] %tmp1 = call i32 @deref( i32* %x_addr ) nounwind ret i32 %tmp1 } - -; CHECK: attributes [[NUW]] = { nounwind } diff --git a/llvm/test/Transforms/ArgumentPromotion/2008-07-02-array-indexing.ll b/llvm/test/Transforms/ArgumentPromotion/2008-07-02-array-indexing.ll --- a/llvm/test/Transforms/ArgumentPromotion/2008-07-02-array-indexing.ll +++ b/llvm/test/Transforms/ArgumentPromotion/2008-07-02-array-indexing.ll @@ -1,11 +1,22 @@ -; RUN: opt < %s -argpromotion -S | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt < %s -argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL ; PR2498 ; This test tries to convince argpromotion about promoting the load from %A + 2, ; because there is a load of %A in the entry block define internal i32 @callee(i1 %C, i32* %A) { -; CHECK-LABEL: define internal i32 @callee( -; CHECK: i1 %C, i32* %A) +; ARGPROMOTION-LABEL: define {{[^@]+}}@callee +; ARGPROMOTION-SAME: (i1 [[C:%.*]], i32* [[A:%.*]]) +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[A_0:%.*]] = load i32, i32* [[A:%.*]] +; ARGPROMOTION-NEXT: br i1 [[C:%.*]], label [[T:%.*]], label [[F:%.*]] +; ARGPROMOTION: T: +; ARGPROMOTION-NEXT: ret i32 [[A_0]] +; ARGPROMOTION: F: +; ARGPROMOTION-NEXT: [[A_2:%.*]] = getelementptr i32, i32* [[A]], i32 2 +; ARGPROMOTION-NEXT: [[R:%.*]] = load i32, i32* [[A_2]] +; ARGPROMOTION-NEXT: ret i32 [[R]] +; entry: ; Unconditonally load the element at %A %A.0 = load i32, i32* %A @@ -22,9 +33,11 @@ } define i32 @foo() { -; CHECK-LABEL: define i32 @foo - %X = call i32 @callee(i1 false, i32* null) ; [#uses=1] -; CHECK: call i32 @callee(i1 false, i32* null) - ret i32 %X +; ARGPROMOTION-LABEL: define {{[^@]+}}@foo() +; ARGPROMOTION-NEXT: [[X:%.*]] = call i32 @callee(i1 false, i32* null) +; ARGPROMOTION-NEXT: ret i32 [[X]] +; + %X = call i32 @callee(i1 false, i32* null) ; [#uses=1] + ret i32 %X } diff --git a/llvm/test/Transforms/ArgumentPromotion/2008-09-07-CGUpdate.ll b/llvm/test/Transforms/ArgumentPromotion/2008-09-07-CGUpdate.ll --- a/llvm/test/Transforms/ArgumentPromotion/2008-09-07-CGUpdate.ll +++ b/llvm/test/Transforms/ArgumentPromotion/2008-09-07-CGUpdate.ll @@ -1,12 +1,13 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes ; RUN: opt < %s -inline -argpromotion -disable-output define internal fastcc i32 @hash(i32* %ts, i32 %mod) nounwind { entry: - unreachable + unreachable } define void @encode(i32* %m, i32* %ts, i32* %new) nounwind { entry: - %0 = call fastcc i32 @hash( i32* %ts, i32 0 ) nounwind ; [#uses=0] - unreachable + %0 = call fastcc i32 @hash( i32* %ts, i32 0 ) nounwind ; [#uses=0] + unreachable } diff --git a/llvm/test/Transforms/ArgumentPromotion/2008-09-08-CGUpdateSelfEdge.ll b/llvm/test/Transforms/ArgumentPromotion/2008-09-08-CGUpdateSelfEdge.ll --- a/llvm/test/Transforms/ArgumentPromotion/2008-09-08-CGUpdateSelfEdge.ll +++ b/llvm/test/Transforms/ArgumentPromotion/2008-09-08-CGUpdateSelfEdge.ll @@ -1,25 +1,26 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes ; RUN: opt < %s -argpromotion -disable-output define internal fastcc i32 @term_SharingList(i32* %Term, i32* %List) nounwind { entry: - br i1 false, label %bb, label %bb5 + br i1 false, label %bb, label %bb5 bb: ; preds = %entry - %0 = call fastcc i32 @term_SharingList( i32* null, i32* %List ) nounwind ; [#uses=0] - unreachable + %0 = call fastcc i32 @term_SharingList( i32* null, i32* %List ) nounwind ; [#uses=0] + unreachable bb5: ; preds = %entry - ret i32 0 + ret i32 0 } define i32 @term_Sharing(i32* %Term) nounwind { entry: - br i1 false, label %bb.i, label %bb14 + br i1 false, label %bb.i, label %bb14 bb.i: ; preds = %entry - %0 = call fastcc i32 @term_SharingList( i32* null, i32* null ) nounwind ; [#uses=0] - ret i32 1 + %0 = call fastcc i32 @term_SharingList( i32* null, i32* null ) nounwind ; [#uses=0] + ret i32 1 bb14: ; preds = %entry - ret i32 0 + ret i32 0 } diff --git a/llvm/test/Transforms/ArgumentPromotion/X86/attributes.ll b/llvm/test/Transforms/ArgumentPromotion/X86/attributes.ll --- a/llvm/test/Transforms/ArgumentPromotion/X86/attributes.ll +++ b/llvm/test/Transforms/ArgumentPromotion/X86/attributes.ll @@ -1,12 +1,19 @@ -; RUN: opt -S -argpromotion < %s | FileCheck %s -; RUN: opt -S -passes=argpromotion < %s | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt -S -argpromotion < %s | FileCheck %s --check-prefixes=ARGPROMOTION,ALL +; RUN: opt -S -passes=argpromotion < %s | FileCheck %s --check-prefixes=ARGPROMOTION,ALL ; Test that we only promote arguments when the caller/callee have compatible ; function attrubtes. target triple = "x86_64-unknown-linux-gnu" -; CHECK-LABEL: @no_promote_avx2(<4 x i64>* %arg, <4 x i64>* readonly %arg1) define internal fastcc void @no_promote_avx2(<4 x i64>* %arg, <4 x i64>* readonly %arg1) #0 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@no_promote_avx2 +; ARGPROMOTION-SAME: (<4 x i64>* [[ARG:%.*]], <4 x i64>* readonly [[ARG1:%.*]]) +; ARGPROMOTION-NEXT: bb: +; ARGPROMOTION-NEXT: [[TMP:%.*]] = load <4 x i64>, <4 x i64>* [[ARG1:%.*]] +; ARGPROMOTION-NEXT: store <4 x i64> [[TMP]], <4 x i64>* [[ARG:%.*]] +; ARGPROMOTION-NEXT: ret void +; bb: %tmp = load <4 x i64>, <4 x i64>* %arg1 store <4 x i64> %tmp, <4 x i64>* %arg @@ -14,6 +21,18 @@ } define void @no_promote(<4 x i64>* %arg) #1 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@no_promote +; ARGPROMOTION-SAME: (<4 x i64>* [[ARG:%.*]]) +; ARGPROMOTION-NEXT: bb: +; ARGPROMOTION-NEXT: [[TMP:%.*]] = alloca <4 x i64>, align 32 +; ARGPROMOTION-NEXT: [[TMP2:%.*]] = alloca <4 x i64>, align 32 +; ARGPROMOTION-NEXT: [[TMP3:%.*]] = bitcast <4 x i64>* [[TMP]] to i8* +; ARGPROMOTION-NEXT: call void @llvm.memset.p0i8.i64(i8* align 32 [[TMP3]], i8 0, i64 32, i1 false) +; ARGPROMOTION-NEXT: call fastcc void @no_promote_avx2(<4 x i64>* [[TMP2]], <4 x i64>* [[TMP]]) +; ARGPROMOTION-NEXT: [[TMP4:%.*]] = load <4 x i64>, <4 x i64>* [[TMP2]], align 32 +; ARGPROMOTION-NEXT: store <4 x i64> [[TMP4]], <4 x i64>* [[ARG:%.*]], align 2 +; ARGPROMOTION-NEXT: ret void +; bb: %tmp = alloca <4 x i64>, align 32 %tmp2 = alloca <4 x i64>, align 32 @@ -25,8 +44,13 @@ ret void } -; CHECK-LABEL: @promote_avx2(<4 x i64>* %arg, <4 x i64> % define internal fastcc void @promote_avx2(<4 x i64>* %arg, <4 x i64>* readonly %arg1) #0 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@promote_avx2 +; ARGPROMOTION-SAME: (<4 x i64>* [[ARG:%.*]], <4 x i64> [[ARG1_VAL:%.*]]) +; ARGPROMOTION-NEXT: bb: +; ARGPROMOTION-NEXT: store <4 x i64> [[ARG1_VAL:%.*]], <4 x i64>* [[ARG:%.*]] +; ARGPROMOTION-NEXT: ret void +; bb: %tmp = load <4 x i64>, <4 x i64>* %arg1 store <4 x i64> %tmp, <4 x i64>* %arg @@ -34,6 +58,19 @@ } define void @promote(<4 x i64>* %arg) #0 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@promote +; ARGPROMOTION-SAME: (<4 x i64>* [[ARG:%.*]]) +; ARGPROMOTION-NEXT: bb: +; ARGPROMOTION-NEXT: [[TMP:%.*]] = alloca <4 x i64>, align 32 +; ARGPROMOTION-NEXT: [[TMP2:%.*]] = alloca <4 x i64>, align 32 +; ARGPROMOTION-NEXT: [[TMP3:%.*]] = bitcast <4 x i64>* [[TMP]] to i8* +; ARGPROMOTION-NEXT: call void @llvm.memset.p0i8.i64(i8* align 32 [[TMP3]], i8 0, i64 32, i1 false) +; ARGPROMOTION-NEXT: [[TMP_VAL:%.*]] = load <4 x i64>, <4 x i64>* [[TMP]] +; ARGPROMOTION-NEXT: call fastcc void @promote_avx2(<4 x i64>* [[TMP2]], <4 x i64> [[TMP_VAL]]) +; ARGPROMOTION-NEXT: [[TMP4:%.*]] = load <4 x i64>, <4 x i64>* [[TMP2]], align 32 +; ARGPROMOTION-NEXT: store <4 x i64> [[TMP4]], <4 x i64>* [[ARG:%.*]], align 2 +; ARGPROMOTION-NEXT: ret void +; bb: %tmp = alloca <4 x i64>, align 32 %tmp2 = alloca <4 x i64>, align 32 diff --git a/llvm/test/Transforms/ArgumentPromotion/X86/min-legal-vector-width.ll b/llvm/test/Transforms/ArgumentPromotion/X86/min-legal-vector-width.ll --- a/llvm/test/Transforms/ArgumentPromotion/X86/min-legal-vector-width.ll +++ b/llvm/test/Transforms/ArgumentPromotion/X86/min-legal-vector-width.ll @@ -1,13 +1,19 @@ -; RUN: opt -S -argpromotion < %s | FileCheck %s -; RUN: opt -S -passes=argpromotion < %s | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt -S -argpromotion < %s | FileCheck %s --check-prefixes=ARGPROMOTION,ALL +; RUN: opt -S -passes=argpromotion < %s | FileCheck %s --check-prefixes=ARGPROMOTION,ALL ; Test that we only promote arguments when the caller/callee have compatible ; function attrubtes. target triple = "x86_64-unknown-linux-gnu" ; This should promote -; CHECK-LABEL: @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer512(<8 x i64>* %arg, <8 x i64> %arg1.val) define internal fastcc void @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer512(<8 x i64>* %arg, <8 x i64>* readonly %arg1) #0 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer512_call_avx512_legal512_prefer512 +; ARGPROMOTION-SAME: (<8 x i64>* [[ARG:%.*]], <8 x i64> [[ARG1_VAL:%.*]]) +; ARGPROMOTION-NEXT: bb: +; ARGPROMOTION-NEXT: store <8 x i64> [[ARG1_VAL:%.*]], <8 x i64>* [[ARG:%.*]] +; ARGPROMOTION-NEXT: ret void +; bb: %tmp = load <8 x i64>, <8 x i64>* %arg1 store <8 x i64> %tmp, <8 x i64>* %arg @@ -15,6 +21,19 @@ } define void @avx512_legal512_prefer512_call_avx512_legal512_prefer512(<8 x i64>* %arg) #0 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@avx512_legal512_prefer512_call_avx512_legal512_prefer512 +; ARGPROMOTION-SAME: (<8 x i64>* [[ARG:%.*]]) +; ARGPROMOTION-NEXT: bb: +; ARGPROMOTION-NEXT: [[TMP:%.*]] = alloca <8 x i64>, align 32 +; ARGPROMOTION-NEXT: [[TMP2:%.*]] = alloca <8 x i64>, align 32 +; ARGPROMOTION-NEXT: [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8* +; ARGPROMOTION-NEXT: call void @llvm.memset.p0i8.i64(i8* align 32 [[TMP3]], i8 0, i64 32, i1 false) +; ARGPROMOTION-NEXT: [[TMP_VAL:%.*]] = load <8 x i64>, <8 x i64>* [[TMP]] +; ARGPROMOTION-NEXT: call fastcc void @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer512(<8 x i64>* [[TMP2]], <8 x i64> [[TMP_VAL]]) +; ARGPROMOTION-NEXT: [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 32 +; ARGPROMOTION-NEXT: store <8 x i64> [[TMP4]], <8 x i64>* [[ARG:%.*]], align 2 +; ARGPROMOTION-NEXT: ret void +; bb: %tmp = alloca <8 x i64>, align 32 %tmp2 = alloca <8 x i64>, align 32 @@ -27,8 +46,13 @@ } ; This should promote -; CHECK-LABEL: @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer256(<8 x i64>* %arg, <8 x i64> %arg1.val) define internal fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer256(<8 x i64>* %arg, <8 x i64>* readonly %arg1) #1 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer256_call_avx512_legal512_prefer256 +; ARGPROMOTION-SAME: (<8 x i64>* [[ARG:%.*]], <8 x i64> [[ARG1_VAL:%.*]]) +; ARGPROMOTION-NEXT: bb: +; ARGPROMOTION-NEXT: store <8 x i64> [[ARG1_VAL:%.*]], <8 x i64>* [[ARG:%.*]] +; ARGPROMOTION-NEXT: ret void +; bb: %tmp = load <8 x i64>, <8 x i64>* %arg1 store <8 x i64> %tmp, <8 x i64>* %arg @@ -36,6 +60,19 @@ } define void @avx512_legal512_prefer256_call_avx512_legal512_prefer256(<8 x i64>* %arg) #1 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@avx512_legal512_prefer256_call_avx512_legal512_prefer256 +; ARGPROMOTION-SAME: (<8 x i64>* [[ARG:%.*]]) +; ARGPROMOTION-NEXT: bb: +; ARGPROMOTION-NEXT: [[TMP:%.*]] = alloca <8 x i64>, align 32 +; ARGPROMOTION-NEXT: [[TMP2:%.*]] = alloca <8 x i64>, align 32 +; ARGPROMOTION-NEXT: [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8* +; ARGPROMOTION-NEXT: call void @llvm.memset.p0i8.i64(i8* align 32 [[TMP3]], i8 0, i64 32, i1 false) +; ARGPROMOTION-NEXT: [[TMP_VAL:%.*]] = load <8 x i64>, <8 x i64>* [[TMP]] +; ARGPROMOTION-NEXT: call fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer256(<8 x i64>* [[TMP2]], <8 x i64> [[TMP_VAL]]) +; ARGPROMOTION-NEXT: [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 32 +; ARGPROMOTION-NEXT: store <8 x i64> [[TMP4]], <8 x i64>* [[ARG:%.*]], align 2 +; ARGPROMOTION-NEXT: ret void +; bb: %tmp = alloca <8 x i64>, align 32 %tmp2 = alloca <8 x i64>, align 32 @@ -48,8 +85,13 @@ } ; This should promote -; CHECK-LABEL: @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer256(<8 x i64>* %arg, <8 x i64> %arg1.val) define internal fastcc void @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer256(<8 x i64>* %arg, <8 x i64>* readonly %arg1) #1 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer512_call_avx512_legal512_prefer256 +; ARGPROMOTION-SAME: (<8 x i64>* [[ARG:%.*]], <8 x i64> [[ARG1_VAL:%.*]]) +; ARGPROMOTION-NEXT: bb: +; ARGPROMOTION-NEXT: store <8 x i64> [[ARG1_VAL:%.*]], <8 x i64>* [[ARG:%.*]] +; ARGPROMOTION-NEXT: ret void +; bb: %tmp = load <8 x i64>, <8 x i64>* %arg1 store <8 x i64> %tmp, <8 x i64>* %arg @@ -57,6 +99,19 @@ } define void @avx512_legal512_prefer512_call_avx512_legal512_prefer256(<8 x i64>* %arg) #0 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@avx512_legal512_prefer512_call_avx512_legal512_prefer256 +; ARGPROMOTION-SAME: (<8 x i64>* [[ARG:%.*]]) +; ARGPROMOTION-NEXT: bb: +; ARGPROMOTION-NEXT: [[TMP:%.*]] = alloca <8 x i64>, align 32 +; ARGPROMOTION-NEXT: [[TMP2:%.*]] = alloca <8 x i64>, align 32 +; ARGPROMOTION-NEXT: [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8* +; ARGPROMOTION-NEXT: call void @llvm.memset.p0i8.i64(i8* align 32 [[TMP3]], i8 0, i64 32, i1 false) +; ARGPROMOTION-NEXT: [[TMP_VAL:%.*]] = load <8 x i64>, <8 x i64>* [[TMP]] +; ARGPROMOTION-NEXT: call fastcc void @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer256(<8 x i64>* [[TMP2]], <8 x i64> [[TMP_VAL]]) +; ARGPROMOTION-NEXT: [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 32 +; ARGPROMOTION-NEXT: store <8 x i64> [[TMP4]], <8 x i64>* [[ARG:%.*]], align 2 +; ARGPROMOTION-NEXT: ret void +; bb: %tmp = alloca <8 x i64>, align 32 %tmp2 = alloca <8 x i64>, align 32 @@ -69,8 +124,13 @@ } ; This should promote -; CHECK-LABEL: @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer512(<8 x i64>* %arg, <8 x i64> %arg1.val) define internal fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer512(<8 x i64>* %arg, <8 x i64>* readonly %arg1) #0 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer256_call_avx512_legal512_prefer512 +; ARGPROMOTION-SAME: (<8 x i64>* [[ARG:%.*]], <8 x i64> [[ARG1_VAL:%.*]]) +; ARGPROMOTION-NEXT: bb: +; ARGPROMOTION-NEXT: store <8 x i64> [[ARG1_VAL:%.*]], <8 x i64>* [[ARG:%.*]] +; ARGPROMOTION-NEXT: ret void +; bb: %tmp = load <8 x i64>, <8 x i64>* %arg1 store <8 x i64> %tmp, <8 x i64>* %arg @@ -78,6 +138,19 @@ } define void @avx512_legal512_prefer256_call_avx512_legal512_prefer512(<8 x i64>* %arg) #1 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@avx512_legal512_prefer256_call_avx512_legal512_prefer512 +; ARGPROMOTION-SAME: (<8 x i64>* [[ARG:%.*]]) +; ARGPROMOTION-NEXT: bb: +; ARGPROMOTION-NEXT: [[TMP:%.*]] = alloca <8 x i64>, align 32 +; ARGPROMOTION-NEXT: [[TMP2:%.*]] = alloca <8 x i64>, align 32 +; ARGPROMOTION-NEXT: [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8* +; ARGPROMOTION-NEXT: call void @llvm.memset.p0i8.i64(i8* align 32 [[TMP3]], i8 0, i64 32, i1 false) +; ARGPROMOTION-NEXT: [[TMP_VAL:%.*]] = load <8 x i64>, <8 x i64>* [[TMP]] +; ARGPROMOTION-NEXT: call fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer512(<8 x i64>* [[TMP2]], <8 x i64> [[TMP_VAL]]) +; ARGPROMOTION-NEXT: [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 32 +; ARGPROMOTION-NEXT: store <8 x i64> [[TMP4]], <8 x i64>* [[ARG:%.*]], align 2 +; ARGPROMOTION-NEXT: ret void +; bb: %tmp = alloca <8 x i64>, align 32 %tmp2 = alloca <8 x i64>, align 32 @@ -90,8 +163,14 @@ } ; This should not promote -; CHECK-LABEL: @callee_avx512_legal256_prefer256_call_avx512_legal512_prefer256(<8 x i64>* %arg, <8 x i64>* readonly %arg1) define internal fastcc void @callee_avx512_legal256_prefer256_call_avx512_legal512_prefer256(<8 x i64>* %arg, <8 x i64>* readonly %arg1) #1 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@callee_avx512_legal256_prefer256_call_avx512_legal512_prefer256 +; ARGPROMOTION-SAME: (<8 x i64>* [[ARG:%.*]], <8 x i64>* readonly [[ARG1:%.*]]) +; ARGPROMOTION-NEXT: bb: +; ARGPROMOTION-NEXT: [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1:%.*]] +; ARGPROMOTION-NEXT: store <8 x i64> [[TMP]], <8 x i64>* [[ARG:%.*]] +; ARGPROMOTION-NEXT: ret void +; bb: %tmp = load <8 x i64>, <8 x i64>* %arg1 store <8 x i64> %tmp, <8 x i64>* %arg @@ -99,6 +178,18 @@ } define void @avx512_legal256_prefer256_call_avx512_legal512_prefer256(<8 x i64>* %arg) #2 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@avx512_legal256_prefer256_call_avx512_legal512_prefer256 +; ARGPROMOTION-SAME: (<8 x i64>* [[ARG:%.*]]) +; ARGPROMOTION-NEXT: bb: +; ARGPROMOTION-NEXT: [[TMP:%.*]] = alloca <8 x i64>, align 32 +; ARGPROMOTION-NEXT: [[TMP2:%.*]] = alloca <8 x i64>, align 32 +; ARGPROMOTION-NEXT: [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8* +; ARGPROMOTION-NEXT: call void @llvm.memset.p0i8.i64(i8* align 32 [[TMP3]], i8 0, i64 32, i1 false) +; ARGPROMOTION-NEXT: call fastcc void @callee_avx512_legal256_prefer256_call_avx512_legal512_prefer256(<8 x i64>* [[TMP2]], <8 x i64>* [[TMP]]) +; ARGPROMOTION-NEXT: [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 32 +; ARGPROMOTION-NEXT: store <8 x i64> [[TMP4]], <8 x i64>* [[ARG:%.*]], align 2 +; ARGPROMOTION-NEXT: ret void +; bb: %tmp = alloca <8 x i64>, align 32 %tmp2 = alloca <8 x i64>, align 32 @@ -111,8 +202,14 @@ } ; This should not promote -; CHECK-LABEL: @callee_avx512_legal512_prefer256_call_avx512_legal256_prefer256(<8 x i64>* %arg, <8 x i64>* readonly %arg1) define internal fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal256_prefer256(<8 x i64>* %arg, <8 x i64>* readonly %arg1) #2 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer256_call_avx512_legal256_prefer256 +; ARGPROMOTION-SAME: (<8 x i64>* [[ARG:%.*]], <8 x i64>* readonly [[ARG1:%.*]]) +; ARGPROMOTION-NEXT: bb: +; ARGPROMOTION-NEXT: [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1:%.*]] +; ARGPROMOTION-NEXT: store <8 x i64> [[TMP]], <8 x i64>* [[ARG:%.*]] +; ARGPROMOTION-NEXT: ret void +; bb: %tmp = load <8 x i64>, <8 x i64>* %arg1 store <8 x i64> %tmp, <8 x i64>* %arg @@ -120,6 +217,18 @@ } define void @avx512_legal512_prefer256_call_avx512_legal256_prefer256(<8 x i64>* %arg) #1 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@avx512_legal512_prefer256_call_avx512_legal256_prefer256 +; ARGPROMOTION-SAME: (<8 x i64>* [[ARG:%.*]]) +; ARGPROMOTION-NEXT: bb: +; ARGPROMOTION-NEXT: [[TMP:%.*]] = alloca <8 x i64>, align 32 +; ARGPROMOTION-NEXT: [[TMP2:%.*]] = alloca <8 x i64>, align 32 +; ARGPROMOTION-NEXT: [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8* +; ARGPROMOTION-NEXT: call void @llvm.memset.p0i8.i64(i8* align 32 [[TMP3]], i8 0, i64 32, i1 false) +; ARGPROMOTION-NEXT: call fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal256_prefer256(<8 x i64>* [[TMP2]], <8 x i64>* [[TMP]]) +; ARGPROMOTION-NEXT: [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 32 +; ARGPROMOTION-NEXT: store <8 x i64> [[TMP4]], <8 x i64>* [[ARG:%.*]], align 2 +; ARGPROMOTION-NEXT: ret void +; bb: %tmp = alloca <8 x i64>, align 32 %tmp2 = alloca <8 x i64>, align 32 @@ -132,8 +241,13 @@ } ; This should promote -; CHECK-LABEL: @callee_avx2_legal256_prefer256_call_avx2_legal512_prefer256(<8 x i64>* %arg, <8 x i64> %arg1.val) define internal fastcc void @callee_avx2_legal256_prefer256_call_avx2_legal512_prefer256(<8 x i64>* %arg, <8 x i64>* readonly %arg1) #3 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@callee_avx2_legal256_prefer256_call_avx2_legal512_prefer256 +; ARGPROMOTION-SAME: (<8 x i64>* [[ARG:%.*]], <8 x i64> [[ARG1_VAL:%.*]]) +; ARGPROMOTION-NEXT: bb: +; ARGPROMOTION-NEXT: store <8 x i64> [[ARG1_VAL:%.*]], <8 x i64>* [[ARG:%.*]] +; ARGPROMOTION-NEXT: ret void +; bb: %tmp = load <8 x i64>, <8 x i64>* %arg1 store <8 x i64> %tmp, <8 x i64>* %arg @@ -141,6 +255,19 @@ } define void @avx2_legal256_prefer256_call_avx2_legal512_prefer256(<8 x i64>* %arg) #4 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@avx2_legal256_prefer256_call_avx2_legal512_prefer256 +; ARGPROMOTION-SAME: (<8 x i64>* [[ARG:%.*]]) +; ARGPROMOTION-NEXT: bb: +; ARGPROMOTION-NEXT: [[TMP:%.*]] = alloca <8 x i64>, align 32 +; ARGPROMOTION-NEXT: [[TMP2:%.*]] = alloca <8 x i64>, align 32 +; ARGPROMOTION-NEXT: [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8* +; ARGPROMOTION-NEXT: call void @llvm.memset.p0i8.i64(i8* align 32 [[TMP3]], i8 0, i64 32, i1 false) +; ARGPROMOTION-NEXT: [[TMP_VAL:%.*]] = load <8 x i64>, <8 x i64>* [[TMP]] +; ARGPROMOTION-NEXT: call fastcc void @callee_avx2_legal256_prefer256_call_avx2_legal512_prefer256(<8 x i64>* [[TMP2]], <8 x i64> [[TMP_VAL]]) +; ARGPROMOTION-NEXT: [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 32 +; ARGPROMOTION-NEXT: store <8 x i64> [[TMP4]], <8 x i64>* [[ARG:%.*]], align 2 +; ARGPROMOTION-NEXT: ret void +; bb: %tmp = alloca <8 x i64>, align 32 %tmp2 = alloca <8 x i64>, align 32 @@ -153,8 +280,13 @@ } ; This should promote -; CHECK-LABEL: @callee_avx2_legal512_prefer256_call_avx2_legal256_prefer256(<8 x i64>* %arg, <8 x i64> %arg1.val) define internal fastcc void @callee_avx2_legal512_prefer256_call_avx2_legal256_prefer256(<8 x i64>* %arg, <8 x i64>* readonly %arg1) #4 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@callee_avx2_legal512_prefer256_call_avx2_legal256_prefer256 +; ARGPROMOTION-SAME: (<8 x i64>* [[ARG:%.*]], <8 x i64> [[ARG1_VAL:%.*]]) +; ARGPROMOTION-NEXT: bb: +; ARGPROMOTION-NEXT: store <8 x i64> [[ARG1_VAL:%.*]], <8 x i64>* [[ARG:%.*]] +; ARGPROMOTION-NEXT: ret void +; bb: %tmp = load <8 x i64>, <8 x i64>* %arg1 store <8 x i64> %tmp, <8 x i64>* %arg @@ -162,6 +294,19 @@ } define void @avx2_legal512_prefer256_call_avx2_legal256_prefer256(<8 x i64>* %arg) #3 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@avx2_legal512_prefer256_call_avx2_legal256_prefer256 +; ARGPROMOTION-SAME: (<8 x i64>* [[ARG:%.*]]) +; ARGPROMOTION-NEXT: bb: +; ARGPROMOTION-NEXT: [[TMP:%.*]] = alloca <8 x i64>, align 32 +; ARGPROMOTION-NEXT: [[TMP2:%.*]] = alloca <8 x i64>, align 32 +; ARGPROMOTION-NEXT: [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8* +; ARGPROMOTION-NEXT: call void @llvm.memset.p0i8.i64(i8* align 32 [[TMP3]], i8 0, i64 32, i1 false) +; ARGPROMOTION-NEXT: [[TMP_VAL:%.*]] = load <8 x i64>, <8 x i64>* [[TMP]] +; ARGPROMOTION-NEXT: call fastcc void @callee_avx2_legal512_prefer256_call_avx2_legal256_prefer256(<8 x i64>* [[TMP2]], <8 x i64> [[TMP_VAL]]) +; ARGPROMOTION-NEXT: [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 32 +; ARGPROMOTION-NEXT: store <8 x i64> [[TMP4]], <8 x i64>* [[ARG:%.*]], align 2 +; ARGPROMOTION-NEXT: ret void +; bb: %tmp = alloca <8 x i64>, align 32 %tmp2 = alloca <8 x i64>, align 32 diff --git a/llvm/test/Transforms/ArgumentPromotion/X86/thiscall.ll b/llvm/test/Transforms/ArgumentPromotion/X86/thiscall.ll --- a/llvm/test/Transforms/ArgumentPromotion/X86/thiscall.ll +++ b/llvm/test/Transforms/ArgumentPromotion/X86/thiscall.ll @@ -1,12 +1,11 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes ; In PR41658, argpromotion put an inalloca in a position that per the ; calling convention is passed in a register. This test verifies that ; we don't do that anymore. It also verifies that the combination of ; globalopt and argpromotion is able to optimize the call safely. ; -; RUN: opt -S -argpromotion %s | FileCheck --check-prefix=THIS %s -; RUN: opt -S -globalopt -argpromotion %s | FileCheck --check-prefix=OPT %s -; THIS: define internal x86_thiscallcc void @internalfun(%struct.a* %this, <{ %struct.a -; OPT: define internal fastcc void @internalfun(<{ %struct.a }>* %0) +; RUN: opt -S -argpromotion %s | FileCheck %s --check-prefixes=ARGPROMOTION,ALL +; RUN: opt -S -globalopt -argpromotion %s | FileCheck %s --check-prefixes=GLOBALOPT_ARGPROMOTION,ALL target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32" target triple = "i386-pc-windows-msvc19.11.0" @@ -14,6 +13,26 @@ %struct.a = type { i8 } define internal x86_thiscallcc void @internalfun(%struct.a* %this, <{ %struct.a }>* inalloca) { +; ARGPROMOTION-LABEL: define {{[^@]+}}@internalfun +; ARGPROMOTION-SAME: (%struct.a* [[THIS:%.*]], <{ [[STRUCT_A:%.*]] }>* inalloca [[TMP0:%.*]]) +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[A:%.*]] = getelementptr inbounds <{ [[STRUCT_A:%.*]] }>, <{ [[STRUCT_A]] }>* [[TMP0:%.*]], i32 0, i32 0 +; ARGPROMOTION-NEXT: [[ARGMEM:%.*]] = alloca inalloca <{ [[STRUCT_A]] }>, align 4 +; ARGPROMOTION-NEXT: [[TMP1:%.*]] = getelementptr inbounds <{ [[STRUCT_A]] }>, <{ [[STRUCT_A]] }>* [[ARGMEM]], i32 0, i32 0 +; ARGPROMOTION-NEXT: [[CALL:%.*]] = call x86_thiscallcc %struct.a* @copy_ctor(%struct.a* [[TMP1]], %struct.a* dereferenceable(1) [[A]]) +; ARGPROMOTION-NEXT: call void @ext(<{ [[STRUCT_A]] }>* inalloca [[ARGMEM]]) +; ARGPROMOTION-NEXT: ret void +; +; GLOBALOPT_ARGPROMOTION-LABEL: define {{[^@]+}}@internalfun +; GLOBALOPT_ARGPROMOTION-SAME: (<{ [[STRUCT_A:%.*]] }>* [[TMP0:%.*]]) unnamed_addr +; GLOBALOPT_ARGPROMOTION-NEXT: entry: +; GLOBALOPT_ARGPROMOTION-NEXT: [[A:%.*]] = getelementptr inbounds <{ [[STRUCT_A:%.*]] }>, <{ [[STRUCT_A]] }>* [[TMP0:%.*]], i32 0, i32 0 +; GLOBALOPT_ARGPROMOTION-NEXT: [[ARGMEM:%.*]] = alloca inalloca <{ [[STRUCT_A]] }>, align 4 +; GLOBALOPT_ARGPROMOTION-NEXT: [[TMP1:%.*]] = getelementptr inbounds <{ [[STRUCT_A]] }>, <{ [[STRUCT_A]] }>* [[ARGMEM]], i32 0, i32 0 +; GLOBALOPT_ARGPROMOTION-NEXT: [[CALL:%.*]] = call x86_thiscallcc %struct.a* @copy_ctor(%struct.a* [[TMP1]], %struct.a* dereferenceable(1) [[A]]) +; GLOBALOPT_ARGPROMOTION-NEXT: call void @ext(<{ [[STRUCT_A]] }>* inalloca [[ARGMEM]]) +; GLOBALOPT_ARGPROMOTION-NEXT: ret void +; entry: %a = getelementptr inbounds <{ %struct.a }>, <{ %struct.a }>* %0, i32 0, i32 0 %argmem = alloca inalloca <{ %struct.a }>, align 4 @@ -25,6 +44,22 @@ ; This is here to ensure @internalfun is live. define void @exportedfun(%struct.a* %a) { +; ARGPROMOTION-LABEL: define {{[^@]+}}@exportedfun +; ARGPROMOTION-SAME: (%struct.a* [[A:%.*]]) +; ARGPROMOTION-NEXT: [[INALLOCA_SAVE:%.*]] = tail call i8* @llvm.stacksave() +; ARGPROMOTION-NEXT: [[ARGMEM:%.*]] = alloca inalloca <{ [[STRUCT_A:%.*]] }>, align 4 +; ARGPROMOTION-NEXT: call x86_thiscallcc void @internalfun(%struct.a* [[A:%.*]], <{ [[STRUCT_A]] }>* inalloca [[ARGMEM]]) +; ARGPROMOTION-NEXT: call void @llvm.stackrestore(i8* [[INALLOCA_SAVE]]) +; ARGPROMOTION-NEXT: ret void +; +; GLOBALOPT_ARGPROMOTION-LABEL: define {{[^@]+}}@exportedfun +; GLOBALOPT_ARGPROMOTION-SAME: (%struct.a* [[A:%.*]]) local_unnamed_addr +; GLOBALOPT_ARGPROMOTION-NEXT: [[INALLOCA_SAVE:%.*]] = tail call i8* @llvm.stacksave() +; GLOBALOPT_ARGPROMOTION-NEXT: [[ARGMEM:%.*]] = alloca inalloca <{ [[STRUCT_A:%.*]] }>, align 4 +; GLOBALOPT_ARGPROMOTION-NEXT: call fastcc void @internalfun(<{ [[STRUCT_A]] }>* [[ARGMEM]]) +; GLOBALOPT_ARGPROMOTION-NEXT: call void @llvm.stackrestore(i8* [[INALLOCA_SAVE]]) +; GLOBALOPT_ARGPROMOTION-NEXT: ret void +; %inalloca.save = tail call i8* @llvm.stacksave() %argmem = alloca inalloca <{ %struct.a }>, align 4 call x86_thiscallcc void @internalfun(%struct.a* %a, <{ %struct.a }>* inalloca %argmem) diff --git a/llvm/test/Transforms/ArgumentPromotion/aggregate-promote.ll b/llvm/test/Transforms/ArgumentPromotion/aggregate-promote.ll --- a/llvm/test/Transforms/ArgumentPromotion/aggregate-promote.ll +++ b/llvm/test/Transforms/ArgumentPromotion/aggregate-promote.ll @@ -1,31 +1,37 @@ -; RUN: opt < %s -argpromotion -S | FileCheck %s -; RUN: opt < %s -passes=argpromotion -S | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt < %s -argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL +; RUN: opt < %s -passes=argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL %T = type { i32, i32, i32, i32 } @G = constant %T { i32 0, i32 0, i32 17, i32 25 } define internal i32 @test(%T* %p) { -; CHECK-LABEL: define internal i32 @test( -; CHECK: i32 %{{.*}}, i32 %{{.*}}) +; ARGPROMOTION-LABEL: define {{[^@]+}}@test +; ARGPROMOTION-SAME: (i32 [[P_0_2_VAL:%.*]], i32 [[P_0_3_VAL:%.*]]) +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[V:%.*]] = add i32 [[P_0_3_VAL:%.*]], [[P_0_2_VAL:%.*]] +; ARGPROMOTION-NEXT: ret i32 [[V]] +; entry: %a.gep = getelementptr %T, %T* %p, i64 0, i32 3 %b.gep = getelementptr %T, %T* %p, i64 0, i32 2 %a = load i32, i32* %a.gep %b = load i32, i32* %b.gep -; CHECK-NOT: load %v = add i32 %a, %b ret i32 %v -; CHECK: ret i32 } define i32 @caller() { -; CHECK-LABEL: define i32 @caller( +; ARGPROMOTION-LABEL: define {{[^@]+}}@caller() +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[G_IDX:%.*]] = getelementptr [[T:%.*]], %T* @G, i64 0, i32 2 +; ARGPROMOTION-NEXT: [[G_IDX_VAL:%.*]] = load i32, i32* [[G_IDX]] +; ARGPROMOTION-NEXT: [[G_IDX1:%.*]] = getelementptr [[T]], %T* @G, i64 0, i32 3 +; ARGPROMOTION-NEXT: [[G_IDX1_VAL:%.*]] = load i32, i32* [[G_IDX1]] +; ARGPROMOTION-NEXT: [[V:%.*]] = call i32 @test(i32 [[G_IDX_VAL]], i32 [[G_IDX1_VAL]]) +; ARGPROMOTION-NEXT: ret i32 [[V]] +; entry: %v = call i32 @test(%T* @G) -; CHECK: %[[B_GEP:.*]] = getelementptr %T, %T* @G, i64 0, i32 2 -; CHECK: %[[B:.*]] = load i32, i32* %[[B_GEP]] -; CHECK: %[[A_GEP:.*]] = getelementptr %T, %T* @G, i64 0, i32 3 -; CHECK: %[[A:.*]] = load i32, i32* %[[A_GEP]] -; CHECK: call i32 @test(i32 %[[B]], i32 %[[A]]) ret i32 %v } diff --git a/llvm/test/Transforms/ArgumentPromotion/attrs.ll b/llvm/test/Transforms/ArgumentPromotion/attrs.ll --- a/llvm/test/Transforms/ArgumentPromotion/attrs.ll +++ b/llvm/test/Transforms/ArgumentPromotion/attrs.ll @@ -1,52 +1,62 @@ -; RUN: opt < %s -argpromotion -S | FileCheck %s -; RUN: opt < %s -passes=argpromotion -S | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt < %s -argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL +; RUN: opt < %s -passes=argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL %struct.ss = type { i32, i64 } ; Don't drop 'byval' on %X here. define internal void @f(%struct.ss* byval %b, i32* byval %X, i32 %i) nounwind { -; CHECK-LABEL: define internal void @f( -; CHECK: i32 %[[B0:.*]], i64 %[[B1:.*]], i32* byval %X, i32 %i) +; ARGPROMOTION-LABEL: define {{[^@]+}}@f +; ARGPROMOTION-SAME: (i32 [[B_0:%.*]], i64 [[B_1:%.*]], i32* byval [[X:%.*]], i32 [[I:%.*]]) +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[B:%.*]] = alloca [[STRUCT_SS:%.*]] +; ARGPROMOTION-NEXT: [[DOT0:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B]], i32 0, i32 0 +; ARGPROMOTION-NEXT: store i32 [[B_0:%.*]], i32* [[DOT0]] +; ARGPROMOTION-NEXT: [[DOT1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B]], i32 0, i32 1 +; ARGPROMOTION-NEXT: store i64 [[B_1:%.*]], i64* [[DOT1]] +; ARGPROMOTION-NEXT: [[TMP:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B]], i32 0, i32 0 +; ARGPROMOTION-NEXT: [[TMP1:%.*]] = load i32, i32* [[TMP]], align 4 +; ARGPROMOTION-NEXT: [[TMP2:%.*]] = add i32 [[TMP1]], 1 +; ARGPROMOTION-NEXT: store i32 [[TMP2]], i32* [[TMP]], align 4 +; ARGPROMOTION-NEXT: store i32 0, i32* [[X:%.*]] +; ARGPROMOTION-NEXT: ret void +; entry: -; CHECK: %[[B:.*]] = alloca %struct.ss -; CHECK: %[[B_GEP0:.*]] = getelementptr %struct.ss, %struct.ss* %[[B]], i32 0, i32 0 -; CHECK: store i32 %[[B0]], i32* %[[B_GEP0]] -; CHECK: %[[B_GEP1:.*]] = getelementptr %struct.ss, %struct.ss* %[[B]], i32 0, i32 1 -; CHECK: store i64 %[[B1]], i64* %[[B_GEP1]] %tmp = getelementptr %struct.ss, %struct.ss* %b, i32 0, i32 0 -; CHECK: %[[TMP:.*]] = getelementptr %struct.ss, %struct.ss* %[[B]], i32 0, i32 0 %tmp1 = load i32, i32* %tmp, align 4 -; CHECK: %[[TMP1:.*]] = load i32, i32* %[[TMP]] %tmp2 = add i32 %tmp1, 1 -; CHECK: %[[TMP2:.*]] = add i32 %[[TMP1]], 1 store i32 %tmp2, i32* %tmp, align 4 -; CHECK: store i32 %[[TMP2]], i32* %[[TMP]] store i32 0, i32* %X -; CHECK: store i32 0, i32* %X ret void } ; Also make sure we don't drop the call zeroext attribute. define i32 @test(i32* %X) { -; CHECK-LABEL: define i32 @test( +; ARGPROMOTION-LABEL: define {{[^@]+}}@test +; ARGPROMOTION-SAME: (i32* [[X:%.*]]) +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[S:%.*]] = alloca [[STRUCT_SS:%.*]] +; ARGPROMOTION-NEXT: [[TMP1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0 +; ARGPROMOTION-NEXT: store i32 1, i32* [[TMP1]], align 8 +; ARGPROMOTION-NEXT: [[TMP4:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1 +; ARGPROMOTION-NEXT: store i64 2, i64* [[TMP4]], align 4 +; ARGPROMOTION-NEXT: [[S_0:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0 +; ARGPROMOTION-NEXT: [[S_0_VAL:%.*]] = load i32, i32* [[S_0]] +; ARGPROMOTION-NEXT: [[S_1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1 +; ARGPROMOTION-NEXT: [[S_1_VAL:%.*]] = load i64, i64* [[S_1]] +; ARGPROMOTION-NEXT: call void @f(i32 [[S_0_VAL]], i64 [[S_1_VAL]], i32* byval [[X:%.*]], i32 zeroext 0) +; ARGPROMOTION-NEXT: ret i32 0 +; entry: %S = alloca %struct.ss -; CHECK: %[[S:.*]] = alloca %struct.ss %tmp1 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 0 store i32 1, i32* %tmp1, align 8 -; CHECK: store i32 1 %tmp4 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 1 store i64 2, i64* %tmp4, align 4 -; CHECK: store i64 2 call void @f( %struct.ss* byval %S, i32* byval %X, i32 zeroext 0) -; CHECK: %[[S_GEP0:.*]] = getelementptr %struct.ss, %struct.ss* %[[S]], i32 0, i32 0 -; CHECK: %[[S0:.*]] = load i32, i32* %[[S_GEP0]] -; CHECK: %[[S_GEP1:.*]] = getelementptr %struct.ss, %struct.ss* %[[S]], i32 0, i32 1 -; CHECK: %[[S1:.*]] = load i64, i64* %[[S_GEP1]] -; CHECK: call void @f(i32 %[[S0]], i64 %[[S1]], i32* byval %X, i32 zeroext 0) ret i32 0 } diff --git a/llvm/test/Transforms/ArgumentPromotion/basictest.ll b/llvm/test/Transforms/ArgumentPromotion/basictest.ll --- a/llvm/test/Transforms/ArgumentPromotion/basictest.ll +++ b/llvm/test/Transforms/ArgumentPromotion/basictest.ll @@ -1,8 +1,13 @@ -; RUN: opt < %s -basicaa -argpromotion -mem2reg -S | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt < %s -basicaa -argpromotion -mem2reg -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128" define internal i32 @test(i32* %X, i32* %Y) { -; CHECK-LABEL: define internal i32 @test(i32 %X.val, i32 %Y.val) +; ARGPROMOTION-LABEL: define {{[^@]+}}@test +; ARGPROMOTION-SAME: (i32 [[X_VAL:%.*]], i32 [[Y_VAL:%.*]]) +; ARGPROMOTION-NEXT: [[C:%.*]] = add i32 [[X_VAL:%.*]], [[Y_VAL:%.*]] +; ARGPROMOTION-NEXT: ret i32 [[C]] +; %A = load i32, i32* %X %B = load i32, i32* %Y %C = add i32 %A, %B @@ -10,20 +15,25 @@ } define internal i32 @caller(i32* %B) { -; CHECK-LABEL: define internal i32 @caller(i32 %B.val1) +; ARGPROMOTION-LABEL: define {{[^@]+}}@caller +; ARGPROMOTION-SAME: (i32 [[B_VAL1:%.*]]) +; ARGPROMOTION-NEXT: [[C:%.*]] = call i32 @test(i32 1, i32 [[B_VAL1:%.*]]) +; ARGPROMOTION-NEXT: ret i32 [[C]] +; %A = alloca i32 store i32 1, i32* %A %C = call i32 @test(i32* %A, i32* %B) -; CHECK: call i32 @test(i32 1, i32 %B.val1) ret i32 %C } define i32 @callercaller() { -; CHECK-LABEL: define i32 @callercaller() +; ARGPROMOTION-LABEL: define {{[^@]+}}@callercaller() +; ARGPROMOTION-NEXT: [[X:%.*]] = call i32 @caller(i32 2) +; ARGPROMOTION-NEXT: ret i32 [[X]] +; %B = alloca i32 store i32 2, i32* %B %X = call i32 @caller(i32* %B) -; CHECK: call i32 @caller(i32 2) ret i32 %X } diff --git a/llvm/test/Transforms/ArgumentPromotion/byval-2.ll b/llvm/test/Transforms/ArgumentPromotion/byval-2.ll --- a/llvm/test/Transforms/ArgumentPromotion/byval-2.ll +++ b/llvm/test/Transforms/ArgumentPromotion/byval-2.ll @@ -1,5 +1,6 @@ -; RUN: opt < %s -argpromotion -S | FileCheck %s -; RUN: opt < %s -passes=argpromotion -S | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt < %s -argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL +; RUN: opt < %s -passes=argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL ; Arg promotion eliminates the struct argument. ; FIXME: Should it eliminate the i32* argument? @@ -7,7 +8,21 @@ %struct.ss = type { i32, i64 } define internal void @f(%struct.ss* byval %b, i32* byval %X) nounwind { -; CHECK-LABEL: define internal void @f(i32 %b.0, i64 %b.1, i32* byval %X) +; ARGPROMOTION-LABEL: define {{[^@]+}}@f +; ARGPROMOTION-SAME: (i32 [[B_0:%.*]], i64 [[B_1:%.*]], i32* byval [[X:%.*]]) +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[B:%.*]] = alloca [[STRUCT_SS:%.*]] +; ARGPROMOTION-NEXT: [[DOT0:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B]], i32 0, i32 0 +; ARGPROMOTION-NEXT: store i32 [[B_0:%.*]], i32* [[DOT0]] +; ARGPROMOTION-NEXT: [[DOT1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B]], i32 0, i32 1 +; ARGPROMOTION-NEXT: store i64 [[B_1:%.*]], i64* [[DOT1]] +; ARGPROMOTION-NEXT: [[TMP:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B]], i32 0, i32 0 +; ARGPROMOTION-NEXT: [[TMP1:%.*]] = load i32, i32* [[TMP]], align 4 +; ARGPROMOTION-NEXT: [[TMP2:%.*]] = add i32 [[TMP1]], 1 +; ARGPROMOTION-NEXT: store i32 [[TMP2]], i32* [[TMP]], align 4 +; ARGPROMOTION-NEXT: store i32 0, i32* [[X:%.*]] +; ARGPROMOTION-NEXT: ret void +; entry: %tmp = getelementptr %struct.ss, %struct.ss* %b, i32 0, i32 0 %tmp1 = load i32, i32* %tmp, align 4 @@ -19,7 +34,21 @@ } define i32 @test(i32* %X) { -; CHECK-LABEL: define i32 @test +; ARGPROMOTION-LABEL: define {{[^@]+}}@test +; ARGPROMOTION-SAME: (i32* [[X:%.*]]) +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[S:%.*]] = alloca [[STRUCT_SS:%.*]] +; ARGPROMOTION-NEXT: [[TMP1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0 +; ARGPROMOTION-NEXT: store i32 1, i32* [[TMP1]], align 8 +; ARGPROMOTION-NEXT: [[TMP4:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1 +; ARGPROMOTION-NEXT: store i64 2, i64* [[TMP4]], align 4 +; ARGPROMOTION-NEXT: [[S_0:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0 +; ARGPROMOTION-NEXT: [[S_0_VAL:%.*]] = load i32, i32* [[S_0]] +; ARGPROMOTION-NEXT: [[S_1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1 +; ARGPROMOTION-NEXT: [[S_1_VAL:%.*]] = load i64, i64* [[S_1]] +; ARGPROMOTION-NEXT: call void @f(i32 [[S_0_VAL]], i64 [[S_1_VAL]], i32* byval [[X:%.*]]) +; ARGPROMOTION-NEXT: ret i32 0 +; entry: %S = alloca %struct.ss %tmp1 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 0 @@ -27,6 +56,5 @@ %tmp4 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 1 store i64 2, i64* %tmp4, align 4 call void @f( %struct.ss* byval %S, i32* byval %X) -; CHECK: call void @f(i32 %{{.*}}, i64 %{{.*}}, i32* byval %{{.*}}) ret i32 0 } diff --git a/llvm/test/Transforms/ArgumentPromotion/byval.ll b/llvm/test/Transforms/ArgumentPromotion/byval.ll --- a/llvm/test/Transforms/ArgumentPromotion/byval.ll +++ b/llvm/test/Transforms/ArgumentPromotion/byval.ll @@ -1,11 +1,26 @@ -; RUN: opt < %s -argpromotion -S | FileCheck %s -; RUN: opt < %s -passes=argpromotion -S | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt < %s -argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL +; RUN: opt < %s -passes=argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128" %struct.ss = type { i32, i64 } define internal void @f(%struct.ss* byval %b) nounwind { +; ARGPROMOTION-LABEL: define {{[^@]+}}@f +; ARGPROMOTION-SAME: (i32 [[B_0:%.*]], i64 [[B_1:%.*]]) +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[B:%.*]] = alloca [[STRUCT_SS:%.*]] +; ARGPROMOTION-NEXT: [[DOT0:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B]], i32 0, i32 0 +; ARGPROMOTION-NEXT: store i32 [[B_0:%.*]], i32* [[DOT0]] +; ARGPROMOTION-NEXT: [[DOT1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B]], i32 0, i32 1 +; ARGPROMOTION-NEXT: store i64 [[B_1:%.*]], i64* [[DOT1]] +; ARGPROMOTION-NEXT: [[TMP:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B]], i32 0, i32 0 +; ARGPROMOTION-NEXT: [[TMP1:%.*]] = load i32, i32* [[TMP]], align 4 +; ARGPROMOTION-NEXT: [[TMP2:%.*]] = add i32 [[TMP1]], 1 +; ARGPROMOTION-NEXT: store i32 [[TMP2]], i32* [[TMP]], align 4 +; ARGPROMOTION-NEXT: ret void +; entry: %tmp = getelementptr %struct.ss, %struct.ss* %b, i32 0, i32 0 %tmp1 = load i32, i32* %tmp, align 4 @@ -14,12 +29,22 @@ ret void } -; CHECK-LABEL: define internal void @f(i32 %b.0, i64 %b.1) -; CHECK: alloca %struct.ss{{$}} -; CHECK: store i32 %b.0 -; CHECK: store i64 %b.1 define internal void @g(%struct.ss* byval align 32 %b) nounwind { +; ARGPROMOTION-LABEL: define {{[^@]+}}@g +; ARGPROMOTION-SAME: (i32 [[B_0:%.*]], i64 [[B_1:%.*]]) +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[B:%.*]] = alloca [[STRUCT_SS:%.*]], align 32 +; ARGPROMOTION-NEXT: [[DOT0:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B]], i32 0, i32 0 +; ARGPROMOTION-NEXT: store i32 [[B_0:%.*]], i32* [[DOT0]] +; ARGPROMOTION-NEXT: [[DOT1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B]], i32 0, i32 1 +; ARGPROMOTION-NEXT: store i64 [[B_1:%.*]], i64* [[DOT1]] +; ARGPROMOTION-NEXT: [[TMP:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B]], i32 0, i32 0 +; ARGPROMOTION-NEXT: [[TMP1:%.*]] = load i32, i32* [[TMP]], align 4 +; ARGPROMOTION-NEXT: [[TMP2:%.*]] = add i32 [[TMP1]], 1 +; ARGPROMOTION-NEXT: store i32 [[TMP2]], i32* [[TMP]], align 4 +; ARGPROMOTION-NEXT: ret void +; entry: %tmp = getelementptr %struct.ss, %struct.ss* %b, i32 0, i32 0 %tmp1 = load i32, i32* %tmp, align 4 @@ -28,12 +53,27 @@ ret void } -; CHECK-LABEL: define internal void @g(i32 %b.0, i64 %b.1) -; CHECK: alloca %struct.ss, align 32 -; CHECK: store i32 %b.0 -; CHECK: store i64 %b.1 define i32 @main() nounwind { +; ARGPROMOTION-LABEL: define {{[^@]+}}@main() +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[S:%.*]] = alloca [[STRUCT_SS:%.*]] +; ARGPROMOTION-NEXT: [[TMP1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0 +; ARGPROMOTION-NEXT: store i32 1, i32* [[TMP1]], align 8 +; ARGPROMOTION-NEXT: [[TMP4:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1 +; ARGPROMOTION-NEXT: store i64 2, i64* [[TMP4]], align 4 +; ARGPROMOTION-NEXT: [[S_0:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0 +; ARGPROMOTION-NEXT: [[S_0_VAL:%.*]] = load i32, i32* [[S_0]] +; ARGPROMOTION-NEXT: [[S_1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1 +; ARGPROMOTION-NEXT: [[S_1_VAL:%.*]] = load i64, i64* [[S_1]] +; ARGPROMOTION-NEXT: call void @f(i32 [[S_0_VAL]], i64 [[S_1_VAL]]) +; ARGPROMOTION-NEXT: [[S_01:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0 +; ARGPROMOTION-NEXT: [[S_01_VAL:%.*]] = load i32, i32* [[S_01]] +; ARGPROMOTION-NEXT: [[S_12:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1 +; ARGPROMOTION-NEXT: [[S_12_VAL:%.*]] = load i64, i64* [[S_12]] +; ARGPROMOTION-NEXT: call void @g(i32 [[S_01_VAL]], i64 [[S_12_VAL]]) +; ARGPROMOTION-NEXT: ret i32 0 +; entry: %S = alloca %struct.ss %tmp1 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 0 @@ -45,6 +85,4 @@ ret i32 0 } -; CHECK-LABEL: define i32 @main -; CHECK: call void @f(i32 %{{.*}}, i64 %{{.*}}) -; CHECK: call void @g(i32 %{{.*}}, i64 %{{.*}}) + diff --git a/llvm/test/Transforms/ArgumentPromotion/chained.ll b/llvm/test/Transforms/ArgumentPromotion/chained.ll --- a/llvm/test/Transforms/ArgumentPromotion/chained.ll +++ b/llvm/test/Transforms/ArgumentPromotion/chained.ll @@ -1,27 +1,32 @@ -; RUN: opt < %s -argpromotion -S | FileCheck %s -; RUN: opt < %s -passes=argpromotion -S | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt < %s -argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL +; RUN: opt < %s -passes=argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL @G1 = constant i32 0 @G2 = constant i32* @G1 define internal i32 @test(i32** %x) { -; CHECK-LABEL: define internal i32 @test( -; CHECK: i32 %{{.*}}) +; ARGPROMOTION-LABEL: define {{[^@]+}}@test +; ARGPROMOTION-SAME: (i32 [[X_VAL_VAL:%.*]]) +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: ret i32 [[X_VAL_VAL:%.*]] +; entry: %y = load i32*, i32** %x %z = load i32, i32* %y -; CHECK-NOT: load ret i32 %z -; CHECK: ret i32 } define i32 @caller() { -; CHECK-LABEL: define i32 @caller() +; ARGPROMOTION-LABEL: define {{[^@]+}}@caller() +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[G2_VAL:%.*]] = load i32*, i32** @G2 +; ARGPROMOTION-NEXT: [[G2_VAL_VAL:%.*]] = load i32, i32* [[G2_VAL]] +; ARGPROMOTION-NEXT: [[X:%.*]] = call i32 @test(i32 [[G2_VAL_VAL]]) +; ARGPROMOTION-NEXT: ret i32 [[X]] +; entry: %x = call i32 @test(i32** @G2) -; CHECK: %[[Y:.*]] = load i32*, i32** @G2 -; CHECK: %[[Z:.*]] = load i32, i32* %[[Y]] -; CHECK: call i32 @test(i32 %[[Z]]) ret i32 %x } diff --git a/llvm/test/Transforms/ArgumentPromotion/control-flow.ll b/llvm/test/Transforms/ArgumentPromotion/control-flow.ll --- a/llvm/test/Transforms/ArgumentPromotion/control-flow.ll +++ b/llvm/test/Transforms/ArgumentPromotion/control-flow.ll @@ -1,10 +1,19 @@ -; RUN: opt < %s -argpromotion -S | FileCheck %s -; RUN: opt < %s -passes=argpromotion -S | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt < %s -argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL +; RUN: opt < %s -passes=argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL ; Don't promote around control flow. define internal i32 @callee(i1 %C, i32* %P) { -; CHECK-LABEL: define internal i32 @callee( -; CHECK: i1 %C, i32* %P) +; ARGPROMOTION-LABEL: define {{[^@]+}}@callee +; ARGPROMOTION-SAME: (i1 [[C:%.*]], i32* [[P:%.*]]) +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: br i1 [[C:%.*]], label [[T:%.*]], label [[F:%.*]] +; ARGPROMOTION: T: +; ARGPROMOTION-NEXT: ret i32 17 +; ARGPROMOTION: F: +; ARGPROMOTION-NEXT: [[X:%.*]] = load i32, i32* [[P:%.*]] +; ARGPROMOTION-NEXT: ret i32 [[X]] +; entry: br i1 %C, label %T, label %F @@ -17,11 +26,13 @@ } define i32 @foo() { -; CHECK-LABEL: define i32 @foo( +; ARGPROMOTION-LABEL: define {{[^@]+}}@foo() +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[X:%.*]] = call i32 @callee(i1 true, i32* null) +; ARGPROMOTION-NEXT: ret i32 [[X]] +; entry: -; CHECK-NOT: load i32, i32* null %X = call i32 @callee(i1 true, i32* null) -; CHECK: call i32 @callee(i1 true, i32* null) ret i32 %X } diff --git a/llvm/test/Transforms/ArgumentPromotion/control-flow2.ll b/llvm/test/Transforms/ArgumentPromotion/control-flow2.ll --- a/llvm/test/Transforms/ArgumentPromotion/control-flow2.ll +++ b/llvm/test/Transforms/ArgumentPromotion/control-flow2.ll @@ -1,24 +1,39 @@ -; RUN: opt < %s -argpromotion -S | FileCheck %s -; RUN: opt < %s -passes=argpromotion -S | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt < %s -argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL +; RUN: opt < %s -passes=argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL -; CHECK: load i32, i32* %A target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128" define internal i32 @callee(i1 %C, i32* %P) { - br i1 %C, label %T, label %F +; ARGPROMOTION-LABEL: define {{[^@]+}}@callee +; ARGPROMOTION-SAME: (i1 [[C:%.*]], i32 [[P_VAL:%.*]]) +; ARGPROMOTION-NEXT: br i1 [[C:%.*]], label [[T:%.*]], label [[F:%.*]] +; ARGPROMOTION: T: +; ARGPROMOTION-NEXT: ret i32 17 +; ARGPROMOTION: F: +; ARGPROMOTION-NEXT: ret i32 [[P_VAL:%.*]] +; + br i1 %C, label %T, label %F T: ; preds = %0 - ret i32 17 + ret i32 17 F: ; preds = %0 - %X = load i32, i32* %P ; [#uses=1] - ret i32 %X + %X = load i32, i32* %P ; [#uses=1] + ret i32 %X } define i32 @foo() { - %A = alloca i32 ; [#uses=2] - store i32 17, i32* %A - %X = call i32 @callee( i1 false, i32* %A ) ; [#uses=1] - ret i32 %X +; ARGPROMOTION-LABEL: define {{[^@]+}}@foo() +; ARGPROMOTION-NEXT: [[A:%.*]] = alloca i32 +; ARGPROMOTION-NEXT: store i32 17, i32* [[A]] +; ARGPROMOTION-NEXT: [[A_VAL:%.*]] = load i32, i32* [[A]] +; ARGPROMOTION-NEXT: [[X:%.*]] = call i32 @callee(i1 false, i32 [[A_VAL]]) +; ARGPROMOTION-NEXT: ret i32 [[X]] +; + %A = alloca i32 ; [#uses=2] + store i32 17, i32* %A + %X = call i32 @callee( i1 false, i32* %A ) ; [#uses=1] + ret i32 %X } diff --git a/llvm/test/Transforms/ArgumentPromotion/crash.ll b/llvm/test/Transforms/ArgumentPromotion/crash.ll --- a/llvm/test/Transforms/ArgumentPromotion/crash.ll +++ b/llvm/test/Transforms/ArgumentPromotion/crash.ll @@ -1,24 +1,46 @@ -; RUN: opt -S < %s -inline -argpromotion | FileCheck %s -; RUN: opt -S < %s -passes=inline,argpromotion | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt -S < %s -inline -argpromotion | FileCheck %s --check-prefixes=ARGPROMOTION,ALL_OLDPM +; RUN: opt -S < %s -passes=inline,argpromotion | FileCheck %s --check-prefixes=ARGPROMOTION,ALL_NEWPM %S = type { %S* } ; Inlining should nuke the invoke (and any inlined calls) here even with ; argument promotion running along with it. define void @zot() personality i32 (...)* @wibble { -; CHECK-LABEL: define void @zot() personality i32 (...)* @wibble -; CHECK-NOT: call -; CHECK-NOT: invoke +; ALL-LABEL: define {{[^@]+}}@zot() personality i32 (...)* @wibble +; ALL-NEXT: bb: +; ALL-NEXT: unreachable +; ALL: hoge.exit: +; ALL-NEXT: br label [[BB1:%.*]] +; ALL: bb1: +; ALL-NEXT: unreachable +; ALL: bb2: +; ALL-NEXT: [[TMP:%.*]] = landingpad { i8*, i32 } +; ALL-NEXT: cleanup +; ALL-NEXT: unreachable +; +; ARGPROMOTION-LABEL: define {{[^@]+}}@zot() personality i32 (...)* @wibble +; ARGPROMOTION-NEXT: bb: +; ARGPROMOTION-NEXT: unreachable +; ARGPROMOTION: hoge.exit: +; ARGPROMOTION-NEXT: br label [[BB1:%.*]] +; ARGPROMOTION: bb1: +; ARGPROMOTION-NEXT: unreachable +; ARGPROMOTION: bb2: +; ARGPROMOTION-NEXT: [[TMP:%.*]] = landingpad { i8*, i32 } +; ARGPROMOTION-NEXT: cleanup +; ARGPROMOTION-NEXT: unreachable +; bb: invoke void @hoge() - to label %bb1 unwind label %bb2 + to label %bb1 unwind label %bb2 bb1: unreachable bb2: %tmp = landingpad { i8*, i32 } - cleanup + cleanup unreachable } @@ -35,6 +57,14 @@ } define internal i1 @eggs(i8* %arg) { +; ARGPROMOTION_NEWPM-LABEL: define {{[^@]+}}@eggs() +; ARGPROMOTION_NEWPM-NEXT: bb: +; ARGPROMOTION_NEWPM-NEXT: unreachable +; +; ALL_NEWPM-LABEL: define {{[^@]+}}@eggs() +; ALL_NEWPM-NEXT: bb: +; ALL_NEWPM-NEXT: unreachable +; bb: %tmp = call zeroext i1 @barney(i8* %arg) unreachable @@ -46,26 +76,57 @@ } define i32 @test_inf_promote_caller(i32 %arg) { -; CHECK-LABEL: define i32 @test_inf_promote_caller( +; ALL-LABEL: define {{[^@]+}}@test_inf_promote_caller +; ALL-SAME: (i32 [[ARG:%.*]]) +; ALL-NEXT: bb: +; ALL-NEXT: [[TMP:%.*]] = alloca [[S:%.*]] +; ALL-NEXT: [[TMP1:%.*]] = alloca [[S]] +; ALL-NEXT: [[TMP2:%.*]] = call i32 @test_inf_promote_callee(%S* [[TMP]], %S* [[TMP1]]) +; ALL-NEXT: ret i32 0 +; +; ARGPROMOTION-LABEL: define {{[^@]+}}@test_inf_promote_caller +; ARGPROMOTION-SAME: (i32 [[ARG:%.*]]) +; ARGPROMOTION-NEXT: bb: +; ARGPROMOTION-NEXT: [[TMP:%.*]] = alloca [[S:%.*]] +; ARGPROMOTION-NEXT: [[TMP1:%.*]] = alloca [[S]] +; ARGPROMOTION-NEXT: [[TMP2:%.*]] = call i32 @test_inf_promote_callee(%S* [[TMP]], %S* [[TMP1]]) +; ARGPROMOTION-NEXT: ret i32 0 +; bb: %tmp = alloca %S %tmp1 = alloca %S %tmp2 = call i32 @test_inf_promote_callee(%S* %tmp, %S* %tmp1) -; CHECK: call i32 @test_inf_promote_callee(%S* %{{.*}}, %S* %{{.*}}) ret i32 0 } define internal i32 @test_inf_promote_callee(%S* %arg, %S* %arg1) { -; CHECK-LABEL: define internal i32 @test_inf_promote_callee( -; CHECK: %S* %{{.*}}, %S* %{{.*}}) +; ALL-LABEL: define {{[^@]+}}@test_inf_promote_callee +; ALL-SAME: (%S* [[ARG:%.*]], %S* [[ARG1:%.*]]) +; ALL-NEXT: bb: +; ALL-NEXT: [[TMP:%.*]] = getelementptr [[S:%.*]], %S* [[ARG1]], i32 0, i32 0 +; ALL-NEXT: [[TMP2:%.*]] = load %S*, %S** [[TMP]] +; ALL-NEXT: [[TMP3:%.*]] = getelementptr [[S]], %S* [[ARG]], i32 0, i32 0 +; ALL-NEXT: [[TMP4:%.*]] = load %S*, %S** [[TMP3]] +; ALL-NEXT: [[TMP5:%.*]] = call i32 @test_inf_promote_callee(%S* [[TMP4]], %S* [[TMP2]]) +; ALL-NEXT: ret i32 0 +; +; ARGPROMOTION-LABEL: define {{[^@]+}}@test_inf_promote_callee +; ARGPROMOTION-SAME: (%S* [[ARG:%.*]], %S* [[ARG1:%.*]]) +; ARGPROMOTION-NEXT: bb: +; ARGPROMOTION-NEXT: [[TMP:%.*]] = getelementptr [[S:%.*]], %S* [[ARG1:%.*]], i32 0, i32 0 +; ARGPROMOTION-NEXT: [[TMP2:%.*]] = load %S*, %S** [[TMP]] +; ARGPROMOTION-NEXT: [[TMP3:%.*]] = getelementptr [[S]], %S* [[ARG:%.*]], i32 0, i32 0 +; ARGPROMOTION-NEXT: [[TMP4:%.*]] = load %S*, %S** [[TMP3]] +; ARGPROMOTION-NEXT: [[TMP5:%.*]] = call i32 @test_inf_promote_callee(%S* [[TMP4]], %S* [[TMP2]]) +; ARGPROMOTION-NEXT: ret i32 0 +; bb: %tmp = getelementptr %S, %S* %arg1, i32 0, i32 0 %tmp2 = load %S*, %S** %tmp %tmp3 = getelementptr %S, %S* %arg, i32 0, i32 0 %tmp4 = load %S*, %S** %tmp3 %tmp5 = call i32 @test_inf_promote_callee(%S* %tmp4, %S* %tmp2) -; CHECK: call i32 @test_inf_promote_callee(%S* %{{.*}}, %S* %{{.*}}) ret i32 0 } diff --git a/llvm/test/Transforms/ArgumentPromotion/dbg.ll b/llvm/test/Transforms/ArgumentPromotion/dbg.ll --- a/llvm/test/Transforms/ArgumentPromotion/dbg.ll +++ b/llvm/test/Transforms/ArgumentPromotion/dbg.ll @@ -1,10 +1,15 @@ -; RUN: opt < %s -argpromotion -S | FileCheck %s -; RUN: opt < %s -passes=argpromotion -S | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt < %s -argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL +; RUN: opt < %s -passes=argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL declare void @sink(i32) -; CHECK: define internal void @test({{.*}} !dbg [[SP:![0-9]+]] define internal void @test(i32** %X) !dbg !2 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@test +; ARGPROMOTION-SAME: (i32 [[X_VAL_VAL:%.*]]) !dbg !3 +; ARGPROMOTION-NEXT: call void @sink(i32 [[X_VAL_VAL:%.*]]) +; ARGPROMOTION-NEXT: ret void +; %1 = load i32*, i32** %X, align 8 %2 = load i32, i32* %1, align 8 call void @sink(i32 %2) @@ -13,30 +18,38 @@ %struct.pair = type { i32, i32 } -; CHECK: define internal void @test_byval(i32 %{{.*}}, i32 %{{.*}}) define internal void @test_byval(%struct.pair* byval %P) { +; ARGPROMOTION-LABEL: define {{[^@]+}}@test_byval +; ARGPROMOTION-SAME: (i32 [[P_0:%.*]], i32 [[P_1:%.*]]) +; ARGPROMOTION-NEXT: [[P:%.*]] = alloca [[STRUCT_PAIR:%.*]] +; ARGPROMOTION-NEXT: [[DOT0:%.*]] = getelementptr [[STRUCT_PAIR]], %struct.pair* [[P]], i32 0, i32 0 +; ARGPROMOTION-NEXT: store i32 [[P_0:%.*]], i32* [[DOT0]] +; ARGPROMOTION-NEXT: [[DOT1:%.*]] = getelementptr [[STRUCT_PAIR]], %struct.pair* [[P]], i32 0, i32 1 +; ARGPROMOTION-NEXT: store i32 [[P_1:%.*]], i32* [[DOT1]] +; ARGPROMOTION-NEXT: ret void +; ret void } -; CHECK-LABEL: define {{.*}} @caller( define void @caller(i32** %Y, %struct.pair* %P) { -; CHECK: load i32*, {{.*}} !dbg [[LOC_1:![0-9]+]] -; CHECK-NEXT: load i32, {{.*}} !dbg [[LOC_1]] -; CHECK-NEXT: call void @test(i32 %{{.*}}), !dbg [[LOC_1]] +; ARGPROMOTION-LABEL: define {{[^@]+}}@caller +; ARGPROMOTION-SAME: (i32** [[Y:%.*]], %struct.pair* [[P:%.*]]) +; ARGPROMOTION-NEXT: [[Y_VAL:%.*]] = load i32*, i32** [[Y:%.*]], align 8, !dbg !4 +; ARGPROMOTION-NEXT: [[Y_VAL_VAL:%.*]] = load i32, i32* [[Y_VAL]], align 8, !dbg !4 +; ARGPROMOTION-NEXT: call void @test(i32 [[Y_VAL_VAL]]), !dbg !4 +; ARGPROMOTION-NEXT: [[P_0:%.*]] = getelementptr [[STRUCT_PAIR:%.*]], %struct.pair* [[P:%.*]], i32 0, i32 0, !dbg !5 +; ARGPROMOTION-NEXT: [[P_0_VAL:%.*]] = load i32, i32* [[P_0]], !dbg !5 +; ARGPROMOTION-NEXT: [[P_1:%.*]] = getelementptr [[STRUCT_PAIR]], %struct.pair* [[P]], i32 0, i32 1, !dbg !5 +; ARGPROMOTION-NEXT: [[P_1_VAL:%.*]] = load i32, i32* [[P_1]], !dbg !5 +; ARGPROMOTION-NEXT: call void @test_byval(i32 [[P_0_VAL]], i32 [[P_1_VAL]]), !dbg !5 +; ARGPROMOTION-NEXT: ret void +; call void @test(i32** %Y), !dbg !1 -; CHECK: getelementptr %struct.pair, {{.*}} !dbg [[LOC_2:![0-9]+]] -; CHECK-NEXT: load i32, i32* {{.*}} !dbg [[LOC_2]] -; CHECK-NEXT: getelementptr %struct.pair, {{.*}} !dbg [[LOC_2]] -; CHECK-NEXT: load i32, i32* {{.*}} !dbg [[LOC_2]] -; CHECK-NEXT: call void @test_byval(i32 %{{.*}}, i32 %{{.*}}), !dbg [[LOC_2]] call void @test_byval(%struct.pair* %P), !dbg !6 ret void } -; CHECK: [[SP]] = distinct !DISubprogram(name: "test", -; CHECK: [[LOC_1]] = !DILocation(line: 8 -; CHECK: [[LOC_2]] = !DILocation(line: 9 !llvm.module.flags = !{!0} !llvm.dbg.cu = !{!3} diff --git a/llvm/test/Transforms/ArgumentPromotion/fp80.ll b/llvm/test/Transforms/ArgumentPromotion/fp80.ll --- a/llvm/test/Transforms/ArgumentPromotion/fp80.ll +++ b/llvm/test/Transforms/ArgumentPromotion/fp80.ll @@ -1,5 +1,6 @@ -; RUN: opt < %s -argpromotion -S | FileCheck %s -; RUN: opt < %s -passes=argpromotion -S | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt < %s -argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL +; RUN: opt < %s -passes=argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" @@ -13,6 +14,16 @@ @a = internal global %struct.Foo { i32 1, i64 2 }, align 8 define void @run() { +; ARGPROMOTION-LABEL: define {{[^@]+}}@run() +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[TMP0:%.*]] = tail call i8 @UseLongDoubleUnsafely(%union.u* byval align 16 bitcast (%struct.s* @b to %union.u*)) +; ARGPROMOTION-NEXT: [[DOT0:%.*]] = getelementptr [[UNION_U:%.*]], %union.u* bitcast (%struct.s* @b to %union.u*), i32 0, i32 0 +; ARGPROMOTION-NEXT: [[DOT0_VAL:%.*]] = load x86_fp80, x86_fp80* [[DOT0]] +; ARGPROMOTION-NEXT: [[TMP1:%.*]] = tail call x86_fp80 @UseLongDoubleSafely(x86_fp80 [[DOT0_VAL]]) +; ARGPROMOTION-NEXT: [[TMP2:%.*]] = call i64 @AccessPaddingOfStruct(%struct.Foo* @a) +; ARGPROMOTION-NEXT: [[TMP3:%.*]] = call i64 @CaptureAStruct(%struct.Foo* @a) +; ARGPROMOTION-NEXT: ret void +; entry: tail call i8 @UseLongDoubleUnsafely(%union.u* byval align 16 bitcast (%struct.s* @b to %union.u*)) tail call x86_fp80 @UseLongDoubleSafely(%union.u* byval align 16 bitcast (%struct.s* @b to %union.u*)) @@ -21,8 +32,15 @@ ret void } -; CHECK: internal i8 @UseLongDoubleUnsafely(%union.u* byval align 16 %arg) { define internal i8 @UseLongDoubleUnsafely(%union.u* byval align 16 %arg) { +; ARGPROMOTION-LABEL: define {{[^@]+}}@UseLongDoubleUnsafely +; ARGPROMOTION-SAME: (%union.u* byval align 16 [[ARG:%.*]]) +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[BITCAST:%.*]] = bitcast %union.u* [[ARG:%.*]] to %struct.s* +; ARGPROMOTION-NEXT: [[GEP:%.*]] = getelementptr inbounds [[STRUCT_S:%.*]], %struct.s* [[BITCAST]], i64 0, i32 2 +; ARGPROMOTION-NEXT: [[RESULT:%.*]] = load i8, i8* [[GEP]] +; ARGPROMOTION-NEXT: ret i8 [[RESULT]] +; entry: %bitcast = bitcast %union.u* %arg to %struct.s* %gep = getelementptr inbounds %struct.s, %struct.s* %bitcast, i64 0, i32 2 @@ -30,22 +48,46 @@ ret i8 %result } -; CHECK: internal x86_fp80 @UseLongDoubleSafely(x86_fp80 {{%.*}}) { define internal x86_fp80 @UseLongDoubleSafely(%union.u* byval align 16 %arg) { +; ARGPROMOTION-LABEL: define {{[^@]+}}@UseLongDoubleSafely +; ARGPROMOTION-SAME: (x86_fp80 [[ARG_0:%.*]]) +; ARGPROMOTION-NEXT: [[ARG:%.*]] = alloca [[UNION_U:%.*]], align 16 +; ARGPROMOTION-NEXT: [[DOT0:%.*]] = getelementptr [[UNION_U]], %union.u* [[ARG]], i32 0, i32 0 +; ARGPROMOTION-NEXT: store x86_fp80 [[ARG_0:%.*]], x86_fp80* [[DOT0]] +; ARGPROMOTION-NEXT: [[GEP:%.*]] = getelementptr inbounds [[UNION_U]], %union.u* [[ARG]], i64 0, i32 0 +; ARGPROMOTION-NEXT: [[FP80:%.*]] = load x86_fp80, x86_fp80* [[GEP]] +; ARGPROMOTION-NEXT: ret x86_fp80 [[FP80]] +; %gep = getelementptr inbounds %union.u, %union.u* %arg, i64 0, i32 0 %fp80 = load x86_fp80, x86_fp80* %gep ret x86_fp80 %fp80 } -; CHECK: define internal i64 @AccessPaddingOfStruct(%struct.Foo* byval %a) { define internal i64 @AccessPaddingOfStruct(%struct.Foo* byval %a) { +; ARGPROMOTION-LABEL: define {{[^@]+}}@AccessPaddingOfStruct +; ARGPROMOTION-SAME: (%struct.Foo* byval [[A:%.*]]) +; ARGPROMOTION-NEXT: [[P:%.*]] = bitcast %struct.Foo* [[A:%.*]] to i64* +; ARGPROMOTION-NEXT: [[V:%.*]] = load i64, i64* [[P]] +; ARGPROMOTION-NEXT: ret i64 [[V]] +; %p = bitcast %struct.Foo* %a to i64* %v = load i64, i64* %p ret i64 %v } -; CHECK: define internal i64 @CaptureAStruct(%struct.Foo* byval %a) { define internal i64 @CaptureAStruct(%struct.Foo* byval %a) { +; ARGPROMOTION-LABEL: define {{[^@]+}}@CaptureAStruct +; ARGPROMOTION-SAME: (%struct.Foo* byval [[A:%.*]]) +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[A_PTR:%.*]] = alloca %struct.Foo* +; ARGPROMOTION-NEXT: br label [[LOOP:%.*]] +; ARGPROMOTION: loop: +; ARGPROMOTION-NEXT: [[PHI:%.*]] = phi %struct.Foo* [ null, [[ENTRY:%.*]] ], [ [[GEP:%.*]], [[LOOP]] ] +; ARGPROMOTION-NEXT: [[TMP0:%.*]] = phi %struct.Foo* [ [[A:%.*]], [[ENTRY]] ], [ [[TMP0]], [[LOOP]] ] +; ARGPROMOTION-NEXT: store %struct.Foo* [[PHI]], %struct.Foo** [[A_PTR]] +; ARGPROMOTION-NEXT: [[GEP]] = getelementptr [[STRUCT_FOO:%.*]], %struct.Foo* [[A]], i64 0 +; ARGPROMOTION-NEXT: br label [[LOOP]] +; entry: %a_ptr = alloca %struct.Foo* br label %loop diff --git a/llvm/test/Transforms/ArgumentPromotion/inalloca.ll b/llvm/test/Transforms/ArgumentPromotion/inalloca.ll --- a/llvm/test/Transforms/ArgumentPromotion/inalloca.ll +++ b/llvm/test/Transforms/ArgumentPromotion/inalloca.ll @@ -1,5 +1,6 @@ -; RUN: opt %s -globalopt -argpromotion -sroa -S | FileCheck %s -; RUN: opt %s -passes='module(globalopt),cgscc(argpromotion),function(sroa)' -S | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt %s -globalopt -argpromotion -sroa -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL +; RUN: opt %s -passes='module(globalopt),cgscc(argpromotion),function(sroa)' -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128" @@ -7,6 +8,12 @@ ; Argpromote + sroa should change this to passing the two integers by value. define internal i32 @f(%struct.ss* inalloca %s) { +; ARGPROMOTION-LABEL: define {{[^@]+}}@f +; ARGPROMOTION-SAME: (i32 [[S_0_0_VAL:%.*]], i32 [[S_0_1_VAL:%.*]]) unnamed_addr +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[R:%.*]] = add i32 [[S_0_0_VAL:%.*]], [[S_0_1_VAL:%.*]] +; ARGPROMOTION-NEXT: ret i32 [[R]] +; entry: %f0 = getelementptr %struct.ss, %struct.ss* %s, i32 0, i32 0 %f1 = getelementptr %struct.ss, %struct.ss* %s, i32 0, i32 1 @@ -15,11 +22,13 @@ %r = add i32 %a, %b ret i32 %r } -; CHECK-LABEL: define internal fastcc i32 @f -; CHECK-NOT: load -; CHECK: ret define i32 @main() { +; ARGPROMOTION-LABEL: define {{[^@]+}}@main() local_unnamed_addr +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[R:%.*]] = call fastcc i32 @f(i32 1, i32 2) +; ARGPROMOTION-NEXT: ret i32 [[R]] +; entry: %S = alloca inalloca %struct.ss %f0 = getelementptr %struct.ss, %struct.ss* %S, i32 0, i32 0 @@ -29,22 +38,29 @@ %r = call i32 @f(%struct.ss* inalloca %S) ret i32 %r } -; CHECK-LABEL: define i32 @main -; CHECK-NOT: load -; CHECK: ret ; Argpromote can't promote %a because of the icmp use. define internal i1 @g(%struct.ss* %a, %struct.ss* inalloca %b) nounwind { -; CHECK: define internal fastcc i1 @g(%struct.ss* %a, %struct.ss* %b) +; ARGPROMOTION-LABEL: define {{[^@]+}}@g +; ARGPROMOTION-SAME: (%struct.ss* [[A:%.*]], %struct.ss* [[B:%.*]]) unnamed_addr +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[C:%.*]] = icmp eq %struct.ss* [[A:%.*]], [[B:%.*]] +; ARGPROMOTION-NEXT: ret i1 [[C]] +; entry: %c = icmp eq %struct.ss* %a, %b ret i1 %c } define i32 @test() { +; ARGPROMOTION-LABEL: define {{[^@]+}}@test() local_unnamed_addr +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[S:%.*]] = alloca inalloca [[STRUCT_SS:%.*]] +; ARGPROMOTION-NEXT: [[C:%.*]] = call fastcc i1 @g(%struct.ss* [[S]], %struct.ss* [[S]]) +; ARGPROMOTION-NEXT: ret i32 0 +; entry: %S = alloca inalloca %struct.ss %c = call i1 @g(%struct.ss* %S, %struct.ss* inalloca %S) -; CHECK: call fastcc i1 @g(%struct.ss* %S, %struct.ss* %S) ret i32 0 } diff --git a/llvm/test/Transforms/ArgumentPromotion/invalidation.ll b/llvm/test/Transforms/ArgumentPromotion/invalidation.ll --- a/llvm/test/Transforms/ArgumentPromotion/invalidation.ll +++ b/llvm/test/Transforms/ArgumentPromotion/invalidation.ll @@ -1,3 +1,4 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes ; Check that when argument promotion changes a function in some parent node of ; the call graph, any analyses that happened to be cached for that function are ; actually invalidated. We are using `demanded-bits` here because when printed @@ -6,42 +7,42 @@ ; invalidation this will crash in the second printer as it tries to reuse ; now-invalid demanded bits. ; -; RUN: opt < %s -passes='function(print),cgscc(argpromotion,function(print))' -S | FileCheck %s +; RUN: opt < %s -passes='function(print),cgscc(argpromotion,function(print))' -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL @G = constant i32 0 define internal i32 @a(i32* %x) { -; CHECK-LABEL: define internal i32 @a( -; CHECK-SAME: i32 %[[V:.*]]) { -; CHECK-NEXT: entry: -; CHECK-NEXT: ret i32 %[[V]] -; CHECK-NEXT: } +; ARGPROMOTION-LABEL: define {{[^@]+}}@a +; ARGPROMOTION-SAME: (i32 [[X_VAL:%.*]]) +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: ret i32 [[X_VAL:%.*]] +; entry: %v = load i32, i32* %x ret i32 %v } define i32 @b() { -; CHECK-LABEL: define i32 @b() -; CHECK-NEXT: entry: -; CHECK-NEXT: %[[L:.*]] = load i32, i32* @G -; CHECK-NEXT: %[[V:.*]] = call i32 @a(i32 %[[L]]) -; CHECK-NEXT: ret i32 %[[V]] -; CHECK-NEXT: } +; ARGPROMOTION-LABEL: define {{[^@]+}}@b() +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[G_VAL:%.*]] = load i32, i32* @G +; ARGPROMOTION-NEXT: [[V:%.*]] = call i32 @a(i32 [[G_VAL]]) +; ARGPROMOTION-NEXT: ret i32 [[V]] +; entry: %v = call i32 @a(i32* @G) ret i32 %v } define i32 @c() { -; CHECK-LABEL: define i32 @c() -; CHECK-NEXT: entry: -; CHECK-NEXT: %[[L:.*]] = load i32, i32* @G -; CHECK-NEXT: %[[V1:.*]] = call i32 @a(i32 %[[L]]) -; CHECK-NEXT: %[[V2:.*]] = call i32 @b() -; CHECK-NEXT: %[[RESULT:.*]] = add i32 %[[V1]], %[[V2]] -; CHECK-NEXT: ret i32 %[[RESULT]] -; CHECK-NEXT: } +; ARGPROMOTION-LABEL: define {{[^@]+}}@c() +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[G_VAL:%.*]] = load i32, i32* @G +; ARGPROMOTION-NEXT: [[V1:%.*]] = call i32 @a(i32 [[G_VAL]]) +; ARGPROMOTION-NEXT: [[V2:%.*]] = call i32 @b() +; ARGPROMOTION-NEXT: [[RESULT:%.*]] = add i32 [[V1]], [[V2]] +; ARGPROMOTION-NEXT: ret i32 [[RESULT]] +; entry: %v1 = call i32 @a(i32* @G) %v2 = call i32 @b() diff --git a/llvm/test/Transforms/ArgumentPromotion/musttail.ll b/llvm/test/Transforms/ArgumentPromotion/musttail.ll --- a/llvm/test/Transforms/ArgumentPromotion/musttail.ll +++ b/llvm/test/Transforms/ArgumentPromotion/musttail.ll @@ -1,12 +1,21 @@ -; RUN: opt < %s -argpromotion -S | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt < %s -argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL ; PR36543 ; Don't promote arguments of musttail callee %T = type { i32, i32, i32, i32 } -; CHECK-LABEL: define internal i32 @test(%T* %p) define internal i32 @test(%T* %p) { +; ARGPROMOTION-LABEL: define {{[^@]+}}@test +; ARGPROMOTION-SAME: (%T* [[P:%.*]]) +; ARGPROMOTION-NEXT: [[A_GEP:%.*]] = getelementptr [[T:%.*]], %T* [[P:%.*]], i64 0, i32 3 +; ARGPROMOTION-NEXT: [[B_GEP:%.*]] = getelementptr [[T]], %T* [[P]], i64 0, i32 2 +; ARGPROMOTION-NEXT: [[A:%.*]] = load i32, i32* [[A_GEP]] +; ARGPROMOTION-NEXT: [[B:%.*]] = load i32, i32* [[B_GEP]] +; ARGPROMOTION-NEXT: [[V:%.*]] = add i32 [[A]], [[B]] +; ARGPROMOTION-NEXT: ret i32 [[V]] +; %a.gep = getelementptr %T, %T* %p, i64 0, i32 3 %b.gep = getelementptr %T, %T* %p, i64 0, i32 2 %a = load i32, i32* %a.gep @@ -15,8 +24,12 @@ ret i32 %v } -; CHECK-LABEL: define i32 @caller(%T* %p) define i32 @caller(%T* %p) { +; ARGPROMOTION-LABEL: define {{[^@]+}}@caller +; ARGPROMOTION-SAME: (%T* [[P:%.*]]) +; ARGPROMOTION-NEXT: [[V:%.*]] = musttail call i32 @test(%T* [[P:%.*]]) +; ARGPROMOTION-NEXT: ret i32 [[V]] +; %v = musttail call i32 @test(%T* %p) ret i32 %v } @@ -24,11 +37,24 @@ ; Don't promote arguments of musttail caller define i32 @foo(%T* %p, i32 %v) { +; ARGPROMOTION-LABEL: define {{[^@]+}}@foo +; ARGPROMOTION-SAME: (%T* [[P:%.*]], i32 [[V:%.*]]) +; ARGPROMOTION-NEXT: ret i32 0 +; ret i32 0 } -; CHECK-LABEL: define internal i32 @test2(%T* %p, i32 %p2) define internal i32 @test2(%T* %p, i32 %p2) { +; ARGPROMOTION-LABEL: define {{[^@]+}}@test2 +; ARGPROMOTION-SAME: (%T* [[P:%.*]], i32 [[P2:%.*]]) +; ARGPROMOTION-NEXT: [[A_GEP:%.*]] = getelementptr [[T:%.*]], %T* [[P:%.*]], i64 0, i32 3 +; ARGPROMOTION-NEXT: [[B_GEP:%.*]] = getelementptr [[T]], %T* [[P]], i64 0, i32 2 +; ARGPROMOTION-NEXT: [[A:%.*]] = load i32, i32* [[A_GEP]] +; ARGPROMOTION-NEXT: [[B:%.*]] = load i32, i32* [[B_GEP]] +; ARGPROMOTION-NEXT: [[V:%.*]] = add i32 [[A]], [[B]] +; ARGPROMOTION-NEXT: [[CA:%.*]] = musttail call i32 @foo(%T* undef, i32 [[V]]) +; ARGPROMOTION-NEXT: ret i32 [[CA]] +; %a.gep = getelementptr %T, %T* %p, i64 0, i32 3 %b.gep = getelementptr %T, %T* %p, i64 0, i32 2 %a = load i32, i32* %a.gep @@ -38,8 +64,12 @@ ret i32 %ca } -; CHECK-LABEL: define i32 @caller2(%T* %g) define i32 @caller2(%T* %g) { +; ARGPROMOTION-LABEL: define {{[^@]+}}@caller2 +; ARGPROMOTION-SAME: (%T* [[G:%.*]]) +; ARGPROMOTION-NEXT: [[V:%.*]] = call i32 @test2(%T* [[G:%.*]], i32 0) +; ARGPROMOTION-NEXT: ret i32 [[V]] +; %v = call i32 @test2(%T* %g, i32 0) ret i32 %v } diff --git a/llvm/test/Transforms/ArgumentPromotion/naked_functions.ll b/llvm/test/Transforms/ArgumentPromotion/naked_functions.ll --- a/llvm/test/Transforms/ArgumentPromotion/naked_functions.ll +++ b/llvm/test/Transforms/ArgumentPromotion/naked_functions.ll @@ -1,23 +1,34 @@ -; RUN: opt < %s -argpromotion -S | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt < %s -argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL ; Don't promote paramaters of/arguments to naked functions @g = common global i32 0, align 4 define i32 @bar() { +; ARGPROMOTION-LABEL: define {{[^@]+}}@bar() +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[CALL:%.*]] = call i32 @foo(i32* @g) +; ARGPROMOTION-NEXT: ret i32 [[CALL]] +; entry: %call = call i32 @foo(i32* @g) -; CHECK: %call = call i32 @foo(i32* @g) ret i32 %call } define internal i32 @foo(i32*) #0 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@foo +; ARGPROMOTION-SAME: (i32* [[TMP0:%.*]]) +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[RETVAL:%.*]] = alloca i32, align 4 +; ARGPROMOTION-NEXT: call void asm sideeffect "ldr r0, [r0] \0Abx lr \0A", ""() +; ARGPROMOTION-NEXT: unreachable +; entry: %retval = alloca i32, align 4 call void asm sideeffect "ldr r0, [r0] \0Abx lr \0A", ""() unreachable } -; CHECK: define internal i32 @foo(i32* %0) attributes #0 = { naked } diff --git a/llvm/test/Transforms/ArgumentPromotion/nonzero-address-spaces.ll b/llvm/test/Transforms/ArgumentPromotion/nonzero-address-spaces.ll --- a/llvm/test/Transforms/ArgumentPromotion/nonzero-address-spaces.ll +++ b/llvm/test/Transforms/ArgumentPromotion/nonzero-address-spaces.ll @@ -1,4 +1,5 @@ -; RUN: opt < %s -argpromotion -S | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt < %s -argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL ; ArgumentPromotion should preserve the default function address space ; from the data layout. @@ -8,14 +9,24 @@ @g = common global i32 0, align 4 define i32 @bar() { +; ARGPROMOTION-LABEL: define {{[^@]+}}@bar() addrspace(1) +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[CALL:%.*]] = call addrspace(1) i32 @foo() +; ARGPROMOTION-NEXT: ret i32 [[CALL]] +; + entry: %call = call i32 @foo(i32* @g) -; CHECK: %call = call addrspace(1) i32 @foo() ret i32 %call } -; CHECK: define internal i32 @foo() addrspace(1) define internal i32 @foo(i32*) { +; ARGPROMOTION-LABEL: define {{[^@]+}}@foo() addrspace(1) +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[RETVAL:%.*]] = alloca i32, align 4 +; ARGPROMOTION-NEXT: call addrspace(0) void asm sideeffect "ldr r0, [r0] \0Abx lr \0A", ""() +; ARGPROMOTION-NEXT: unreachable +; entry: %retval = alloca i32, align 4 call void asm sideeffect "ldr r0, [r0] \0Abx lr \0A", ""() diff --git a/llvm/test/Transforms/ArgumentPromotion/pr27568.ll b/llvm/test/Transforms/ArgumentPromotion/pr27568.ll --- a/llvm/test/Transforms/ArgumentPromotion/pr27568.ll +++ b/llvm/test/Transforms/ArgumentPromotion/pr27568.ll @@ -1,18 +1,35 @@ -; RUN: opt -S -argpromotion < %s | FileCheck %s -; RUN: opt -S -passes=argpromotion < %s | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt -S -argpromotion < %s | FileCheck %s --check-prefixes=ARGPROMOTION,ALL +; RUN: opt -S -passes=argpromotion < %s | FileCheck %s --check-prefixes=ARGPROMOTION,ALL ; RUN: opt -S -debugify -o /dev/null < %s target triple = "x86_64-pc-windows-msvc" define internal void @callee(i8*) { +; ARGPROMOTION-LABEL: define {{[^@]+}}@callee() +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: call void @thunk() +; ARGPROMOTION-NEXT: ret void +; entry: call void @thunk() ret void } define void @test1() personality i32 (...)* @__CxxFrameHandler3 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@test1() personality i32 (...)* @__CxxFrameHandler3 +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: invoke void @thunk() +; ARGPROMOTION-NEXT: to label [[OUT:%.*]] unwind label [[CPAD:%.*]] +; ARGPROMOTION: out: +; ARGPROMOTION-NEXT: ret void +; ARGPROMOTION: cpad: +; ARGPROMOTION-NEXT: [[PAD:%.*]] = cleanuppad within none [] +; ARGPROMOTION-NEXT: call void @callee() [ "funclet"(token [[PAD]]) ] +; ARGPROMOTION-NEXT: cleanupret from [[PAD]] unwind to caller +; entry: invoke void @thunk() - to label %out unwind label %cpad + to label %out unwind label %cpad out: ret void @@ -23,10 +40,6 @@ cleanupret from %pad unwind to caller } -; CHECK-LABEL: define void @test1( -; CHECK: %[[pad:.*]] = cleanuppad within none [] -; CHECK-NEXT: call void @callee() [ "funclet"(token %[[pad]]) ] -; CHECK-NEXT: cleanupret from %[[pad]] unwind to caller declare void @thunk() diff --git a/llvm/test/Transforms/ArgumentPromotion/pr3085.ll b/llvm/test/Transforms/ArgumentPromotion/pr3085.ll --- a/llvm/test/Transforms/ArgumentPromotion/pr3085.ll +++ b/llvm/test/Transforms/ArgumentPromotion/pr3085.ll @@ -1,3 +1,4 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes ; RUN: opt < %s -disable-output -loop-extract-single -loop-rotate -loop-reduce -argpromotion ; PR 3085 @@ -5,1940 +6,1940 @@ define fastcc %struct.Lit* @import_lit(i32 %lit) nounwind { entry: - br i1 false, label %bb, label %bb1 + br i1 false, label %bb, label %bb1 bb: ; preds = %entry - unreachable + unreachable bb1: ; preds = %entry - br label %bb3 + br label %bb3 bb2: ; preds = %bb3 - br label %bb3 + br label %bb3 bb3: ; preds = %bb2, %bb1 - br i1 false, label %bb2, label %bb6 + br i1 false, label %bb2, label %bb6 bb6: ; preds = %bb3 - br i1 false, label %bb.i.i, label %bb1.i.i + br i1 false, label %bb.i.i, label %bb1.i.i bb.i.i: ; preds = %bb6 - br label %int2lit.exit + br label %int2lit.exit bb1.i.i: ; preds = %bb6 - br label %int2lit.exit + br label %int2lit.exit int2lit.exit: ; preds = %bb1.i.i, %bb.i.i - ret %struct.Lit* null + ret %struct.Lit* null } define fastcc i32 @picosat_main(i32 %argc, i8** %argv) nounwind { entry: - br i1 false, label %bb.i, label %picosat_time_stamp.exit + br i1 false, label %bb.i, label %picosat_time_stamp.exit bb.i: ; preds = %entry - br label %picosat_time_stamp.exit + br label %picosat_time_stamp.exit picosat_time_stamp.exit: ; preds = %bb.i, %entry - br label %bb108 + br label %bb108 bb: ; preds = %bb108 - br i1 false, label %bb1, label %bb2 + br i1 false, label %bb1, label %bb2 bb1: ; preds = %bb - br label %bb106 + br label %bb106 bb2: ; preds = %bb - br i1 false, label %bb3, label %bb4 + br i1 false, label %bb3, label %bb4 bb3: ; preds = %bb2 - br label %bb106 + br label %bb106 bb4: ; preds = %bb2 - br i1 false, label %bb5, label %bb6 + br i1 false, label %bb5, label %bb6 bb5: ; preds = %bb4 - br label %bb106 + br label %bb106 bb6: ; preds = %bb4 - br i1 false, label %bb7, label %bb8 + br i1 false, label %bb7, label %bb8 bb7: ; preds = %bb6 - br label %bb106 + br label %bb106 bb8: ; preds = %bb6 - br i1 false, label %bb106, label %bb10 + br i1 false, label %bb106, label %bb10 bb10: ; preds = %bb8 - br i1 false, label %bb106, label %bb12 + br i1 false, label %bb106, label %bb12 bb12: ; preds = %bb10 - br i1 false, label %bb106, label %bb14 + br i1 false, label %bb106, label %bb14 bb14: ; preds = %bb12 - br i1 false, label %bb15, label %bb19 + br i1 false, label %bb15, label %bb19 bb15: ; preds = %bb14 - br i1 false, label %bb16, label %bb17 + br i1 false, label %bb16, label %bb17 bb16: ; preds = %bb15 - br label %bb106 + br label %bb106 bb17: ; preds = %bb15 - br label %bb106 + br label %bb106 bb19: ; preds = %bb14 - br i1 false, label %bb20, label %bb28 + br i1 false, label %bb20, label %bb28 bb20: ; preds = %bb19 - br i1 false, label %bb21, label %bb22 + br i1 false, label %bb21, label %bb22 bb21: ; preds = %bb20 - br label %bb106 + br label %bb106 bb22: ; preds = %bb20 - br i1 false, label %bb106, label %bb24 + br i1 false, label %bb106, label %bb24 bb24: ; preds = %bb22 - br i1 false, label %bb106, label %bb26 + br i1 false, label %bb106, label %bb26 bb26: ; preds = %bb24 - br label %bb106 + br label %bb106 bb28: ; preds = %bb19 - br i1 false, label %bb29, label %bb35 + br i1 false, label %bb29, label %bb35 bb29: ; preds = %bb28 - br i1 false, label %bb30, label %bb31 + br i1 false, label %bb30, label %bb31 bb30: ; preds = %bb29 - br label %bb106 + br label %bb106 bb31: ; preds = %bb29 - br i1 false, label %bb32, label %bb33 + br i1 false, label %bb32, label %bb33 bb32: ; preds = %bb31 - br label %bb106 + br label %bb106 bb33: ; preds = %bb31 - br label %bb106 + br label %bb106 bb35: ; preds = %bb28 - br i1 false, label %bb36, label %bb40 + br i1 false, label %bb36, label %bb40 bb36: ; preds = %bb35 - br i1 false, label %bb37, label %bb38 + br i1 false, label %bb37, label %bb38 bb37: ; preds = %bb36 - br label %bb106 + br label %bb106 bb38: ; preds = %bb36 - br label %bb106 + br label %bb106 bb40: ; preds = %bb35 - br i1 false, label %bb41, label %bb49 + br i1 false, label %bb41, label %bb49 bb41: ; preds = %bb40 - br i1 false, label %bb43, label %bb42 + br i1 false, label %bb43, label %bb42 bb42: ; preds = %bb41 - br label %bb106 + br label %bb106 bb43: ; preds = %bb41 - br i1 false, label %bb44, label %bb45 + br i1 false, label %bb44, label %bb45 bb44: ; preds = %bb43 - br label %bb106 + br label %bb106 bb45: ; preds = %bb43 - br i1 false, label %bb46, label %bb47 + br i1 false, label %bb46, label %bb47 bb46: ; preds = %bb45 - br label %bb106 + br label %bb106 bb47: ; preds = %bb45 - br label %bb106 + br label %bb106 bb49: ; preds = %bb40 - br i1 false, label %bb50, label %bb56 + br i1 false, label %bb50, label %bb56 bb50: ; preds = %bb49 - br i1 false, label %bb52, label %bb51 + br i1 false, label %bb52, label %bb51 bb51: ; preds = %bb50 - br label %bb106 + br label %bb106 bb52: ; preds = %bb50 - br i1 false, label %bb53, label %bb54 + br i1 false, label %bb53, label %bb54 bb53: ; preds = %bb52 - br label %bb106 + br label %bb106 bb54: ; preds = %bb52 - br label %bb106 + br label %bb106 bb56: ; preds = %bb49 - br i1 false, label %bb57, label %bb63 + br i1 false, label %bb57, label %bb63 bb57: ; preds = %bb56 - br i1 false, label %bb59, label %bb58 + br i1 false, label %bb59, label %bb58 bb58: ; preds = %bb57 - br label %bb106 + br label %bb106 bb59: ; preds = %bb57 - br i1 false, label %bb60, label %bb61 + br i1 false, label %bb60, label %bb61 bb60: ; preds = %bb59 - br label %bb106 + br label %bb106 bb61: ; preds = %bb59 - br label %bb106 + br label %bb106 bb63: ; preds = %bb56 - br i1 false, label %bb64, label %bb70 + br i1 false, label %bb64, label %bb70 bb64: ; preds = %bb63 - br i1 false, label %bb66, label %bb65 + br i1 false, label %bb66, label %bb65 bb65: ; preds = %bb64 - br label %bb106 + br label %bb106 bb66: ; preds = %bb64 - br i1 false, label %bb67, label %bb68 + br i1 false, label %bb67, label %bb68 bb67: ; preds = %bb66 - br label %bb106 + br label %bb106 bb68: ; preds = %bb66 - br label %bb106 + br label %bb106 bb70: ; preds = %bb63 - br i1 false, label %bb71, label %bb79 + br i1 false, label %bb71, label %bb79 bb71: ; preds = %bb70 - br i1 false, label %bb73, label %bb72 + br i1 false, label %bb73, label %bb72 bb72: ; preds = %bb71 - br label %bb106 + br label %bb106 bb73: ; preds = %bb71 - br i1 false, label %bb74, label %bb75 + br i1 false, label %bb74, label %bb75 bb74: ; preds = %bb73 - br label %bb106 + br label %bb106 bb75: ; preds = %bb73 - br i1 false, label %bb76, label %bb77 + br i1 false, label %bb76, label %bb77 bb76: ; preds = %bb75 - br label %bb106 + br label %bb106 bb77: ; preds = %bb75 - br label %bb106 + br label %bb106 bb79: ; preds = %bb70 - br i1 false, label %bb80, label %bb86 + br i1 false, label %bb80, label %bb86 bb80: ; preds = %bb79 - br i1 false, label %bb82, label %bb81 + br i1 false, label %bb82, label %bb81 bb81: ; preds = %bb80 - br label %bb106 + br label %bb106 bb82: ; preds = %bb80 - br i1 false, label %bb83, label %bb84 + br i1 false, label %bb83, label %bb84 bb83: ; preds = %bb82 - br label %bb106 + br label %bb106 bb84: ; preds = %bb82 - br label %bb106 + br label %bb106 bb86: ; preds = %bb79 - br i1 false, label %bb87, label %bb93 + br i1 false, label %bb87, label %bb93 bb87: ; preds = %bb86 - br i1 false, label %bb89, label %bb88 + br i1 false, label %bb89, label %bb88 bb88: ; preds = %bb87 - br label %bb106 + br label %bb106 bb89: ; preds = %bb87 - br i1 false, label %bb90, label %bb91 + br i1 false, label %bb90, label %bb91 bb90: ; preds = %bb89 - br label %bb106 + br label %bb106 bb91: ; preds = %bb89 - br label %bb106 + br label %bb106 bb93: ; preds = %bb86 - br i1 false, label %bb94, label %bb95 + br i1 false, label %bb94, label %bb95 bb94: ; preds = %bb93 - br label %bb106 + br label %bb106 bb95: ; preds = %bb93 - br i1 false, label %bb98, label %bb97 + br i1 false, label %bb98, label %bb97 bb97: ; preds = %bb95 - br label %bb106 + br label %bb106 bb98: ; preds = %bb95 - br i1 false, label %bb103, label %bb1.i24 + br i1 false, label %bb103, label %bb1.i24 bb1.i24: ; preds = %bb98 - br i1 false, label %bb99, label %bb103 + br i1 false, label %bb99, label %bb103 bb99: ; preds = %bb1.i24 - br i1 false, label %bb101, label %bb100 + br i1 false, label %bb101, label %bb100 bb100: ; preds = %bb99 - br label %bb102 + br label %bb102 bb101: ; preds = %bb99 - br label %bb102 + br label %bb102 bb102: ; preds = %bb101, %bb100 - br label %bb106 + br label %bb106 bb103: ; preds = %bb1.i24, %bb98 - br i1 false, label %bb104, label %bb105 + br i1 false, label %bb104, label %bb105 bb104: ; preds = %bb103 - br label %bb106 + br label %bb106 bb105: ; preds = %bb103 - br label %bb106 + br label %bb106 bb106: ; preds = %bb105, %bb104, %bb102, %bb97, %bb94, %bb91, %bb90, %bb88, %bb84, %bb83, %bb81, %bb77, %bb76, %bb74, %bb72, %bb68, %bb67, %bb65, %bb61, %bb60, %bb58, %bb54, %bb53, %bb51, %bb47, %bb46, %bb44, %bb42, %bb38, %bb37, %bb33, %bb32, %bb30, %bb26, %bb24, %bb22, %bb21, %bb17, %bb16, %bb12, %bb10, %bb8, %bb7, %bb5, %bb3, %bb1 - br i1 false, label %bb108, label %bb110 + br i1 false, label %bb108, label %bb110 bb108: ; preds = %bb106, %picosat_time_stamp.exit - br i1 false, label %bb, label %bb110 + br i1 false, label %bb, label %bb110 bb110: ; preds = %bb108, %bb106 - br i1 false, label %bb112, label %bb171 + br i1 false, label %bb112, label %bb171 bb112: ; preds = %bb110 - br i1 false, label %bb114, label %bb113 + br i1 false, label %bb114, label %bb113 bb113: ; preds = %bb112 - br label %bb114 + br label %bb114 bb114: ; preds = %bb113, %bb112 - br i1 false, label %bb.i.i35, label %bb1.i.i36 + br i1 false, label %bb.i.i35, label %bb1.i.i36 bb.i.i35: ; preds = %bb114 - unreachable + unreachable bb1.i.i36: ; preds = %bb114 - br i1 false, label %bb5.i.i.i41, label %bb6.i.i.i42 + br i1 false, label %bb5.i.i.i41, label %bb6.i.i.i42 bb5.i.i.i41: ; preds = %bb1.i.i36 - unreachable + unreachable bb6.i.i.i42: ; preds = %bb1.i.i36 - br i1 false, label %bb7.i.i.i43, label %bb8.i.i.i44 + br i1 false, label %bb7.i.i.i43, label %bb8.i.i.i44 bb7.i.i.i43: ; preds = %bb6.i.i.i42 - br label %bb8.i.i.i44 + br label %bb8.i.i.i44 bb8.i.i.i44: ; preds = %bb7.i.i.i43, %bb6.i.i.i42 - br i1 false, label %picosat_init.exit, label %bb14.i.i + br i1 false, label %picosat_init.exit, label %bb14.i.i bb14.i.i: ; preds = %bb8.i.i.i44 - br label %picosat_init.exit + br label %picosat_init.exit picosat_init.exit: ; preds = %bb14.i.i, %bb8.i.i.i44 - br i1 false, label %bb116, label %bb115 + br i1 false, label %bb116, label %bb115 bb115: ; preds = %picosat_init.exit - br label %bb116 + br label %bb116 bb116: ; preds = %bb115, %picosat_init.exit - br i1 false, label %bb119, label %bb118 + br i1 false, label %bb119, label %bb118 bb118: ; preds = %bb116 - br label %bb119 + br label %bb119 bb119: ; preds = %bb118, %bb116 - br i1 false, label %bb121, label %bb120 + br i1 false, label %bb121, label %bb120 bb120: ; preds = %bb119 - br label %bb121 + br label %bb121 bb121: ; preds = %bb120, %bb119 - br i1 false, label %bb126, label %bb122 + br i1 false, label %bb126, label %bb122 bb122: ; preds = %bb121 - br label %bb126 + br label %bb126 bb126: ; preds = %bb122, %bb121 - br i1 false, label %bb128, label %bb127 + br i1 false, label %bb128, label %bb127 bb127: ; preds = %bb126 - br label %bb128 + br label %bb128 bb128: ; preds = %bb127, %bb126 - br label %SKIP_COMMENTS.i + br label %SKIP_COMMENTS.i SKIP_COMMENTS.i.loopexit: ; preds = %bb.i149, %bb.i149 - br label %SKIP_COMMENTS.i.backedge + br label %SKIP_COMMENTS.i.backedge SKIP_COMMENTS.i: ; preds = %SKIP_COMMENTS.i.backedge, %bb128 - br i1 false, label %bb.i149.preheader, label %bb3.i152 + br i1 false, label %bb.i149.preheader, label %bb3.i152 bb.i149.preheader: ; preds = %SKIP_COMMENTS.i - br label %bb.i149 + br label %bb.i149 bb.i149: ; preds = %bb.i149, %bb.i149.preheader - switch i32 0, label %bb.i149 [ - i32 -1, label %SKIP_COMMENTS.i.loopexit - i32 10, label %SKIP_COMMENTS.i.loopexit - ] + switch i32 0, label %bb.i149 [ + i32 -1, label %SKIP_COMMENTS.i.loopexit + i32 10, label %SKIP_COMMENTS.i.loopexit + ] bb3.i152: ; preds = %SKIP_COMMENTS.i - br i1 false, label %bb4.i153, label %SKIP_COMMENTS.i.backedge + br i1 false, label %bb4.i153, label %SKIP_COMMENTS.i.backedge SKIP_COMMENTS.i.backedge: ; preds = %bb3.i152, %SKIP_COMMENTS.i.loopexit - br label %SKIP_COMMENTS.i + br label %SKIP_COMMENTS.i bb4.i153: ; preds = %bb3.i152 - br i1 false, label %bb5.i154, label %bb129 + br i1 false, label %bb5.i154, label %bb129 bb5.i154: ; preds = %bb4.i153 - br i1 false, label %bb129, label %bb6.i155.preheader + br i1 false, label %bb129, label %bb6.i155.preheader bb6.i155.preheader: ; preds = %bb5.i154 - br label %bb6.i155 + br label %bb6.i155 bb6.i155: ; preds = %bb6.i155, %bb6.i155.preheader - br i1 false, label %bb7.i156, label %bb6.i155 + br i1 false, label %bb7.i156, label %bb6.i155 bb7.i156: ; preds = %bb6.i155 - br i1 false, label %bb8.i157, label %bb129 + br i1 false, label %bb8.i157, label %bb129 bb8.i157: ; preds = %bb7.i156 - br i1 false, label %bb9.i158, label %bb129 + br i1 false, label %bb9.i158, label %bb129 bb9.i158: ; preds = %bb8.i157 - br i1 false, label %bb10.i159, label %bb129 + br i1 false, label %bb10.i159, label %bb129 bb10.i159: ; preds = %bb9.i158 - br i1 false, label %bb129, label %bb11.i160.preheader + br i1 false, label %bb129, label %bb11.i160.preheader bb11.i160.preheader: ; preds = %bb10.i159 - br label %bb11.i160 + br label %bb11.i160 bb11.i160: ; preds = %bb11.i160, %bb11.i160.preheader - br i1 false, label %bb12.i161, label %bb11.i160 + br i1 false, label %bb12.i161, label %bb11.i160 bb12.i161: ; preds = %bb11.i160 - br i1 false, label %bb129, label %bb15.i165.preheader + br i1 false, label %bb129, label %bb15.i165.preheader bb15.i165.preheader: ; preds = %bb12.i161 - br label %bb15.i165 + br label %bb15.i165 bb14.i163: ; preds = %bb15.i165 - br label %bb15.i165 + br label %bb15.i165 bb15.i165: ; preds = %bb14.i163, %bb15.i165.preheader - br i1 false, label %bb16.i166, label %bb14.i163 + br i1 false, label %bb16.i166, label %bb14.i163 bb16.i166: ; preds = %bb15.i165 - br i1 false, label %bb129, label %bb17.i167.preheader + br i1 false, label %bb129, label %bb17.i167.preheader bb17.i167.preheader: ; preds = %bb16.i166 - br label %bb17.i167 + br label %bb17.i167 bb17.i167: ; preds = %bb17.i167, %bb17.i167.preheader - br i1 false, label %bb18.i168, label %bb17.i167 + br i1 false, label %bb18.i168, label %bb17.i167 bb18.i168: ; preds = %bb17.i167 - br i1 false, label %bb129, label %bb21.i172.preheader + br i1 false, label %bb129, label %bb21.i172.preheader bb21.i172.preheader: ; preds = %bb18.i168 - br label %bb21.i172 + br label %bb21.i172 bb20.i170: ; preds = %bb21.i172 - br label %bb21.i172 + br label %bb21.i172 bb21.i172: ; preds = %bb20.i170, %bb21.i172.preheader - br i1 false, label %bb22.i173, label %bb20.i170 + br i1 false, label %bb22.i173, label %bb20.i170 bb22.i173: ; preds = %bb21.i172 - br i1 false, label %bb24.i175, label %bb129 + br i1 false, label %bb24.i175, label %bb129 bb24.i175: ; preds = %bb22.i173 - br i1 false, label %bb26.i180, label %bb25.i176 + br i1 false, label %bb26.i180, label %bb25.i176 bb25.i176: ; preds = %bb24.i175 - br label %bb26.i180 + br label %bb26.i180 bb26.i180: ; preds = %bb25.i176, %bb24.i175 - br i1 false, label %bb.i.i181, label %bb3.i.i184.preheader + br i1 false, label %bb.i.i181, label %bb3.i.i184.preheader bb.i.i181: ; preds = %bb26.i180 - br label %bb3.i.i184.preheader + br label %bb3.i.i184.preheader bb3.i.i184.preheader: ; preds = %bb.i.i181, %bb26.i180 - br label %bb3.i.i184 + br label %bb3.i.i184 bb2.i.i183: ; preds = %bb3.i.i184 - br label %bb3.i.i184 + br label %bb3.i.i184 bb3.i.i184: ; preds = %bb2.i.i183, %bb3.i.i184.preheader - br i1 false, label %bb2.i.i183, label %bb4.i.i185 + br i1 false, label %bb2.i.i183, label %bb4.i.i185 bb4.i.i185: ; preds = %bb3.i.i184 - br i1 false, label %bb.i.i.i186, label %picosat_adjust.exit.i + br i1 false, label %bb.i.i.i186, label %picosat_adjust.exit.i bb.i.i.i186: ; preds = %bb4.i.i185 - br label %picosat_adjust.exit.i + br label %picosat_adjust.exit.i picosat_adjust.exit.i: ; preds = %bb.i.i.i186, %bb4.i.i185 - br i1 false, label %bb28.i188, label %bb27.i187 + br i1 false, label %bb28.i188, label %bb27.i187 bb27.i187: ; preds = %picosat_adjust.exit.i - br label %bb28.i188 + br label %bb28.i188 bb28.i188: ; preds = %bb27.i187, %picosat_adjust.exit.i - br label %READ_LITERAL.i.outer + br label %READ_LITERAL.i.outer READ_LITERAL.i.outer: ; preds = %READ_LITERAL.i.outer.backedge, %bb28.i188 - br label %READ_LITERAL.i + br label %READ_LITERAL.i READ_LITERAL.i.loopexit: ; preds = %bb29.i189, %bb29.i189 - br label %READ_LITERAL.i.backedge + br label %READ_LITERAL.i.backedge READ_LITERAL.i: ; preds = %READ_LITERAL.i.backedge, %READ_LITERAL.i.outer - switch i32 0, label %bb39.i199 [ - i32 99, label %bb29.i189.preheader - i32 -1, label %bb33.i193 - ] + switch i32 0, label %bb39.i199 [ + i32 99, label %bb29.i189.preheader + i32 -1, label %bb33.i193 + ] bb29.i189.preheader: ; preds = %READ_LITERAL.i - br label %bb29.i189 + br label %bb29.i189 bb29.i189: ; preds = %bb29.i189, %bb29.i189.preheader - switch i32 0, label %bb29.i189 [ - i32 -1, label %READ_LITERAL.i.loopexit - i32 10, label %READ_LITERAL.i.loopexit - ] + switch i32 0, label %bb29.i189 [ + i32 -1, label %READ_LITERAL.i.loopexit + i32 10, label %READ_LITERAL.i.loopexit + ] bb33.i193: ; preds = %READ_LITERAL.i - br i1 false, label %bb35.i195, label %parse.exit + br i1 false, label %bb35.i195, label %parse.exit bb35.i195: ; preds = %bb33.i193 - br i1 false, label %bb38.i198, label %parse.exit + br i1 false, label %bb38.i198, label %parse.exit bb38.i198: ; preds = %bb35.i195 - br label %parse.exit + br label %parse.exit bb39.i199: ; preds = %READ_LITERAL.i - br i1 false, label %bb40.i200, label %READ_LITERAL.i.backedge + br i1 false, label %bb40.i200, label %READ_LITERAL.i.backedge READ_LITERAL.i.backedge: ; preds = %bb39.i199, %READ_LITERAL.i.loopexit - br label %READ_LITERAL.i + br label %READ_LITERAL.i bb40.i200: ; preds = %bb39.i199 - br i1 false, label %bb41.i201, label %bb42.i202 + br i1 false, label %bb41.i201, label %bb42.i202 bb41.i201: ; preds = %bb40.i200 - br label %bb42.i202 + br label %bb42.i202 bb42.i202: ; preds = %bb41.i201, %bb40.i200 - br i1 false, label %parse.exit.loopexit, label %bb46.i.preheader + br i1 false, label %parse.exit.loopexit, label %bb46.i.preheader bb46.i.preheader: ; preds = %bb42.i202 - br label %bb46.i + br label %bb46.i bb45.i: ; preds = %bb46.i - br label %bb46.i + br label %bb46.i bb46.i: ; preds = %bb45.i, %bb46.i.preheader - br i1 false, label %bb47.i, label %bb45.i + br i1 false, label %bb47.i, label %bb45.i bb47.i: ; preds = %bb46.i - br i1 false, label %parse.exit.loopexit, label %bb50.i + br i1 false, label %parse.exit.loopexit, label %bb50.i bb50.i: ; preds = %bb47.i - br i1 false, label %bb55.i, label %bb51.i + br i1 false, label %bb55.i, label %bb51.i bb51.i: ; preds = %bb50.i - br i1 false, label %parse.exit.loopexit, label %bb54.i + br i1 false, label %parse.exit.loopexit, label %bb54.i bb54.i: ; preds = %bb51.i - br label %bb56.i + br label %bb56.i bb55.i: ; preds = %bb50.i - br label %bb56.i + br label %bb56.i bb56.i: ; preds = %bb55.i, %bb54.i - br i1 false, label %bb3.i11.i, label %bb.i8.i + br i1 false, label %bb3.i11.i, label %bb.i8.i bb.i8.i: ; preds = %bb56.i - br i1 false, label %bb1.i9.i, label %bb3.i11.i + br i1 false, label %bb1.i9.i, label %bb3.i11.i bb1.i9.i: ; preds = %bb.i8.i - br i1 false, label %bb3.i11.i, label %bb2.i10.i + br i1 false, label %bb3.i11.i, label %bb2.i10.i bb2.i10.i: ; preds = %bb1.i9.i - unreachable + unreachable bb3.i11.i: ; preds = %bb1.i9.i, %bb.i8.i, %bb56.i - br i1 false, label %bb7.i.i208, label %bb6.i.i207 + br i1 false, label %bb7.i.i208, label %bb6.i.i207 bb6.i.i207: ; preds = %bb3.i11.i - br label %READ_LITERAL.i.outer.backedge + br label %READ_LITERAL.i.outer.backedge bb7.i.i208: ; preds = %bb3.i11.i - br i1 false, label %bb53.i.i.i.i.preheader, label %bb.i.i.i.i210.preheader + br i1 false, label %bb53.i.i.i.i.preheader, label %bb.i.i.i.i210.preheader bb.i.i.i.i210.preheader: ; preds = %bb7.i.i208 - br label %bb.i.i.i.i210 + br label %bb.i.i.i.i210 bb.i.i.i.i210: ; preds = %bb.i.i.i.i210.backedge, %bb.i.i.i.i210.preheader - br i1 false, label %bb17.i.i.i.i, label %bb18.i.i.i.i + br i1 false, label %bb17.i.i.i.i, label %bb18.i.i.i.i bb17.i.i.i.i: ; preds = %bb.i.i.i.i210 - br label %bb18.i.i.i.i + br label %bb18.i.i.i.i bb18.i.i.i.i: ; preds = %bb17.i.i.i.i, %bb.i.i.i.i210 - br i1 false, label %bb19.i.i.i.i, label %bb20.i.i.i.i + br i1 false, label %bb19.i.i.i.i, label %bb20.i.i.i.i bb19.i.i.i.i: ; preds = %bb18.i.i.i.i - br label %bb20.i.i.i.i + br label %bb20.i.i.i.i bb20.i.i.i.i: ; preds = %bb19.i.i.i.i, %bb18.i.i.i.i - br i1 false, label %bb21.i.i.i.i, label %bb22.i.i.i.i + br i1 false, label %bb21.i.i.i.i, label %bb22.i.i.i.i bb21.i.i.i.i: ; preds = %bb20.i.i.i.i - br label %bb22.i.i.i.i + br label %bb22.i.i.i.i bb22.i.i.i.i: ; preds = %bb21.i.i.i.i, %bb20.i.i.i.i - br label %bb23.i.i.i.i.outer + br label %bb23.i.i.i.i.outer bb23.i.i.i.i.outer: ; preds = %bb28.i.i.i.i, %bb22.i.i.i.i - br label %bb23.i.i.i.i + br label %bb23.i.i.i.i bb23.i.i.i.i: ; preds = %bb23.i.i.i.i, %bb23.i.i.i.i.outer - br i1 false, label %bb23.i.i.i.i, label %bb26.i.i.i.i.preheader + br i1 false, label %bb23.i.i.i.i, label %bb26.i.i.i.i.preheader bb26.i.i.i.i.preheader: ; preds = %bb23.i.i.i.i - br label %bb26.i.i.i.i + br label %bb26.i.i.i.i bb26.i.i.i.i: ; preds = %bb26.i.i.i.i, %bb26.i.i.i.i.preheader - br i1 false, label %bb27.i.i.i.i, label %bb26.i.i.i.i + br i1 false, label %bb27.i.i.i.i, label %bb26.i.i.i.i bb27.i.i.i.i: ; preds = %bb26.i.i.i.i - br i1 false, label %bb28.i.i.i.i, label %bb29.i.i.i.i + br i1 false, label %bb28.i.i.i.i, label %bb29.i.i.i.i bb28.i.i.i.i: ; preds = %bb27.i.i.i.i - br label %bb23.i.i.i.i.outer + br label %bb23.i.i.i.i.outer bb29.i.i.i.i: ; preds = %bb27.i.i.i.i - br i1 false, label %bb33.i.i.i.i, label %bb44.i.i.i.i + br i1 false, label %bb33.i.i.i.i, label %bb44.i.i.i.i bb33.i.i.i.i: ; preds = %bb29.i.i.i.i - br i1 false, label %bb34.i.i.i.i, label %bb38.i.i.i.i + br i1 false, label %bb34.i.i.i.i, label %bb38.i.i.i.i bb34.i.i.i.i: ; preds = %bb33.i.i.i.i - br i1 false, label %bb37.i.i.i.i, label %bb35.i.i.i.i + br i1 false, label %bb37.i.i.i.i, label %bb35.i.i.i.i bb35.i.i.i.i: ; preds = %bb34.i.i.i.i - br label %bb37.i.i.i.i + br label %bb37.i.i.i.i bb37.i.i.i.i: ; preds = %bb35.i.i.i.i, %bb34.i.i.i.i - br label %bb38.i.i.i.i + br label %bb38.i.i.i.i bb38.i.i.i.i: ; preds = %bb37.i.i.i.i, %bb33.i.i.i.i - br i1 false, label %bb39.i.i.i.i, label %bb43.i.i.i.i + br i1 false, label %bb39.i.i.i.i, label %bb43.i.i.i.i bb39.i.i.i.i: ; preds = %bb38.i.i.i.i - br i1 false, label %bb42.i.i.i.i, label %bb40.i.i.i.i + br i1 false, label %bb42.i.i.i.i, label %bb40.i.i.i.i bb40.i.i.i.i: ; preds = %bb39.i.i.i.i - br label %bb42.i.i.i.i + br label %bb42.i.i.i.i bb42.i.i.i.i: ; preds = %bb40.i.i.i.i, %bb39.i.i.i.i - br label %bb43.i.i.i.i + br label %bb43.i.i.i.i bb43.i.i.i.i: ; preds = %bb42.i.i.i.i, %bb38.i.i.i.i - br label %bb.i.i.i.i210.backedge + br label %bb.i.i.i.i210.backedge bb.i.i.i.i210.backedge: ; preds = %bb47.i.i.i.i, %bb44.i.i.i.i, %bb43.i.i.i.i - br label %bb.i.i.i.i210 + br label %bb.i.i.i.i210 bb44.i.i.i.i: ; preds = %bb29.i.i.i.i - br i1 false, label %bb.i.i.i.i210.backedge, label %bb46.i.i.i.i + br i1 false, label %bb.i.i.i.i210.backedge, label %bb46.i.i.i.i bb46.i.i.i.i: ; preds = %bb44.i.i.i.i - br i1 false, label %bb47.i.i.i.i, label %bb53.i.i.i.i.preheader.loopexit + br i1 false, label %bb47.i.i.i.i, label %bb53.i.i.i.i.preheader.loopexit bb53.i.i.i.i.preheader.loopexit: ; preds = %bb46.i.i.i.i - br label %bb53.i.i.i.i.preheader + br label %bb53.i.i.i.i.preheader bb53.i.i.i.i.preheader: ; preds = %bb53.i.i.i.i.preheader.loopexit, %bb7.i.i208 - br label %bb53.i.i.i.i + br label %bb53.i.i.i.i bb47.i.i.i.i: ; preds = %bb46.i.i.i.i - br label %bb.i.i.i.i210.backedge + br label %bb.i.i.i.i210.backedge bb50.i.i.i.i: ; preds = %bb53.i.i.i.i - br i1 false, label %bb51.i.i.i.i, label %bb52.i.i.i.i + br i1 false, label %bb51.i.i.i.i, label %bb52.i.i.i.i bb51.i.i.i.i: ; preds = %bb50.i.i.i.i - br label %bb52.i.i.i.i + br label %bb52.i.i.i.i bb52.i.i.i.i: ; preds = %bb51.i.i.i.i, %bb50.i.i.i.i - br label %bb53.i.i.i.i + br label %bb53.i.i.i.i bb53.i.i.i.i: ; preds = %bb52.i.i.i.i, %bb53.i.i.i.i.preheader - br i1 false, label %bb50.i.i.i.i, label %bb59.i.i.i.i.preheader + br i1 false, label %bb50.i.i.i.i, label %bb59.i.i.i.i.preheader bb59.i.i.i.i.preheader: ; preds = %bb53.i.i.i.i - br label %bb59.i.i.i.i + br label %bb59.i.i.i.i bb55.i.i.i.i: ; preds = %bb59.i.i.i.i - br label %bb57.i.i.i.i + br label %bb57.i.i.i.i bb56.i.i.i.i: ; preds = %bb57.i.i.i.i - br label %bb57.i.i.i.i + br label %bb57.i.i.i.i bb57.i.i.i.i: ; preds = %bb56.i.i.i.i, %bb55.i.i.i.i - br i1 false, label %bb56.i.i.i.i, label %bb58.i.i.i.i + br i1 false, label %bb56.i.i.i.i, label %bb58.i.i.i.i bb58.i.i.i.i: ; preds = %bb57.i.i.i.i - br label %bb59.i.i.i.i + br label %bb59.i.i.i.i bb59.i.i.i.i: ; preds = %bb58.i.i.i.i, %bb59.i.i.i.i.preheader - br i1 false, label %bb60.i.i.i.i, label %bb55.i.i.i.i + br i1 false, label %bb60.i.i.i.i, label %bb55.i.i.i.i bb60.i.i.i.i: ; preds = %bb59.i.i.i.i - br label %bb69.i.i.i.i + br label %bb69.i.i.i.i bb61.i.i.i.i: ; preds = %bb69.i.i.i.i - br i1 false, label %bb68.i.i.i.i, label %bb62.i.i.i.i + br i1 false, label %bb68.i.i.i.i, label %bb62.i.i.i.i bb62.i.i.i.i: ; preds = %bb61.i.i.i.i - br i1 false, label %bb63.i.i.i.i, label %bb65.i.i.i.i + br i1 false, label %bb63.i.i.i.i, label %bb65.i.i.i.i bb63.i.i.i.i: ; preds = %bb62.i.i.i.i - br i1 false, label %bb.i.i12.i, label %bb65.i.i.i.i + br i1 false, label %bb.i.i12.i, label %bb65.i.i.i.i bb65.i.i.i.i: ; preds = %bb63.i.i.i.i, %bb62.i.i.i.i - br i1 false, label %bb.i.i12.i, label %bb67.i.i.i.i + br i1 false, label %bb.i.i12.i, label %bb67.i.i.i.i bb67.i.i.i.i: ; preds = %bb65.i.i.i.i - br label %bb68.i.i.i.i + br label %bb68.i.i.i.i bb68.i.i.i.i: ; preds = %bb67.i.i.i.i, %bb61.i.i.i.i - br label %bb69.i.i.i.i + br label %bb69.i.i.i.i bb69.i.i.i.i: ; preds = %bb68.i.i.i.i, %bb60.i.i.i.i - br i1 false, label %bb61.i.i.i.i, label %bb70.i.i.i.i + br i1 false, label %bb61.i.i.i.i, label %bb70.i.i.i.i bb70.i.i.i.i: ; preds = %bb69.i.i.i.i - br label %READ_LITERAL.i.outer.backedge + br label %READ_LITERAL.i.outer.backedge bb.i.i12.i: ; preds = %bb65.i.i.i.i, %bb63.i.i.i.i - br i1 false, label %bb1.i.i.i213, label %bb5.i.i.i218 + br i1 false, label %bb1.i.i.i213, label %bb5.i.i.i218 bb1.i.i.i213: ; preds = %bb.i.i12.i - br i1 false, label %bb4.i.i.i217, label %bb2.i.i.i214 + br i1 false, label %bb4.i.i.i217, label %bb2.i.i.i214 bb2.i.i.i214: ; preds = %bb1.i.i.i213 - br label %bb4.i.i.i217 + br label %bb4.i.i.i217 bb4.i.i.i217: ; preds = %bb2.i.i.i214, %bb1.i.i.i213 - br label %bb5.i.i.i218 + br label %bb5.i.i.i218 bb5.i.i.i218: ; preds = %bb4.i.i.i217, %bb.i.i12.i - br label %READ_LITERAL.i.outer.backedge + br label %READ_LITERAL.i.outer.backedge READ_LITERAL.i.outer.backedge: ; preds = %bb5.i.i.i218, %bb70.i.i.i.i, %bb6.i.i207 - br label %READ_LITERAL.i.outer + br label %READ_LITERAL.i.outer parse.exit.loopexit: ; preds = %bb51.i, %bb47.i, %bb42.i202 - br label %parse.exit + br label %parse.exit parse.exit: ; preds = %parse.exit.loopexit, %bb38.i198, %bb35.i195, %bb33.i193 - br i1 false, label %bb130, label %bb129 + br i1 false, label %bb130, label %bb129 bb129: ; preds = %parse.exit, %bb22.i173, %bb18.i168, %bb16.i166, %bb12.i161, %bb10.i159, %bb9.i158, %bb8.i157, %bb7.i156, %bb5.i154, %bb4.i153 - br label %bb170 + br label %bb170 bb130: ; preds = %parse.exit - br i1 false, label %bb143, label %bb142.preheader + br i1 false, label %bb143, label %bb142.preheader bb142.preheader: ; preds = %bb130 - br label %bb142 + br label %bb142 bb132: ; preds = %bb142 - br i1 false, label %bb137, label %bb133 + br i1 false, label %bb137, label %bb133 bb133: ; preds = %bb132 - br i1 false, label %bb137, label %bb134 + br i1 false, label %bb137, label %bb134 bb134: ; preds = %bb133 - br i1 false, label %bb137, label %bb135 + br i1 false, label %bb137, label %bb135 bb135: ; preds = %bb134 - br i1 false, label %bb137, label %bb136 + br i1 false, label %bb137, label %bb136 bb136: ; preds = %bb135 - br i1 false, label %bb137, label %bb138 + br i1 false, label %bb137, label %bb138 bb137: ; preds = %bb136, %bb135, %bb134, %bb133, %bb132 - br label %bb141 + br label %bb141 bb138: ; preds = %bb136 - br i1 false, label %bb139, label %bb141 + br i1 false, label %bb139, label %bb141 bb139: ; preds = %bb138 - br i1 false, label %bb2.i126, label %picosat_assume.exit + br i1 false, label %bb2.i126, label %picosat_assume.exit bb2.i126: ; preds = %bb139 - br i1 false, label %bb5.i130, label %bb3.i127 + br i1 false, label %bb5.i130, label %bb3.i127 bb3.i127: ; preds = %bb2.i126 - br label %bb5.i130 + br label %bb5.i130 bb5.i130: ; preds = %bb3.i127, %bb2.i126 - br label %picosat_assume.exit + br label %picosat_assume.exit picosat_assume.exit: ; preds = %bb5.i130, %bb139 - br i1 false, label %bb141, label %bb140 + br i1 false, label %bb141, label %bb140 bb140: ; preds = %picosat_assume.exit - br label %bb141 + br label %bb141 bb141: ; preds = %bb140, %picosat_assume.exit, %bb138, %bb137 - br label %bb142 + br label %bb142 bb142: ; preds = %bb141, %bb142.preheader - br i1 false, label %bb132, label %bb143.loopexit + br i1 false, label %bb132, label %bb143.loopexit bb143.loopexit: ; preds = %bb142 - br label %bb143 + br label %bb143 bb143: ; preds = %bb143.loopexit, %bb130 - br i1 false, label %bb145, label %bb144 + br i1 false, label %bb145, label %bb144 bb144: ; preds = %bb143 - br label %bb11.i + br label %bb11.i bb5.i114: ; preds = %bb11.i - br label %bb11.i + br label %bb11.i bb11.i: ; preds = %bb5.i114, %bb144 - br i1 false, label %bb12.i, label %bb5.i114 + br i1 false, label %bb12.i, label %bb5.i114 bb12.i: ; preds = %bb11.i - br i1 false, label %bb.i.i.i118, label %bb1.i.i.i119 + br i1 false, label %bb.i.i.i118, label %bb1.i.i.i119 bb.i.i.i118: ; preds = %bb12.i - br label %int2lit.exit.i + br label %int2lit.exit.i bb1.i.i.i119: ; preds = %bb12.i - br label %int2lit.exit.i + br label %int2lit.exit.i int2lit.exit.i: ; preds = %bb1.i.i.i119, %bb.i.i.i118 - br label %bb19.i + br label %bb19.i bb13.i: ; preds = %bb19.i - br label %bb17.i + br label %bb17.i bb14.i: ; preds = %bb17.i - br label %bb17.i + br label %bb17.i bb17.i: ; preds = %bb14.i, %bb13.i - br i1 false, label %bb14.i, label %bb18.i + br i1 false, label %bb14.i, label %bb18.i bb18.i: ; preds = %bb17.i - br label %bb19.i + br label %bb19.i bb19.i: ; preds = %bb18.i, %int2lit.exit.i - br i1 false, label %bb20.i, label %bb13.i + br i1 false, label %bb20.i, label %bb13.i bb20.i: ; preds = %bb19.i - br label %bb33.i + br label %bb33.i bb24.i: ; preds = %bb33.i - br i1 false, label %bb29.i, label %bb25.i + br i1 false, label %bb29.i, label %bb25.i bb25.i: ; preds = %bb24.i - br label %bb27.i + br label %bb27.i bb26.i: ; preds = %bb27.i - br label %bb27.i + br label %bb27.i bb27.i: ; preds = %bb26.i, %bb25.i - br i1 false, label %bb26.i, label %bb28.i + br i1 false, label %bb26.i, label %bb28.i bb28.i: ; preds = %bb27.i - br label %bb29.i + br label %bb29.i bb29.i: ; preds = %bb28.i, %bb24.i - br label %bb33.i + br label %bb33.i bb33.i: ; preds = %bb29.i, %bb20.i - br i1 false, label %bb34.i, label %bb24.i + br i1 false, label %bb34.i, label %bb24.i bb34.i: ; preds = %bb33.i - br i1 false, label %bb.i.i58.i, label %bb1.i.i59.i + br i1 false, label %bb.i.i58.i, label %bb1.i.i59.i bb.i.i58.i: ; preds = %bb34.i - br label %int2lit.exit63.i + br label %int2lit.exit63.i bb1.i.i59.i: ; preds = %bb34.i - br label %int2lit.exit63.i + br label %int2lit.exit63.i int2lit.exit63.i: ; preds = %bb1.i.i59.i, %bb.i.i58.i - br label %bb41.i + br label %bb41.i bb35.i: ; preds = %bb41.i - br label %bb39.i + br label %bb39.i bb36.i: ; preds = %bb39.i - br i1 false, label %bb38.i, label %bb37.i + br i1 false, label %bb38.i, label %bb37.i bb37.i: ; preds = %bb36.i - br label %bb38.i + br label %bb38.i bb38.i: ; preds = %bb37.i, %bb36.i - br label %bb39.i + br label %bb39.i bb39.i: ; preds = %bb38.i, %bb35.i - br i1 false, label %bb36.i, label %bb40.i + br i1 false, label %bb36.i, label %bb40.i bb40.i: ; preds = %bb39.i - br label %bb41.i + br label %bb41.i bb41.i: ; preds = %bb40.i, %int2lit.exit63.i - br i1 false, label %bb42.i, label %bb35.i + br i1 false, label %bb42.i, label %bb35.i bb42.i: ; preds = %bb41.i - br label %bb44.i + br label %bb44.i bb43.i: ; preds = %bb44.i - br label %bb44.i + br label %bb44.i bb44.i: ; preds = %bb43.i, %bb42.i - br i1 false, label %bb43.i, label %picosat_print.exit + br i1 false, label %bb43.i, label %picosat_print.exit picosat_print.exit: ; preds = %bb44.i - br label %bb167 + br label %bb167 bb145: ; preds = %bb143 - br i1 false, label %bb147, label %bb146 + br i1 false, label %bb147, label %bb146 bb146: ; preds = %bb145 - br label %bb147 + br label %bb147 bb147: ; preds = %bb146, %bb145 - br i1 false, label %bb149, label %bb148 + br i1 false, label %bb149, label %bb148 bb148: ; preds = %bb147 - br label %bb149 + br label %bb149 bb149: ; preds = %bb148, %bb147 - br i1 false, label %bb.i54, label %bb1.i55 + br i1 false, label %bb.i54, label %bb1.i55 bb.i54: ; preds = %bb149 - unreachable + unreachable bb1.i55: ; preds = %bb149 - br i1 false, label %bb.i.i56, label %bb1.i.i57 + br i1 false, label %bb.i.i56, label %bb1.i.i57 bb.i.i56: ; preds = %bb1.i55 - br label %bb1.i.i57 + br label %bb1.i.i57 bb1.i.i57: ; preds = %bb.i.i56, %bb1.i55 - br i1 false, label %bb3.i.i59, label %bb2.i.i58 + br i1 false, label %bb3.i.i59, label %bb2.i.i58 bb2.i.i58: ; preds = %bb1.i.i57 - br label %bb3.i.i59 + br label %bb3.i.i59 bb3.i.i59: ; preds = %bb2.i.i58, %bb1.i.i57 - br i1 false, label %bb5.i.i61, label %sat.exit.i + br i1 false, label %bb5.i.i61, label %sat.exit.i bb5.i.i61: ; preds = %bb3.i.i59 - br i1 false, label %bb6.i.i65, label %bb1.i.i.i63 + br i1 false, label %bb6.i.i65, label %bb1.i.i.i63 bb1.i.i.i63: ; preds = %bb5.i.i61 - br i1 false, label %sat.exit.i, label %bb6.i.i65 + br i1 false, label %sat.exit.i, label %bb6.i.i65 bb6.i.i65: ; preds = %bb1.i.i.i63, %bb5.i.i61 - br i1 false, label %bb8.i.i67, label %bb7.i.i66 + br i1 false, label %bb8.i.i67, label %bb7.i.i66 bb7.i.i66: ; preds = %bb6.i.i65 - br label %bb8.i.i67 + br label %bb8.i.i67 bb8.i.i67: ; preds = %bb7.i.i66, %bb6.i.i65 - br i1 false, label %bb10.i.i69, label %sat.exit.i + br i1 false, label %bb10.i.i69, label %sat.exit.i bb10.i.i69: ; preds = %bb8.i.i67 - br i1 false, label %bb11.i.i70, label %bb1.i61.i.i + br i1 false, label %bb11.i.i70, label %bb1.i61.i.i bb1.i61.i.i: ; preds = %bb10.i.i69 - br i1 false, label %sat.exit.i, label %bb11.i.i70 + br i1 false, label %sat.exit.i, label %bb11.i.i70 bb11.i.i70: ; preds = %bb1.i61.i.i, %bb10.i.i69 - br label %bb13.i.i71.outer + br label %bb13.i.i71.outer bb13.i.i71.outer: ; preds = %bb42.i.i, %bb11.i.i70 - br label %bb13.i.i71 + br label %bb13.i.i71 bb13.i.i71: ; preds = %bb13.i.i71.backedge, %bb13.i.i71.outer - br i1 false, label %bb14.i.i72, label %bb15.i.i73 + br i1 false, label %bb14.i.i72, label %bb15.i.i73 bb14.i.i72: ; preds = %bb13.i.i71 - br label %bb15.i.i73 + br label %bb15.i.i73 bb15.i.i73: ; preds = %bb14.i.i72, %bb13.i.i71 - br i1 false, label %bb19.i.i, label %bb16.i.i + br i1 false, label %bb19.i.i, label %bb16.i.i bb16.i.i: ; preds = %bb15.i.i73 - br i1 false, label %bb.i.i79.i.i, label %incincs.exit.i.i + br i1 false, label %bb.i.i79.i.i, label %incincs.exit.i.i bb.i.i79.i.i: ; preds = %bb16.i.i - br label %bb4.i.i.i85.i.i + br label %bb4.i.i.i85.i.i bb.i.i.i80.i.i: ; preds = %bb4.i.i.i85.i.i - br i1 false, label %bb3.i.i.i83.i.i, label %bb1.i.i.i81.i.i + br i1 false, label %bb3.i.i.i83.i.i, label %bb1.i.i.i81.i.i bb1.i.i.i81.i.i: ; preds = %bb.i.i.i80.i.i - br i1 false, label %bb2.i.i.i82.i.i, label %bb3.i.i.i83.i.i + br i1 false, label %bb2.i.i.i82.i.i, label %bb3.i.i.i83.i.i bb2.i.i.i82.i.i: ; preds = %bb1.i.i.i81.i.i - br label %bb3.i.i.i83.i.i + br label %bb3.i.i.i83.i.i bb3.i.i.i83.i.i: ; preds = %bb2.i.i.i82.i.i, %bb1.i.i.i81.i.i, %bb.i.i.i80.i.i - br label %bb4.i.i.i85.i.i + br label %bb4.i.i.i85.i.i bb4.i.i.i85.i.i: ; preds = %bb3.i.i.i83.i.i, %bb.i.i79.i.i - br i1 false, label %crescore.exit.i.i.i.i, label %bb.i.i.i80.i.i + br i1 false, label %crescore.exit.i.i.i.i, label %bb.i.i.i80.i.i crescore.exit.i.i.i.i: ; preds = %bb4.i.i.i85.i.i - br label %incincs.exit.i.i + br label %incincs.exit.i.i incincs.exit.i.i: ; preds = %crescore.exit.i.i.i.i, %bb16.i.i - br i1 false, label %bb13.i.i71.backedge, label %sat.exit.i.loopexit.loopexit + br i1 false, label %bb13.i.i71.backedge, label %sat.exit.i.loopexit.loopexit bb13.i.i71.backedge: ; preds = %bb1.i55.i.i, %bb28.i.i, %incincs.exit.i.i - br label %bb13.i.i71 + br label %bb13.i.i71 bb19.i.i: ; preds = %bb15.i.i73 - br i1 false, label %bb20.i.i, label %bb1.i68.i.i + br i1 false, label %bb20.i.i, label %bb1.i68.i.i bb1.i68.i.i: ; preds = %bb19.i.i - br i1 false, label %sat.exit.i.loopexit.loopexit, label %bb20.i.i + br i1 false, label %sat.exit.i.loopexit.loopexit, label %bb20.i.i bb20.i.i: ; preds = %bb1.i68.i.i, %bb19.i.i - br i1 false, label %bb24.i.i, label %bb21.i.i + br i1 false, label %bb24.i.i, label %bb21.i.i bb21.i.i: ; preds = %bb20.i.i - br i1 false, label %bb22.i.i, label %bb24.i.i + br i1 false, label %bb22.i.i, label %bb24.i.i bb22.i.i: ; preds = %bb21.i.i - br i1 false, label %bb23.i.i, label %bb24.i.i + br i1 false, label %bb23.i.i, label %bb24.i.i bb23.i.i: ; preds = %bb22.i.i - br label %bb24.i.i + br label %bb24.i.i bb24.i.i: ; preds = %bb23.i.i, %bb22.i.i, %bb21.i.i, %bb20.i.i - br i1 false, label %bb26.i.i, label %sat.exit.i.loopexit.loopexit + br i1 false, label %bb26.i.i, label %sat.exit.i.loopexit.loopexit bb26.i.i: ; preds = %bb24.i.i - br i1 false, label %bb27.i.i, label %bb33.i.i.loopexit + br i1 false, label %bb27.i.i, label %bb33.i.i.loopexit bb27.i.i: ; preds = %bb26.i.i - br i1 false, label %bb33.i.i.loopexit, label %bb28.i.i + br i1 false, label %bb33.i.i.loopexit, label %bb28.i.i bb28.i.i: ; preds = %bb27.i.i - br i1 false, label %bb1.i55.i.i, label %bb13.i.i71.backedge + br i1 false, label %bb1.i55.i.i, label %bb13.i.i71.backedge bb1.i55.i.i: ; preds = %bb28.i.i - br i1 false, label %bb29.i.i, label %bb13.i.i71.backedge + br i1 false, label %bb29.i.i, label %bb13.i.i71.backedge bb29.i.i: ; preds = %bb1.i55.i.i - br i1 false, label %bb31.i.i, label %sat.exit.i.loopexit.loopexit2 + br i1 false, label %bb31.i.i, label %sat.exit.i.loopexit.loopexit2 bb31.i.i: ; preds = %bb29.i.i - br i1 false, label %bb33.i.i, label %bb1.i48.i.i + br i1 false, label %bb33.i.i, label %bb1.i48.i.i bb1.i48.i.i: ; preds = %bb31.i.i - br i1 false, label %sat.exit.i.loopexit.loopexit2, label %bb33.i.i + br i1 false, label %sat.exit.i.loopexit.loopexit2, label %bb33.i.i bb33.i.i.loopexit: ; preds = %bb27.i.i, %bb26.i.i - br label %bb33.i.i + br label %bb33.i.i bb33.i.i: ; preds = %bb33.i.i.loopexit, %bb1.i48.i.i, %bb31.i.i - br i1 false, label %bb34.i.i, label %bb35.i.i + br i1 false, label %bb34.i.i, label %bb35.i.i bb34.i.i: ; preds = %bb33.i.i - br i1 false, label %bb35.i.i, label %bb2.i44.i.i76 + br i1 false, label %bb35.i.i, label %bb2.i44.i.i76 bb2.i44.i.i76: ; preds = %bb34.i.i - br label %bb35.i.i + br label %bb35.i.i bb35.i.i: ; preds = %bb2.i44.i.i76, %bb34.i.i, %bb33.i.i - br i1 false, label %bb1.i37.i.i, label %bb.i35.i.i + br i1 false, label %bb1.i37.i.i, label %bb.i35.i.i bb.i35.i.i: ; preds = %bb35.i.i - br label %bb36.i.i + br label %bb36.i.i bb1.i37.i.i: ; preds = %bb35.i.i - br i1 false, label %bb37.i.i, label %bb36.i.i + br i1 false, label %bb37.i.i, label %bb36.i.i bb36.i.i: ; preds = %bb1.i37.i.i, %bb.i35.i.i - br label %bb25.i23.i.i + br label %bb25.i23.i.i bb.i18.i.i: ; preds = %bb25.i23.i.i - br i1 false, label %bb24.i22.i.i, label %bb22.i19.i.i + br i1 false, label %bb24.i22.i.i, label %bb22.i19.i.i bb22.i19.i.i: ; preds = %bb.i18.i.i - br label %bb24.i22.i.i + br label %bb24.i22.i.i bb24.i22.i.i: ; preds = %bb22.i19.i.i, %bb.i18.i.i - br label %bb25.i23.i.i + br label %bb25.i23.i.i bb25.i23.i.i: ; preds = %bb24.i22.i.i, %bb36.i.i - br i1 false, label %bb.i18.i.i, label %bb26.i24.i.i + br i1 false, label %bb.i18.i.i, label %bb26.i24.i.i bb26.i24.i.i: ; preds = %bb25.i23.i.i - br i1 false, label %bb27.i25.i.i, label %bb32.i.i.i + br i1 false, label %bb27.i25.i.i, label %bb32.i.i.i bb27.i25.i.i: ; preds = %bb26.i24.i.i - br label %bb32.i.i.i + br label %bb32.i.i.i bb32.i.i.i: ; preds = %bb27.i25.i.i, %bb26.i24.i.i - br label %bb64.i.i.i + br label %bb64.i.i.i bb33.i.i.i: ; preds = %bb64.i.i.i - br i1 false, label %bb60.i.i.i, label %bb34.i.i.i + br i1 false, label %bb60.i.i.i, label %bb34.i.i.i bb34.i.i.i: ; preds = %bb33.i.i.i - br i1 false, label %bb38.i.i.i, label %bb60.i.i.i + br i1 false, label %bb38.i.i.i, label %bb60.i.i.i bb38.i.i.i: ; preds = %bb34.i.i.i - br i1 false, label %bb39.i.i.i, label %bb48.i.i.i + br i1 false, label %bb39.i.i.i, label %bb48.i.i.i bb39.i.i.i: ; preds = %bb38.i.i.i - br i1 false, label %bb48.i.i.i, label %bb40.i.i.i + br i1 false, label %bb48.i.i.i, label %bb40.i.i.i bb40.i.i.i: ; preds = %bb39.i.i.i - br i1 false, label %bb60.i.i.i, label %bb45.i.i.i + br i1 false, label %bb60.i.i.i, label %bb45.i.i.i bb45.i.i.i: ; preds = %bb40.i.i.i - br label %bb60.i.i.i + br label %bb60.i.i.i bb48.i.i.i: ; preds = %bb39.i.i.i, %bb38.i.i.i - br i1 false, label %bb53.i.i.i, label %bb60.i.i.i + br i1 false, label %bb53.i.i.i, label %bb60.i.i.i bb53.i.i.i: ; preds = %bb48.i.i.i - br i1 false, label %bb60.i.i.i, label %bb58.i.i.i + br i1 false, label %bb60.i.i.i, label %bb58.i.i.i bb58.i.i.i: ; preds = %bb53.i.i.i - br i1 false, label %bb59.i.i.i, label %bb60.i.i.i + br i1 false, label %bb59.i.i.i, label %bb60.i.i.i bb59.i.i.i: ; preds = %bb58.i.i.i - br label %bb60.i.i.i + br label %bb60.i.i.i bb60.i.i.i: ; preds = %bb59.i.i.i, %bb58.i.i.i, %bb53.i.i.i, %bb48.i.i.i, %bb45.i.i.i, %bb40.i.i.i, %bb34.i.i.i, %bb33.i.i.i - %lcollect.i.i.i.1 = phi i32 [ %lcollect.i.i.i.2, %bb34.i.i.i ], [ %lcollect.i.i.i.2, %bb48.i.i.i ], [ %lcollect.i.i.i.2, %bb58.i.i.i ], [ %lcollect.i.i.i.2, %bb59.i.i.i ], [ %lcollect.i.i.i.2, %bb53.i.i.i ], [ %lcollect.i.i.i.2, %bb33.i.i.i ], [ %lcollect.i.i.i.2, %bb40.i.i.i ], [ 0, %bb45.i.i.i ] ; [#uses=1] - br label %bb64.i.i.i + %lcollect.i.i.i.1 = phi i32 [ %lcollect.i.i.i.2, %bb34.i.i.i ], [ %lcollect.i.i.i.2, %bb48.i.i.i ], [ %lcollect.i.i.i.2, %bb58.i.i.i ], [ %lcollect.i.i.i.2, %bb59.i.i.i ], [ %lcollect.i.i.i.2, %bb53.i.i.i ], [ %lcollect.i.i.i.2, %bb33.i.i.i ], [ %lcollect.i.i.i.2, %bb40.i.i.i ], [ 0, %bb45.i.i.i ] ; [#uses=1] + br label %bb64.i.i.i bb64.i.i.i: ; preds = %bb60.i.i.i, %bb32.i.i.i - %lcollect.i.i.i.2 = phi i32 [ 0, %bb32.i.i.i ], [ %lcollect.i.i.i.1, %bb60.i.i.i ] ; [#uses=8] - br i1 false, label %bb65.i.i.i, label %bb33.i.i.i + %lcollect.i.i.i.2 = phi i32 [ 0, %bb32.i.i.i ], [ %lcollect.i.i.i.1, %bb60.i.i.i ] ; [#uses=8] + br i1 false, label %bb65.i.i.i, label %bb33.i.i.i bb65.i.i.i: ; preds = %bb64.i.i.i - br i1 false, label %bb103.i.i.i.preheader, label %bb66.i.i.i.preheader + br i1 false, label %bb103.i.i.i.preheader, label %bb66.i.i.i.preheader bb66.i.i.i.preheader: ; preds = %bb65.i.i.i - br label %bb66.i.i.i + br label %bb66.i.i.i bb66.i.i.i: ; preds = %bb66.i.i.i.backedge, %bb66.i.i.i.preheader - br i1 false, label %bb67.i.i.i, label %bb68.i.i.i + br i1 false, label %bb67.i.i.i, label %bb68.i.i.i bb67.i.i.i: ; preds = %bb66.i.i.i - br label %bb68.i.i.i + br label %bb68.i.i.i bb68.i.i.i: ; preds = %bb67.i.i.i, %bb66.i.i.i - br i1 false, label %bb69.i.i.i, label %bb70.i.i.i + br i1 false, label %bb69.i.i.i, label %bb70.i.i.i bb69.i.i.i: ; preds = %bb68.i.i.i - br label %bb70.i.i.i + br label %bb70.i.i.i bb70.i.i.i: ; preds = %bb69.i.i.i, %bb68.i.i.i - br i1 false, label %bb71.i.i.i, label %bb72.i.i.i + br i1 false, label %bb71.i.i.i, label %bb72.i.i.i bb71.i.i.i: ; preds = %bb70.i.i.i - br label %bb72.i.i.i + br label %bb72.i.i.i bb72.i.i.i: ; preds = %bb71.i.i.i, %bb70.i.i.i - br label %bb73.i.i.i.outer + br label %bb73.i.i.i.outer bb73.i.i.i.outer: ; preds = %bb78.i.i.i, %bb72.i.i.i - br label %bb73.i.i.i + br label %bb73.i.i.i bb73.i.i.i: ; preds = %bb73.i.i.i, %bb73.i.i.i.outer - br i1 false, label %bb73.i.i.i, label %bb76.i.i.i.preheader + br i1 false, label %bb73.i.i.i, label %bb76.i.i.i.preheader bb76.i.i.i.preheader: ; preds = %bb73.i.i.i - br label %bb76.i.i.i + br label %bb76.i.i.i bb76.i.i.i: ; preds = %bb76.i.i.i, %bb76.i.i.i.preheader - br i1 false, label %bb77.i.i.i, label %bb76.i.i.i + br i1 false, label %bb77.i.i.i, label %bb76.i.i.i bb77.i.i.i: ; preds = %bb76.i.i.i - br i1 false, label %bb78.i.i.i, label %bb79.i.i.i + br i1 false, label %bb78.i.i.i, label %bb79.i.i.i bb78.i.i.i: ; preds = %bb77.i.i.i - br label %bb73.i.i.i.outer + br label %bb73.i.i.i.outer bb79.i.i.i: ; preds = %bb77.i.i.i - br i1 false, label %bb83.i.i.i, label %bb94.i.i.i + br i1 false, label %bb83.i.i.i, label %bb94.i.i.i bb83.i.i.i: ; preds = %bb79.i.i.i - br i1 false, label %bb84.i.i.i, label %bb88.i.i.i + br i1 false, label %bb84.i.i.i, label %bb88.i.i.i bb84.i.i.i: ; preds = %bb83.i.i.i - br i1 false, label %bb87.i.i.i, label %bb85.i.i.i + br i1 false, label %bb87.i.i.i, label %bb85.i.i.i bb85.i.i.i: ; preds = %bb84.i.i.i - br label %bb87.i.i.i + br label %bb87.i.i.i bb87.i.i.i: ; preds = %bb85.i.i.i, %bb84.i.i.i - br label %bb88.i.i.i + br label %bb88.i.i.i bb88.i.i.i: ; preds = %bb87.i.i.i, %bb83.i.i.i - br i1 false, label %bb89.i.i.i, label %bb93.i.i.i + br i1 false, label %bb89.i.i.i, label %bb93.i.i.i bb89.i.i.i: ; preds = %bb88.i.i.i - br i1 false, label %bb92.i.i.i, label %bb90.i.i.i + br i1 false, label %bb92.i.i.i, label %bb90.i.i.i bb90.i.i.i: ; preds = %bb89.i.i.i - br label %bb92.i.i.i + br label %bb92.i.i.i bb92.i.i.i: ; preds = %bb90.i.i.i, %bb89.i.i.i - br label %bb93.i.i.i + br label %bb93.i.i.i bb93.i.i.i: ; preds = %bb92.i.i.i, %bb88.i.i.i - br label %bb66.i.i.i.backedge + br label %bb66.i.i.i.backedge bb66.i.i.i.backedge: ; preds = %bb97.i.i.i, %bb94.i.i.i, %bb93.i.i.i - br label %bb66.i.i.i + br label %bb66.i.i.i bb94.i.i.i: ; preds = %bb79.i.i.i - br i1 false, label %bb66.i.i.i.backedge, label %bb96.i.i.i + br i1 false, label %bb66.i.i.i.backedge, label %bb96.i.i.i bb96.i.i.i: ; preds = %bb94.i.i.i - br i1 false, label %bb97.i.i.i, label %bb103.i.i.i.preheader.loopexit + br i1 false, label %bb97.i.i.i, label %bb103.i.i.i.preheader.loopexit bb103.i.i.i.preheader.loopexit: ; preds = %bb96.i.i.i - br label %bb103.i.i.i.preheader + br label %bb103.i.i.i.preheader bb103.i.i.i.preheader: ; preds = %bb103.i.i.i.preheader.loopexit, %bb65.i.i.i - br label %bb103.i.i.i + br label %bb103.i.i.i bb97.i.i.i: ; preds = %bb96.i.i.i - br label %bb66.i.i.i.backedge + br label %bb66.i.i.i.backedge bb100.i.i.i: ; preds = %bb103.i.i.i - br i1 false, label %bb101.i.i.i, label %bb102.i.i.i + br i1 false, label %bb101.i.i.i, label %bb102.i.i.i bb101.i.i.i: ; preds = %bb100.i.i.i - br label %bb102.i.i.i + br label %bb102.i.i.i bb102.i.i.i: ; preds = %bb101.i.i.i, %bb100.i.i.i - br label %bb103.i.i.i + br label %bb103.i.i.i bb103.i.i.i: ; preds = %bb102.i.i.i, %bb103.i.i.i.preheader - br i1 false, label %bb100.i.i.i, label %bb109.i.i.i.preheader + br i1 false, label %bb100.i.i.i, label %bb109.i.i.i.preheader bb109.i.i.i.preheader: ; preds = %bb103.i.i.i - br label %bb109.i.i.i + br label %bb109.i.i.i bb105.i.i.i: ; preds = %bb109.i.i.i - br label %bb107.i.i.i + br label %bb107.i.i.i bb106.i.i.i: ; preds = %bb107.i.i.i - br label %bb107.i.i.i + br label %bb107.i.i.i bb107.i.i.i: ; preds = %bb106.i.i.i, %bb105.i.i.i - br i1 false, label %bb106.i.i.i, label %bb108.i.i.i + br i1 false, label %bb106.i.i.i, label %bb108.i.i.i bb108.i.i.i: ; preds = %bb107.i.i.i - br label %bb109.i.i.i + br label %bb109.i.i.i bb109.i.i.i: ; preds = %bb108.i.i.i, %bb109.i.i.i.preheader - br i1 false, label %bb110.i.i.i, label %bb105.i.i.i + br i1 false, label %bb110.i.i.i, label %bb105.i.i.i bb110.i.i.i: ; preds = %bb109.i.i.i - %0 = sub i32 0, %lcollect.i.i.i.2 ; [#uses=1] - %1 = add i32 %0, 1 ; [#uses=1] - br label %bb113.i.i.i + %0 = sub i32 0, %lcollect.i.i.i.2 ; [#uses=1] + %1 = add i32 %0, 1 ; [#uses=1] + br label %bb113.i.i.i bb111.i.i.i: ; preds = %bb113.i.i.i - br i1 false, label %bb114.i.i.i, label %bb113.i.i.i + br i1 false, label %bb114.i.i.i, label %bb113.i.i.i bb113.i.i.i: ; preds = %bb111.i.i.i, %bb110.i.i.i - br i1 false, label %bb111.i.i.i, label %bb114.i.i.i + br i1 false, label %bb111.i.i.i, label %bb114.i.i.i bb114.i.i.i: ; preds = %bb113.i.i.i, %bb111.i.i.i - %2 = lshr i32 %1, 1 ; [#uses=2] - br i1 false, label %bb116.i.i.i, label %bb124.i.i.i + %2 = lshr i32 %1, 1 ; [#uses=2] + br i1 false, label %bb116.i.i.i, label %bb124.i.i.i bb116.i.i.i: ; preds = %bb114.i.i.i - br i1 false, label %bb117.i.i.i.preheader, label %bb122.i.i.i.preheader + br i1 false, label %bb117.i.i.i.preheader, label %bb122.i.i.i.preheader bb122.i.i.i.preheader: ; preds = %bb116.i.i.i - br label %bb122.i.i.i + br label %bb122.i.i.i bb117.i.i.i.preheader: ; preds = %bb116.i.i.i - br label %bb117.i.i.i + br label %bb117.i.i.i bb117.i.i.i: ; preds = %bb118.i.i.i, %bb117.i.i.i.preheader - %target.i.i.i.1 = phi i32 [ %3, %bb118.i.i.i ], [ %2, %bb117.i.i.i.preheader ] ; [#uses=1] - %3 = add i32 %target.i.i.i.1, 1 ; [#uses=2] - br i1 false, label %bb118.i.i.i, label %bb124.i.i.i.loopexit + %target.i.i.i.1 = phi i32 [ %3, %bb118.i.i.i ], [ %2, %bb117.i.i.i.preheader ] ; [#uses=1] + %3 = add i32 %target.i.i.i.1, 1 ; [#uses=2] + br i1 false, label %bb118.i.i.i, label %bb124.i.i.i.loopexit bb118.i.i.i: ; preds = %bb117.i.i.i - br i1 false, label %bb117.i.i.i, label %bb124.i.i.i.loopexit + br i1 false, label %bb117.i.i.i, label %bb124.i.i.i.loopexit bb122.i.i.i: ; preds = %bb123.i.i.i, %bb122.i.i.i.preheader - %target.i.i.i.2 = phi i32 [ %4, %bb123.i.i.i ], [ %2, %bb122.i.i.i.preheader ] ; [#uses=2] - br i1 false, label %bb124.i.i.i.loopexit1, label %bb123.i.i.i + %target.i.i.i.2 = phi i32 [ %4, %bb123.i.i.i ], [ %2, %bb122.i.i.i.preheader ] ; [#uses=2] + br i1 false, label %bb124.i.i.i.loopexit1, label %bb123.i.i.i bb123.i.i.i: ; preds = %bb122.i.i.i - %4 = add i32 %target.i.i.i.2, -1 ; [#uses=1] - br i1 false, label %bb122.i.i.i, label %bb124.i.i.i.loopexit1 + %4 = add i32 %target.i.i.i.2, -1 ; [#uses=1] + br i1 false, label %bb122.i.i.i, label %bb124.i.i.i.loopexit1 bb124.i.i.i.loopexit: ; preds = %bb118.i.i.i, %bb117.i.i.i - br label %bb124.i.i.i + br label %bb124.i.i.i bb124.i.i.i.loopexit1: ; preds = %bb123.i.i.i, %bb122.i.i.i - br label %bb124.i.i.i + br label %bb124.i.i.i bb124.i.i.i: ; preds = %bb124.i.i.i.loopexit1, %bb124.i.i.i.loopexit, %bb114.i.i.i - %target.i.i.i.0 = phi i32 [ 0, %bb114.i.i.i ], [ %3, %bb124.i.i.i.loopexit ], [ %target.i.i.i.2, %bb124.i.i.i.loopexit1 ] ; [#uses=0] - br label %bb132.i.i.i.outer + %target.i.i.i.0 = phi i32 [ 0, %bb114.i.i.i ], [ %3, %bb124.i.i.i.loopexit ], [ %target.i.i.i.2, %bb124.i.i.i.loopexit1 ] ; [#uses=0] + br label %bb132.i.i.i.outer bb125.i.i.i: ; preds = %bb132.i.i.i - br i1 false, label %bb132.i.i.i, label %bb130.i.i.i + br i1 false, label %bb132.i.i.i, label %bb130.i.i.i bb130.i.i.i: ; preds = %bb125.i.i.i - br label %bb132.i.i.i.outer + br label %bb132.i.i.i.outer bb132.i.i.i.outer: ; preds = %bb130.i.i.i, %bb124.i.i.i - br label %bb132.i.i.i + br label %bb132.i.i.i bb132.i.i.i: ; preds = %bb132.i.i.i.outer, %bb125.i.i.i - br i1 false, label %bb125.i.i.i, label %bb133.i.i.i + br i1 false, label %bb125.i.i.i, label %bb133.i.i.i bb133.i.i.i: ; preds = %bb132.i.i.i - br i1 false, label %bb136.i.i.i, label %bb134.i.i.i + br i1 false, label %bb136.i.i.i, label %bb134.i.i.i bb134.i.i.i: ; preds = %bb133.i.i.i - br i1 false, label %bb136.i.i.i, label %bb135.i.i.i + br i1 false, label %bb136.i.i.i, label %bb135.i.i.i bb135.i.i.i: ; preds = %bb134.i.i.i - br label %bb136.i.i.i + br label %bb136.i.i.i bb136.i.i.i: ; preds = %bb135.i.i.i, %bb134.i.i.i, %bb133.i.i.i - br i1 false, label %bb137.i.i.i, label %bb37.i.i + br i1 false, label %bb137.i.i.i, label %bb37.i.i bb137.i.i.i: ; preds = %bb136.i.i.i - br label %bb37.i.i + br label %bb37.i.i bb37.i.i: ; preds = %bb137.i.i.i, %bb136.i.i.i, %bb1.i37.i.i - br i1 false, label %bb40.i.i, label %bb38.i.i + br i1 false, label %bb40.i.i, label %bb38.i.i bb38.i.i: ; preds = %bb37.i.i - br i1 false, label %bb39.i.i, label %bb40.i.i + br i1 false, label %bb39.i.i, label %bb40.i.i bb39.i.i: ; preds = %bb38.i.i - br i1 false, label %bb17.i.i.i, label %bb3.i12.i.i + br i1 false, label %bb17.i.i.i, label %bb3.i12.i.i bb3.i12.i.i: ; preds = %bb39.i.i - br label %bb5.i14.i.i + br label %bb5.i14.i.i bb5.i14.i.i: ; preds = %bb8.i.i.i79, %bb3.i12.i.i - br i1 false, label %bb6.i15.i.i, label %bb9.i.i.i80 + br i1 false, label %bb6.i15.i.i, label %bb9.i.i.i80 bb6.i15.i.i: ; preds = %bb5.i14.i.i - br i1 false, label %bb7.i.i.i78, label %bb9.i.i.i80 + br i1 false, label %bb7.i.i.i78, label %bb9.i.i.i80 bb7.i.i.i78: ; preds = %bb6.i15.i.i - br i1 false, label %bb9.i.i.i80, label %bb8.i.i.i79 + br i1 false, label %bb9.i.i.i80, label %bb8.i.i.i79 bb8.i.i.i79: ; preds = %bb7.i.i.i78 - br i1 false, label %bb9.i.i.i80, label %bb5.i14.i.i + br i1 false, label %bb9.i.i.i80, label %bb5.i14.i.i bb9.i.i.i80: ; preds = %bb8.i.i.i79, %bb7.i.i.i78, %bb6.i15.i.i, %bb5.i14.i.i - br i1 false, label %bb16.i.i.i, label %bb10.i.i.i81 + br i1 false, label %bb16.i.i.i, label %bb10.i.i.i81 bb10.i.i.i81: ; preds = %bb9.i.i.i80 - br i1 false, label %bb11.i.i.i, label %bb15.i.i.i + br i1 false, label %bb11.i.i.i, label %bb15.i.i.i bb11.i.i.i: ; preds = %bb10.i.i.i81 - br i1 false, label %bb16.i.i.i, label %bb15.i.i.i + br i1 false, label %bb16.i.i.i, label %bb15.i.i.i bb15.i.i.i: ; preds = %bb11.i.i.i, %bb10.i.i.i81 - br label %bb16.i.i.i + br label %bb16.i.i.i bb16.i.i.i: ; preds = %bb15.i.i.i, %bb11.i.i.i, %bb9.i.i.i80 - br label %bb17.i.i.i + br label %bb17.i.i.i bb17.i.i.i: ; preds = %bb16.i.i.i, %bb39.i.i - br i1 false, label %bb18.i.i.i, label %bb25.i.i.i + br i1 false, label %bb18.i.i.i, label %bb25.i.i.i bb18.i.i.i: ; preds = %bb17.i.i.i - br i1 false, label %bb24.i.i.i, label %bb23.i.i.i + br i1 false, label %bb24.i.i.i, label %bb23.i.i.i bb23.i.i.i: ; preds = %bb18.i.i.i - br label %bb24.i.i.i + br label %bb24.i.i.i bb24.i.i.i: ; preds = %bb23.i.i.i, %bb18.i.i.i - br label %bb29.i.i.i + br label %bb29.i.i.i bb25.i.i.i: ; preds = %bb17.i.i.i - br i1 false, label %bb29.i.i.i, label %bb27.i.i.i + br i1 false, label %bb29.i.i.i, label %bb27.i.i.i bb27.i.i.i: ; preds = %bb25.i.i.i - br i1 false, label %bb29.i.i.i, label %bb28.i.i.i + br i1 false, label %bb29.i.i.i, label %bb28.i.i.i bb28.i.i.i: ; preds = %bb27.i.i.i - br i1 false, label %bb29.i.i.i, label %bb.i4.i.i.i + br i1 false, label %bb29.i.i.i, label %bb.i4.i.i.i bb.i4.i.i.i: ; preds = %bb28.i.i.i - br i1 false, label %bb4.i.i16.i.i, label %bb29.i.i.i + br i1 false, label %bb4.i.i16.i.i, label %bb29.i.i.i bb4.i.i16.i.i: ; preds = %bb.i4.i.i.i - br label %bb29.i.i.i + br label %bb29.i.i.i bb29.i.i.i: ; preds = %bb4.i.i16.i.i, %bb.i4.i.i.i, %bb28.i.i.i, %bb27.i.i.i, %bb25.i.i.i, %bb24.i.i.i - br label %bb40.i.i + br label %bb40.i.i bb40.i.i: ; preds = %bb29.i.i.i, %bb38.i.i, %bb37.i.i - br i1 false, label %bb9.i.i.i.i.preheader, label %bb2.i.i.i87 + br i1 false, label %bb9.i.i.i.i.preheader, label %bb2.i.i.i87 bb9.i.i.i.i.preheader: ; preds = %bb40.i.i - br label %bb9.i.i.i.i + br label %bb9.i.i.i.i bb.i.i.i.i84: ; preds = %bb9.i.i.i.i - switch i8 0, label %bb8.i.i.i.i [ - i8 -1, label %bb1.i.i.i.i85 - i8 1, label %bb9.i.i.i.i - ] + switch i8 0, label %bb8.i.i.i.i [ + i8 -1, label %bb1.i.i.i.i85 + i8 1, label %bb9.i.i.i.i + ] bb1.i.i.i.i85: ; preds = %bb.i.i.i.i84 - br i1 false, label %bb5.i.i.i.i, label %bb2.i.i.i87 + br i1 false, label %bb5.i.i.i.i, label %bb2.i.i.i87 bb5.i.i.i.i: ; preds = %bb1.i.i.i.i85 - br label %bb2.i.i.i87 + br label %bb2.i.i.i87 bb8.i.i.i.i: ; preds = %bb.i.i.i.i84 - br i1 false, label %bb2.i.i.i87, label %bb6.i.i.i95 + br i1 false, label %bb2.i.i.i87, label %bb6.i.i.i95 bb9.i.i.i.i: ; preds = %bb.i.i.i.i84, %bb9.i.i.i.i.preheader - br i1 false, label %bb.i.i.i.i84, label %bb10.i.i.i.i + br i1 false, label %bb.i.i.i.i84, label %bb10.i.i.i.i bb10.i.i.i.i: ; preds = %bb9.i.i.i.i - br label %bb2.i.i.i87 + br label %bb2.i.i.i87 bb2.i.i.i87: ; preds = %bb10.i.i.i.i, %bb8.i.i.i.i, %bb5.i.i.i.i, %bb1.i.i.i.i85, %bb40.i.i - br i1 false, label %bb3.i.i.i88, label %decide.exit.i.i + br i1 false, label %bb3.i.i.i88, label %decide.exit.i.i bb3.i.i.i88: ; preds = %bb2.i.i.i87 - br i1 false, label %bb4.i.i.i90, label %bb1.i23.i.i.i + br i1 false, label %bb4.i.i.i90, label %bb1.i23.i.i.i bb1.i23.i.i.i: ; preds = %bb3.i.i.i88 - br i1 false, label %decide.exit.i.i, label %bb4.i.i.i90 + br i1 false, label %decide.exit.i.i, label %bb4.i.i.i90 bb4.i.i.i90: ; preds = %bb1.i23.i.i.i, %bb3.i.i.i88 - br i1 false, label %bb1.i9.i.i.i, label %bb5.i.i.i94 + br i1 false, label %bb1.i9.i.i.i, label %bb5.i.i.i94 bb1.i9.i.i.i: ; preds = %bb4.i.i.i90 - br i1 false, label %bb.i.i27.i.i.i.i, label %bb1.i.i28.i.i.i.i + br i1 false, label %bb.i.i27.i.i.i.i, label %bb1.i.i28.i.i.i.i bb.i.i27.i.i.i.i: ; preds = %bb1.i9.i.i.i - br label %int2lit.exit32.i.i.i.i + br label %int2lit.exit32.i.i.i.i bb1.i.i28.i.i.i.i: ; preds = %bb1.i9.i.i.i - br label %int2lit.exit32.i.i.i.i + br label %int2lit.exit32.i.i.i.i int2lit.exit32.i.i.i.i: ; preds = %bb1.i.i28.i.i.i.i, %bb.i.i27.i.i.i.i - br i1 false, label %bb8.i19.i.i.i, label %bb2.i.i.i.i91 + br i1 false, label %bb8.i19.i.i.i, label %bb2.i.i.i.i91 bb2.i.i.i.i91: ; preds = %int2lit.exit32.i.i.i.i - br label %bb4.i.i.i.i + br label %bb4.i.i.i.i bb3.i.i.i.i92: ; preds = %gcd.exit.i.i.i.i - br label %bb4.i.i.i.i + br label %bb4.i.i.i.i bb4.i.i.i.i: ; preds = %bb3.i.i.i.i92, %bb2.i.i.i.i91 - br label %bb3.i.i13.i.i.i + br label %bb3.i.i13.i.i.i bb2.i.i12.i.i.i: ; preds = %bb3.i.i13.i.i.i - br label %bb3.i.i13.i.i.i + br label %bb3.i.i13.i.i.i bb3.i.i13.i.i.i: ; preds = %bb2.i.i12.i.i.i, %bb4.i.i.i.i - br i1 false, label %gcd.exit.i.i.i.i, label %bb2.i.i12.i.i.i + br i1 false, label %gcd.exit.i.i.i.i, label %bb2.i.i12.i.i.i gcd.exit.i.i.i.i: ; preds = %bb3.i.i13.i.i.i - br i1 false, label %bb5.i14.i.i.i.preheader, label %bb3.i.i.i.i92 + br i1 false, label %bb5.i14.i.i.i.preheader, label %bb3.i.i.i.i92 bb5.i14.i.i.i.preheader: ; preds = %gcd.exit.i.i.i.i - br label %bb5.i14.i.i.i + br label %bb5.i14.i.i.i bb5.i14.i.i.i: ; preds = %int2lit.exit.i.i.i.i, %bb5.i14.i.i.i.preheader - br i1 false, label %bb.i.i.i17.i.i.i, label %bb1.i.i.i18.i.i.i + br i1 false, label %bb.i.i.i17.i.i.i, label %bb1.i.i.i18.i.i.i bb.i.i.i17.i.i.i: ; preds = %bb5.i14.i.i.i - br label %int2lit.exit.i.i.i.i + br label %int2lit.exit.i.i.i.i bb1.i.i.i18.i.i.i: ; preds = %bb5.i14.i.i.i - br label %int2lit.exit.i.i.i.i + br label %int2lit.exit.i.i.i.i int2lit.exit.i.i.i.i: ; preds = %bb1.i.i.i18.i.i.i, %bb.i.i.i17.i.i.i - br i1 false, label %bb8.i19.i.i.i.loopexit, label %bb5.i14.i.i.i + br i1 false, label %bb8.i19.i.i.i.loopexit, label %bb5.i14.i.i.i bb8.i19.i.i.i.loopexit: ; preds = %int2lit.exit.i.i.i.i - br label %bb8.i19.i.i.i + br label %bb8.i19.i.i.i bb8.i19.i.i.i: ; preds = %bb8.i19.i.i.i.loopexit, %int2lit.exit32.i.i.i.i - br i1 false, label %bb5.i.i.i94, label %bb6.i.i.i95 + br i1 false, label %bb5.i.i.i94, label %bb6.i.i.i95 bb5.i.i.i94: ; preds = %bb8.i19.i.i.i, %bb4.i.i.i90 - br label %bb.i2.i.i.i + br label %bb.i2.i.i.i bb.i2.i.i.i: ; preds = %hpop.exit.i.i.i.i, %bb5.i.i.i94 - br i1 false, label %hpop.exit.i.i.i.i, label %bb1.i.i.i.i.i + br i1 false, label %hpop.exit.i.i.i.i, label %bb1.i.i.i.i.i bb1.i.i.i.i.i: ; preds = %bb.i2.i.i.i - br label %bb2.i.i.i.i.i + br label %bb2.i.i.i.i.i bb2.i.i.i.i.i: ; preds = %bb11.i.i.i.i.i, %bb1.i.i.i.i.i - br i1 false, label %bb3.i.i.i.i.i, label %bb12.i.i.i.i.i + br i1 false, label %bb3.i.i.i.i.i, label %bb12.i.i.i.i.i bb3.i.i.i.i.i: ; preds = %bb2.i.i.i.i.i - br i1 false, label %bb4.i.i.i.i.i, label %bb1.i.i.i.i.i.i + br i1 false, label %bb4.i.i.i.i.i, label %bb1.i.i.i.i.i.i bb1.i.i.i.i.i.i: ; preds = %bb3.i.i.i.i.i - br i1 false, label %bb8.i.i.i.i.i, label %bb3.i.i.i.i.i.i + br i1 false, label %bb8.i.i.i.i.i, label %bb3.i.i.i.i.i.i bb3.i.i.i.i.i.i: ; preds = %bb1.i.i.i.i.i.i - br i1 false, label %bb4.i.i.i.i.i, label %bb8.i.i.i.i.i + br i1 false, label %bb4.i.i.i.i.i, label %bb8.i.i.i.i.i bb4.i.i.i.i.i: ; preds = %bb3.i.i.i.i.i.i, %bb3.i.i.i.i.i - br i1 false, label %bb5.i.i.i.i.i, label %bb11.i.i.i.i.i + br i1 false, label %bb5.i.i.i.i.i, label %bb11.i.i.i.i.i bb5.i.i.i.i.i: ; preds = %bb4.i.i.i.i.i - br i1 false, label %bb6.i.i.i.i.i, label %bb1.i21.i.i.i.i.i + br i1 false, label %bb6.i.i.i.i.i, label %bb1.i21.i.i.i.i.i bb1.i21.i.i.i.i.i: ; preds = %bb5.i.i.i.i.i - br i1 false, label %bb11.i.i.i.i.i, label %bb3.i24.i.i.i.i.i + br i1 false, label %bb11.i.i.i.i.i, label %bb3.i24.i.i.i.i.i bb3.i24.i.i.i.i.i: ; preds = %bb1.i21.i.i.i.i.i - br i1 false, label %bb6.i.i.i.i.i, label %bb11.i.i.i.i.i + br i1 false, label %bb6.i.i.i.i.i, label %bb11.i.i.i.i.i bb6.i.i.i.i.i: ; preds = %bb3.i24.i.i.i.i.i, %bb5.i.i.i.i.i - br label %bb11.i.i.i.i.i + br label %bb11.i.i.i.i.i bb8.i.i.i.i.i: ; preds = %bb3.i.i.i.i.i.i, %bb1.i.i.i.i.i.i - br i1 false, label %bb9.i.i.i.i.i, label %bb12.i.i.i.i.i + br i1 false, label %bb9.i.i.i.i.i, label %bb12.i.i.i.i.i bb9.i.i.i.i.i: ; preds = %bb8.i.i.i.i.i - br i1 false, label %bb11.i.i.i.i.i, label %bb1.i8.i.i.i.i.i + br i1 false, label %bb11.i.i.i.i.i, label %bb1.i8.i.i.i.i.i bb1.i8.i.i.i.i.i: ; preds = %bb9.i.i.i.i.i - br i1 false, label %bb12.i.i.i.i.i, label %bb3.i11.i.i.i.i.i + br i1 false, label %bb12.i.i.i.i.i, label %bb3.i11.i.i.i.i.i bb3.i11.i.i.i.i.i: ; preds = %bb1.i8.i.i.i.i.i - br i1 false, label %bb11.i.i.i.i.i, label %bb12.i.i.i.i.i + br i1 false, label %bb11.i.i.i.i.i, label %bb12.i.i.i.i.i bb11.i.i.i.i.i: ; preds = %bb3.i11.i.i.i.i.i, %bb9.i.i.i.i.i, %bb6.i.i.i.i.i, %bb3.i24.i.i.i.i.i, %bb1.i21.i.i.i.i.i, %bb4.i.i.i.i.i - br label %bb2.i.i.i.i.i + br label %bb2.i.i.i.i.i bb12.i.i.i.i.i: ; preds = %bb3.i11.i.i.i.i.i, %bb1.i8.i.i.i.i.i, %bb8.i.i.i.i.i, %bb2.i.i.i.i.i - br label %hpop.exit.i.i.i.i + br label %hpop.exit.i.i.i.i hpop.exit.i.i.i.i: ; preds = %bb12.i.i.i.i.i, %bb.i2.i.i.i - br i1 false, label %sdecide.exit.i.i.i, label %bb.i2.i.i.i + br i1 false, label %sdecide.exit.i.i.i, label %bb.i2.i.i.i sdecide.exit.i.i.i: ; preds = %hpop.exit.i.i.i.i - br label %bb6.i.i.i95 + br label %bb6.i.i.i95 bb6.i.i.i95: ; preds = %sdecide.exit.i.i.i, %bb8.i19.i.i.i, %bb8.i.i.i.i - br label %decide.exit.i.i + br label %decide.exit.i.i decide.exit.i.i: ; preds = %bb6.i.i.i95, %bb1.i23.i.i.i, %bb2.i.i.i87 - br i1 false, label %bb42.i.i, label %sat.exit.i.loopexit.loopexit2 + br i1 false, label %bb42.i.i, label %sat.exit.i.loopexit.loopexit2 bb42.i.i: ; preds = %decide.exit.i.i - br label %bb13.i.i71.outer + br label %bb13.i.i71.outer sat.exit.i.loopexit.loopexit: ; preds = %bb24.i.i, %bb1.i68.i.i, %incincs.exit.i.i - br label %sat.exit.i.loopexit + br label %sat.exit.i.loopexit sat.exit.i.loopexit.loopexit2: ; preds = %decide.exit.i.i, %bb1.i48.i.i, %bb29.i.i - br label %sat.exit.i.loopexit + br label %sat.exit.i.loopexit sat.exit.i.loopexit: ; preds = %sat.exit.i.loopexit.loopexit2, %sat.exit.i.loopexit.loopexit - br label %sat.exit.i + br label %sat.exit.i sat.exit.i: ; preds = %sat.exit.i.loopexit, %bb1.i61.i.i, %bb8.i.i67, %bb1.i.i.i63, %bb3.i.i59 - br i1 false, label %bb7.i, label %bb2.i96 + br i1 false, label %bb7.i, label %bb2.i96 bb2.i96: ; preds = %sat.exit.i - switch i32 0, label %bb5.i99 [ - i32 10, label %bb4.i98 - i32 20, label %bb6.i100 - ] + switch i32 0, label %bb5.i99 [ + i32 10, label %bb4.i98 + i32 20, label %bb6.i100 + ] bb4.i98: ; preds = %bb2.i96 - br label %bb6.i100 + br label %bb6.i100 bb5.i99: ; preds = %bb2.i96 - br label %bb6.i100 + br label %bb6.i100 bb6.i100: ; preds = %bb5.i99, %bb4.i98, %bb2.i96 - br label %bb7.i + br label %bb7.i bb7.i: ; preds = %bb6.i100, %sat.exit.i - br i1 false, label %bb.i1.i, label %picosat_sat.exit + br i1 false, label %bb.i1.i, label %picosat_sat.exit bb.i1.i: ; preds = %bb7.i - br label %picosat_sat.exit + br label %picosat_sat.exit picosat_sat.exit: ; preds = %bb.i1.i, %bb7.i - switch i32 0, label %bb166 [ - i32 20, label %bb150 - i32 10, label %bb163 - ] + switch i32 0, label %bb166 [ + i32 20, label %bb150 + i32 10, label %bb163 + ] bb150: ; preds = %picosat_sat.exit - br i1 false, label %bb152, label %bb151 + br i1 false, label %bb152, label %bb151 bb151: ; preds = %bb150 - br label %bb152 + br label %bb152 bb152: ; preds = %bb151, %bb150 - br i1 false, label %bb154, label %bb153 + br i1 false, label %bb154, label %bb153 bb153: ; preds = %bb152 - br label %bb154 + br label %bb154 bb154: ; preds = %bb153, %bb152 - br i1 false, label %bb157, label %bb156 + br i1 false, label %bb157, label %bb156 bb156: ; preds = %bb154 - br label %bb157 + br label %bb157 bb157: ; preds = %bb156, %bb154 - br i1 false, label %bb159, label %bb158 + br i1 false, label %bb159, label %bb158 bb158: ; preds = %bb157 - br label %bb159 + br label %bb159 bb159: ; preds = %bb158, %bb157 - br i1 false, label %bb167, label %bb160 + br i1 false, label %bb167, label %bb160 bb160: ; preds = %bb159 - br label %bb167 + br label %bb167 bb163: ; preds = %picosat_sat.exit - br i1 false, label %bb167, label %bb164 + br i1 false, label %bb167, label %bb164 bb164: ; preds = %bb163 - br label %bb4.i + br label %bb4.i bb.i11: ; preds = %bb4.i - br i1 false, label %bb.i.i12, label %bb1.i.i14 + br i1 false, label %bb.i.i12, label %bb1.i.i14 bb.i.i12: ; preds = %bb.i11 - unreachable + unreachable bb1.i.i14: ; preds = %bb.i11 - br i1 false, label %bb3.i.i16, label %bb2.i.i15 + br i1 false, label %bb3.i.i16, label %bb2.i.i15 bb2.i.i15: ; preds = %bb1.i.i14 - unreachable + unreachable bb3.i.i16: ; preds = %bb1.i.i14 - br i1 false, label %bb3.i, label %bb7.i.i + br i1 false, label %bb3.i, label %bb7.i.i bb7.i.i: ; preds = %bb3.i.i16 - br i1 false, label %bb.i.i.i.i17, label %bb1.i.i.i.i18 + br i1 false, label %bb.i.i.i.i17, label %bb1.i.i.i.i18 bb.i.i.i.i17: ; preds = %bb7.i.i - br label %int2lit.exit.i.i + br label %int2lit.exit.i.i bb1.i.i.i.i18: ; preds = %bb7.i.i - br label %int2lit.exit.i.i + br label %int2lit.exit.i.i int2lit.exit.i.i: ; preds = %bb1.i.i.i.i18, %bb.i.i.i.i17 - br i1 false, label %bb3.i, label %bb9.i.i + br i1 false, label %bb3.i, label %bb9.i.i bb9.i.i: ; preds = %int2lit.exit.i.i - br label %bb3.i + br label %bb3.i bb3.i: ; preds = %bb9.i.i, %int2lit.exit.i.i, %bb3.i.i16 - br label %bb4.i + br label %bb4.i bb4.i: ; preds = %bb3.i, %bb164 - br i1 false, label %bb5.i, label %bb.i11 + br i1 false, label %bb5.i, label %bb.i11 bb5.i: ; preds = %bb4.i - br i1 false, label %bb6.i, label %bb167 + br i1 false, label %bb6.i, label %bb167 bb6.i: ; preds = %bb5.i - br label %bb167 + br label %bb167 bb166: ; preds = %picosat_sat.exit - br label %bb167 + br label %bb167 bb167: ; preds = %bb166, %bb6.i, %bb5.i, %bb163, %bb160, %bb159, %picosat_print.exit - br i1 false, label %bb168, label %bb170 + br i1 false, label %bb168, label %bb170 bb168: ; preds = %bb167 - br i1 false, label %bb170, label %bb169 + br i1 false, label %bb170, label %bb169 bb169: ; preds = %bb168 - br i1 false, label %bb.i7, label %picosat_time_stamp.exit9 + br i1 false, label %bb.i7, label %picosat_time_stamp.exit9 bb.i7: ; preds = %bb169 - br label %picosat_time_stamp.exit9 + br label %picosat_time_stamp.exit9 picosat_time_stamp.exit9: ; preds = %bb.i7, %bb169 - br label %bb170 + br label %bb170 bb170: ; preds = %picosat_time_stamp.exit9, %bb168, %bb167, %bb129 - br i1 false, label %bb.i.i3, label %picosat_leave.exit + br i1 false, label %bb.i.i3, label %picosat_leave.exit bb.i.i3: ; preds = %bb170 - br label %picosat_leave.exit + br label %picosat_leave.exit picosat_leave.exit: ; preds = %bb.i.i3, %bb170 - br i1 false, label %bb1.i.i, label %bb.i.i + br i1 false, label %bb1.i.i, label %bb.i.i bb.i.i: ; preds = %picosat_leave.exit - unreachable + unreachable bb1.i.i: ; preds = %picosat_leave.exit - br label %bb9.i.i.i + br label %bb9.i.i.i bb3.i.i.i: ; preds = %bb9.i.i.i - br i1 false, label %bb5.i.i.i, label %bb4.i.i.i + br i1 false, label %bb5.i.i.i, label %bb4.i.i.i bb4.i.i.i: ; preds = %bb3.i.i.i - br label %bb5.i.i.i + br label %bb5.i.i.i bb5.i.i.i: ; preds = %bb4.i.i.i, %bb3.i.i.i - br label %bb9.i.i.i + br label %bb9.i.i.i bb9.i.i.i: ; preds = %bb5.i.i.i, %bb1.i.i - br i1 false, label %bb10.i.i.i, label %bb3.i.i.i + br i1 false, label %bb10.i.i.i, label %bb3.i.i.i bb10.i.i.i: ; preds = %bb9.i.i.i - br i1 false, label %delete.exit.i.i.i, label %bb1.i.i.i.i + br i1 false, label %delete.exit.i.i.i, label %bb1.i.i.i.i bb1.i.i.i.i: ; preds = %bb10.i.i.i - br label %delete.exit.i.i.i + br label %delete.exit.i.i.i delete.exit.i.i.i: ; preds = %bb1.i.i.i.i, %bb10.i.i.i - br i1 false, label %delete_clauses.exit.i.i, label %bb1.i7.i.i.i + br i1 false, label %delete_clauses.exit.i.i, label %bb1.i7.i.i.i bb1.i7.i.i.i: ; preds = %delete.exit.i.i.i - br label %delete_clauses.exit.i.i + br label %delete_clauses.exit.i.i delete_clauses.exit.i.i: ; preds = %bb1.i7.i.i.i, %delete.exit.i.i.i - br label %bb3.i.i + br label %bb3.i.i bb2.i.i: ; preds = %bb3.i.i - br i1 false, label %lrelease.exit.i.i, label %bb1.i.i23.i.i + br i1 false, label %lrelease.exit.i.i, label %bb1.i.i23.i.i bb1.i.i23.i.i: ; preds = %bb2.i.i - br label %lrelease.exit.i.i + br label %lrelease.exit.i.i lrelease.exit.i.i: ; preds = %bb1.i.i23.i.i, %bb2.i.i - br label %bb3.i.i + br label %bb3.i.i bb3.i.i: ; preds = %lrelease.exit.i.i, %delete_clauses.exit.i.i - br i1 false, label %bb4.i.i, label %bb2.i.i + br i1 false, label %bb4.i.i, label %bb2.i.i bb4.i.i: ; preds = %bb3.i.i - br i1 false, label %delete.exit214.i.i, label %bb1.i208.i.i + br i1 false, label %delete.exit214.i.i, label %bb1.i208.i.i bb1.i208.i.i: ; preds = %bb4.i.i - br label %delete.exit214.i.i + br label %delete.exit214.i.i delete.exit214.i.i: ; preds = %bb1.i208.i.i, %bb4.i.i - br i1 false, label %delete.exit203.i.i, label %bb1.i197.i.i + br i1 false, label %delete.exit203.i.i, label %bb1.i197.i.i bb1.i197.i.i: ; preds = %delete.exit214.i.i - br label %delete.exit203.i.i + br label %delete.exit203.i.i delete.exit203.i.i: ; preds = %bb1.i197.i.i, %delete.exit214.i.i - br i1 false, label %delete.exit192.i.i, label %bb1.i186.i.i + br i1 false, label %delete.exit192.i.i, label %bb1.i186.i.i bb1.i186.i.i: ; preds = %delete.exit203.i.i - br label %delete.exit192.i.i + br label %delete.exit192.i.i delete.exit192.i.i: ; preds = %bb1.i186.i.i, %delete.exit203.i.i - br i1 false, label %delete.exit181.i.i, label %bb1.i175.i.i + br i1 false, label %delete.exit181.i.i, label %bb1.i175.i.i bb1.i175.i.i: ; preds = %delete.exit192.i.i - br label %delete.exit181.i.i + br label %delete.exit181.i.i delete.exit181.i.i: ; preds = %bb1.i175.i.i, %delete.exit192.i.i - br i1 false, label %delete.exit170.i.i, label %bb1.i164.i.i + br i1 false, label %delete.exit170.i.i, label %bb1.i164.i.i bb1.i164.i.i: ; preds = %delete.exit181.i.i - br label %delete.exit170.i.i + br label %delete.exit170.i.i delete.exit170.i.i: ; preds = %bb1.i164.i.i, %delete.exit181.i.i - br i1 false, label %delete.exit159.i.i, label %bb1.i153.i.i + br i1 false, label %delete.exit159.i.i, label %bb1.i153.i.i bb1.i153.i.i: ; preds = %delete.exit170.i.i - br label %delete.exit159.i.i + br label %delete.exit159.i.i delete.exit159.i.i: ; preds = %bb1.i153.i.i, %delete.exit170.i.i - br i1 false, label %delete.exit148.i.i, label %bb1.i142.i.i + br i1 false, label %delete.exit148.i.i, label %bb1.i142.i.i bb1.i142.i.i: ; preds = %delete.exit159.i.i - br label %delete.exit148.i.i + br label %delete.exit148.i.i delete.exit148.i.i: ; preds = %bb1.i142.i.i, %delete.exit159.i.i - br i1 false, label %delete.exit137.i.i, label %bb1.i131.i.i + br i1 false, label %delete.exit137.i.i, label %bb1.i131.i.i bb1.i131.i.i: ; preds = %delete.exit148.i.i - br label %delete.exit137.i.i + br label %delete.exit137.i.i delete.exit137.i.i: ; preds = %bb1.i131.i.i, %delete.exit148.i.i - br i1 false, label %delete.exit126.i.i, label %bb1.i120.i.i + br i1 false, label %delete.exit126.i.i, label %bb1.i120.i.i bb1.i120.i.i: ; preds = %delete.exit137.i.i - br label %delete.exit126.i.i + br label %delete.exit126.i.i delete.exit126.i.i: ; preds = %bb1.i120.i.i, %delete.exit137.i.i - br i1 false, label %delete.exit115.i.i, label %bb1.i109.i.i + br i1 false, label %delete.exit115.i.i, label %bb1.i109.i.i bb1.i109.i.i: ; preds = %delete.exit126.i.i - br label %delete.exit115.i.i + br label %delete.exit115.i.i delete.exit115.i.i: ; preds = %bb1.i109.i.i, %delete.exit126.i.i - br i1 false, label %delete.exit104.i.i, label %bb1.i98.i.i + br i1 false, label %delete.exit104.i.i, label %bb1.i98.i.i bb1.i98.i.i: ; preds = %delete.exit115.i.i - br label %delete.exit104.i.i + br label %delete.exit104.i.i delete.exit104.i.i: ; preds = %bb1.i98.i.i, %delete.exit115.i.i - br i1 false, label %delete.exit93.i.i, label %bb1.i87.i.i + br i1 false, label %delete.exit93.i.i, label %bb1.i87.i.i bb1.i87.i.i: ; preds = %delete.exit104.i.i - br label %delete.exit93.i.i + br label %delete.exit93.i.i delete.exit93.i.i: ; preds = %bb1.i87.i.i, %delete.exit104.i.i - br i1 false, label %delete.exit82.i.i, label %bb1.i76.i.i + br i1 false, label %delete.exit82.i.i, label %bb1.i76.i.i bb1.i76.i.i: ; preds = %delete.exit93.i.i - br label %delete.exit82.i.i + br label %delete.exit82.i.i delete.exit82.i.i: ; preds = %bb1.i76.i.i, %delete.exit93.i.i - br i1 false, label %delete.exit71.i.i, label %bb1.i65.i.i + br i1 false, label %delete.exit71.i.i, label %bb1.i65.i.i bb1.i65.i.i: ; preds = %delete.exit82.i.i - br label %delete.exit71.i.i + br label %delete.exit71.i.i delete.exit71.i.i: ; preds = %bb1.i65.i.i, %delete.exit82.i.i - br i1 false, label %delete.exit60.i.i, label %bb1.i54.i.i + br i1 false, label %delete.exit60.i.i, label %bb1.i54.i.i bb1.i54.i.i: ; preds = %delete.exit71.i.i - br label %delete.exit60.i.i + br label %delete.exit60.i.i delete.exit60.i.i: ; preds = %bb1.i54.i.i, %delete.exit71.i.i - br i1 false, label %delete.exit38.i.i, label %bb1.i32.i.i + br i1 false, label %delete.exit38.i.i, label %bb1.i32.i.i bb1.i32.i.i: ; preds = %delete.exit60.i.i - br label %delete.exit38.i.i + br label %delete.exit38.i.i delete.exit38.i.i: ; preds = %bb1.i32.i.i, %delete.exit60.i.i - br i1 false, label %delete.exit18.i.i, label %bb1.i12.i.i + br i1 false, label %delete.exit18.i.i, label %bb1.i12.i.i bb1.i12.i.i: ; preds = %delete.exit38.i.i - br label %delete.exit18.i.i + br label %delete.exit18.i.i delete.exit18.i.i: ; preds = %bb1.i12.i.i, %delete.exit38.i.i - br i1 false, label %picosat_reset.exit, label %bb1.i2.i.i + br i1 false, label %picosat_reset.exit, label %bb1.i2.i.i bb1.i2.i.i: ; preds = %delete.exit18.i.i - br label %picosat_reset.exit + br label %picosat_reset.exit picosat_reset.exit: ; preds = %bb1.i2.i.i, %delete.exit18.i.i - br label %bb171 + br label %bb171 bb171: ; preds = %picosat_reset.exit, %bb110 - br i1 false, label %bb173, label %bb172 + br i1 false, label %bb173, label %bb172 bb172: ; preds = %bb171 - br label %bb173 + br label %bb173 bb173: ; preds = %bb172, %bb171 - br i1 false, label %bb175, label %bb174 + br i1 false, label %bb175, label %bb174 bb174: ; preds = %bb173 - br label %bb175 + br label %bb175 bb175: ; preds = %bb174, %bb173 - br i1 false, label %bb177, label %bb176 + br i1 false, label %bb177, label %bb176 bb176: ; preds = %bb175 - br label %bb177 + br label %bb177 bb177: ; preds = %bb176, %bb175 - br i1 false, label %bb179, label %bb178 + br i1 false, label %bb179, label %bb178 bb178: ; preds = %bb177 - ret i32 0 + ret i32 0 bb179: ; preds = %bb177 - ret i32 0 + ret i32 0 } define i32 @main(i32 %argc, i8** %argv) nounwind { entry: - br label %bb2 + br label %bb2 bb: ; preds = %bb2 - br i1 false, label %bb3, label %bb2 + br i1 false, label %bb3, label %bb2 bb2: ; preds = %bb, %entry - br i1 false, label %bb5.loopexit, label %bb + br i1 false, label %bb5.loopexit, label %bb bb3: ; preds = %bb - br i1 false, label %bb5, label %bb4 + br i1 false, label %bb5, label %bb4 bb4: ; preds = %bb3 - br label %bb5 + br label %bb5 bb5.loopexit: ; preds = %bb2 - br label %bb5 + br label %bb5 bb5: ; preds = %bb5.loopexit, %bb4, %bb3 - %0 = call fastcc i32 @picosat_main(i32 %argc, i8** %argv) nounwind ; [#uses=2] - br i1 false, label %bb7, label %bb6 + %0 = call fastcc i32 @picosat_main(i32 %argc, i8** %argv) nounwind ; [#uses=2] + br i1 false, label %bb7, label %bb6 bb6: ; preds = %bb5 - ret i32 %0 + ret i32 %0 bb7: ; preds = %bb5 - ret i32 %0 + ret i32 %0 } diff --git a/llvm/test/Transforms/ArgumentPromotion/pr32917.ll b/llvm/test/Transforms/ArgumentPromotion/pr32917.ll --- a/llvm/test/Transforms/ArgumentPromotion/pr32917.ll +++ b/llvm/test/Transforms/ArgumentPromotion/pr32917.ll @@ -1,10 +1,20 @@ -; RUN: opt < %s -argpromotion -S | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt < %s -argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL ; PR 32917 @b = common local_unnamed_addr global i32 0, align 4 @a = common local_unnamed_addr global i32 0, align 4 define i32 @fn2() local_unnamed_addr { +; ARGPROMOTION-LABEL: define {{[^@]+}}@fn2() local_unnamed_addr +; ARGPROMOTION-NEXT: [[TMP1:%.*]] = load i32, i32* @b, align 4 +; ARGPROMOTION-NEXT: [[TMP2:%.*]] = sext i32 [[TMP1]] to i64 +; ARGPROMOTION-NEXT: [[TMP3:%.*]] = inttoptr i64 [[TMP2]] to i32* +; ARGPROMOTION-NEXT: [[DOTIDX:%.*]] = getelementptr i32, i32* [[TMP3]], i64 -1 +; ARGPROMOTION-NEXT: [[DOTIDX_VAL:%.*]] = load i32, i32* [[DOTIDX]], align 4 +; ARGPROMOTION-NEXT: call fastcc void @fn1(i32 [[DOTIDX_VAL]]) +; ARGPROMOTION-NEXT: ret i32 undef +; %1 = load i32, i32* @b, align 4 %2 = sext i32 %1 to i64 %3 = inttoptr i64 %2 to i32* @@ -13,11 +23,13 @@ } define internal fastcc void @fn1(i32* nocapture readonly) unnamed_addr { +; ARGPROMOTION-LABEL: define {{[^@]+}}@fn1 +; ARGPROMOTION-SAME: (i32 [[DOT18446744073709551615_VAL:%.*]]) unnamed_addr +; ARGPROMOTION-NEXT: store i32 [[DOT18446744073709551615_VAL:%.*]], i32* @a, align 4 +; ARGPROMOTION-NEXT: ret void +; %2 = getelementptr inbounds i32, i32* %0, i64 -1 %3 = load i32, i32* %2, align 4 store i32 %3, i32* @a, align 4 ret void } - -; CHECK: getelementptr {{.*}} -1 -; CHECK-NOT: getelementptr {{.*}} 4294967295 diff --git a/llvm/test/Transforms/ArgumentPromotion/pr33641_remove_arg_dbgvalue.ll b/llvm/test/Transforms/ArgumentPromotion/pr33641_remove_arg_dbgvalue.ll --- a/llvm/test/Transforms/ArgumentPromotion/pr33641_remove_arg_dbgvalue.ll +++ b/llvm/test/Transforms/ArgumentPromotion/pr33641_remove_arg_dbgvalue.ll @@ -1,18 +1,29 @@ -; RUN: opt -argpromotion -verify -dse -S %s -o - | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt -argpromotion -verify -dse -S %s -o - | FileCheck %s --check-prefixes=ARGPROMOTION,ALL ; Fix for PR33641. ArgumentPromotion removed the argument to bar but left the call to ; dbg.value which still used the removed argument. +; The %p argument should be removed, and the use of it in dbg.value should be +; changed to undef. + %p_t = type i16* %fun_t = type void (%p_t)* define void @foo() { +; ARGPROMOTION-LABEL: define {{[^@]+}}@foo() +; ARGPROMOTION-NEXT: ret void +; %tmp = alloca %fun_t store %fun_t @bar, %fun_t* %tmp ret void } define internal void @bar(%p_t %p) { +; ARGPROMOTION-LABEL: define {{[^@]+}}@bar() +; ARGPROMOTION-NEXT: call void @llvm.dbg.value(metadata i16* undef, metadata !3, metadata !DIExpression()), !dbg !5 +; ARGPROMOTION-NEXT: ret void +; call void @llvm.dbg.value(metadata %p_t %p, metadata !4, metadata !5), !dbg !6 ret void } @@ -29,10 +40,3 @@ !4 = !DILocalVariable(name: "p", scope: !3) !5 = !DIExpression() !6 = !DILocation(line: 1, column: 1, scope: !3) - -; The %p argument should be removed, and the use of it in dbg.value should be -; changed to undef. -; CHECK: define internal void @bar() { -; CHECK-NEXT: call void @llvm.dbg.value(metadata i16* undef -; CHECK-NEXT: ret void -; CHECK-NEXT: } diff --git a/llvm/test/Transforms/ArgumentPromotion/profile.ll b/llvm/test/Transforms/ArgumentPromotion/profile.ll --- a/llvm/test/Transforms/ArgumentPromotion/profile.ll +++ b/llvm/test/Transforms/ArgumentPromotion/profile.ll @@ -1,17 +1,26 @@ -; RUN: opt -argpromotion -mem2reg -S < %s | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt -argpromotion -mem2reg -S < %s | FileCheck %s --check-prefixes=ARGPROMOTION,ALL target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128" ; Checks if !prof metadata is corret in deadargelim. define void @caller() #0 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@caller() +; ARGPROMOTION-NEXT: call void @promote_i32_ptr(i32 42), !prof !0 +; ARGPROMOTION-NEXT: ret void +; %x = alloca i32 store i32 42, i32* %x call void @promote_i32_ptr(i32* %x), !prof !0 -; CHECK: call void @promote_i32_ptr(i32 42), !prof ![[PROF:[0-9]]] ret void } define internal void @promote_i32_ptr(i32* %xp) { +; ARGPROMOTION-LABEL: define {{[^@]+}}@promote_i32_ptr +; ARGPROMOTION-SAME: (i32 [[XP_VAL:%.*]]) +; ARGPROMOTION-NEXT: call void @use_i32(i32 [[XP_VAL:%.*]]) +; ARGPROMOTION-NEXT: ret void +; %x = load i32, i32* %xp call void @use_i32(i32 %x) ret void @@ -19,5 +28,4 @@ declare void @use_i32(i32) -; CHECK: ![[PROF]] = !{!"branch_weights", i32 30} !0 = !{!"branch_weights", i32 30} diff --git a/llvm/test/Transforms/ArgumentPromotion/reserve-tbaa.ll b/llvm/test/Transforms/ArgumentPromotion/reserve-tbaa.ll --- a/llvm/test/Transforms/ArgumentPromotion/reserve-tbaa.ll +++ b/llvm/test/Transforms/ArgumentPromotion/reserve-tbaa.ll @@ -1,5 +1,6 @@ -; RUN: opt < %s -argpromotion -S | FileCheck %s -; RUN: opt < %s -passes=argpromotion -S | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt < %s -argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL +; RUN: opt < %s -passes=argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL ; PR17906 ; When we promote two arguments in a single function with different types, @@ -14,6 +15,14 @@ @d = global i8 0, align 1 define internal fastcc void @fn(i32* nocapture readonly %p1, i64* nocapture readonly %p2) { +; ARGPROMOTION-LABEL: define {{[^@]+}}@fn +; ARGPROMOTION-SAME: (i32 [[P1_VAL:%.*]], i64 [[P2_VAL:%.*]]) +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[CONV:%.*]] = trunc i64 [[P2_VAL:%.*]] to i32 +; ARGPROMOTION-NEXT: [[CONV1:%.*]] = trunc i32 [[P1_VAL:%.*]] to i8 +; ARGPROMOTION-NEXT: store i8 [[CONV1]], i8* @d, align 1, !tbaa !0 +; ARGPROMOTION-NEXT: ret void +; entry: %0 = load i64, i64* %p2, align 8, !tbaa !1 %conv = trunc i64 %0 to i32 @@ -24,11 +33,18 @@ } define i32 @main() { +; ARGPROMOTION-LABEL: define {{[^@]+}}@main() +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: [[TMP0:%.*]] = load i32**, i32*** @e, align 8, !tbaa !3 +; ARGPROMOTION-NEXT: store i32* @g, i32** [[TMP0]], align 8, !tbaa !3 +; ARGPROMOTION-NEXT: [[TMP1:%.*]] = load i32*, i32** @a, align 8, !tbaa !3 +; ARGPROMOTION-NEXT: store i32 1, i32* [[TMP1]], align 4, !tbaa !5 +; ARGPROMOTION-NEXT: [[G_VAL:%.*]] = load i32, i32* @g, align 4, !tbaa !5 +; ARGPROMOTION-NEXT: [[C_VAL:%.*]] = load i64, i64* @c, align 8, !tbaa !7 +; ARGPROMOTION-NEXT: call fastcc void @fn(i32 [[G_VAL]], i64 [[C_VAL]]) +; ARGPROMOTION-NEXT: ret i32 0 +; entry: -; CHECK-LABEL: main -; CHECK: store i32 1, i32* %{{.*}}, align 4, !tbaa ![[I32:[0-9]+]] -; CHECK: %g.val = load i32, i32* @g, align 4, !tbaa ![[I32]] -; CHECK: %c.val = load i64, i64* @c, align 8, !tbaa ![[LONG:[0-9]+]] %0 = load i32**, i32*** @e, align 8, !tbaa !8 store i32* @g, i32** %0, align 8, !tbaa !8 %1 = load i32*, i32** @a, align 8, !tbaa !8 @@ -47,7 +63,4 @@ !7 = !{!3, !3, i64 0} !8 = !{!9, !9, i64 0} !9 = !{!"any pointer", !3, i64 0} -; CHECK: ![[I32]] = !{![[I32_TYPE:[0-9]+]], ![[I32_TYPE]], i64 0} -; CHECK: ![[I32_TYPE]] = !{!"int", !{{.*}}, i64 0} -; CHECK: ![[LONG]] = !{![[LONG_TYPE:[0-9]+]], ![[LONG_TYPE]], i64 0} -; CHECK: ![[LONG_TYPE]] = !{!"long", !{{.*}}, i64 0} + diff --git a/llvm/test/Transforms/ArgumentPromotion/sret.ll b/llvm/test/Transforms/ArgumentPromotion/sret.ll --- a/llvm/test/Transforms/ArgumentPromotion/sret.ll +++ b/llvm/test/Transforms/ArgumentPromotion/sret.ll @@ -1,29 +1,40 @@ -; RUN: opt < %s -argpromotion -S | FileCheck %s -; RUN: opt < %s -passes=argpromotion -S | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt < %s -argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL +; RUN: opt < %s -passes=argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-pc-windows-msvc" -; CHECK: define internal void @add(i32 %[[THIS1:.*]], i32 %[[THIS2:.*]], i32* noalias %[[SR:.*]]) define internal void @add({i32, i32}* %this, i32* sret %r) { +; ARGPROMOTION-LABEL: define {{[^@]+}}@add +; ARGPROMOTION-SAME: (i32 [[THIS_0_0_VAL:%.*]], i32 [[THIS_0_1_VAL:%.*]], i32* noalias [[R:%.*]]) +; ARGPROMOTION-NEXT: [[AB:%.*]] = add i32 [[THIS_0_0_VAL:%.*]], [[THIS_0_1_VAL:%.*]] +; ARGPROMOTION-NEXT: store i32 [[AB]], i32* [[R:%.*]] +; ARGPROMOTION-NEXT: ret void +; %ap = getelementptr {i32, i32}, {i32, i32}* %this, i32 0, i32 0 %bp = getelementptr {i32, i32}, {i32, i32}* %this, i32 0, i32 1 %a = load i32, i32* %ap %b = load i32, i32* %bp - ; CHECK: %[[AB:.*]] = add i32 %[[THIS1]], %[[THIS2]] %ab = add i32 %a, %b - ; CHECK: store i32 %[[AB]], i32* %[[SR]] store i32 %ab, i32* %r ret void } -; CHECK: define void @f() define void @f() { - ; CHECK: %[[R:.*]] = alloca i32 +; ARGPROMOTION-LABEL: define {{[^@]+}}@f() +; ARGPROMOTION-NEXT: [[R:%.*]] = alloca i32 +; ARGPROMOTION-NEXT: [[PAIR:%.*]] = alloca { i32, i32 } +; ARGPROMOTION-NEXT: [[PAIR_IDX:%.*]] = getelementptr { i32, i32 }, { i32, i32 }* [[PAIR]], i64 0, i32 0 +; ARGPROMOTION-NEXT: [[PAIR_IDX_VAL:%.*]] = load i32, i32* [[PAIR_IDX]] +; ARGPROMOTION-NEXT: [[PAIR_IDX1:%.*]] = getelementptr { i32, i32 }, { i32, i32 }* [[PAIR]], i64 0, i32 1 +; ARGPROMOTION-NEXT: [[PAIR_IDX1_VAL:%.*]] = load i32, i32* [[PAIR_IDX1]] +; ARGPROMOTION-NEXT: call void @add(i32 [[PAIR_IDX_VAL]], i32 [[PAIR_IDX1_VAL]], i32* noalias [[R]]) +; ARGPROMOTION-NEXT: ret void +; %r = alloca i32 %pair = alloca {i32, i32} - ; CHECK: call void @add(i32 %{{.*}}, i32 %{{.*}}, i32* noalias %[[R]]) call void @add({i32, i32}* %pair, i32* sret %r) ret void } diff --git a/llvm/test/Transforms/ArgumentPromotion/tail.ll b/llvm/test/Transforms/ArgumentPromotion/tail.ll --- a/llvm/test/Transforms/ArgumentPromotion/tail.ll +++ b/llvm/test/Transforms/ArgumentPromotion/tail.ll @@ -1,5 +1,6 @@ -; RUN: opt %s -argpromotion -S -o - | FileCheck %s -; RUN: opt %s -passes=argpromotion -S -o - | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt %s -argpromotion -S -o - | FileCheck %s --check-prefixes=ARGPROMOTION,ALL +; RUN: opt %s -passes=argpromotion -S -o - | FileCheck %s --check-prefixes=ARGPROMOTION,ALL ; PR14710 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" @@ -9,15 +10,30 @@ declare i8* @foo(%pair*) define internal void @bar(%pair* byval %Data) { -; CHECK: define internal void @bar(i32 %Data.0, i32 %Data.1) -; CHECK: %Data = alloca %pair -; CHECK-NOT: tail -; CHECK: call i8* @foo(%pair* %Data) +; ARGPROMOTION-LABEL: define {{[^@]+}}@bar +; ARGPROMOTION-SAME: (i32 [[DATA_0:%.*]], i32 [[DATA_1:%.*]]) +; ARGPROMOTION-NEXT: [[DATA:%.*]] = alloca [[PAIR:%.*]] +; ARGPROMOTION-NEXT: [[DOT0:%.*]] = getelementptr [[PAIR]], %pair* [[DATA]], i32 0, i32 0 +; ARGPROMOTION-NEXT: store i32 [[DATA_0:%.*]], i32* [[DOT0]] +; ARGPROMOTION-NEXT: [[DOT1:%.*]] = getelementptr [[PAIR]], %pair* [[DATA]], i32 0, i32 1 +; ARGPROMOTION-NEXT: store i32 [[DATA_1:%.*]], i32* [[DOT1]] +; ARGPROMOTION-NEXT: [[TMP1:%.*]] = call i8* @foo(%pair* [[DATA]]) +; ARGPROMOTION-NEXT: ret void +; tail call i8* @foo(%pair* %Data) ret void } define void @zed(%pair* byval %Data) { +; ARGPROMOTION-LABEL: define {{[^@]+}}@zed +; ARGPROMOTION-SAME: (%pair* byval [[DATA:%.*]]) +; ARGPROMOTION-NEXT: [[DATA_0:%.*]] = getelementptr [[PAIR:%.*]], %pair* [[DATA:%.*]], i32 0, i32 0 +; ARGPROMOTION-NEXT: [[DATA_0_VAL:%.*]] = load i32, i32* [[DATA_0]] +; ARGPROMOTION-NEXT: [[DATA_1:%.*]] = getelementptr [[PAIR]], %pair* [[DATA]], i32 0, i32 1 +; ARGPROMOTION-NEXT: [[DATA_1_VAL:%.*]] = load i32, i32* [[DATA_1]] +; ARGPROMOTION-NEXT: call void @bar(i32 [[DATA_0_VAL]], i32 [[DATA_1_VAL]]) +; ARGPROMOTION-NEXT: ret void +; call void @bar(%pair* byval %Data) ret void } diff --git a/llvm/test/Transforms/ArgumentPromotion/variadic.ll b/llvm/test/Transforms/ArgumentPromotion/variadic.ll --- a/llvm/test/Transforms/ArgumentPromotion/variadic.ll +++ b/llvm/test/Transforms/ArgumentPromotion/variadic.ll @@ -1,5 +1,6 @@ -; RUN: opt < %s -argpromotion -S | FileCheck %s -; RUN: opt < %s -passes=argpromotion -S | FileCheck %s +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes +; RUN: opt < %s -argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL +; RUN: opt < %s -passes=argpromotion -S | FileCheck %s --check-prefixes=ARGPROMOTION,ALL ; Unused arguments from variadic functions cannot be eliminated as that changes ; their classiciation according to the SysV amd64 ABI. Clang and other frontends @@ -15,6 +16,12 @@ ; Function Attrs: nounwind uwtable define i32 @main(i32 %argc, i8** nocapture readnone %argv) #0 { +; ARGPROMOTION-LABEL: define {{[^@]+}}@main +; ARGPROMOTION-SAME: (i32 [[ARGC:%.*]], i8** nocapture readnone [[ARGV:%.*]]) +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: tail call void (i8*, i8*, i8*, i8*, i8*, ...) @callee_t0f(i8* undef, i8* undef, i8* undef, i8* undef, i8* undef, %struct.tt0* byval align 8 @t45) +; ARGPROMOTION-NEXT: ret i32 0 +; entry: tail call void (i8*, i8*, i8*, i8*, i8*, ...) @callee_t0f(i8* undef, i8* undef, i8* undef, i8* undef, i8* undef, %struct.tt0* byval align 8 @t45) ret i32 0 @@ -22,8 +29,11 @@ ; Function Attrs: nounwind uwtable define internal void @callee_t0f(i8* nocapture readnone %tp13, i8* nocapture readnone %tp14, i8* nocapture readnone %tp15, i8* nocapture readnone %tp16, i8* nocapture readnone %tp17, ...) { +; ARGPROMOTION-LABEL: define {{[^@]+}}@callee_t0f +; ARGPROMOTION-SAME: (i8* nocapture readnone [[TP13:%.*]], i8* nocapture readnone [[TP14:%.*]], i8* nocapture readnone [[TP15:%.*]], i8* nocapture readnone [[TP16:%.*]], i8* nocapture readnone [[TP17:%.*]], ...) +; ARGPROMOTION-NEXT: entry: +; ARGPROMOTION-NEXT: ret void +; entry: ret void } - -; CHECK-LABEL: define internal void @callee_t0f(i8* nocapture readnone %tp13, i8* nocapture readnone %tp14, i8* nocapture readnone %tp15, i8* nocapture readnone %tp16, i8* nocapture readnone %tp17, ...)