LICM will speculatively hoist code outside of loops. This requires removing information, like alias analysis (https://github.com/llvm/llvm-project/issues/53794), range information (https://bugs.llvm.org/show_bug.cgi?id=50550), among others. Prior to https://reviews.llvm.org/D99249 , LICM would only be run after LoopRotate. Running Loop Rotate prior to LICM prevents a instruction hoist from being speculative, if it was conditionally executed by the iteration (as is commonly emitted by clang and other frontends). Adding the additional LICM pass first, however, forces all of these instructions to be considered speculative, even if they are not speculative after LoopRotate. This destroys information, resulting in performance losses for discarding this additional information. This PR modifies LICM to accept a ``speculative'' parameter which allows LICM to be set to perform information-loss speculative hoists or not. Phase ordering is then modified to not perform the information-losing speculative hoists until after loop rotate is performed, preserving this additional information. Reviewed By: lebedev.ri Differential Revision: https://reviews.llvm.org/D119965
263 lines
18 KiB
LLVM
263 lines
18 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature
|
|
; RUN: opt -O1 -S -enable-new-pm=0 < %s | FileCheck --check-prefixes=OLDPM_O1 %s
|
|
; RUN: opt -O2 -S -enable-new-pm=0 < %s | FileCheck --check-prefixes=OLDPM_O23 %s
|
|
; RUN: opt -O3 -S -enable-new-pm=0 < %s | FileCheck --check-prefixes=OLDPM_O23 %s
|
|
; RUN: opt -passes='default<O1>' -S < %s | FileCheck --check-prefixes=NEWPM_O1 %s
|
|
; RUN: opt -passes='default<O2>' -S < %s | FileCheck --check-prefixes=NEWPM_O23 %s
|
|
; RUN: opt -passes='default<O3>' -S < %s | FileCheck --check-prefixes=NEWPM_O23 %s
|
|
|
|
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
|
target triple = "x86_64-unknown-linux-gnu"
|
|
|
|
%class.FloatVecPair = type { %class.HomemadeVector, %class.HomemadeVector }
|
|
%class.HomemadeVector = type <{ %class.HomemadeVector.0*, i32, [4 x i8] }>
|
|
%class.HomemadeVector.0 = type <{ float*, i32, [4 x i8] }>
|
|
|
|
$_ZN12FloatVecPair6vecIncEv = comdat any
|
|
|
|
define dso_local void @_Z13vecIncFromPtrP12FloatVecPair(%class.FloatVecPair* %FVP) {
|
|
; OLDPM_O1-LABEL: define {{[^@]+}}@_Z13vecIncFromPtrP12FloatVecPair
|
|
; OLDPM_O1-SAME: (%class.FloatVecPair* [[FVP:%.*]]) local_unnamed_addr {
|
|
; OLDPM_O1-NEXT: entry:
|
|
; OLDPM_O1-NEXT: call void @_ZN12FloatVecPair6vecIncEv(%class.FloatVecPair* [[FVP]])
|
|
; OLDPM_O1-NEXT: ret void
|
|
;
|
|
; OLDPM_O23-LABEL: define {{[^@]+}}@_Z13vecIncFromPtrP12FloatVecPair
|
|
; OLDPM_O23-SAME: (%class.FloatVecPair* nocapture readonly [[FVP:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
|
|
; OLDPM_O23-NEXT: entry:
|
|
; OLDPM_O23-NEXT: [[BASE_I_I:%.*]] = getelementptr inbounds [[CLASS_FLOATVECPAIR:%.*]], %class.FloatVecPair* [[FVP]], i64 0, i32 1, i32 0
|
|
; OLDPM_O23-NEXT: [[TMP0:%.*]] = load %class.HomemadeVector.0*, %class.HomemadeVector.0** [[BASE_I_I]], align 8, !tbaa [[TBAA0:![0-9]+]]
|
|
; OLDPM_O23-NEXT: [[SIZE4_I:%.*]] = getelementptr inbounds [[CLASS_HOMEMADEVECTOR_0:%.*]], %class.HomemadeVector.0* [[TMP0]], i64 undef, i32 1
|
|
; OLDPM_O23-NEXT: [[TMP1:%.*]] = load i32, i32* [[SIZE4_I]], align 8, !tbaa [[TBAA6:![0-9]+]]
|
|
; OLDPM_O23-NEXT: [[CMP510_NOT_I:%.*]] = icmp eq i32 [[TMP1]], 0
|
|
; OLDPM_O23-NEXT: br i1 [[CMP510_NOT_I]], label [[_ZN12FLOATVECPAIR6VECINCEV_EXIT:%.*]], label [[FOR_BODY7_LR_PH_I:%.*]]
|
|
; OLDPM_O23: for.body7.lr.ph.i:
|
|
; OLDPM_O23-NEXT: [[BASE_I6_I:%.*]] = getelementptr inbounds [[CLASS_HOMEMADEVECTOR_0]], %class.HomemadeVector.0* [[TMP0]], i64 undef, i32 0
|
|
; OLDPM_O23-NEXT: [[TMP2:%.*]] = load float*, float** [[BASE_I6_I]], align 8, !tbaa [[TBAA8:![0-9]+]]
|
|
; OLDPM_O23-NEXT: [[ARRAYIDX_I7_I:%.*]] = getelementptr inbounds float, float* [[TMP2]], i64 undef
|
|
; OLDPM_O23-NEXT: [[BASE_I4_I:%.*]] = getelementptr inbounds [[CLASS_FLOATVECPAIR]], %class.FloatVecPair* [[FVP]], i64 0, i32 0, i32 0
|
|
; OLDPM_O23-NEXT: [[TMP3:%.*]] = load %class.HomemadeVector.0*, %class.HomemadeVector.0** [[BASE_I4_I]], align 8, !tbaa [[TBAA0]]
|
|
; OLDPM_O23-NEXT: [[BASE_I2_I:%.*]] = getelementptr inbounds [[CLASS_HOMEMADEVECTOR_0]], %class.HomemadeVector.0* [[TMP3]], i64 undef, i32 0
|
|
; OLDPM_O23-NEXT: [[TMP4:%.*]] = load float*, float** [[BASE_I2_I]], align 8, !tbaa [[TBAA8]]
|
|
; OLDPM_O23-NEXT: [[ARRAYIDX_I3_I:%.*]] = getelementptr inbounds float, float* [[TMP4]], i64 undef
|
|
; OLDPM_O23-NEXT: [[DOTPRE_I:%.*]] = load float, float* [[ARRAYIDX_I3_I]], align 4, !tbaa [[TBAA9:![0-9]+]]
|
|
; OLDPM_O23-NEXT: br label [[FOR_BODY7_I:%.*]]
|
|
; OLDPM_O23: for.body7.i:
|
|
; OLDPM_O23-NEXT: [[TMP5:%.*]] = phi float [ [[DOTPRE_I]], [[FOR_BODY7_LR_PH_I]] ], [ [[ADD_I:%.*]], [[FOR_BODY7_I]] ]
|
|
; OLDPM_O23-NEXT: [[J_011_I:%.*]] = phi i32 [ 0, [[FOR_BODY7_LR_PH_I]] ], [ [[INC_I:%.*]], [[FOR_BODY7_I]] ]
|
|
; OLDPM_O23-NEXT: [[TMP6:%.*]] = load float, float* [[ARRAYIDX_I7_I]], align 4, !tbaa [[TBAA9]]
|
|
; OLDPM_O23-NEXT: [[ADD_I]] = fadd float [[TMP5]], [[TMP6]]
|
|
; OLDPM_O23-NEXT: store float [[ADD_I]], float* [[ARRAYIDX_I3_I]], align 4, !tbaa [[TBAA9]]
|
|
; OLDPM_O23-NEXT: [[INC_I]] = add nuw i32 [[J_011_I]], 1
|
|
; OLDPM_O23-NEXT: [[EXITCOND_NOT_I:%.*]] = icmp eq i32 [[INC_I]], [[TMP1]]
|
|
; OLDPM_O23-NEXT: br i1 [[EXITCOND_NOT_I]], label [[_ZN12FLOATVECPAIR6VECINCEV_EXIT]], label [[FOR_BODY7_I]], !llvm.loop [[LOOP11:![0-9]+]]
|
|
; OLDPM_O23: _ZN12FloatVecPair6vecIncEv.exit:
|
|
; OLDPM_O23-NEXT: ret void
|
|
;
|
|
; NEWPM_O1-LABEL: define {{[^@]+}}@_Z13vecIncFromPtrP12FloatVecPair
|
|
; NEWPM_O1-SAME: (%class.FloatVecPair* nocapture readonly [[FVP:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
|
|
; NEWPM_O1-NEXT: entry:
|
|
; NEWPM_O1-NEXT: [[BASE_I_I:%.*]] = getelementptr inbounds [[CLASS_FLOATVECPAIR:%.*]], %class.FloatVecPair* [[FVP]], i64 0, i32 1, i32 0
|
|
; NEWPM_O1-NEXT: [[TMP0:%.*]] = load %class.HomemadeVector.0*, %class.HomemadeVector.0** [[BASE_I_I]], align 8, !tbaa [[TBAA0:![0-9]+]]
|
|
; NEWPM_O1-NEXT: [[SIZE4_I:%.*]] = getelementptr inbounds [[CLASS_HOMEMADEVECTOR_0:%.*]], %class.HomemadeVector.0* [[TMP0]], i64 undef, i32 1
|
|
; NEWPM_O1-NEXT: [[TMP1:%.*]] = load i32, i32* [[SIZE4_I]], align 8, !tbaa [[TBAA6:![0-9]+]]
|
|
; NEWPM_O1-NEXT: [[CMP510_NOT_I:%.*]] = icmp eq i32 [[TMP1]], 0
|
|
; NEWPM_O1-NEXT: br i1 [[CMP510_NOT_I]], label [[_ZN12FLOATVECPAIR6VECINCEV_EXIT:%.*]], label [[FOR_BODY7_LR_PH_I:%.*]]
|
|
; NEWPM_O1: for.body7.lr.ph.i:
|
|
; NEWPM_O1-NEXT: [[BASE_I4_I:%.*]] = getelementptr inbounds [[CLASS_HOMEMADEVECTOR_0]], %class.HomemadeVector.0* [[TMP0]], i64 undef, i32 0
|
|
; NEWPM_O1-NEXT: [[TMP2:%.*]] = load float*, float** [[BASE_I4_I]], align 8, !tbaa [[TBAA8:![0-9]+]]
|
|
; NEWPM_O1-NEXT: [[ARRAYIDX_I5_I:%.*]] = getelementptr inbounds float, float* [[TMP2]], i64 undef
|
|
; NEWPM_O1-NEXT: [[BASE_I6_I:%.*]] = getelementptr inbounds [[CLASS_FLOATVECPAIR]], %class.FloatVecPair* [[FVP]], i64 0, i32 0, i32 0
|
|
; NEWPM_O1-NEXT: [[TMP3:%.*]] = load %class.HomemadeVector.0*, %class.HomemadeVector.0** [[BASE_I6_I]], align 8, !tbaa [[TBAA0]]
|
|
; NEWPM_O1-NEXT: [[BASE_I8_I:%.*]] = getelementptr inbounds [[CLASS_HOMEMADEVECTOR_0]], %class.HomemadeVector.0* [[TMP3]], i64 undef, i32 0
|
|
; NEWPM_O1-NEXT: [[TMP4:%.*]] = load float*, float** [[BASE_I8_I]], align 8, !tbaa [[TBAA8]]
|
|
; NEWPM_O1-NEXT: [[ARRAYIDX_I9_I:%.*]] = getelementptr inbounds float, float* [[TMP4]], i64 undef
|
|
; NEWPM_O1-NEXT: br label [[FOR_BODY7_I:%.*]]
|
|
; NEWPM_O1: for.body7.i:
|
|
; NEWPM_O1-NEXT: [[J_011_I:%.*]] = phi i32 [ 0, [[FOR_BODY7_LR_PH_I]] ], [ [[INC_I:%.*]], [[FOR_BODY7_I]] ]
|
|
; NEWPM_O1-NEXT: [[TMP5:%.*]] = load float, float* [[ARRAYIDX_I5_I]], align 4, !tbaa [[TBAA9:![0-9]+]]
|
|
; NEWPM_O1-NEXT: [[TMP6:%.*]] = load float, float* [[ARRAYIDX_I9_I]], align 4, !tbaa [[TBAA9]]
|
|
; NEWPM_O1-NEXT: [[ADD_I:%.*]] = fadd float [[TMP5]], [[TMP6]]
|
|
; NEWPM_O1-NEXT: store float [[ADD_I]], float* [[ARRAYIDX_I9_I]], align 4, !tbaa [[TBAA9]]
|
|
; NEWPM_O1-NEXT: [[INC_I]] = add nuw i32 [[J_011_I]], 1
|
|
; NEWPM_O1-NEXT: [[EXITCOND_NOT_I:%.*]] = icmp eq i32 [[INC_I]], [[TMP1]]
|
|
; NEWPM_O1-NEXT: br i1 [[EXITCOND_NOT_I]], label [[_ZN12FLOATVECPAIR6VECINCEV_EXIT]], label [[FOR_BODY7_I]], !llvm.loop [[LOOP11:![0-9]+]]
|
|
; NEWPM_O1: _ZN12FloatVecPair6vecIncEv.exit:
|
|
; NEWPM_O1-NEXT: ret void
|
|
;
|
|
; NEWPM_O23-LABEL: define {{[^@]+}}@_Z13vecIncFromPtrP12FloatVecPair
|
|
; NEWPM_O23-SAME: (%class.FloatVecPair* nocapture readonly [[FVP:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
|
|
; NEWPM_O23-NEXT: entry:
|
|
; NEWPM_O23-NEXT: [[BASE_I_I:%.*]] = getelementptr inbounds [[CLASS_FLOATVECPAIR:%.*]], %class.FloatVecPair* [[FVP]], i64 0, i32 1, i32 0
|
|
; NEWPM_O23-NEXT: [[TMP0:%.*]] = load %class.HomemadeVector.0*, %class.HomemadeVector.0** [[BASE_I_I]], align 8, !tbaa [[TBAA0:![0-9]+]]
|
|
; NEWPM_O23-NEXT: [[SIZE4_I:%.*]] = getelementptr inbounds [[CLASS_HOMEMADEVECTOR_0:%.*]], %class.HomemadeVector.0* [[TMP0]], i64 undef, i32 1
|
|
; NEWPM_O23-NEXT: [[TMP1:%.*]] = load i32, i32* [[SIZE4_I]], align 8, !tbaa [[TBAA6:![0-9]+]]
|
|
; NEWPM_O23-NEXT: [[CMP510_NOT_I:%.*]] = icmp eq i32 [[TMP1]], 0
|
|
; NEWPM_O23-NEXT: br i1 [[CMP510_NOT_I]], label [[_ZN12FLOATVECPAIR6VECINCEV_EXIT:%.*]], label [[FOR_BODY7_LR_PH_I:%.*]]
|
|
; NEWPM_O23: for.body7.lr.ph.i:
|
|
; NEWPM_O23-NEXT: [[BASE_I4_I:%.*]] = getelementptr inbounds [[CLASS_HOMEMADEVECTOR_0]], %class.HomemadeVector.0* [[TMP0]], i64 undef, i32 0
|
|
; NEWPM_O23-NEXT: [[TMP2:%.*]] = load float*, float** [[BASE_I4_I]], align 8, !tbaa [[TBAA8:![0-9]+]]
|
|
; NEWPM_O23-NEXT: [[ARRAYIDX_I5_I:%.*]] = getelementptr inbounds float, float* [[TMP2]], i64 undef
|
|
; NEWPM_O23-NEXT: [[BASE_I6_I:%.*]] = getelementptr inbounds [[CLASS_FLOATVECPAIR]], %class.FloatVecPair* [[FVP]], i64 0, i32 0, i32 0
|
|
; NEWPM_O23-NEXT: [[TMP3:%.*]] = load %class.HomemadeVector.0*, %class.HomemadeVector.0** [[BASE_I6_I]], align 8, !tbaa [[TBAA0]]
|
|
; NEWPM_O23-NEXT: [[BASE_I8_I:%.*]] = getelementptr inbounds [[CLASS_HOMEMADEVECTOR_0]], %class.HomemadeVector.0* [[TMP3]], i64 undef, i32 0
|
|
; NEWPM_O23-NEXT: [[TMP4:%.*]] = load float*, float** [[BASE_I8_I]], align 8, !tbaa [[TBAA8]]
|
|
; NEWPM_O23-NEXT: [[ARRAYIDX_I9_I:%.*]] = getelementptr inbounds float, float* [[TMP4]], i64 undef
|
|
; NEWPM_O23-NEXT: [[DOTPRE_I:%.*]] = load float, float* [[ARRAYIDX_I9_I]], align 4, !tbaa [[TBAA9:![0-9]+]]
|
|
; NEWPM_O23-NEXT: br label [[FOR_BODY7_I:%.*]]
|
|
; NEWPM_O23: for.body7.i:
|
|
; NEWPM_O23-NEXT: [[TMP5:%.*]] = phi float [ [[DOTPRE_I]], [[FOR_BODY7_LR_PH_I]] ], [ [[ADD_I:%.*]], [[FOR_BODY7_I]] ]
|
|
; NEWPM_O23-NEXT: [[J_011_I:%.*]] = phi i32 [ 0, [[FOR_BODY7_LR_PH_I]] ], [ [[INC_I:%.*]], [[FOR_BODY7_I]] ]
|
|
; NEWPM_O23-NEXT: [[TMP6:%.*]] = load float, float* [[ARRAYIDX_I5_I]], align 4, !tbaa [[TBAA9]]
|
|
; NEWPM_O23-NEXT: [[ADD_I]] = fadd float [[TMP5]], [[TMP6]]
|
|
; NEWPM_O23-NEXT: store float [[ADD_I]], float* [[ARRAYIDX_I9_I]], align 4, !tbaa [[TBAA9]]
|
|
; NEWPM_O23-NEXT: [[INC_I]] = add nuw i32 [[J_011_I]], 1
|
|
; NEWPM_O23-NEXT: [[EXITCOND_NOT_I:%.*]] = icmp eq i32 [[INC_I]], [[TMP1]]
|
|
; NEWPM_O23-NEXT: br i1 [[EXITCOND_NOT_I]], label [[_ZN12FLOATVECPAIR6VECINCEV_EXIT]], label [[FOR_BODY7_I]], !llvm.loop [[LOOP11:![0-9]+]]
|
|
; NEWPM_O23: _ZN12FloatVecPair6vecIncEv.exit:
|
|
; NEWPM_O23-NEXT: ret void
|
|
;
|
|
entry:
|
|
%FVP.addr = alloca %class.FloatVecPair*, align 8
|
|
store %class.FloatVecPair* %FVP, %class.FloatVecPair** %FVP.addr, align 8, !tbaa !0
|
|
%0 = load %class.FloatVecPair*, %class.FloatVecPair** %FVP.addr, align 8, !tbaa !0
|
|
call void @_ZN12FloatVecPair6vecIncEv(%class.FloatVecPair* %0)
|
|
ret void
|
|
}
|
|
|
|
define linkonce_odr dso_local void @_ZN12FloatVecPair6vecIncEv(%class.FloatVecPair* %this) comdat align 2 {
|
|
; OLDPM_O1-LABEL: define {{[^@]+}}@_ZN12FloatVecPair6vecIncEv
|
|
; OLDPM_O1-SAME: (%class.FloatVecPair* [[THIS:%.*]]) local_unnamed_addr comdat align 2 {
|
|
; OLDPM_O1-NEXT: entry:
|
|
; OLDPM_O1-NEXT: [[VSRC23:%.*]] = getelementptr inbounds [[CLASS_FLOATVECPAIR:%.*]], %class.FloatVecPair* [[THIS]], i64 0, i32 1
|
|
; OLDPM_O1-NEXT: [[CALL2:%.*]] = call %class.HomemadeVector.0* @_ZN14HomemadeVectorIS_IfLj8EELj8EEixEj(%class.HomemadeVector* nonnull [[VSRC23]])
|
|
; OLDPM_O1-NEXT: [[SIZE43:%.*]] = getelementptr inbounds [[CLASS_HOMEMADEVECTOR_0:%.*]], %class.HomemadeVector.0* [[CALL2]], i64 0, i32 1
|
|
; OLDPM_O1-NEXT: [[TMP0:%.*]] = load i32, i32* [[SIZE43]], align 8, !tbaa [[TBAA0:![0-9]+]]
|
|
; OLDPM_O1-NEXT: [[CMP54_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
|
|
; OLDPM_O1-NEXT: br i1 [[CMP54_NOT]], label [[FOR_COND_CLEANUP6:%.*]], label [[FOR_BODY7_LR_PH:%.*]]
|
|
; OLDPM_O1: for.body7.lr.ph:
|
|
; OLDPM_O1-NEXT: [[VSRCDST:%.*]] = getelementptr inbounds [[CLASS_FLOATVECPAIR]], %class.FloatVecPair* [[THIS]], i64 0, i32 0
|
|
; OLDPM_O1-NEXT: br label [[FOR_BODY7:%.*]]
|
|
; OLDPM_O1: for.cond.cleanup6:
|
|
; OLDPM_O1-NEXT: ret void
|
|
; OLDPM_O1: for.body7:
|
|
; OLDPM_O1-NEXT: [[J_05:%.*]] = phi i32 [ 0, [[FOR_BODY7_LR_PH]] ], [ [[INC:%.*]], [[FOR_BODY7]] ]
|
|
; OLDPM_O1-NEXT: [[CALL9:%.*]] = call %class.HomemadeVector.0* @_ZN14HomemadeVectorIS_IfLj8EELj8EEixEj(%class.HomemadeVector* nonnull [[VSRC23]])
|
|
; OLDPM_O1-NEXT: [[CALL10:%.*]] = call float* @_ZN14HomemadeVectorIfLj8EEixEj(%class.HomemadeVector.0* [[CALL9]])
|
|
; OLDPM_O1-NEXT: [[TMP1:%.*]] = load float, float* [[CALL10]], align 4, !tbaa [[TBAA6:![0-9]+]]
|
|
; OLDPM_O1-NEXT: [[CALL11:%.*]] = call %class.HomemadeVector.0* @_ZN14HomemadeVectorIS_IfLj8EELj8EEixEj(%class.HomemadeVector* [[VSRCDST]])
|
|
; OLDPM_O1-NEXT: [[CALL12:%.*]] = call float* @_ZN14HomemadeVectorIfLj8EEixEj(%class.HomemadeVector.0* [[CALL11]])
|
|
; OLDPM_O1-NEXT: [[TMP2:%.*]] = load float, float* [[CALL12]], align 4, !tbaa [[TBAA6]]
|
|
; OLDPM_O1-NEXT: [[ADD:%.*]] = fadd float [[TMP1]], [[TMP2]]
|
|
; OLDPM_O1-NEXT: store float [[ADD]], float* [[CALL12]], align 4, !tbaa [[TBAA6]]
|
|
; OLDPM_O1-NEXT: [[INC]] = add nuw i32 [[J_05]], 1
|
|
; OLDPM_O1-NEXT: [[CALL:%.*]] = call %class.HomemadeVector.0* @_ZN14HomemadeVectorIS_IfLj8EELj8EEixEj(%class.HomemadeVector* nonnull [[VSRC23]])
|
|
; OLDPM_O1-NEXT: [[SIZE4:%.*]] = getelementptr inbounds [[CLASS_HOMEMADEVECTOR_0]], %class.HomemadeVector.0* [[CALL]], i64 0, i32 1
|
|
; OLDPM_O1-NEXT: [[TMP3:%.*]] = load i32, i32* [[SIZE4]], align 8, !tbaa [[TBAA0]]
|
|
; OLDPM_O1-NEXT: [[CMP5:%.*]] = icmp ult i32 [[INC]], [[TMP3]]
|
|
; OLDPM_O1-NEXT: br i1 [[CMP5]], label [[FOR_BODY7]], label [[FOR_COND_CLEANUP6]], !llvm.loop [[LOOP8:![0-9]+]]
|
|
;
|
|
entry:
|
|
%this.addr = alloca %class.FloatVecPair*, align 8
|
|
%j = alloca i32, align 4
|
|
store %class.FloatVecPair* %this, %class.FloatVecPair** %this.addr, align 8, !tbaa !0
|
|
%this1 = load %class.FloatVecPair*, %class.FloatVecPair** %this.addr, align 8
|
|
br label %for.cond
|
|
|
|
for.cond: ; preds = %entry
|
|
br label %for.body
|
|
|
|
for.body: ; preds = %for.cond
|
|
store i32 0, i32* %j, align 4, !tbaa !4
|
|
br label %for.cond2
|
|
|
|
for.cond2: ; preds = %for.inc, %for.body
|
|
%0 = load i32, i32* %j, align 4, !tbaa !4
|
|
%Vsrc23 = getelementptr inbounds %class.FloatVecPair, %class.FloatVecPair* %this1, i32 0, i32 1
|
|
%call = call %class.HomemadeVector.0* @_ZN14HomemadeVectorIS_IfLj8EELj8EEixEj(%class.HomemadeVector* %Vsrc23)
|
|
%size4 = getelementptr inbounds %class.HomemadeVector.0, %class.HomemadeVector.0* %call, i32 0, i32 1
|
|
%1 = load i32, i32* %size4, align 8, !tbaa !6
|
|
%cmp5 = icmp ult i32 %0, %1
|
|
br i1 %cmp5, label %for.body7, label %for.cond.cleanup6
|
|
|
|
for.cond.cleanup6: ; preds = %for.cond2
|
|
ret void
|
|
|
|
for.body7: ; preds = %for.cond2
|
|
%Vsrc28 = getelementptr inbounds %class.FloatVecPair, %class.FloatVecPair* %this1, i32 0, i32 1
|
|
%call9 = call %class.HomemadeVector.0* @_ZN14HomemadeVectorIS_IfLj8EELj8EEixEj(%class.HomemadeVector* %Vsrc28)
|
|
%call10 = call float* @_ZN14HomemadeVectorIfLj8EEixEj(%class.HomemadeVector.0* %call9)
|
|
%2 = load float, float* %call10, align 4, !tbaa !8
|
|
%Vsrcdst = getelementptr inbounds %class.FloatVecPair, %class.FloatVecPair* %this1, i32 0, i32 0
|
|
%call11 = call %class.HomemadeVector.0* @_ZN14HomemadeVectorIS_IfLj8EELj8EEixEj(%class.HomemadeVector* %Vsrcdst)
|
|
%call12 = call float* @_ZN14HomemadeVectorIfLj8EEixEj(%class.HomemadeVector.0* %call11)
|
|
%3 = load float, float* %call12, align 4, !tbaa !8
|
|
%add = fadd float %3, %2
|
|
store float %add, float* %call12, align 4, !tbaa !8
|
|
br label %for.inc
|
|
|
|
for.inc: ; preds = %for.body7
|
|
%4 = load i32, i32* %j, align 4, !tbaa !4
|
|
%inc = add i32 %4, 1
|
|
store i32 %inc, i32* %j, align 4, !tbaa !4
|
|
br label %for.cond2, !llvm.loop !10
|
|
}
|
|
|
|
define linkonce_odr dso_local %class.HomemadeVector.0* @_ZN14HomemadeVectorIS_IfLj8EELj8EEixEj(%class.HomemadeVector* %this) align 2 {
|
|
; OLDPM_O1-LABEL: define {{[^@]+}}@_ZN14HomemadeVectorIS_IfLj8EELj8EEixEj
|
|
; OLDPM_O1-SAME: (%class.HomemadeVector* [[THIS:%.*]]) local_unnamed_addr align 2 {
|
|
; OLDPM_O1-NEXT: entry:
|
|
; OLDPM_O1-NEXT: [[BASE:%.*]] = getelementptr inbounds [[CLASS_HOMEMADEVECTOR:%.*]], %class.HomemadeVector* [[THIS]], i64 0, i32 0
|
|
; OLDPM_O1-NEXT: [[TMP0:%.*]] = load %class.HomemadeVector.0*, %class.HomemadeVector.0** [[BASE]], align 8, !tbaa [[TBAA10:![0-9]+]]
|
|
; OLDPM_O1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [[CLASS_HOMEMADEVECTOR_0:%.*]], %class.HomemadeVector.0* [[TMP0]], i64 undef
|
|
; OLDPM_O1-NEXT: ret %class.HomemadeVector.0* [[ARRAYIDX]]
|
|
;
|
|
entry:
|
|
%this.addr = alloca %class.HomemadeVector*, align 8
|
|
store %class.HomemadeVector* %this, %class.HomemadeVector** %this.addr, align 8, !tbaa !0
|
|
%this1 = load %class.HomemadeVector*, %class.HomemadeVector** %this.addr, align 8
|
|
%base = getelementptr inbounds %class.HomemadeVector, %class.HomemadeVector* %this1, i32 0, i32 0
|
|
%0 = load %class.HomemadeVector.0*, %class.HomemadeVector.0** %base, align 8, !tbaa !12
|
|
%1 = bitcast %class.HomemadeVector.0* %0 to i8*
|
|
%2 = bitcast i8* %1 to %class.HomemadeVector.0*
|
|
%arrayidx = getelementptr inbounds %class.HomemadeVector.0, %class.HomemadeVector.0* %2, i64 undef
|
|
ret %class.HomemadeVector.0* %arrayidx
|
|
}
|
|
|
|
define linkonce_odr dso_local float* @_ZN14HomemadeVectorIfLj8EEixEj(%class.HomemadeVector.0* %this) align 2 {
|
|
; OLDPM_O1-LABEL: define {{[^@]+}}@_ZN14HomemadeVectorIfLj8EEixEj
|
|
; OLDPM_O1-SAME: (%class.HomemadeVector.0* [[THIS:%.*]]) local_unnamed_addr align 2 {
|
|
; OLDPM_O1-NEXT: entry:
|
|
; OLDPM_O1-NEXT: [[BASE:%.*]] = getelementptr inbounds [[CLASS_HOMEMADEVECTOR_0:%.*]], %class.HomemadeVector.0* [[THIS]], i64 0, i32 0
|
|
; OLDPM_O1-NEXT: [[TMP0:%.*]] = load float*, float** [[BASE]], align 8, !tbaa [[TBAA12:![0-9]+]]
|
|
; OLDPM_O1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds float, float* [[TMP0]], i64 undef
|
|
; OLDPM_O1-NEXT: ret float* [[ARRAYIDX]]
|
|
;
|
|
entry:
|
|
%this.addr = alloca %class.HomemadeVector.0*, align 8
|
|
store %class.HomemadeVector.0* %this, %class.HomemadeVector.0** %this.addr, align 8, !tbaa !0
|
|
%this1 = load %class.HomemadeVector.0*, %class.HomemadeVector.0** %this.addr, align 8
|
|
%base = getelementptr inbounds %class.HomemadeVector.0, %class.HomemadeVector.0* %this1, i32 0, i32 0
|
|
%0 = load float*, float** %base, align 8, !tbaa !14
|
|
%1 = bitcast float* %0 to i8*
|
|
%2 = bitcast i8* %1 to float*
|
|
%arrayidx = getelementptr inbounds float, float* %2, i64 undef
|
|
ret float* %arrayidx
|
|
}
|
|
|
|
!0 = !{!1, !1, i64 0}
|
|
!1 = !{!"any pointer", !2, i64 0}
|
|
!2 = !{!"omnipotent char", !3, i64 0}
|
|
!3 = !{!"Simple C++ TBAA"}
|
|
!4 = !{!5, !5, i64 0}
|
|
!5 = !{!"int", !2, i64 0}
|
|
!6 = !{!7, !5, i64 8}
|
|
!7 = !{!"_ZTS14HomemadeVectorIfLj8EE", !1, i64 0, !5, i64 8}
|
|
!8 = !{!9, !9, i64 0}
|
|
!9 = !{!"float", !2, i64 0}
|
|
!10 = distinct !{!10, !11}
|
|
!11 = !{!"llvm.loop.mustprogress"}
|
|
!12 = !{!13, !1, i64 0}
|
|
!13 = !{!"_ZTS14HomemadeVectorIS_IfLj8EELj8EE", !1, i64 0, !5, i64 8}
|
|
!14 = !{!7, !1, i64 0}
|