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
  • #5
Closed
Open
Issue created May 27, 2024 by 邓实诚@CaptainDeveloper

生成的LLVM IR的顺序错误

样例17怎么突然有else if

删掉

对于下面的sysY代码

下面的样例全都是block decl乱序问题

int main() {
  int x = 10;
  int y = 20;
  int z = 0;
  int i = 0;

  while (i < 5) {
    if (x < y) {
      if (y > 15) {
        z = z + x;
      } else {
        z = z - x;
      }
    } else {
      z = z * y;
    }
    i = i+ 1;
  }

  return z;
}

SCNUCC产生了下面的LLVM IR

define i32 @main(  ) {
block0:
  br label %block1
block1:
  %0 = phi i32 [0, %block0], [%18, %14]
  %1 = phi i32 [10, %block0], [%15, %14]
  %2 = phi i32 [20, %block0], [%16, %14]
  %3 = phi i32 [0, %block0], [%17, %14]
  %4 = icmp slt i32 %0, 5
  br i1 %4, label %block2, label %block9
block2:
  %5 = icmp slt i32 %1, %2
  br i1 %5, label %block3, label %block7
block3:
  %6 = icmp sgt i32 %2, 15
  br i1 %6, label %block4, label %block5
block4:
  %7 = add i32 %3, %1
  br label %block6
block5:
  %8 = sub i32 %3, %1
  br label %block6
block6:
  %9 = phi i32 [%0, %block4], [%0, %block5]
  %10 = phi i32 [%1, %block4], [%1, %block5]
  %11 = phi i32 [%2, %block4], [%2, %block5]
  %12 = phi i32 [%7, %block4], [%8, %block5]
  br label %block8
block7:
  %13 = mul i32 %3, %2
  br label %block8
%14 = phi i32 [%9, %block6], [%0, %block7]
  block8:
  %15 = phi i32 [%10, %block6], [%1, %block7]
  %16 = phi i32 [%11, %block6], [%2, %block7]
  %17 = phi i32 [%12, %block6], [%13, %block7]
  %18 = add i32 %14, 1
  br label %block1
block9:
  br label %block10
block10:
  %19 = phi i32 [%3, %block9]
  ret i32 %19
}

可以看到,在block7中,莫名其妙地出现了差错,block8位于block7里面了

样例16

//单个if
int main(){
    int a;
    if(1) a=1;
    return a;
}
define i32 @main(  ) {
block0:
  %0 = icmp ne i32 1, 0
  br i1 %0, label %block1, label %block2
block1:
  br label %block2
%1 = phi i32 [0.000000, %block0], [1, %block1]
  block2:
  br label %block3
block3:
  %2 = phi i32 [%1, %1]
  ret i32 %2
}

样例20

int main(){
    int a = 3;
    while(a>0){
        if(a<3) break;
        a = a - 1;
    }
    return a;
}
define i32 @main(  ) {
block0:
  br label %block1
block1:
  %0 = phi i32 [3, %block0], [%3, %block4]
  %1 = icmp sgt i32 %0, 0
  br i1 %1, label %block2, label %block5
block2:
  %2 = icmp slt i32 %0, 3
  br i1 %2, label %block3, label %block4
block3:
  br label %block5
block4:
  %3 = sub i32 %0, 1
  br label %block1
%4 = phi i32 [%0, %block1], [%0, %block3]
  block5:
  br label %block6
block6:
  %5 = phi i32 [%4, %4]
  ret i32 %5
}

样例28

int main(){
	int a=1,b=0,c=1,d=0,e=1;
	int flag = 0;
	if(a-b*c!=d-a/c||a*b/c==e+d||a+b+c==d+e){
		flag=1;
	}
	return flag;
}
define i32 @main(  ) {
block0:
  br i1 1, label %block3, label %block1
block1:
  br i1 0, label %block3, label %block2
block2:
  br i1 0, label %block3, label %block4
block3:
  br label %block4
%0 = phi i32 [0, %block2], [1, %block3]
  block4:
  br label %block5
block5:
  %1 = phi i32 [%0, %0]
  ret i32 %1
}

样例29

int a = 1;
int b = 0;
int c = 1;
int d = 2;
int e = 4;
int main()
{
	int flag=0;
	if(a * b / c == e + d && a * (a + b) + c <= d + e || a - (b * c) == d - a / c)
	{
		flag=1;
	}
	return flag;
}
@a = global i32 0
@b = global i32 0
@c = global i32 0
@d = global i32 0
@e = global i32 0
@llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @_GLOBAL__sub_I_example.cpp, ptr null }]
define internal void @init_a() #0 section ".text.startup" {
block0:
  store i32 1, i32* @a
  ret void
}

define internal void @init_b() #0 section ".text.startup" {
block0:
  store i32 0, i32* @b
  ret void
}

define internal void @init_c() #0 section ".text.startup" {
block0:
  store i32 1, i32* @c
  ret void
}

define internal void @init_d() #0 section ".text.startup" {
block0:
  store i32 2, i32* @d
  ret void
}

define internal void @init_e() #0 section ".text.startup" {
block0:
  store i32 4, i32* @e
  ret void
}

define internal void @_GLOBAL__sub_I_example.cpp() #1 section ".text.startup" {
  call void @init_a()
  call void @init_b()
  call void @init_c()
  call void @init_d()
  call void @init_e()
  ret void
}

define i32 @main(  ) {
block0:
  %0 = load i32, i32* @a
  %1 = load i32, i32* @b
  %2 = mul i32 %0, %1
  %3 = load i32, i32* @c
  %4 = sdiv i32 %2, %3
  %5 = load i32, i32* @e
  %6 = load i32, i32* @d
  %7 = add i32 %5, %6
  %8 = icmp eq i32 %4, %7
  br i1 %8, label %block1, label %block2
block1:
  %9 = load i32, i32* @a
  %10 = load i32, i32* @a
  %11 = load i32, i32* @b
  %12 = add i32 %10, %11
  %13 = mul i32 %9, %12
  %14 = load i32, i32* @c
  %15 = add i32 %13, %14
  %16 = load i32, i32* @d
  %17 = load i32, i32* @e
  %18 = add i32 %16, %17
  %19 = icmp sle i32 %15, %18
  br i1 %19, label %block3, label %block2
block2:
  %20 = phi i32 [0, %block0], [0, %block1]
  %21 = load i32, i32* @a
  %22 = load i32, i32* @b
  %23 = load i32, i32* @c
  %24 = mul i32 %22, %23
  %25 = sub i32 %21, %24
  %26 = load i32, i32* @d
  %27 = load i32, i32* @a
  %28 = load i32, i32* @c
  %29 = sdiv i32 %27, %28
  %30 = sub i32 %26, %29
  %31 = icmp eq i32 %25, %30
  br i1 %31, label %block3, label %block4
block3:
  br label %block4
%32 = phi i32 [%20, %block2], [1, %block3]
  block4:
  br label %block5
block5:
  %33 = phi i32 [%32, %32]
  ret i32 %33
}

Edited May 27, 2024 by jiajieZeng
Assignee
Assign to
Time tracking