[llvm] [VPlan] First step towards VPlan cost modeling. (PR #92555)

Arthur Eubanks via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 21 14:35:34 PDT 2024


aeubanks wrote:

actually, managed to reduce with `clang -mllvm --print-pipeline-passes` and `llvm/utils/reduce_pipeline.py`:

```
$ cat /tmp/a.ll
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%"class.llvm::MCOperand" = type { i8, %union.anon.125 }
%union.anon.125 = type { i64 }

$__llvm_profile_raw_version = comdat any

$__profc__ZNK4llvm6MCInst10getOperandEj = comdat nodeduplicate

$__profc__ZL13getOpIdxForMORKN4llvm6MCInstERKNS_9MCOperandE = comdat nodeduplicate

$__profc__ZNK4llvm25SmallVectorTemplateCommonINS_9MCOperandEvEixEm = comdat nodeduplicate

@__llvm_profile_raw_version = hidden local_unnamed_addr constant i64 72057594037927946, comdat
@__profc__ZNK4llvm6MCInst10getOperandEj = private global [1 x i64] zeroinitializer, section "__llvm_prf_cnts", comdat, align 8
@__profd__ZNK4llvm6MCInst10getOperandEj = private global { i64, i64, i64, i64, ptr, ptr, i32, [3 x i16], i32 } { i64 2553341900277967693, i64 742261418966908927, i64 sub (i64 ptrtoint (ptr @__profc__ZNK4llvm6MCInst10getOperandEj to i64), i64 ptrtoint (ptr @__profd__ZNK4llvm6MCInst10getOperandEj to i64)), i64 0, ptr @_ZNK4llvm6MCInst10getOperandEj.local, ptr null, i32 1, [3 x i16] zeroinitializer, i32 0 }, section "__llvm_prf_data", comdat($__profc__ZNK4llvm6MCInst10getOperandEj), align 8
@__profc__ZL13getOpIdxForMORKN4llvm6MCInstERKNS_9MCOperandE = private global [2 x i64] zeroinitializer, section "__llvm_prf_cnts", comdat, align 8
@__profd__ZL13getOpIdxForMORKN4llvm6MCInstERKNS_9MCOperandE = private global { i64, i64, i64, i64, ptr, ptr, i32, [3 x i16], i32 } { i64 -7534827318068404421, i64 146835646621254984, i64 sub (i64 ptrtoint (ptr @__profc__ZL13getOpIdxForMORKN4llvm6MCInstERKNS_9MCOperandE to i64), i64 ptrtoint (ptr @__profd__ZL13getOpIdxForMORKN4llvm6MCInstERKNS_9MCOperandE to i64)), i64 0, ptr @_ZL13getOpIdxForMORKN4llvm6MCInstERKNS_9MCOperandE.local, ptr null, i32 2, [3 x i16] zeroinitializer, i32 0 }, section "__llvm_prf_data", comdat($__profc__ZL13getOpIdxForMORKN4llvm6MCInstERKNS_9MCOperandE), align 8
@__profc__ZNK4llvm25SmallVectorTemplateCommonINS_9MCOperandEvEixEm = private global [1 x i64] zeroinitializer, section "__llvm_prf_cnts", comdat, align 8
@__profd__ZNK4llvm25SmallVectorTemplateCommonINS_9MCOperandEvEixEm = private global { i64, i64, i64, i64, ptr, ptr, i32, [3 x i16], i32 } { i64 8451465755920421443, i64 742261418966908927, i64 sub (i64 ptrtoint (ptr @__profc__ZNK4llvm25SmallVectorTemplateCommonINS_9MCOperandEvEixEm to i64), i64 ptrtoint (ptr @__profd__ZNK4llvm25SmallVectorTemplateCommonINS_9MCOperandEvEixEm to i64)), i64 0, ptr @_ZNK4llvm25SmallVectorTemplateCommonINS_9MCOperandEvEixEm.local, ptr null, i32 1, [3 x i16] zeroinitializer, i32 0 }, section "__llvm_prf_data", comdat($__profc__ZNK4llvm25SmallVectorTemplateCommonINS_9MCOperandEvEixEm), align 8
@__llvm_prf_nm = private constant [112 x i8] c"\8B\01mx\DA\8B\8F\F2\F36\C9\C9)\CB5\F3u\F6\CC+.14HO-\F1/H-J\CCKq\CDb\8C\8F\F214\06\8Bx\A6T\B8\E5\17\F9\FA\07y\FB!\ABw\05\F2\83\E3-}\9Daz\80Z\A0&\1A\99\06\E7&\E6\E4\84\A5&\97\E4\17\85\A4\E6\16\E4$\96\A4:\E7\E7\E6\E6\E7y\A2\EA)s\CD\ACp\CD\05\008D1/", section "__llvm_prf_names", align 1
@llvm.used = appending global [1 x ptr] [ptr @__llvm_prf_nm], section "llvm.metadata"
@llvm.compiler.used = appending global [3 x ptr] [ptr @__profd__ZL13getOpIdxForMORKN4llvm6MCInstERKNS_9MCOperandE, ptr @__profd__ZNK4llvm25SmallVectorTemplateCommonINS_9MCOperandEvEixEm, ptr @__profd__ZNK4llvm6MCInst10getOperandEj], section "llvm.metadata"

@_ZNK4llvm6MCInst10getOperandEj.local = private alias ptr (i32), ptr @_ZNK4llvm6MCInst10getOperandEj
@_ZL13getOpIdxForMORKN4llvm6MCInstERKNS_9MCOperandE.local = private alias i32 (ptr, i32), ptr @_ZL13getOpIdxForMORKN4llvm6MCInstERKNS_9MCOperandE
@_ZNK4llvm25SmallVectorTemplateCommonINS_9MCOperandEvEixEm.local = private alias ptr (i64), ptr @_ZNK4llvm25SmallVectorTemplateCommonINS_9MCOperandEvEixEm

; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(readwrite, argmem: none, inaccessiblemem: none)
define noalias ptr @_ZNK4llvm6MCInst10getOperandEj(i32 %i) local_unnamed_addr #0 {
entry:
  %pgocount = load i64, ptr @__profc__ZNK4llvm6MCInst10getOperandEj, align 8
  %0 = add i64 %pgocount, 1
  store i64 %0, ptr @__profc__ZNK4llvm6MCInst10getOperandEj, align 8
  %conv = zext i32 %i to i64
  %arrayidx.i = getelementptr nusw %"class.llvm::MCOperand", ptr null, i64 %conv
  ret ptr %arrayidx.i
}

; Function Attrs: nofree norecurse nosync nounwind memory(readwrite, argmem: none, inaccessiblemem: write)
define noundef i32 @_ZL13getOpIdxForMORKN4llvm6MCInstERKNS_9MCOperandE(ptr readnone %MI, i32 %call) local_unnamed_addr #1 {
entry:
  %pgocount = load i64, ptr getelementptr inbounds (i8, ptr @__profc__ZL13getOpIdxForMORKN4llvm6MCInstERKNS_9MCOperandE, i64 8), align 8
  %0 = add i64 %pgocount, 1
  store i64 %0, ptr getelementptr inbounds (i8, ptr @__profc__ZL13getOpIdxForMORKN4llvm6MCInstERKNS_9MCOperandE, i64 8), align 8
  %cmp1 = icmp ne i32 %call, 0
  tail call void @llvm.assume(i1 %cmp1)
  %cmp2.not2 = icmp eq ptr %MI, null
  br i1 %cmp2.not2, label %cleanup3, label %for.inc.preheader

for.inc.preheader:                                ; preds = %entry
  %__profc__ZL13getOpIdxForMORKN4llvm6MCInstERKNS_9MCOperandE.promoted = load i64, ptr @__profc__ZL13getOpIdxForMORKN4llvm6MCInstERKNS_9MCOperandE, align 8
  %1 = zext i32 %call to i64
  br label %for.inc

for.inc:                                          ; preds = %for.inc, %for.inc.preheader
  %indvars.iv = phi i64 [ 0, %for.inc.preheader ], [ %indvars.iv.next, %for.inc ]
  %2 = phi i64 [ %__profc__ZL13getOpIdxForMORKN4llvm6MCInstERKNS_9MCOperandE.promoted, %for.inc.preheader ], [ %3, %for.inc ]
  %3 = add i64 %2, 1
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %cmp = icmp ult i64 %indvars.iv.next, %1
  tail call void @llvm.assume(i1 %cmp)
  %arrayidx.i.i = getelementptr nusw %"class.llvm::MCOperand", ptr null, i64 %indvars.iv.next
  %cmp2.not = icmp eq ptr %arrayidx.i.i, %MI
  br i1 %cmp2.not, label %cleanup3.loopexit, label %for.inc

cleanup3.loopexit:                                ; preds = %for.inc
  %.lcssa = phi i64 [ %3, %for.inc ]
  store i64 %.lcssa, ptr @__profc__ZL13getOpIdxForMORKN4llvm6MCInstERKNS_9MCOperandE, align 8
  br label %cleanup3

cleanup3:                                         ; preds = %cleanup3.loopexit, %entry
  ret i32 0
}

; Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(readwrite, argmem: none, inaccessiblemem: none)
define noalias ptr @_ZNK4llvm25SmallVectorTemplateCommonINS_9MCOperandEvEixEm(i64 %idx) local_unnamed_addr #0 {
entry:
  %pgocount = load i64, ptr @__profc__ZNK4llvm25SmallVectorTemplateCommonINS_9MCOperandEvEixEm, align 8
  %0 = add i64 %pgocount, 1
  store i64 %0, ptr @__profc__ZNK4llvm25SmallVectorTemplateCommonINS_9MCOperandEvEixEm, align 8
  %arrayidx = getelementptr nusw %"class.llvm::MCOperand", ptr null, i64 %idx
  ret ptr %arrayidx
}

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: write)
declare void @llvm.assume(i1 noundef) #2

attributes #0 = { mustprogress nofree norecurse nosync nounwind willreturn memory(readwrite, argmem: none, inaccessiblemem: none) }
attributes #1 = { nofree norecurse nosync nounwind memory(readwrite, argmem: none, inaccessiblemem: write) }
attributes #2 = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: write) }

$ opt -p loop-vectorize -disable-output /tmp/a.ll
opt: ../../llvm/lib/Transforms/Vectorize/LoopVectorize.cpp:10361: bool llvm::LoopVectorizePass::processLoop(Loop *): Assertion `VF.Width == Width && "VPlan cost model and legacy cost model disagreed"' failed.
```

https://github.com/llvm/llvm-project/pull/92555


More information about the llvm-commits mailing list