[PATCH] [GVN] Use a simpler form of IRBuilder constructor.
Daniel Berlin
dberlin at dberlin.org
Thu Jun 11 17:00:24 PDT 2015
LGTM
On Thu, Jun 11, 2015 at 4:42 PM, Alexey Samsonov <vonosmas at gmail.com> wrote:
> Hi echristo, dberlin, dblaikie,
>
> A side effect of this change is that it IRBuilder now automatically
> created debug info locations for new instructions, which is the
> same as debug location of insertion point. This is fine for the
> functions in questions (GetStoreValueForLoad and
> GetMemInstValueForLoad), as they are used in two situations:
> * GVN::processLoad, which tries to eliminate a load. In this case
> new instructions would have the same debug location as the load they
> eventually replace;
> * MaterializeAdjustedValue, which adds new instructions to the end
> of the basic blocks, which could later be used to replace the load
> definition. In this case we don't yet know the way the load would
> be eventually replaced (either by assembling the precomputed values
> via PHI, or by using them directly), so just using the basic block
> strategy seems to be reasonable. There is also a special case
> in the code that *would* adjust the location of the last
> instruction replacing the load definition to the location of the
> load.
>
> http://reviews.llvm.org/D10405
>
> Files:
> lib/Transforms/Scalar/GVN.cpp
> test/Transforms/GVN/load-pre-nonlocal.ll
>
> Index: lib/Transforms/Scalar/GVN.cpp
> ===================================================================
> --- lib/Transforms/Scalar/GVN.cpp
> +++ lib/Transforms/Scalar/GVN.cpp
> @@ -1120,7 +1120,7 @@
> uint64_t StoreSize = (DL.getTypeSizeInBits(SrcVal->getType()) + 7) / 8;
> uint64_t LoadSize = (DL.getTypeSizeInBits(LoadTy) + 7) / 8;
>
> - IRBuilder<> Builder(InsertPt->getParent(), InsertPt);
> + IRBuilder<> Builder(InsertPt);
>
> // Compute which bits of the stored value are being used by the load. Convert
> // to an integer type to start with.
> @@ -1217,7 +1217,7 @@
> LLVMContext &Ctx = LoadTy->getContext();
> uint64_t LoadSize = DL.getTypeSizeInBits(LoadTy)/8;
>
> - IRBuilder<> Builder(InsertPt->getParent(), InsertPt);
> + IRBuilder<> Builder(InsertPt);
>
> // We know that this method is only called when the mem transfer fully
> // provides the bits for the load.
> Index: test/Transforms/GVN/load-pre-nonlocal.ll
> ===================================================================
> --- test/Transforms/GVN/load-pre-nonlocal.ll
> +++ test/Transforms/GVN/load-pre-nonlocal.ll
> @@ -53,35 +53,55 @@
> ; %1 is partially redundant if %0 can be widened to a 64-bit load.
>
> ; CHECK-LABEL: define i32 @overaligned_load
> +; CHECK: if.then:
> +; CHECK: %0 = load i64
> +; CHECK: [[LSHR:%[0-9]+]] = lshr i64 %0, 32, !dbg [[LSHR_LOC:![0-9]+]]
> +; CHECK: trunc i64 [[LSHR]] to i32
> ; CHECK: if.end:
> ; CHECK-NOT: %1 = load i32, i32*
> +; CHECK: [[LSHR_LOC]] = !DILocation(line: 101, column: 1, scope: !{{.*}})
>
> define i32 @overaligned_load(i32 %a, i32* nocapture %b) {
> entry:
> - %cmp = icmp sgt i32 %a, 0
> - br i1 %cmp, label %if.then, label %if.else
> + %cmp = icmp sgt i32 %a, 0, !dbg !14
> + br i1 %cmp, label %if.then, label %if.else, !dbg !14
>
> if.then:
> - %0 = load i32, i32* getelementptr inbounds (%struct.S1, %struct.S1* @s1, i64 0, i32 0), align 8, !tbaa !5
> - br label %if.end
> + %0 = load i32, i32* getelementptr inbounds (%struct.S1, %struct.S1* @s1, i64 0, i32 0), align 8, !tbaa !5, !dbg !15
> + br label %if.end, !dbg !15
>
> if.else:
> - %arrayidx = getelementptr inbounds i32, i32* %b, i64 2
> - store i32 10, i32* %arrayidx, align 4, !tbaa !5
> - br label %if.end
> + %arrayidx = getelementptr inbounds i32, i32* %b, i64 2, !dbg !16
> + store i32 10, i32* %arrayidx, align 4, !tbaa !5, !dbg !16
> + br label %if.end, !dbg !16
>
> if.end:
> %i.0 = phi i32 [ %0, %if.then ], [ 0, %if.else ]
> %p.0 = phi i32* [ getelementptr inbounds (%struct.S1, %struct.S1* @s1, i64 0, i32 0), %if.then ], [ %b, %if.else ]
> - %add.ptr = getelementptr inbounds i32, i32* %p.0, i64 1
> - %1 = load i32, i32* %add.ptr, align 4, !tbaa !5
> - %add1 = add nsw i32 %1, %i.0
> - ret i32 %add1
> + %add.ptr = getelementptr inbounds i32, i32* %p.0, i64 1, !dbg !17
> + %1 = load i32, i32* %add.ptr, align 4, !tbaa !5, !dbg !17
> + %add1 = add nsw i32 %1, %i.0, !dbg !17
> + ret i32 %add1, !dbg !17
> }
>
> !1 = !{!2, !2, i64 0}
> !2 = !{!"any pointer", !3, i64 0}
> !3 = !{!"omnipotent char", !4, i64 0}
> !4 = !{!"Simple C/C++ TBAA"}
> !5 = !{!6, !6, i64 0}
> !6 = !{!"int", !3, i64 0}
> +
> +!llvm.module.flags = !{!7, !8, !9}
> +!7 = !{i32 2, !"Dwarf Version", i32 4}
> +!8 = !{i32 2, !"Debug Info Version", i32 3}
> +!9 = !{i32 1, !"PIC Level", i32 2}
> +
> +!10 = !{}
> +!11 = !DISubroutineType(types: !10)
> +!12 = !DIFile(filename: "test.cpp", directory: "/tmp")
> +!13 = !DISubprogram(name: "test", scope: !12, file: !12, line: 99, type: !11, isLocal: false, isDefinition: true, scopeLine: 100, flags: DIFlagPrototyped, isOptimized: false, function: i32 (i32, i32*)* @overaligned_load, variables: !10)
> +!14 = !DILocation(line: 100, column: 1, scope: !13)
> +!15 = !DILocation(line: 101, column: 1, scope: !13)
> +!16 = !DILocation(line: 102, column: 1, scope: !13)
> +!17 = !DILocation(line: 103, column: 1, scope: !13)
> +
>
> EMAIL PREFERENCES
> http://reviews.llvm.org/settings/panel/emailpreferences/
More information about the llvm-commits
mailing list