Closed
Description
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.