Skip to content
GitLab
Projects Groups Topics Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in
  • S SCNUCC
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributor statistics
    • Graph
    • Compare revisions
  • Issues 11
    • Issues 11
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Terraform modules
  • Monitor
    • Monitor
    • Metrics
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • BetterThanGnu
  • SCNUCC
  • Issues
  • #32
Closed
Open
Issue created Jun 08, 2024 by jiajieZeng@jiajieZengDeveloper

样例73

样例73出现了phi函数没有操作数的问题

代码

const int ascii_0 = 48;

int my_getint()
{
    int sum = 0, c;

    while (1) {
        c = getch() - ascii_0;
        if (c < 0 || c > 9) {
            continue;
        } else {
            break;
        }
    }
    sum = c;

    while (1) {
        c = getch() - ascii_0;
        if (c >= 0 && c <= 9) {
            sum = sum * 10 + c;
        } else {
            break;
        }
    }

    return sum;
}

void my_putint(int a)
{
    int b[16], i = 0;
    while (a > 0) {
        b[i] = a % 10 + ascii_0;
        a = a / 10;
        i = i + 1;
    }
    while (i > 0) {
        i = i - 1;
        putch(b[i]);
    }
}

int main()
{
    int n = my_getint();
    while (n > 0) {
        int m = my_getint();
        my_putint(m); putch(10);
        n = n - 1;
    }
    return 0;
}

IR

@ascii_0 = dso_local global i32 48
define i32 @my_getint( ) {
block0:
  br label %block1
block1:
  %0 = phi i32 [0, %block0], [%6, %block4], [%7, %block6]
  %1 = icmp ne i32 1, 0
  br i1 %1, label %block2, label %block7
block2:
  %2 = call noundef i32 @getch()
  %3 = sub i32 %2, 48
  %4 = icmp slt i32 %3, 0
  br i1 %4, label %block4, label %block3
block3:
  %5 = icmp sgt i32 %3, 9
  br i1 %5, label %block4, label %block5
block4:
  %6 = phi i32 [%3, %block2], [%3, %block3]
  br label %block1
block5:
  br label %block7
block6:
  %7 = phi i32
  br label %block1
block7:
  %8 = phi i32 [%0, %block1], [%3, %block5]
  br label %block8
block8:
  %9 = phi i32 [%8, %block7], [%16, %block13]
  %10 = icmp ne i32 1, 0
  br i1 %10, label %block9, label %block14
block9:
  %11 = call noundef i32 @getch()
  %12 = sub i32 %11, 48
  %13 = icmp sge i32 %12, 0
  br i1 %13, label %block10, label %block12
block10:
  %14 = icmp sle i32 %12, 9
  br i1 %14, label %block11, label %block12
block11:
  %15 = mul i32 %9, 10
  %16 = add i32 %15, %12
  br label %block13
block12:
  %17 = phi i32 [%9, %block9], [%9, %block10]
  br label %block14
block13:
  br label %block8
block14:
  %18 = phi i32 [%9, %block8], [%17, %block12]
  br label %block15
block15:
  %19 = phi i32 [%18, %block14]
  ret i32 %19
}
define void @my_putint( i32 %0 ) {
block0:
  %1 = alloca [16 x i32], align 16
  br label %block1
block1:
  %2 = phi i32 [%0, %block0], [%9, %block2]
  %3 = phi i32* [%1, %block0], [%3, %block2]
  %4 = phi i32 [0, %block0], [%10, %block2]
  %5 = icmp sgt i32 %2, 0
  br i1 %5, label %block2, label %block3
block2:
  %6 = srem i32 %2, 10
  %7 = add i32 %6, 48
  %8 = getelementptr inbounds [16 x i32], ptr %3, i32 0, i32 %4
  store i32 %7, i32* %8
  %9 = sdiv i32 %2, 10
  %10 = add i32 %4, 1
  br label %block1
block3:
  br label %block4
block4:
  %11 = phi i32 [%4, %block3], [%14, %block5]
  %12 = phi i32* [%3, %block3], [%12, %block5]
  %13 = icmp sgt i32 %11, 0
  br i1 %13, label %block5, label %block6
block5:
  %14 = sub i32 %11, 1
  %15 = getelementptr inbounds [16 x i32], ptr %12, i32 0, i32 %14
  %16 = load i32, i32* %15
  call void @putch(i32 noundef %16)
  br label %block4
block6:
  br label %block7
block7:
  ret void
}
define i32 @main( ) {
block0:
  %0 = call noundef i32 @my_getint()
  br label %block1
block1:
  %1 = phi i32 [%0, %block0], [%4, %block2]
  %2 = icmp sgt i32 %1, 0
  br i1 %2, label %block2, label %block3
block2:
  %3 = call noundef i32 @my_getint()
  call void @my_putint(i32 noundef %3)
  call void @putch(i32 noundef 10)
  %4 = sub i32 %1, 1
  br label %block1
block3:
  br label %block4
block4:
  %5 = phi i32 [0, %block3]
  ret i32 %5
}


declare i32 @getint()
declare i32 @getch()
declare float @getfloat()
declare i32 @getarray(i32* %0)
declare i32 @getfarray(float* %0)
declare void @putint(i32 %0)
declare void @putch(i32 %0)
declare void @putarray(i32 %0, i32* %1)
declare void @putfloat(float %0)
declare void @putfarray(i32 %0, float* %1)
declare void @putf(i8* %0, ...)
declare void @before_main()
declare void @after_main()
declare void @_sysy_starttime(i32 %0)
declare void @_sysy_stoptime(i32 %0)


declare void @llvm.memset.p0.i32(ptr nocapture writeonly, i8, i32, i1 immarg)

错误信息

llc: error: llc: tmp.ll:24:3: error: expected '[' in phi value list
  br label %block1
  ^
Assignee
Assign to
Time tracking