Skip to content

[SimplifyCFG] ForwardSwitchConditionToPHI missed some cases #95919

Closed
@dianqk

Description

@dianqk

I tried this IR:

define { i64, i64 } @src(i64 noundef %arg, i64 noundef %arg1) local_unnamed_addr #0 {
bb:
  switch i64 %arg1, label %bb7 [
    i64 0, label %bb3
    i64 1, label %bb2
  ]

bb2:                                              ; preds = %bb
  br label %bb3

bb7:                                              ; preds = %bb
  %i8 = udiv i64 %arg, %arg1
  %i13 = shl nuw i64 %i8, 1
  br label %bb3

bb3:                                              ; preds = %bb7, %bb2, %bb
  %i = phi i64 [ %i13, %bb7 ], [ %arg, %bb2 ], [ undef, %bb ]
  %i4 = phi i64 [ 1, %bb7 ], [ 1, %bb2 ], [ %arg1, %bb ]
  %i5 = insertvalue { i64, i64 } poison, i64 %i4, 0
  %i6 = insertvalue { i64, i64 } %i5, i64 %i, 1
  ret { i64, i64 } %i6
}

We can replace [ 1, %bb2 ] with [ %arg1, %bb2 ]. Then the final IR will become to:

define { i64, i64 } @tgt(i64 noundef %arg, i64 noundef %arg1) {
bb:
  %switch = icmp ult i64 %arg1, 2
  br i1 %switch, label %bb3, label %bb7

bb7:                                              ; preds = %bb
  %i8 = udiv i64 %arg, %arg1
  %i13 = shl nuw i64 %i8, 1
  br label %bb3

bb3:                                              ; preds = %bb, %bb7
  %i = phi i64 [ %i13, %bb7 ], [ %arg, %bb ]
  %i4 = phi i64 [ 1, %bb7 ], [ %arg1, %bb ]
  %i5 = insertvalue { i64, i64 } poison, i64 %i4, 0
  %i6 = insertvalue { i64, i64 } %i5, i64 %i, 1
  ret { i64, i64 } %i6
}

Alive2: https://alive2.llvm.org/ce/z/HvwxHB.
From: rust-lang/rust#126585.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions