Index: llvm/test/Transforms/SimplifyCFG/AArch64/check-instr-cost-for-folding.ll =================================================================== --- llvm/test/Transforms/SimplifyCFG/AArch64/check-instr-cost-for-folding.ll +++ llvm/test/Transforms/SimplifyCFG/AArch64/check-instr-cost-for-folding.ll @@ -2,103 +2,64 @@ ; RUN: FileCheck %s < %t ; ModuleID = 'do_select.c' -%struct.fd_set_bits = type { i64*, i64*, i64*, i64*, i64*, i64*, i32, i8* } +%struct.ptr_wrapper = type { i32*, i8* } -@g_max_i = common dso_local global i64 0, align 8 -@gv_fds = common dso_local global %struct.fd_set_bits* null, align 8 +@fds = common dso_local local_unnamed_addr global %struct.ptr_wrapper* null, align 8 -; Function Attrs: nofree noinline norecurse nounwind -define dso_local i32 @do_select(i32 %max_iters_count, i64 %in, i64 %out, i64 %ex, i64 %bit_init_val, i64 %mask) local_unnamed_addr #0 { +; Function Attrs: nofree norecurse nounwind +define dso_local i32 @do_select(i64 %in, i64 %bit, i64 %mask) local_unnamed_addr #0 { entry: - %cmp52 = icmp sgt i32 %max_iters_count, 0 - br i1 %cmp52, label %for.body.lr.ph, label %for.cond.cleanup + %cmp16 = icmp eq i64 %bit, 0 + br i1 %cmp16, label %for.end, label %for.body.lr.ph for.body.lr.ph: ; preds = %entry - %and13 = and i64 %mask, 780 - %tobool14 = icmp eq i64 %and13, 0 + %0 = load %struct.ptr_wrapper*, %struct.ptr_wrapper** @fds, align 8 + %proc = getelementptr inbounds %struct.ptr_wrapper, %struct.ptr_wrapper* %0, i64 0, i32 1 + %and2 = and i64 %mask, 1 + %tobool3 = icmp eq i64 %and2, 0 br label %for.body -for.cond.cleanup.loopexit: ; preds = %for.cond.cleanup5 - %retval1.1.lcssa.lcssa = phi i32 [ %retval1.1.lcssa, %for.cond.cleanup5 ] - br label %for.cond.cleanup - -for.cond.cleanup: ; preds = %for.cond.cleanup.loopexit, %entry - %retval1.0.lcssa = phi i32 [ 0, %entry ], [ %retval1.1.lcssa.lcssa, %for.cond.cleanup.loopexit ] - ret i32 %retval1.0.lcssa - -for.body: ; preds = %for.cond.cleanup5, %for.body.lr.ph - %retval1.054 = phi i32 [ 0, %for.body.lr.ph ], [ %retval1.1.lcssa, %for.cond.cleanup5 ] - %k.053 = phi i32 [ 0, %for.body.lr.ph ], [ %inc23, %for.cond.cleanup5 ] - %0 = load volatile %struct.fd_set_bits*, %struct.fd_set_bits** @gv_fds, align 8 - %res_in = getelementptr inbounds %struct.fd_set_bits, %struct.fd_set_bits* %0, i64 0, i32 3 - %1 = load i64*, i64** %res_in, align 8 - %2 = load volatile i64, i64* @g_max_i, align 8 - %cmp348 = icmp eq i64 %2, 0 - br i1 %cmp348, label %for.cond.cleanup5, label %for.cond8.preheader.lr.ph - -for.cond8.preheader.lr.ph: ; preds = %for.body - %proc = getelementptr inbounds %struct.fd_set_bits, %struct.fd_set_bits* %0, i64 0, i32 7 - br label %for.cond8.preheader - -for.cond8.preheader: ; preds = %for.cond8.preheader.lr.ph, %for.cond.cleanup11 - %indvars.iv = phi i64 [ 0, %for.cond8.preheader.lr.ph ], [ %indvars.iv.next, %for.cond.cleanup11 ] - %rinp.050 = phi i64* [ %1, %for.cond8.preheader.lr.ph ], [ %incdec.ptr, %for.cond.cleanup11 ] - %retval1.149 = phi i32 [ %retval1.054, %for.cond8.preheader.lr.ph ], [ %retval1.3.lcssa, %for.cond.cleanup11 ] - br label %for.body12 - -for.cond.cleanup5.loopexit: ; preds = %for.cond.cleanup11 - %retval1.3.lcssa.lcssa = phi i32 [ %retval1.3.lcssa, %for.cond.cleanup11 ] - br label %for.cond.cleanup5 - -for.cond.cleanup5: ; preds = %for.cond.cleanup5.loopexit, %for.body - %retval1.1.lcssa = phi i32 [ %retval1.054, %for.body ], [ %retval1.3.lcssa.lcssa, %for.cond.cleanup5.loopexit ] - %inc23 = add nuw nsw i32 %k.053, 1 - %exitcond56 = icmp eq i32 %inc23, %max_iters_count - br i1 %exitcond56, label %for.cond.cleanup.loopexit, label %for.body - -for.cond.cleanup11: ; preds = %for.inc - %retval1.3.lcssa = phi i32 [ %retval1.3, %for.inc ] - %res_in7.1.lcssa = phi i64 [ %res_in7.1, %for.inc ] - store i64 %res_in7.1.lcssa, i64* %rinp.050, align 8 - %indvars.iv.next = add nuw i64 %indvars.iv, 1 - %incdec.ptr = getelementptr inbounds i64, i64* %rinp.050, i64 1 - %3 = load volatile i64, i64* @g_max_i, align 8 - %cmp3 = icmp ugt i64 %3, %indvars.iv.next - br i1 %cmp3, label %for.cond8.preheader, label %for.cond.cleanup5.loopexit - -for.body12: ; preds = %for.inc, %for.cond8.preheader - %j.047 = phi i32 [ 0, %for.cond8.preheader ], [ %inc18, %for.inc ] - %res_in7.046 = phi i64 [ 0, %for.cond8.preheader ], [ %res_in7.1, %for.inc ] - %bit.044 = phi i64 [ %bit_init_val, %for.cond8.preheader ], [ %shl, %for.inc ] - %retval1.243 = phi i32 [ %retval1.149, %for.cond8.preheader ], [ %retval1.3, %for.inc ] - %and = and i64 %bit.044, %in +for.body: ; preds = %for.body.lr.ph, %for.inc + %res_in.020 = phi i64 [ 0, %for.body.lr.ph ], [ %res_in.1, %for.inc ] + %retval1.019 = phi i32 [ 0, %for.body.lr.ph ], [ %retval1.1, %for.inc ] + %bit.addr.017 = phi i64 [ %bit, %for.body.lr.ph ], [ %shl, %for.inc ] + %and = and i64 %bit.addr.017, %in %tobool = icmp eq i64 %and, 0 br i1 %tobool, label %if.end, label %if.then -if.then: ; preds = %for.body12 +if.then: ; preds = %for.body ; CHECK-LABEL: if.then: -; CHECK-NEXT: %or = or i64 %res_in7.046, %bit.044 -; CHECK-NEXT: %inc = add nsw i32 %retval1.243, 1 +; CHECK-NEXT: %or = or i64 %res_in.020, %bit.addr.017 +; CHECK-NEXT: %inc = add nsw i32 %retval1.019, 1 ; CHECK-NEXT: store i8* null, i8** %proc, align 8 - %or = or i64 %res_in7.046, %bit.044 - %inc = add nsw i32 %retval1.243, 1 + %or = or i64 %res_in.020, %bit.addr.017 + %inc = add nsw i32 %retval1.019, 1 store i8* null, i8** %proc, align 8 br label %if.end -if.end: ; preds = %for.body12, %if.then - %retval1.3 = phi i32 [ %inc, %if.then ], [ %retval1.243, %for.body12 ] - %res_in7.1 = phi i64 [ %or, %if.then ], [ %res_in7.046, %for.body12 ] - br i1 %tobool14, label %for.inc, label %if.then15 +if.end: ; preds = %for.body, %if.then + %retval1.1 = phi i32 [ %inc, %if.then ], [ %retval1.019, %for.body ] + %res_in.1 = phi i64 [ %or, %if.then ], [ %res_in.020, %for.body ] + br i1 %tobool3, label %for.inc, label %if.then4 -if.then15: ; preds = %if.end -; CHECK-LABEL: if.then15: -; CHECK-NEXT: store i8* null, i8** %proc, align 8 +if.then4: ; preds = %if.end store i8* null, i8** %proc, align 8 br label %for.inc -for.inc: ; preds = %if.end, %if.then15 - %inc18 = add nuw nsw i32 %j.047, 1 - %shl = shl i64 %bit.044, 1 - %exitcond = icmp eq i32 %inc18, 64 - br i1 %exitcond, label %for.cond.cleanup11, label %for.body12 +for.inc: ; preds = %if.end, %if.then4 + %shl = shl i64 %bit.addr.017, 1 + %cmp = icmp eq i64 %shl, 0 + br i1 %cmp, label %for.end.loopexit, label %for.body + +for.end.loopexit: ; preds = %for.inc + %retval1.1.lcssa = phi i32 [ %retval1.1, %for.inc ] + %res_in.1.lcssa = phi i64 [ %res_in.1, %for.inc ] + br label %for.end + +for.end: ; preds = %for.end.loopexit, %entry + %retval1.0.lcssa = phi i32 [ 0, %entry ], [ %retval1.1.lcssa, %for.end.loopexit ] + %res_in.0.lcssa = phi i64 [ 0, %entry ], [ %res_in.1.lcssa, %for.end.loopexit ] + %1 = trunc i64 %res_in.0.lcssa to i32 + %conv7 = add i32 %retval1.0.lcssa, %1 + ret i32 %conv7 }