Skip to content

Instantly share code, notes, and snippets.

@masayuki038
Created December 14, 2019 13:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save masayuki038/cee2b28e0d6032de357829063447b922 to your computer and use it in GitHub Desktop.
Save masayuki038/cee2b28e0d6032de357829063447b922 to your computer and use it in GitHub Desktop.
; 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