GEPs are often in the form `gep [N x %T], ptr %p, i64 0, i64 %idx`. Canonicalize these to `gep %T, ptr %p, i64 %idx`. This enables transforms that only support one GEP index to work and improves CSE. Various transforms were recently hardened to make sure they still work without the leading index.
422 lines
18 KiB
LLVM
422 lines
18 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
|
|
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
|
|
define double @test_mul_fast_flags(ptr %arr_d) {
|
|
; CHECK-LABEL: @test_mul_fast_flags(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
|
|
; CHECK: for.body:
|
|
; CHECK-NEXT: [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
|
|
; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999
|
|
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]
|
|
; CHECK: end:
|
|
; CHECK-NEXT: ret double 0.000000e+00
|
|
;
|
|
entry:
|
|
br label %for.body
|
|
|
|
for.body: ; preds = %entry, %for.body
|
|
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
|
|
%f_prod.01 = phi double [ 0.000000e+00, %entry ], [ %mul, %for.body ]
|
|
%arrayidx = getelementptr inbounds [1000 x double], ptr %arr_d, i64 0, i64 %i.02
|
|
%0 = load double, ptr %arrayidx, align 8
|
|
%mul = fmul fast double %f_prod.01, %0
|
|
%inc = add i64 %i.02, 1
|
|
%cmp = icmp ult i64 %inc, 1000
|
|
br i1 %cmp, label %for.body, label %end
|
|
|
|
end: ; preds = %for.body
|
|
%f_prod.0.lcssa = phi double [ %mul, %for.body ]
|
|
ret double %f_prod.0.lcssa
|
|
}
|
|
|
|
define double @test_nsz_nnan_flags_enabled(ptr %arr_d) {
|
|
; CHECK-LABEL: @test_nsz_nnan_flags_enabled(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
|
|
; CHECK: for.body:
|
|
; CHECK-NEXT: [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
|
|
; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999
|
|
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]
|
|
; CHECK: end:
|
|
; CHECK-NEXT: ret double 0.000000e+00
|
|
;
|
|
entry:
|
|
br label %for.body
|
|
|
|
for.body: ; preds = %entry, %for.body
|
|
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
|
|
%f_prod.01 = phi double [ 0.000000e+00, %entry ], [ %mul, %for.body ]
|
|
%arrayidx = getelementptr inbounds [1000 x double], ptr %arr_d, i64 0, i64 %i.02
|
|
%0 = load double, ptr %arrayidx, align 8
|
|
%mul = fmul nsz nnan double %f_prod.01, %0
|
|
%inc = add i64 %i.02, 1
|
|
%cmp = icmp ult i64 %inc, 1000
|
|
br i1 %cmp, label %for.body, label %end
|
|
|
|
end: ; preds = %for.body
|
|
%f_prod.0.lcssa = phi double [ %mul, %for.body ]
|
|
ret double %f_prod.0.lcssa
|
|
}
|
|
|
|
define double @test_nnan_flag_enabled(ptr %arr_d) {
|
|
; CHECK-LABEL: @test_nnan_flag_enabled(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
|
|
; CHECK: for.body:
|
|
; CHECK-NEXT: [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
|
|
; CHECK-NEXT: [[F_PROD_01:%.*]] = phi double [ 0.000000e+00, [[ENTRY]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]
|
|
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw double, ptr [[ARR_D:%.*]], i64 [[I_02]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8
|
|
; CHECK-NEXT: [[MUL]] = fmul nnan double [[F_PROD_01]], [[TMP0]]
|
|
; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999
|
|
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]
|
|
; CHECK: end:
|
|
; CHECK-NEXT: ret double [[MUL]]
|
|
;
|
|
entry:
|
|
br label %for.body
|
|
|
|
for.body: ; preds = %entry, %for.body
|
|
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
|
|
%f_prod.01 = phi double [ 0.000000e+00, %entry ], [ %mul, %for.body ]
|
|
%arrayidx = getelementptr inbounds [1000 x double], ptr %arr_d, i64 0, i64 %i.02
|
|
%0 = load double, ptr %arrayidx, align 8
|
|
%mul = fmul nnan double %f_prod.01, %0
|
|
%inc = add i64 %i.02, 1
|
|
%cmp = icmp ult i64 %inc, 1000
|
|
br i1 %cmp, label %for.body, label %end
|
|
|
|
end: ; preds = %for.body
|
|
%f_prod.0.lcssa = phi double [ %mul, %for.body ]
|
|
ret double %f_prod.0.lcssa
|
|
}
|
|
|
|
define double @test_ninf_flag_enabled(ptr %arr_d) {
|
|
; CHECK-LABEL: @test_ninf_flag_enabled(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
|
|
; CHECK: for.body:
|
|
; CHECK-NEXT: [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
|
|
; CHECK-NEXT: [[F_PROD_01:%.*]] = phi double [ 0.000000e+00, [[ENTRY]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]
|
|
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw double, ptr [[ARR_D:%.*]], i64 [[I_02]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8
|
|
; CHECK-NEXT: [[MUL]] = fmul ninf double [[F_PROD_01]], [[TMP0]]
|
|
; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999
|
|
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]
|
|
; CHECK: end:
|
|
; CHECK-NEXT: ret double [[MUL]]
|
|
;
|
|
entry:
|
|
br label %for.body
|
|
|
|
for.body: ; preds = %entry, %for.body
|
|
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
|
|
%f_prod.01 = phi double [ 0.000000e+00, %entry ], [ %mul, %for.body ]
|
|
%arrayidx = getelementptr inbounds [1000 x double], ptr %arr_d, i64 0, i64 %i.02
|
|
%0 = load double, ptr %arrayidx, align 8
|
|
%mul = fmul ninf double %f_prod.01, %0
|
|
%inc = add i64 %i.02, 1
|
|
%cmp = icmp ult i64 %inc, 1000
|
|
br i1 %cmp, label %for.body, label %end
|
|
|
|
end: ; preds = %for.body
|
|
%f_prod.0.lcssa = phi double [ %mul, %for.body ]
|
|
ret double %f_prod.0.lcssa
|
|
}
|
|
|
|
define double @test_nsz_flag_enabled(ptr %arr_d) {
|
|
; CHECK-LABEL: @test_nsz_flag_enabled(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
|
|
; CHECK: for.body:
|
|
; CHECK-NEXT: [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
|
|
; CHECK-NEXT: [[F_PROD_01:%.*]] = phi double [ 0.000000e+00, [[ENTRY]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]
|
|
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw double, ptr [[ARR_D:%.*]], i64 [[I_02]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8
|
|
; CHECK-NEXT: [[MUL]] = fmul nsz double [[F_PROD_01]], [[TMP0]]
|
|
; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999
|
|
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]
|
|
; CHECK: end:
|
|
; CHECK-NEXT: ret double [[MUL]]
|
|
;
|
|
entry:
|
|
br label %for.body
|
|
|
|
for.body: ; preds = %entry, %for.body
|
|
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
|
|
%f_prod.01 = phi double [ 0.000000e+00, %entry ], [ %mul, %for.body ]
|
|
%arrayidx = getelementptr inbounds [1000 x double], ptr %arr_d, i64 0, i64 %i.02
|
|
%0 = load double, ptr %arrayidx, align 8
|
|
%mul = fmul nsz double %f_prod.01, %0
|
|
%inc = add i64 %i.02, 1
|
|
%cmp = icmp ult i64 %inc, 1000
|
|
br i1 %cmp, label %for.body, label %end
|
|
|
|
end: ; preds = %for.body
|
|
%f_prod.0.lcssa = phi double [ %mul, %for.body ]
|
|
ret double %f_prod.0.lcssa
|
|
}
|
|
|
|
define double @test_phi_initalise_to_non_zero(ptr %arr_d) {
|
|
; CHECK-LABEL: @test_phi_initalise_to_non_zero(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
|
|
; CHECK: for.body:
|
|
; CHECK-NEXT: [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
|
|
; CHECK-NEXT: [[F_PROD_01:%.*]] = phi double [ 1.000000e+00, [[ENTRY]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]
|
|
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw double, ptr [[ARR_D:%.*]], i64 [[I_02]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8
|
|
; CHECK-NEXT: [[MUL]] = fmul fast double [[F_PROD_01]], [[TMP0]]
|
|
; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999
|
|
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]
|
|
; CHECK: end:
|
|
; CHECK-NEXT: ret double [[MUL]]
|
|
;
|
|
entry:
|
|
br label %for.body
|
|
|
|
for.body: ; preds = %entry, %for.body
|
|
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
|
|
%f_prod.01 = phi double [ 1.000000e+00, %entry ], [ %mul, %for.body ]
|
|
%arrayidx = getelementptr inbounds [1000 x double], ptr %arr_d, i64 0, i64 %i.02
|
|
%0 = load double, ptr %arrayidx, align 8
|
|
%mul = fmul fast double %f_prod.01, %0
|
|
%inc = add i64 %i.02, 1
|
|
%cmp = icmp ult i64 %inc, 1000
|
|
br i1 %cmp, label %for.body, label %end
|
|
|
|
end: ; preds = %for.body
|
|
%f_prod.0.lcssa = phi double [ %mul, %for.body ]
|
|
ret double %f_prod.0.lcssa
|
|
}
|
|
|
|
define double @test_multiple_phi_operands(ptr %arr_d, i1 %entry_cond) {
|
|
; CHECK-LABEL: @test_multiple_phi_operands(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: br i1 [[ENTRY_COND:%.*]], label [[FOR_BODY:%.*]], label [[ENTRY_2:%.*]]
|
|
; CHECK: entry_2:
|
|
; CHECK-NEXT: br label [[FOR_BODY]]
|
|
; CHECK: for.body:
|
|
; CHECK-NEXT: [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ 0, [[ENTRY_2]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
|
|
; CHECK-NEXT: [[F_PROD_01:%.*]] = phi double [ 0.000000e+00, [[ENTRY]] ], [ 0.000000e+00, [[ENTRY_2]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]
|
|
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw double, ptr [[ARR_D:%.*]], i64 [[I_02]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8
|
|
; CHECK-NEXT: [[MUL]] = fmul fast double [[F_PROD_01]], [[TMP0]]
|
|
; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[I_02]], 999
|
|
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]
|
|
; CHECK: end:
|
|
; CHECK-NEXT: ret double [[MUL]]
|
|
;
|
|
entry:
|
|
br i1 %entry_cond, label %for.body, label %entry_2
|
|
|
|
entry_2:
|
|
br label %for.body
|
|
|
|
for.body: ; preds = %entry, %for.body
|
|
%i.02 = phi i64 [ 0, %entry ], [0, %entry_2], [ %inc, %for.body ]
|
|
%f_prod.01 = phi double [ 0.0, %entry ], [0.0, %entry_2], [ %mul, %for.body ]
|
|
%arrayidx = getelementptr inbounds [1000 x double], ptr %arr_d, i64 0, i64 %i.02
|
|
%0 = load double, ptr %arrayidx, align 8
|
|
%mul = fmul fast double %f_prod.01, %0
|
|
%inc = add i64 %i.02, 1
|
|
%cmp = icmp ult i64 %inc, 1000
|
|
br i1 %cmp, label %for.body, label %end
|
|
|
|
end: ; preds = %for.body
|
|
%f_prod.0.lcssa = phi double [ %mul, %for.body ]
|
|
ret double %f_prod.0.lcssa
|
|
}
|
|
|
|
define double @test_multiple_phi_operands_with_non_zero(ptr %arr_d, i1 %entry_cond) {
|
|
; CHECK-LABEL: @test_multiple_phi_operands_with_non_zero(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: br i1 [[ENTRY_COND:%.*]], label [[FOR_BODY:%.*]], label [[ENTRY_2:%.*]]
|
|
; CHECK: entry_2:
|
|
; CHECK-NEXT: br label [[FOR_BODY]]
|
|
; CHECK: for.body:
|
|
; CHECK-NEXT: [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ 0, [[ENTRY_2]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
|
|
; CHECK-NEXT: [[F_PROD_01:%.*]] = phi double [ 1.000000e+00, [[ENTRY]] ], [ 0.000000e+00, [[ENTRY_2]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]
|
|
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw double, ptr [[ARR_D:%.*]], i64 [[I_02]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load double, ptr [[ARRAYIDX]], align 8
|
|
; CHECK-NEXT: [[MUL]] = fmul fast double [[F_PROD_01]], [[TMP0]]
|
|
; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[I_02]], 999
|
|
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]
|
|
; CHECK: end:
|
|
; CHECK-NEXT: ret double [[MUL]]
|
|
;
|
|
entry:
|
|
br i1 %entry_cond, label %for.body, label %entry_2
|
|
|
|
entry_2:
|
|
br label %for.body
|
|
|
|
for.body: ; preds = %entry, %for.body
|
|
%i.02 = phi i64 [ 0, %entry ], [0, %entry_2], [ %inc, %for.body ]
|
|
%f_prod.01 = phi double [ 1.0, %entry ], [0.0, %entry_2], [ %mul, %for.body ]
|
|
%arrayidx = getelementptr inbounds [1000 x double], ptr %arr_d, i64 0, i64 %i.02
|
|
%0 = load double, ptr %arrayidx, align 8
|
|
%mul = fmul fast double %f_prod.01, %0
|
|
%inc = add i64 %i.02, 1
|
|
%cmp = icmp ult i64 %inc, 1000
|
|
br i1 %cmp, label %for.body, label %end
|
|
|
|
end: ; preds = %for.body
|
|
%f_prod.0.lcssa = phi double [ %mul, %for.body ]
|
|
ret double %f_prod.0.lcssa
|
|
}
|
|
|
|
define i32 @test_int_phi_operands(ptr %arr_d) {
|
|
; CHECK-LABEL: @test_int_phi_operands(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
|
|
; CHECK: for.body:
|
|
; CHECK-NEXT: [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
|
|
; CHECK-NEXT: [[F_PROD_01:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]
|
|
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw i32, ptr [[ARR_D:%.*]], i64 [[I_02]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
|
|
; CHECK-NEXT: [[MUL]] = mul nsw i32 [[F_PROD_01]], [[TMP0]]
|
|
; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999
|
|
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]
|
|
; CHECK: end:
|
|
; CHECK-NEXT: ret i32 [[MUL]]
|
|
;
|
|
entry:
|
|
br label %for.body
|
|
|
|
for.body: ; preds = %entry, %for.body
|
|
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
|
|
%f_prod.01 = phi i32 [ 0, %entry ], [ %mul, %for.body ]
|
|
%arrayidx = getelementptr inbounds i32, ptr %arr_d, i64 %i.02
|
|
%0 = load i32, ptr %arrayidx, align 4
|
|
%mul = mul nsw i32 %f_prod.01, %0
|
|
%inc = add i64 %i.02, 1
|
|
%cmp = icmp ult i64 %inc, 1000
|
|
br i1 %cmp, label %for.body, label %end
|
|
|
|
end: ; preds = %for.body
|
|
%f_prod.0.lcssa = phi i32 [ %mul, %for.body ]
|
|
ret i32 %f_prod.0.lcssa
|
|
}
|
|
|
|
define i32 @test_int_phi_operands_initalise_to_non_zero(ptr %arr_d) {
|
|
; CHECK-LABEL: @test_int_phi_operands_initalise_to_non_zero(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
|
|
; CHECK: for.body:
|
|
; CHECK-NEXT: [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
|
|
; CHECK-NEXT: [[F_PROD_01:%.*]] = phi i32 [ 1, [[ENTRY]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]
|
|
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw i32, ptr [[ARR_D:%.*]], i64 [[I_02]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
|
|
; CHECK-NEXT: [[MUL]] = mul i32 [[F_PROD_01]], [[TMP0]]
|
|
; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp samesign ult i64 [[I_02]], 999
|
|
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]
|
|
; CHECK: end:
|
|
; CHECK-NEXT: ret i32 [[MUL]]
|
|
;
|
|
entry:
|
|
br label %for.body
|
|
|
|
for.body: ; preds = %entry, %for.body
|
|
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
|
|
%f_prod.01 = phi i32 [ 1, %entry ], [ %mul, %for.body ]
|
|
%arrayidx = getelementptr inbounds i32, ptr %arr_d, i64 %i.02
|
|
%0 = load i32, ptr %arrayidx, align 4
|
|
%mul = mul i32 %f_prod.01, %0
|
|
%inc = add i64 %i.02, 1
|
|
%cmp = icmp ult i64 %inc, 1000
|
|
br i1 %cmp, label %for.body, label %end
|
|
|
|
end: ; preds = %for.body
|
|
%f_prod.0.lcssa = phi i32 [ %mul, %for.body ]
|
|
ret i32 %f_prod.0.lcssa
|
|
}
|
|
|
|
define i32 @test_multiple_int_phi_operands(ptr %arr_d, i1 %entry_cond) {
|
|
; CHECK-LABEL: @test_multiple_int_phi_operands(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: br i1 [[ENTRY_COND:%.*]], label [[FOR_BODY:%.*]], label [[ENTRY_2:%.*]]
|
|
; CHECK: entry_2:
|
|
; CHECK-NEXT: br label [[FOR_BODY]]
|
|
; CHECK: for.body:
|
|
; CHECK-NEXT: [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ 0, [[ENTRY_2]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
|
|
; CHECK-NEXT: [[F_PROD_01:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ 0, [[ENTRY_2]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]
|
|
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw i32, ptr [[ARR_D:%.*]], i64 [[I_02]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
|
|
; CHECK-NEXT: [[MUL]] = mul i32 [[F_PROD_01]], [[TMP0]]
|
|
; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[I_02]], 999
|
|
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]
|
|
; CHECK: end:
|
|
; CHECK-NEXT: ret i32 [[MUL]]
|
|
;
|
|
entry:
|
|
br i1 %entry_cond, label %for.body, label %entry_2
|
|
|
|
entry_2:
|
|
br label %for.body
|
|
|
|
for.body: ; preds = %entry, %for.body
|
|
%i.02 = phi i64 [ 0, %entry ], [0, %entry_2], [ %inc, %for.body ]
|
|
%f_prod.01 = phi i32 [ 0, %entry ], [0, %entry_2], [ %mul, %for.body ]
|
|
%arrayidx = getelementptr inbounds i32, ptr %arr_d, i64 %i.02
|
|
%0 = load i32, ptr %arrayidx, align 4
|
|
%mul = mul i32 %f_prod.01, %0
|
|
%inc = add i64 %i.02, 1
|
|
%cmp = icmp ult i64 %inc, 1000
|
|
br i1 %cmp, label %for.body, label %end
|
|
|
|
end: ; preds = %for.body
|
|
%f_prod.0.lcssa = phi i32 [ %mul, %for.body ]
|
|
ret i32 %f_prod.0.lcssa
|
|
}
|
|
|
|
define i32 @test_multiple_int_phi_operands_initalise_to_non_zero(ptr %arr_d, i1 %entry_cond) {
|
|
; CHECK-LABEL: @test_multiple_int_phi_operands_initalise_to_non_zero(
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: br i1 [[ENTRY_COND:%.*]], label [[FOR_BODY:%.*]], label [[ENTRY_2:%.*]]
|
|
; CHECK: entry_2:
|
|
; CHECK-NEXT: br label [[FOR_BODY]]
|
|
; CHECK: for.body:
|
|
; CHECK-NEXT: [[I_02:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ 0, [[ENTRY_2]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
|
|
; CHECK-NEXT: [[F_PROD_01:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ 1, [[ENTRY_2]] ], [ [[MUL:%.*]], [[FOR_BODY]] ]
|
|
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds nuw i32, ptr [[ARR_D:%.*]], i64 [[I_02]]
|
|
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
|
|
; CHECK-NEXT: [[MUL]] = mul i32 [[F_PROD_01]], [[TMP0]]
|
|
; CHECK-NEXT: [[INC]] = add nuw nsw i64 [[I_02]], 1
|
|
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i64 [[I_02]], 999
|
|
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[END:%.*]]
|
|
; CHECK: end:
|
|
; CHECK-NEXT: ret i32 [[MUL]]
|
|
;
|
|
entry:
|
|
br i1 %entry_cond, label %for.body, label %entry_2
|
|
|
|
entry_2:
|
|
br label %for.body
|
|
|
|
for.body: ; preds = %entry, %for.body
|
|
%i.02 = phi i64 [ 0, %entry ], [0, %entry_2], [ %inc, %for.body ]
|
|
%f_prod.01 = phi i32 [ 0, %entry ], [1, %entry_2], [ %mul, %for.body ]
|
|
%arrayidx = getelementptr inbounds i32, ptr %arr_d, i64 %i.02
|
|
%0 = load i32, ptr %arrayidx, align 4
|
|
%mul = mul i32 %f_prod.01, %0
|
|
%inc = add i64 %i.02, 1
|
|
%cmp = icmp ult i64 %inc, 1000
|
|
br i1 %cmp, label %for.body, label %end
|
|
|
|
end: ; preds = %for.body
|
|
%f_prod.0.lcssa = phi i32 [ %mul, %for.body ]
|
|
ret i32 %f_prod.0.lcssa
|
|
}
|