[PATCH] D129402: [RISCV] Teach shouldConvertConstantLoadToIntImm that constant materialization can use constant pools.

Alex Bradbury via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 11 07:54:14 PDT 2022


asb added a comment.

Hi Craig - this seems to be causing some code quality regressions. Here is a relatively small (but not reduced) test case:

  --- a/output_rv64imafdc_lp64d_Os/20120207-1.s
  +++ b/output_rv64imafdc_lp64d_Os/20120207-1.s
  @@ -2,24 +2,41 @@
          .attribute      4, 16
          .attribute      5, "rv64i2p0_m2p0_a2p0_f2p0_d2p0_c2p0"
          .file   "20120207-1.c"
  -       .section        .sdata,"aw", at progbits
  -       .p2align        3                               # -- Begin function test
  -.LCPI0_0:
  -       .quad   3978425819141910832             # 0x3736353433323130
  -       .text
  -       .globl  test
  +       .globl  test                            # -- Begin function test
          .p2align        1
          .type   test, at function
   test:                                   # @test
   # %bb.0:                                # %entry
          addi    sp, sp, -16
          lui     a1, 4
  -       lui     a2, %hi(.LCPI0_0)
  -       ld      a2, %lo(.LCPI0_0)(a2)
          addiw   a1, a1, -1736
          sh      a1, 8(sp)
  +       lui     a1, %hi(.L.str)
  +       addi    a2, a1, %lo(.L.str)
  +       lbu     a3, 1(a2)
  +       lbu     a1, %lo(.L.str)(a1)
  +       lbu     a4, 3(a2)
  +       lbu     a5, 2(a2)
  +       slli    a3, a3, 8
  +       or      a1, a1, a3
  +       slli    a3, a4, 8
  +       or      a3, a3, a5
  +       lbu     a4, 5(a2)
  +       slli    a3, a3, 16
  +       or      a1, a1, a3
  +       lbu     a3, 4(a2)
  +       slli    a4, a4, 8
  +       lbu     a5, 7(a2)
  +       lbu     a2, 6(a2)
  +       or      a3, a3, a4
          sb      zero, 10(sp)
  -       sd      a2, 0(sp)
  +       slli    a4, a5, 8
  +       or      a2, a2, a4
  +       slli    a2, a2, 16
  +       or      a2, a2, a3
  +       slli    a2, a2, 32
  +       or      a1, a1, a2
  +       sd      a1, 0(sp)
          mv      a1, sp
          add     a0, a0, a1
          lbu     a0, -1(a0)



  ; ModuleID = './output_rv64imafdc_lp64d_Os/20120207-1.bc'
  source_filename = "20120207-1.c"
  target datalayout = "e-m:e-p:64:64-i64:64-i128:128-n64-S128"
  target triple = "riscv64-unknown-linux-gnu"
  
  @.str = private unnamed_addr constant [11 x i8] c"0123456789\00", align 1
  
  ; Function Attrs: noinline nounwind optsize
  define dso_local zeroext i8 @test(i32 noundef signext %a) #0 {
  entry:
    %a.addr = alloca i32, align 4
    %buf = alloca [16 x i8], align 1
    %output = alloca ptr, align 8
    store i32 %a, ptr %a.addr, align 4, !tbaa !3
    call void @llvm.lifetime.start.p0(i64 16, ptr %buf) #5
    call void @llvm.lifetime.start.p0(i64 8, ptr %output) #5
    %arraydecay = getelementptr inbounds [16 x i8], ptr %buf, i64 0, i64 0
    store ptr %arraydecay, ptr %output, align 8, !tbaa !7
    %arrayidx = getelementptr inbounds [16 x i8], ptr %buf, i64 0, i64 0
    %call = call ptr @strcpy(ptr noundef %arrayidx, ptr noundef @.str) #6
    %0 = load i32, ptr %a.addr, align 4, !tbaa !3
    %1 = load ptr, ptr %output, align 8, !tbaa !7
    %idx.ext = sext i32 %0 to i64
    %add.ptr = getelementptr inbounds i8, ptr %1, i64 %idx.ext
    store ptr %add.ptr, ptr %output, align 8, !tbaa !7
    %2 = load ptr, ptr %output, align 8, !tbaa !7
    %add.ptr1 = getelementptr inbounds i8, ptr %2, i64 -1
    store ptr %add.ptr1, ptr %output, align 8, !tbaa !7
    %3 = load ptr, ptr %output, align 8, !tbaa !7
    %arrayidx2 = getelementptr inbounds i8, ptr %3, i64 0
    %4 = load i8, ptr %arrayidx2, align 1, !tbaa !9
    call void @llvm.lifetime.end.p0(i64 8, ptr %output) #5
    call void @llvm.lifetime.end.p0(i64 16, ptr %buf) #5
    ret i8 %4
  }
  
  ; Function Attrs: argmemonly nocallback nofree nosync nounwind willreturn
  declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #1
  
  ; Function Attrs: optsize
  declare dso_local ptr @strcpy(ptr noundef, ptr noundef) #2
  
  ; Function Attrs: argmemonly nocallback nofree nosync nounwind willreturn
  declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #1
  
  ; Function Attrs: nounwind optsize
  define dso_local signext i32 @main() #3 {
  entry:
    %retval = alloca i32, align 4
    store i32 0, ptr %retval, align 4
    %call = call zeroext i8 @test(i32 noundef signext 2) #6
    %conv = zext i8 %call to i32
    %cmp = icmp ne i32 %conv, 49
    br i1 %cmp, label %if.then, label %if.end
  
  if.then:                                          ; preds = %entry
    call void @abort() #7
    unreachable
  
  if.end:                                           ; preds = %entry
    ret i32 0
  }
  
  ; Function Attrs: noreturn optsize
  declare dso_local void @abort() #4
  
  attributes #0 = { noinline nounwind optsize "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+64bit,+a,+c,+d,+f,+m,+relax,-save-restore" }
  attributes #1 = { argmemonly nocallback nofree nosync nounwind willreturn }
  attributes #2 = { optsize "frame-pointer"="none" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+64bit,+a,+c,+d,+f,+m,+relax,-save-restore" }
  attributes #3 = { nounwind optsize "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+64bit,+a,+c,+d,+f,+m,+relax,-save-restore" }
  attributes #4 = { noreturn optsize "frame-pointer"="none" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-features"="+64bit,+a,+c,+d,+f,+m,+relax,-save-restore" }
  attributes #5 = { nounwind }
  attributes #6 = { optsize }
  attributes #7 = { noreturn optsize }
  
  !llvm.module.flags = !{!0, !1, !2}
  
  !0 = !{i32 1, !"wchar_size", i32 4}
  !1 = !{i32 1, !"target-abi", !"lp64d"}
  !2 = !{i32 1, !"SmallDataLimit", i32 8}
  !3 = !{!4, !4, i64 0}
  !4 = !{!"int", !5, i64 0}
  !5 = !{!"omnipotent char", !6, i64 0}
  !6 = !{!"Simple C/C++ TBAA"}
  !7 = !{!8, !8, i64 0}
  !8 = !{!"any pointer", !5, i64 0}
  !9 = !{!5, !5, i64 0}


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D129402/new/

https://reviews.llvm.org/D129402



More information about the llvm-commits mailing list