Created
December 14, 2019 13:20
-
-
Save masayuki038/cee2b28e0d6032de357829063447b922 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; ModuleID = '/var/lib/postgresql/12/main/2832.0.bc' | |
source_filename = "pg" | |
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" | |
target triple = "x86_64-pc-linux-gnu" | |
%struct.ExprState = type { %struct.Node, i8, i8, i64, %struct.TupleTableSlot*, %struct.ExprEvalStep*, i64 (%struct.ExprState*, %struct.ExprContext*, i8*)*, %struct.Expr*, i8*, i32, i32, %struct.PlanState*, %struct.ParamListInfoData*, i64*, i8*, i64*, i8* } | |
%struct.Node = type { i32 } | |
%struct.TupleTableSlot = type { i32, i16, i16, %struct.TupleTableSlotOps*, %struct.TupleDescData*, i64*, i8*, %struct.MemoryContextData*, %struct.ItemPointerData, i32 } | |
%struct.TupleTableSlotOps = type { i64, void (%struct.TupleTableSlot*)*, void (%struct.TupleTableSlot*)*, void (%struct.TupleTableSlot*)*, {}*, i64 (%struct.TupleTableSlot*, i32, i8*)*, void (%struct.TupleTableSlot*)*, void (%struct.TupleTableSlot*, %struct.TupleTableSlot*)*, %struct.HeapTupleData* (%struct.TupleTableSlot*)*, %struct.MinimalTupleData* (%struct.TupleTableSlot*)*, %struct.HeapTupleData* (%struct.TupleTableSlot*)*, %struct.MinimalTupleData* (%struct.TupleTableSlot*)* } | |
%struct.HeapTupleData = type { i32, %struct.ItemPointerData, i32, %struct.HeapTupleHeaderData* } | |
%struct.HeapTupleHeaderData = type { %union.anon, %struct.ItemPointerData, i16, i16, i8, [0 x i8] } | |
%union.anon = type { %struct.HeapTupleFields } | |
%struct.HeapTupleFields = type { i32, i32, %union.anon.0 } | |
%union.anon.0 = type { i32 } | |
%struct.MinimalTupleData = type { i32, [6 x i8], i16, i16, i8, [0 x i8] } | |
%struct.TupleDescData = type { i32, i32, i32, i32, %struct.TupleConstr*, [0 x %struct.FormData_pg_attribute] } | |
%struct.TupleConstr = type { %struct.AttrDefault*, %struct.ConstrCheck*, %struct.AttrMissing*, i16, i16, i8, i8 } | |
%struct.AttrDefault = type { i16, i8* } | |
%struct.ConstrCheck = type { i8*, i8*, i8, i8 } | |
%struct.AttrMissing = type { i8, i64 } | |
%struct.FormData_pg_attribute = type { i32, %struct.nameData, i32, i32, i16, i16, i32, i32, i32, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i32, i32 } | |
%struct.nameData = type { [64 x i8] } | |
%struct.MemoryContextData = type { i32, i8, i8, %struct.MemoryContextMethods*, %struct.MemoryContextData*, %struct.MemoryContextData*, %struct.MemoryContextData*, %struct.MemoryContextData*, i8*, i8*, %struct.MemoryContextCallback* } | |
%struct.MemoryContextMethods = type { i8* (%struct.MemoryContextData*, i64)*, void (%struct.MemoryContextData*, i8*)*, i8* (%struct.MemoryContextData*, i8*, i64)*, void (%struct.MemoryContextData*)*, void (%struct.MemoryContextData*)*, i64 (%struct.MemoryContextData*, i8*)*, i1 (%struct.MemoryContextData*)*, void (%struct.MemoryContextData*, void (%struct.MemoryContextData*, i8*, i8*)*, i8*, %struct.MemoryContextCounters*)* } | |
%struct.MemoryContextCounters = type { i64, i64, i64, i64 } | |
%struct.MemoryContextCallback = type { void (i8*)*, i8*, %struct.MemoryContextCallback* } | |
%struct.ItemPointerData = type { %struct.BlockIdData, i16 } | |
%struct.BlockIdData = type { i16, i16 } | |
%struct.ExprEvalStep = type { i64, i64*, i8*, %union.anon.1 } | |
%union.anon.1 = type { %struct.anon.25 } | |
%struct.anon.25 = type { i64*, i8*, i32, i32, %struct.FmgrInfo*, %struct.FunctionCallInfoBaseData* } | |
%struct.FmgrInfo = type { {}*, i32, i16, i8, i8, i8, i8*, %struct.MemoryContextData*, %struct.Node* } | |
%struct.FunctionCallInfoBaseData = type { %struct.FmgrInfo*, %struct.Node*, %struct.Node*, i32, i8, i16, [0 x %struct.NullableDatum] } | |
%struct.NullableDatum = type { i64, i8 } | |
%struct.Expr = type { i32 } | |
%struct.PlanState = type { i32, %struct.Plan*, %struct.EState*, %struct.TupleTableSlot* (%struct.PlanState*)*, %struct.TupleTableSlot* (%struct.PlanState*)*, %struct.Instrumentation*, %struct.WorkerInstrumentation*, %struct.SharedJitInstrumentation*, %struct.ExprState*, %struct.PlanState*, %struct.PlanState*, %struct.List*, %struct.List*, %struct.Bitmapset*, %struct.TupleDescData*, %struct.TupleTableSlot*, %struct.ExprContext*, %struct.ProjectionInfo*, %struct.TupleDescData*, %struct.TupleTableSlotOps*, %struct.TupleTableSlotOps*, %struct.TupleTableSlotOps*, %struct.TupleTableSlotOps*, i8, i8, i8, i8, i8, i8, i8, i8 } | |
%struct.Plan = type { i32, double, double, double, i32, i8, i8, i32, %struct.List*, %struct.List*, %struct.Plan*, %struct.Plan*, %struct.List*, %struct.Bitmapset*, %struct.Bitmapset* } | |
%struct.EState = type { i32, i32, %struct.SnapshotData*, %struct.SnapshotData*, %struct.List*, %struct.RangeTblEntry**, i32, %struct.RelationData**, %struct.ExecRowMark**, %struct.PlannedStmt*, i8*, %struct.JunkFilter*, i32, %struct.ResultRelInfo*, i32, %struct.ResultRelInfo*, %struct.ResultRelInfo*, i32, %struct.PartitionDirectoryData*, %struct.List*, %struct.List*, %struct.ParamListInfoData*, %struct.ParamExecData*, %struct.QueryEnvironment*, %struct.MemoryContextData*, %struct.List*, i64, i32, i32, i8, %struct.List*, %struct.List*, %struct.List*, %struct.ExprContext*, %struct.EPQState*, i8, %struct.dsa_area*, i32, %struct.JitContext*, %struct.JitInstrumentation* } | |
%struct.SnapshotData = type { i32, i32, i32, i32*, i32, i32*, i32, i8, i8, i8, i32, i32, i32, i32, %struct.pairingheap_node, i64, i64 } | |
%struct.pairingheap_node = type { %struct.pairingheap_node*, %struct.pairingheap_node*, %struct.pairingheap_node* } | |
%struct.RangeTblEntry = type opaque | |
%struct.RelationData = type opaque | |
%struct.ExecRowMark = type { %struct.RelationData*, i32, i32, i32, i32, i32, i32, i32, i8, %struct.ItemPointerData, i8* } | |
%struct.PlannedStmt = type { i32, i32, i64, i8, i8, i8, i8, i8, i8, i32, %struct.Plan*, %struct.List*, %struct.List*, %struct.List*, %struct.List*, %struct.Bitmapset*, %struct.List*, %struct.List*, %struct.List*, %struct.List*, %struct.Node*, i32, i32 } | |
%struct.JunkFilter = type { i32, %struct.List*, %struct.TupleDescData*, i16*, %struct.TupleTableSlot*, i16 } | |
%struct.ResultRelInfo = type { i32, i32, %struct.RelationData*, i32, %struct.RelationData**, %struct.IndexInfo**, %struct.TriggerDesc*, %struct.FmgrInfo*, %struct.ExprState**, %struct.Instrumentation*, %struct.TupleTableSlot*, %struct.TupleTableSlot*, %struct.TupleTableSlot*, %struct.FdwRoutine*, i8*, i8, %struct.List*, %struct.List*, %struct.ExprState**, %struct.ExprState**, %struct.JunkFilter*, %struct.List*, %struct.ProjectionInfo*, %struct.List*, %struct.OnConflictSetState*, %struct.List*, %struct.ExprState*, %struct.RelationData*, %struct.PartitionRoutingInfo*, %struct.CopyMultiInsertBuffer* } | |
%struct.IndexInfo = type { i32, i32, i32, [32 x i16], %struct.List*, %struct.List*, %struct.List*, %struct.ExprState*, i32*, i32*, i16*, i32*, i32*, i16*, i8, i8, i8, i8, i32, i32, i8*, %struct.MemoryContextData* } | |
%struct.TriggerDesc = type { %struct.Trigger*, i32, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8 } | |
%struct.Trigger = type { i32, i8*, i32, i16, i8, i8, i32, i32, i32, i8, i8, i16, i16, i16*, i8**, i8*, i8*, i8* } | |
%struct.FdwRoutine = type opaque | |
%struct.OnConflictSetState = type { i32, %struct.TupleTableSlot*, %struct.TupleTableSlot*, %struct.ProjectionInfo*, %struct.ExprState* } | |
%struct.PartitionRoutingInfo = type opaque | |
%struct.CopyMultiInsertBuffer = type opaque | |
%struct.PartitionDirectoryData = type opaque | |
%struct.ParamExecData = type { i8*, i64, i8 } | |
%struct.QueryEnvironment = type opaque | |
%struct.EPQState = type { %struct.EState*, i32, %struct.List*, %struct.TupleTableSlot**, %struct.Plan*, %struct.List*, %struct.TupleTableSlot*, %struct.EState*, %struct.ExecAuxRowMark**, i8*, %struct.PlanState* } | |
%struct.ExecAuxRowMark = type { %struct.ExecRowMark*, i16, i16, i16 } | |
%struct.dsa_area = type opaque | |
%struct.JitContext = type opaque | |
%struct.JitInstrumentation = type opaque | |
%struct.Instrumentation = type { i8, i8, i8, %struct.timespec, %struct.timespec, double, double, %struct.BufferUsage, double, double, double, double, double, double, double, %struct.BufferUsage } | |
%struct.timespec = type { i64, i64 } | |
%struct.BufferUsage = type { i64, i64, i64, i64, i64, i64, i64, i64, i64, i64, %struct.timespec, %struct.timespec } | |
%struct.WorkerInstrumentation = type { i32, [0 x %struct.Instrumentation] } | |
%struct.SharedJitInstrumentation = type opaque | |
%struct.List = type { i32, i32, %struct.ListCell*, %struct.ListCell* } | |
%struct.ListCell = type { %union.anon.4, %struct.ListCell* } | |
%union.anon.4 = type { i8* } | |
%struct.Bitmapset = type { i32, [0 x i64] } | |
%struct.ProjectionInfo = type { i32, %struct.ExprState, %struct.ExprContext* } | |
%struct.ParamListInfoData = type { %struct.ParamExternData* (%struct.ParamListInfoData*, i32, i1, %struct.ParamExternData*)*, i8*, void (%struct.ParamListInfoData*, %struct.Param*, %struct.ExprState*, i64*, i8*)*, i8*, void (%struct.ParseState*, i8*)*, i8*, i32, [0 x %struct.ParamExternData] } | |
%struct.ParamExternData = type { i64, i8, i16, i32 } | |
%struct.Param = type { %struct.Expr, i32, i32, i32, i32, i32, i32 } | |
%struct.ParseState = type opaque | |
%struct.ExprContext = type { i32, %struct.TupleTableSlot*, %struct.TupleTableSlot*, %struct.TupleTableSlot*, %struct.MemoryContextData*, %struct.MemoryContextData*, %struct.ParamExecData*, %struct.ParamListInfoData*, i64*, i8*, i64, i8, i64, i8, %struct.EState*, %struct.ExprContext_CB* } | |
%struct.ExprContext_CB = type { %struct.ExprContext_CB*, void (i64)*, i64 } | |
%struct.HeapTupleTableSlot = type { %struct.TupleTableSlot, %struct.HeapTupleData*, i32, %struct.HeapTupleData } | |
%struct.varlena.92 = type { [4 x i8], [0 x i8] } | |
; Function Attrs: norecurse nounwind uwtable | |
define i64 @evalexpr_0_0(%struct.ExprState*, %struct.ExprContext*, i1*) #0 { | |
entry: | |
%v.state.resvalue = getelementptr inbounds %struct.ExprState, %struct.ExprState* %0, i32 0, i32 3 | |
%v.state.resnull = getelementptr inbounds %struct.ExprState, %struct.ExprState* %0, i32 0, i32 2 | |
%3 = getelementptr inbounds %struct.ExprContext, %struct.ExprContext* %1, i32 0, i32 1 | |
%v_scanslot = load %struct.TupleTableSlot*, %struct.TupleTableSlot** %3 | |
%4 = getelementptr inbounds %struct.ExprContext, %struct.ExprContext* %1, i32 0, i32 2 | |
%v_innerslot = load %struct.TupleTableSlot*, %struct.TupleTableSlot** %4 | |
%5 = getelementptr inbounds %struct.ExprContext, %struct.ExprContext* %1, i32 0, i32 3 | |
%v_outerslot = load %struct.TupleTableSlot*, %struct.TupleTableSlot** %5 | |
%6 = getelementptr inbounds %struct.ExprState, %struct.ExprState* %0, i32 0, i32 4 | |
%v_resultslot = load %struct.TupleTableSlot*, %struct.TupleTableSlot** %6 | |
%7 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %v_scanslot, i32 0, i32 5 | |
%v_scanvalues = load i64*, i64** %7 | |
%8 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %v_scanslot, i32 0, i32 6 | |
%v_scannulls = load i8*, i8** %8 | |
%9 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %v_innerslot, i32 0, i32 5 | |
%v_innervalues = load i64*, i64** %9 | |
%10 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %v_innerslot, i32 0, i32 6 | |
%v_innernulls = load i8*, i8** %10 | |
%11 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %v_outerslot, i32 0, i32 5 | |
%v_outervalues = load i64*, i64** %11 | |
%12 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %v_outerslot, i32 0, i32 6 | |
%v_outernulls = load i8*, i8** %12 | |
%13 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %v_resultslot, i32 0, i32 5 | |
%v_resultvalues = load i64*, i64** %13 | |
%14 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %v_resultslot, i32 0, i32 6 | |
%v_resultnulls = load i8*, i8** %14 | |
%15 = getelementptr inbounds %struct.ExprContext, %struct.ExprContext* %1, i32 0, i32 8 | |
%v.econtext.aggvalues = load i64*, i64** %15 | |
%16 = getelementptr inbounds %struct.ExprContext, %struct.ExprContext* %1, i32 0, i32 9 | |
%v.econtext.aggnulls = load i8*, i8** %16 | |
br label %b.op.0.start | |
b.op.0.start: ; preds = %entry | |
%17 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %v_scanslot, i32 0, i32 2 | |
%18 = load i16, i16* %17 | |
%19 = icmp uge i16 %18, 3 | |
br i1 %19, label %b.op.1.start, label %op.0.fetch | |
op.0.fetch: ; preds = %b.op.0.start | |
call void @deform_0_1(%struct.TupleTableSlot* %v_scanslot) | |
br label %b.op.1.start | |
b.op.1.start: ; preds = %op.0.fetch, %b.op.0.start | |
%20 = getelementptr i64, i64* %v_scanvalues, i32 0 | |
%21 = load i64, i64* %20 | |
%22 = getelementptr i8, i8* %v_scannulls, i32 0 | |
%23 = load i8, i8* %22 | |
%24 = getelementptr i64, i64* %v_resultvalues, i32 0 | |
%25 = getelementptr i8, i8* %v_resultnulls, i32 0 | |
store i64 %21, i64* %24 | |
store i8 %23, i8* %25 | |
br label %b.op.2.start | |
b.op.2.start: ; preds = %b.op.1.start | |
%26 = getelementptr i64, i64* %v_scanvalues, i32 1 | |
%27 = load i64, i64* %26 | |
%28 = getelementptr i8, i8* %v_scannulls, i32 1 | |
%29 = load i8, i8* %28 | |
%30 = getelementptr i64, i64* %v_resultvalues, i32 1 | |
%31 = getelementptr i8, i8* %v_resultnulls, i32 1 | |
store i64 %27, i64* %30 | |
store i8 %29, i8* %31 | |
br label %b.op.3.start | |
b.op.3.start: ; preds = %b.op.2.start | |
%32 = getelementptr i64, i64* %v_scanvalues, i32 2 | |
%33 = load i64, i64* %32 | |
%34 = getelementptr i8, i8* %v_scannulls, i32 2 | |
%35 = load i8, i8* %34 | |
%36 = getelementptr i64, i64* %v_resultvalues, i32 2 | |
%37 = getelementptr i8, i8* %v_resultnulls, i32 2 | |
store i64 %33, i64* %36 | |
store i8 %35, i8* %37 | |
br label %b.op.4.start | |
b.op.4.start: ; preds = %b.op.3.start | |
%38 = load i64, i64* %v.state.resvalue | |
%39 = load i8, i8* %v.state.resnull | |
%40 = trunc i8 %39 to i1 | |
store i1 %40, i1* %2 | |
ret i64 %38 | |
} | |
; Function Attrs: norecurse nounwind uwtable | |
define internal void @deform_0_1(%struct.TupleTableSlot* align 8) #0 { | |
entry: | |
%v_offp = alloca i64 | |
%1 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %0, i32 0, i32 5 | |
%tts_values = load i64*, i64** %1 | |
%2 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %0, i32 0, i32 6 | |
%tts_ISNULL = load i8*, i8** %2 | |
%3 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %0, i32 0, i32 1 | |
%4 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %0, i32 0, i32 2 | |
%heapslot = bitcast %struct.TupleTableSlot* %0 to %struct.HeapTupleTableSlot* | |
%5 = getelementptr inbounds %struct.HeapTupleTableSlot, %struct.HeapTupleTableSlot* %heapslot, i32 0, i32 2 | |
%6 = getelementptr inbounds %struct.HeapTupleTableSlot, %struct.HeapTupleTableSlot* %heapslot, i32 0, i32 1 | |
%tupleheader = load %struct.HeapTupleData*, %struct.HeapTupleData** %6 | |
%7 = getelementptr inbounds %struct.HeapTupleData, %struct.HeapTupleData* %tupleheader, i32 0, i32 3 | |
%tuple = load %struct.HeapTupleHeaderData*, %struct.HeapTupleHeaderData** %7 | |
%8 = getelementptr inbounds %struct.HeapTupleHeaderData, %struct.HeapTupleHeaderData* %tuple, i32 0, i32 5 | |
%t_bits = bitcast [0 x i8]* %8 to i8* | |
%9 = getelementptr inbounds %struct.HeapTupleHeaderData, %struct.HeapTupleHeaderData* %tuple, i32 0, i32 3 | |
%infomask1 = load i16, i16* %9 | |
%10 = getelementptr inbounds %struct.HeapTupleHeaderData, %struct.HeapTupleHeaderData* %tuple, i32 0, i32 2 | |
%infomask2 = load i16, i16* %10 | |
%11 = and i16 1, %infomask1 | |
%hasnulls = icmp ne i16 %11, 0 | |
%maxatt = and i16 2047, %infomask2 | |
%12 = getelementptr inbounds %struct.HeapTupleHeaderData, %struct.HeapTupleHeaderData* %tuple, i32 0, i32 4 | |
%13 = load i8, i8* %12 | |
%t_hoff = zext i8 %13 to i32 | |
%14 = bitcast %struct.HeapTupleHeaderData* %tuple to i8* | |
%v_tupdata_base = getelementptr i8, i8* %14, i32 %t_hoff | |
%v_slot_off = load i32, i32* %5 | |
%15 = zext i32 %v_slot_off to i64 | |
store i64 %15, i64* %v_offp | |
br label %adjust_unavail_cols | |
adjust_unavail_cols: ; preds = %entry | |
br label %find_startblock | |
find_startblock: ; preds = %adjust_unavail_cols | |
%16 = load i16, i16* %4 | |
switch i16 %16, label %deadblock [ | |
i16 0, label %block.attr.0.attcheckattno | |
i16 1, label %block.attr.1.attcheckattno | |
i16 2, label %block.attr.2.attcheckattno | |
] | |
outblock: ; preds = %block.attr.2.store | |
%17 = load i64, i64* %v_offp | |
store i16 3, i16* %4 | |
%18 = trunc i64 %17 to i32 | |
store i32 %18, i32* %5 | |
%tts_flags = load i16, i16* %3 | |
%19 = or i16 %tts_flags, 8 | |
store i16 %19, i16* %3 | |
ret void | |
deadblock: ; preds = %find_startblock | |
unreachable | |
block.attr.0.attcheckattno: ; preds = %find_startblock | |
store i64 0, i64* %v_offp | |
br label %block.attr.0.start | |
block.attr.0.start: ; preds = %block.attr.0.attcheckattno | |
br label %block.attr.0.attcheckalign | |
block.attr.0.attisnull: ; No predecessors! | |
br label %block.attr.0.attcheckalign | |
block.attr.0.attcheckalign: ; preds = %block.attr.0.attisnull, %block.attr.0.start | |
br label %block.attr.0.align | |
block.attr.0.align: ; preds = %block.attr.0.attcheckalign | |
br label %block.attr.0.store | |
block.attr.0.store: ; preds = %block.attr.0.align | |
store i64 0, i64* %v_offp | |
%20 = load i64, i64* %v_offp | |
%21 = getelementptr i8, i8* %v_tupdata_base, i64 %20 | |
%22 = getelementptr i64, i64* %tts_values, i16 0 | |
%23 = getelementptr i8, i8* %tts_ISNULL, i16 0 | |
store i8 0, i8* %23 | |
%24 = bitcast i8* %21 to i32* | |
%attr_byval = load i32, i32* %24 | |
%25 = zext i32 %attr_byval to i64 | |
store i64 %25, i64* %22 | |
store i64 4, i64* %v_offp | |
br label %block.attr.1.attcheckattno | |
block.attr.1.attcheckattno: ; preds = %block.attr.0.store, %find_startblock | |
br label %block.attr.1.start | |
block.attr.1.start: ; preds = %block.attr.1.attcheckattno | |
br label %block.attr.1.attcheckalign | |
block.attr.1.attisnull: ; No predecessors! | |
br label %block.attr.1.attcheckalign | |
block.attr.1.attcheckalign: ; preds = %block.attr.1.attisnull, %block.attr.1.start | |
br label %block.attr.1.align | |
block.attr.1.align: ; preds = %block.attr.1.attcheckalign | |
br label %block.attr.1.store | |
block.attr.1.store: ; preds = %block.attr.1.align | |
store i64 4, i64* %v_offp | |
%26 = load i64, i64* %v_offp | |
%27 = getelementptr i8, i8* %v_tupdata_base, i64 %26 | |
%28 = getelementptr i64, i64* %tts_values, i16 1 | |
%29 = getelementptr i8, i8* %tts_ISNULL, i16 1 | |
store i8 0, i8* %29 | |
%30 = bitcast i8* %27 to i32* | |
%attr_byval1 = load i32, i32* %30 | |
%31 = zext i32 %attr_byval1 to i64 | |
store i64 %31, i64* %28 | |
store i64 8, i64* %v_offp | |
br label %block.attr.2.attcheckattno | |
block.attr.2.attcheckattno: ; preds = %block.attr.1.store, %find_startblock | |
br label %block.attr.2.start | |
block.attr.2.start: ; preds = %block.attr.2.attcheckattno | |
br label %block.attr.2.attcheckalign | |
block.attr.2.attisnull: ; No predecessors! | |
br label %block.attr.2.attcheckalign | |
block.attr.2.attcheckalign: ; preds = %block.attr.2.attisnull, %block.attr.2.start | |
br label %block.attr.2.align | |
block.attr.2.align: ; preds = %block.attr.2.attcheckalign | |
br label %block.attr.2.store | |
block.attr.2.store: ; preds = %block.attr.2.align | |
store i64 8, i64* %v_offp | |
%32 = load i64, i64* %v_offp | |
%33 = getelementptr i8, i8* %v_tupdata_base, i64 %32 | |
%34 = getelementptr i64, i64* %tts_values, i16 2 | |
%35 = getelementptr i8, i8* %tts_ISNULL, i16 2 | |
store i8 0, i8* %35 | |
%36 = bitcast i8* %33 to i32* | |
%attr_byval2 = load i32, i32* %36 | |
%37 = zext i32 %attr_byval2 to i64 | |
store i64 %37, i64* %34 | |
store i64 12, i64* %v_offp | |
br label %outblock | |
} | |
; Function Attrs: norecurse nounwind uwtable | |
define i64 @evalexpr_0_2(%struct.ExprState*, %struct.ExprContext*, i1*) #0 { | |
entry: | |
%v.state.resvalue = getelementptr inbounds %struct.ExprState, %struct.ExprState* %0, i32 0, i32 3 | |
%v.state.resnull = getelementptr inbounds %struct.ExprState, %struct.ExprState* %0, i32 0, i32 2 | |
%3 = getelementptr inbounds %struct.ExprContext, %struct.ExprContext* %1, i32 0, i32 1 | |
%v_scanslot = load %struct.TupleTableSlot*, %struct.TupleTableSlot** %3 | |
%4 = getelementptr inbounds %struct.ExprContext, %struct.ExprContext* %1, i32 0, i32 2 | |
%v_innerslot = load %struct.TupleTableSlot*, %struct.TupleTableSlot** %4 | |
%5 = getelementptr inbounds %struct.ExprContext, %struct.ExprContext* %1, i32 0, i32 3 | |
%v_outerslot = load %struct.TupleTableSlot*, %struct.TupleTableSlot** %5 | |
%6 = getelementptr inbounds %struct.ExprState, %struct.ExprState* %0, i32 0, i32 4 | |
%v_resultslot = load %struct.TupleTableSlot*, %struct.TupleTableSlot** %6 | |
%7 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %v_scanslot, i32 0, i32 5 | |
%v_scanvalues = load i64*, i64** %7 | |
%8 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %v_scanslot, i32 0, i32 6 | |
%v_scannulls = load i8*, i8** %8 | |
%9 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %v_innerslot, i32 0, i32 5 | |
%v_innervalues = load i64*, i64** %9 | |
%10 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %v_innerslot, i32 0, i32 6 | |
%v_innernulls = load i8*, i8** %10 | |
%11 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %v_outerslot, i32 0, i32 5 | |
%v_outervalues = load i64*, i64** %11 | |
%12 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %v_outerslot, i32 0, i32 6 | |
%v_outernulls = load i8*, i8** %12 | |
%13 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %v_resultslot, i32 0, i32 5 | |
%v_resultvalues = load i64*, i64** %13 | |
%14 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %v_resultslot, i32 0, i32 6 | |
%v_resultnulls = load i8*, i8** %14 | |
%15 = getelementptr inbounds %struct.ExprContext, %struct.ExprContext* %1, i32 0, i32 8 | |
%v.econtext.aggvalues = load i64*, i64** %15 | |
%16 = getelementptr inbounds %struct.ExprContext, %struct.ExprContext* %1, i32 0, i32 9 | |
%v.econtext.aggnulls = load i8*, i8** %16 | |
br label %b.op.0.start | |
b.op.0.start: ; preds = %entry | |
%17 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %v_scanslot, i32 0, i32 2 | |
%18 = load i16, i16* %17 | |
%19 = icmp uge i16 %18, 8 | |
br i1 %19, label %b.op.1.start, label %op.0.fetch | |
op.0.fetch: ; preds = %b.op.0.start | |
call void @deform_0_3(%struct.TupleTableSlot* %v_scanslot) | |
br label %b.op.1.start | |
b.op.1.start: ; preds = %op.0.fetch, %b.op.0.start | |
%20 = getelementptr i64, i64* %v_scanvalues, i32 7 | |
%21 = load i64, i64* %20 | |
%22 = getelementptr i8, i8* %v_scannulls, i32 7 | |
%23 = load i8, i8* %22 | |
store i64 %21, i64* inttoptr (i64 94155341074016 to i64*) | |
store i8 %23, i8* inttoptr (i64 94155341074024 to i8*) | |
br label %b.op.2.start | |
b.op.2.start: ; preds = %b.op.1.start | |
store i8 1, i8* inttoptr (i64 94155341072725 to i8*) | |
br label %b.2.isnull.0 | |
b.2.isnull.0: ; preds = %b.op.2.start | |
%24 = load i8, i8* getelementptr inbounds (%struct.FunctionCallInfoBaseData, %struct.FunctionCallInfoBaseData* inttoptr (i64 94155341073984 to %struct.FunctionCallInfoBaseData*), i32 0, i32 6, i32 0, i32 1) | |
%25 = icmp eq i8 %24, 1 | |
br i1 %25, label %b.op.3.start, label %b.2.isnull.1 | |
b.2.isnull.1: ; preds = %b.2.isnull.0 | |
%26 = load i8, i8* getelementptr inbounds (%struct.FunctionCallInfoBaseData, %struct.FunctionCallInfoBaseData* inttoptr (i64 94155341073984 to %struct.FunctionCallInfoBaseData*), i32 0, i32 6, i32 1, i32 1) | |
%27 = icmp eq i8 %26, 1 | |
br i1 %27, label %b.op.3.start, label %b.2.no-null-args | |
b.2.no-null-args: ; preds = %b.2.isnull.1 | |
store i8 0, i8* getelementptr inbounds (%struct.FunctionCallInfoBaseData, %struct.FunctionCallInfoBaseData* inttoptr (i64 94155341073984 to %struct.FunctionCallInfoBaseData*), i32 0, i32 4) | |
%funccall = call i64 @numeric_gt(%struct.FunctionCallInfoBaseData* inttoptr (i64 94155341073984 to %struct.FunctionCallInfoBaseData*)) | |
%28 = load i8, i8* getelementptr inbounds (%struct.FunctionCallInfoBaseData, %struct.FunctionCallInfoBaseData* inttoptr (i64 94155341073984 to %struct.FunctionCallInfoBaseData*), i32 0, i32 4) | |
call void @llvm.lifetime.end.p0i8(i64 32, i8* inttoptr (i64 94155341074016 to i8*)) | |
call void @llvm.lifetime.end.p0i8(i64 1, i8* inttoptr (i64 94155341074012 to i8*)) | |
store i64 %funccall, i64* inttoptr (i64 94155341072728 to i64*) | |
store i8 %28, i8* inttoptr (i64 94155341072725 to i8*) | |
br label %b.op.3.start | |
b.op.3.start: ; preds = %b.2.no-null-args, %b.2.isnull.1, %b.2.isnull.0 | |
%29 = load i64, i64* inttoptr (i64 94155341072728 to i64*) | |
%30 = load i8, i8* inttoptr (i64 94155341072725 to i8*) | |
%31 = icmp eq i64 %29, 0 | |
%32 = icmp eq i8 %30, 1 | |
%33 = or i1 %32, %31 | |
br i1 %33, label %op.3.qualfail, label %b.op.4.start | |
op.3.qualfail: ; preds = %b.op.3.start | |
store i8 0, i8* inttoptr (i64 94155341072725 to i8*) | |
store i64 0, i64* inttoptr (i64 94155341072728 to i64*) | |
br label %b.op.4.start | |
b.op.4.start: ; preds = %op.3.qualfail, %b.op.3.start | |
%34 = load i64, i64* %v.state.resvalue | |
%35 = load i8, i8* %v.state.resnull | |
%36 = trunc i8 %35 to i1 | |
store i1 %36, i1* %2 | |
ret i64 %34 | |
} | |
; Function Attrs: norecurse nounwind uwtable | |
define internal void @deform_0_3(%struct.TupleTableSlot* align 8) #0 { | |
entry: | |
%v_offp = alloca i64 | |
%1 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %0, i32 0, i32 5 | |
%tts_values = load i64*, i64** %1 | |
%2 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %0, i32 0, i32 6 | |
%tts_ISNULL = load i8*, i8** %2 | |
%3 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %0, i32 0, i32 1 | |
%4 = getelementptr inbounds %struct.TupleTableSlot, %struct.TupleTableSlot* %0, i32 0, i32 2 | |
%heapslot = bitcast %struct.TupleTableSlot* %0 to %struct.HeapTupleTableSlot* | |
%5 = getelementptr inbounds %struct.HeapTupleTableSlot, %struct.HeapTupleTableSlot* %heapslot, i32 0, i32 2 | |
%6 = getelementptr inbounds %struct.HeapTupleTableSlot, %struct.HeapTupleTableSlot* %heapslot, i32 0, i32 1 | |
%tupleheader = load %struct.HeapTupleData*, %struct.HeapTupleData** %6 | |
%7 = getelementptr inbounds %struct.HeapTupleData, %struct.HeapTupleData* %tupleheader, i32 0, i32 3 | |
%tuple = load %struct.HeapTupleHeaderData*, %struct.HeapTupleHeaderData** %7 | |
%8 = getelementptr inbounds %struct.HeapTupleHeaderData, %struct.HeapTupleHeaderData* %tuple, i32 0, i32 5 | |
%t_bits = bitcast [0 x i8]* %8 to i8* | |
%9 = getelementptr inbounds %struct.HeapTupleHeaderData, %struct.HeapTupleHeaderData* %tuple, i32 0, i32 3 | |
%infomask1 = load i16, i16* %9 | |
%10 = getelementptr inbounds %struct.HeapTupleHeaderData, %struct.HeapTupleHeaderData* %tuple, i32 0, i32 2 | |
%infomask2 = load i16, i16* %10 | |
%11 = and i16 1, %infomask1 | |
%hasnulls = icmp ne i16 %11, 0 | |
%maxatt = and i16 2047, %infomask2 | |
%12 = getelementptr inbounds %struct.HeapTupleHeaderData, %struct.HeapTupleHeaderData* %tuple, i32 0, i32 4 | |
%13 = load i8, i8* %12 | |
%t_hoff = zext i8 %13 to i32 | |
%14 = bitcast %struct.HeapTupleHeaderData* %tuple to i8* | |
%v_tupdata_base = getelementptr i8, i8* %14, i32 %t_hoff | |
%v_slot_off = load i32, i32* %5 | |
%15 = zext i32 %v_slot_off to i64 | |
store i64 %15, i64* %v_offp | |
br label %adjust_unavail_cols | |
adjust_unavail_cols: ; preds = %entry | |
br label %find_startblock | |
find_startblock: ; preds = %adjust_unavail_cols | |
%16 = load i16, i16* %4 | |
switch i16 %16, label %deadblock [ | |
i16 0, label %block.attr.0.attcheckattno | |
i16 1, label %block.attr.1.attcheckattno | |
i16 2, label %block.attr.2.attcheckattno | |
i16 3, label %block.attr.3.attcheckattno | |
i16 4, label %block.attr.4.attcheckattno | |
i16 5, label %block.attr.5.attcheckattno | |
i16 6, label %block.attr.6.attcheckattno | |
i16 7, label %block.attr.7.attcheckattno | |
] | |
outblock: ; preds = %block.attr.7.store | |
%17 = load i64, i64* %v_offp | |
store i16 8, i16* %4 | |
%18 = trunc i64 %17 to i32 | |
store i32 %18, i32* %5 | |
%tts_flags = load i16, i16* %3 | |
%19 = or i16 %tts_flags, 8 | |
store i16 %19, i16* %3 | |
ret void | |
deadblock: ; preds = %find_startblock | |
unreachable | |
block.attr.0.attcheckattno: ; preds = %find_startblock | |
store i64 0, i64* %v_offp | |
br label %block.attr.0.start | |
block.attr.0.start: ; preds = %block.attr.0.attcheckattno | |
br label %block.attr.0.attcheckalign | |
block.attr.0.attisnull: ; No predecessors! | |
br label %block.attr.0.attcheckalign | |
block.attr.0.attcheckalign: ; preds = %block.attr.0.attisnull, %block.attr.0.start | |
br label %block.attr.0.align | |
block.attr.0.align: ; preds = %block.attr.0.attcheckalign | |
br label %block.attr.0.store | |
block.attr.0.store: ; preds = %block.attr.0.align | |
store i64 0, i64* %v_offp | |
%20 = load i64, i64* %v_offp | |
%21 = getelementptr i8, i8* %v_tupdata_base, i64 %20 | |
%22 = getelementptr i64, i64* %tts_values, i16 0 | |
%23 = getelementptr i8, i8* %tts_ISNULL, i16 0 | |
store i8 0, i8* %23 | |
%24 = bitcast i8* %21 to i32* | |
%attr_byval = load i32, i32* %24 | |
%25 = zext i32 %attr_byval to i64 | |
store i64 %25, i64* %22 | |
store i64 4, i64* %v_offp | |
br label %block.attr.1.attcheckattno | |
block.attr.1.attcheckattno: ; preds = %block.attr.0.store, %find_startblock | |
br label %block.attr.1.start | |
block.attr.1.start: ; preds = %block.attr.1.attcheckattno | |
br label %block.attr.1.attcheckalign | |
block.attr.1.attisnull: ; No predecessors! | |
br label %block.attr.1.attcheckalign | |
block.attr.1.attcheckalign: ; preds = %block.attr.1.attisnull, %block.attr.1.start | |
br label %block.attr.1.align | |
block.attr.1.align: ; preds = %block.attr.1.attcheckalign | |
br label %block.attr.1.store | |
block.attr.1.store: ; preds = %block.attr.1.align | |
store i64 4, i64* %v_offp | |
%26 = load i64, i64* %v_offp | |
%27 = getelementptr i8, i8* %v_tupdata_base, i64 %26 | |
%28 = getelementptr i64, i64* %tts_values, i16 1 | |
%29 = getelementptr i8, i8* %tts_ISNULL, i16 1 | |
store i8 0, i8* %29 | |
%30 = bitcast i8* %27 to i32* | |
%attr_byval1 = load i32, i32* %30 | |
%31 = zext i32 %attr_byval1 to i64 | |
store i64 %31, i64* %28 | |
store i64 8, i64* %v_offp | |
br label %block.attr.2.attcheckattno | |
block.attr.2.attcheckattno: ; preds = %block.attr.1.store, %find_startblock | |
br label %block.attr.2.start | |
block.attr.2.start: ; preds = %block.attr.2.attcheckattno | |
br label %block.attr.2.attcheckalign | |
block.attr.2.attisnull: ; No predecessors! | |
br label %block.attr.2.attcheckalign | |
block.attr.2.attcheckalign: ; preds = %block.attr.2.attisnull, %block.attr.2.start | |
br label %block.attr.2.align | |
block.attr.2.align: ; preds = %block.attr.2.attcheckalign | |
br label %block.attr.2.store | |
block.attr.2.store: ; preds = %block.attr.2.align | |
store i64 8, i64* %v_offp | |
%32 = load i64, i64* %v_offp | |
%33 = getelementptr i8, i8* %v_tupdata_base, i64 %32 | |
%34 = getelementptr i64, i64* %tts_values, i16 2 | |
%35 = getelementptr i8, i8* %tts_ISNULL, i16 2 | |
store i8 0, i8* %35 | |
%36 = bitcast i8* %33 to i32* | |
%attr_byval2 = load i32, i32* %36 | |
%37 = zext i32 %attr_byval2 to i64 | |
store i64 %37, i64* %34 | |
store i64 12, i64* %v_offp | |
br label %block.attr.3.attcheckattno | |
block.attr.3.attcheckattno: ; preds = %block.attr.2.store, %find_startblock | |
br label %block.attr.3.start | |
block.attr.3.start: ; preds = %block.attr.3.attcheckattno | |
br label %block.attr.3.attcheckalign | |
block.attr.3.attisnull: ; No predecessors! | |
br label %block.attr.3.attcheckalign | |
block.attr.3.attcheckalign: ; preds = %block.attr.3.attisnull, %block.attr.3.start | |
br label %block.attr.3.align | |
block.attr.3.align: ; preds = %block.attr.3.attcheckalign | |
br label %block.attr.3.store | |
block.attr.3.store: ; preds = %block.attr.3.align | |
store i64 12, i64* %v_offp | |
%38 = load i64, i64* %v_offp | |
%39 = getelementptr i8, i8* %v_tupdata_base, i64 %38 | |
%40 = getelementptr i64, i64* %tts_values, i16 3 | |
%41 = getelementptr i8, i8* %tts_ISNULL, i16 3 | |
store i8 0, i8* %41 | |
%42 = bitcast i8* %39 to i32* | |
%attr_byval3 = load i32, i32* %42 | |
%43 = zext i32 %attr_byval3 to i64 | |
store i64 %43, i64* %40 | |
store i64 16, i64* %v_offp | |
br label %block.attr.4.attcheckattno | |
block.attr.4.attcheckattno: ; preds = %block.attr.3.store, %find_startblock | |
br label %block.attr.4.start | |
block.attr.4.start: ; preds = %block.attr.4.attcheckattno | |
br label %block.attr.4.attcheckalign | |
block.attr.4.attisnull: ; No predecessors! | |
br label %block.attr.4.attcheckalign | |
block.attr.4.attcheckalign: ; preds = %block.attr.4.attisnull, %block.attr.4.start | |
br label %block.attr.4.align | |
block.attr.4.align: ; preds = %block.attr.4.attcheckalign | |
br label %block.attr.4.store | |
block.attr.4.store: ; preds = %block.attr.4.align | |
store i64 16, i64* %v_offp | |
%44 = load i64, i64* %v_offp | |
%45 = getelementptr i8, i8* %v_tupdata_base, i64 %44 | |
%46 = getelementptr i64, i64* %tts_values, i16 4 | |
%47 = getelementptr i8, i8* %tts_ISNULL, i16 4 | |
store i8 0, i8* %47 | |
%attr_ptr = ptrtoint i8* %45 to i64 | |
store i64 %attr_ptr, i64* %46 | |
%varsize_any = call i64 @varsize_any(i8* %45) #5 | |
%48 = load i64, i64* %v_offp | |
%increment_offset = add i64 %48, %varsize_any | |
store i64 %increment_offset, i64* %v_offp | |
br label %block.attr.5.attcheckattno | |
block.attr.5.attcheckattno: ; preds = %block.attr.4.store, %find_startblock | |
br label %block.attr.5.start | |
block.attr.5.start: ; preds = %block.attr.5.attcheckattno | |
br label %block.attr.5.attcheckalign | |
block.attr.5.attisnull: ; No predecessors! | |
br label %block.attr.5.attcheckalign | |
block.attr.5.attcheckalign: ; preds = %block.attr.5.attisnull, %block.attr.5.start | |
%49 = load i64, i64* %v_offp | |
%50 = getelementptr i8, i8* %v_tupdata_base, i64 %49 | |
%padbyte = load i8, i8* %50 | |
%ispadbyte = icmp eq i8 %padbyte, 0 | |
br i1 %ispadbyte, label %block.attr.5.align, label %block.attr.5.store | |
block.attr.5.align: ; preds = %block.attr.5.attcheckalign | |
%51 = load i64, i64* %v_offp | |
%52 = add i64 %51, 3 | |
%aligned_offset = and i64 %52, -4 | |
store i64 %aligned_offset, i64* %v_offp | |
br label %block.attr.5.store | |
block.attr.5.store: ; preds = %block.attr.5.align, %block.attr.5.attcheckalign | |
%53 = load i64, i64* %v_offp | |
%54 = getelementptr i8, i8* %v_tupdata_base, i64 %53 | |
%55 = getelementptr i64, i64* %tts_values, i16 5 | |
%56 = getelementptr i8, i8* %tts_ISNULL, i16 5 | |
store i8 0, i8* %56 | |
%attr_ptr4 = ptrtoint i8* %54 to i64 | |
store i64 %attr_ptr4, i64* %55 | |
%varsize_any5 = call i64 @varsize_any(i8* %54) #5 | |
%57 = load i64, i64* %v_offp | |
%increment_offset6 = add i64 %57, %varsize_any5 | |
store i64 %increment_offset6, i64* %v_offp | |
br label %block.attr.6.attcheckattno | |
block.attr.6.attcheckattno: ; preds = %block.attr.5.store, %find_startblock | |
br label %block.attr.6.start | |
block.attr.6.start: ; preds = %block.attr.6.attcheckattno | |
br label %block.attr.6.attcheckalign | |
block.attr.6.attisnull: ; No predecessors! | |
br label %block.attr.6.attcheckalign | |
block.attr.6.attcheckalign: ; preds = %block.attr.6.attisnull, %block.attr.6.start | |
%58 = load i64, i64* %v_offp | |
%59 = getelementptr i8, i8* %v_tupdata_base, i64 %58 | |
%padbyte7 = load i8, i8* %59 | |
%ispadbyte8 = icmp eq i8 %padbyte7, 0 | |
br i1 %ispadbyte8, label %block.attr.6.align, label %block.attr.6.store | |
block.attr.6.align: ; preds = %block.attr.6.attcheckalign | |
%60 = load i64, i64* %v_offp | |
%61 = add i64 %60, 3 | |
%aligned_offset9 = and i64 %61, -4 | |
store i64 %aligned_offset9, i64* %v_offp | |
br label %block.attr.6.store | |
block.attr.6.store: ; preds = %block.attr.6.align, %block.attr.6.attcheckalign | |
%62 = load i64, i64* %v_offp | |
%63 = getelementptr i8, i8* %v_tupdata_base, i64 %62 | |
%64 = getelementptr i64, i64* %tts_values, i16 6 | |
%65 = getelementptr i8, i8* %tts_ISNULL, i16 6 | |
store i8 0, i8* %65 | |
%attr_ptr10 = ptrtoint i8* %63 to i64 | |
store i64 %attr_ptr10, i64* %64 | |
%varsize_any11 = call i64 @varsize_any(i8* %63) #5 | |
%66 = load i64, i64* %v_offp | |
%increment_offset12 = add i64 %66, %varsize_any11 | |
store i64 %increment_offset12, i64* %v_offp | |
br label %block.attr.7.attcheckattno | |
block.attr.7.attcheckattno: ; preds = %block.attr.6.store, %find_startblock | |
br label %block.attr.7.start | |
block.attr.7.start: ; preds = %block.attr.7.attcheckattno | |
br label %block.attr.7.attcheckalign | |
block.attr.7.attisnull: ; No predecessors! | |
br label %block.attr.7.attcheckalign | |
block.attr.7.attcheckalign: ; preds = %block.attr.7.attisnull, %block.attr.7.start | |
%67 = load i64, i64* %v_offp | |
%68 = getelementptr i8, i8* %v_tupdata_base, i64 %67 | |
%padbyte13 = load i8, i8* %68 | |
%ispadbyte14 = icmp eq i8 %padbyte13, 0 | |
br i1 %ispadbyte14, label %block.attr.7.align, label %block.attr.7.store | |
block.attr.7.align: ; preds = %block.attr.7.attcheckalign | |
%69 = load i64, i64* %v_offp | |
%70 = add i64 %69, 3 | |
%aligned_offset15 = and i64 %70, -4 | |
store i64 %aligned_offset15, i64* %v_offp | |
br label %block.attr.7.store | |
block.attr.7.store: ; preds = %block.attr.7.align, %block.attr.7.attcheckalign | |
%71 = load i64, i64* %v_offp | |
%72 = getelementptr i8, i8* %v_tupdata_base, i64 %71 | |
%73 = getelementptr i64, i64* %tts_values, i16 7 | |
%74 = getelementptr i8, i8* %tts_ISNULL, i16 7 | |
store i8 0, i8* %74 | |
%attr_ptr16 = ptrtoint i8* %72 to i64 | |
store i64 %attr_ptr16, i64* %73 | |
%varsize_any17 = call i64 @varsize_any(i8* %72) #5 | |
%75 = load i64, i64* %v_offp | |
%increment_offset18 = add i64 %75, %varsize_any17 | |
store i64 %increment_offset18, i64* %v_offp | |
br label %outblock | |
} | |
declare i64 @numeric_gt(%struct.FunctionCallInfoBaseData*) | |
; Function Attrs: argmemonly nounwind | |
declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) #1 | |
; Function Attrs: nounwind uwtable | |
define available_externally %struct.varlena.92* @pg_detoast_datum(%struct.varlena.92*) local_unnamed_addr #2 { | |
%2 = getelementptr inbounds %struct.varlena.92, %struct.varlena.92* %0, i64 0, i32 0, i64 0 | |
%3 = load i8, i8* %2, align 1 | |
%4 = and i8 %3, 3 | |
%5 = icmp eq i8 %4, 0 | |
br i1 %5, label %8, label %6 | |
; <label>:6: ; preds = %1 | |
%7 = tail call %struct.varlena.92* @heap_tuple_untoast_attr(%struct.varlena.92* nonnull %0) #6 | |
br label %8 | |
; <label>:8: ; preds = %6, %1 | |
%9 = phi %struct.varlena.92* [ %7, %6 ], [ %0, %1 ] | |
ret %struct.varlena.92* %9 | |
} | |
declare %struct.varlena.92* @heap_tuple_untoast_attr(%struct.varlena.92*) local_unnamed_addr #3 | |
; Function Attrs: nounwind uwtable | |
define available_externally void @pfree(i8*) local_unnamed_addr #2 { | |
%2 = getelementptr i8, i8* %0, i64 -8 | |
%3 = bitcast i8* %2 to %struct.MemoryContextData** | |
%4 = load %struct.MemoryContextData*, %struct.MemoryContextData** %3, align 8 | |
%5 = getelementptr inbounds %struct.MemoryContextData, %struct.MemoryContextData* %4, i64 0, i32 3 | |
%6 = load %struct.MemoryContextMethods*, %struct.MemoryContextMethods** %5, align 8 | |
%7 = getelementptr inbounds %struct.MemoryContextMethods, %struct.MemoryContextMethods* %6, i64 0, i32 1 | |
%8 = load void (%struct.MemoryContextData*, i8*)*, void (%struct.MemoryContextData*, i8*)** %7, align 8 | |
tail call void %8(%struct.MemoryContextData* %4, i8* %0) #6 | |
ret void | |
} | |
; Function Attrs: norecurse nounwind readonly uwtable | |
define available_externally i64 @varsize_any(i8* nocapture readonly) local_unnamed_addr #4 { | |
%2 = load i8, i8* %0, align 1 | |
%3 = zext i8 %2 to i32 | |
%4 = icmp eq i8 %2, 1 | |
br i1 %4, label %5, label %15 | |
; <label>:5: ; preds = %1 | |
%6 = getelementptr inbounds i8, i8* %0, i64 1 | |
%7 = load i8, i8* %6, align 1 | |
%8 = icmp eq i8 %7, 1 | |
%9 = and i8 %7, -2 | |
%10 = icmp eq i8 %9, 2 | |
%11 = or i1 %8, %10 | |
%12 = icmp eq i8 %7, 18 | |
%13 = select i1 %12, i64 18, i64 3 | |
%14 = select i1 %11, i64 10, i64 %13 | |
br label %27 | |
; <label>:15: ; preds = %1 | |
%16 = and i32 %3, 1 | |
%17 = icmp eq i32 %16, 0 | |
br i1 %17, label %20, label %18 | |
; <label>:18: ; preds = %15 | |
%19 = lshr i32 %3, 1 | |
br label %24 | |
; <label>:20: ; preds = %15 | |
%21 = bitcast i8* %0 to i32* | |
%22 = load i32, i32* %21, align 4 | |
%23 = lshr i32 %22, 2 | |
br label %24 | |
; <label>:24: ; preds = %20, %18 | |
%25 = phi i32 [ %19, %18 ], [ %23, %20 ] | |
%26 = zext i32 %25 to i64 | |
br label %27 | |
; <label>:27: ; preds = %24, %5 | |
%28 = phi i64 [ %26, %24 ], [ %14, %5 ] | |
ret i64 %28 | |
} | |
attributes #0 = { norecurse nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } | |
attributes #1 = { argmemonly nounwind } | |
attributes #2 = { nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } | |
attributes #3 = { "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } | |
attributes #4 = { norecurse nounwind readonly uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } | |
attributes #5 = { alwaysinline "readonly" } | |
attributes #6 = { nounwind } | |
!llvm.ident = !{!0, !0, !0} | |
!llvm.module.flags = !{!1} | |
!0 = !{!"clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)"} | |
!1 = !{i32 1, !"wchar_size", i32 4} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment