-
Notifications
You must be signed in to change notification settings - Fork 15.3k
Closed
Labels
Description
After the #67736 LICM turns the following IR
define i32 @test() {
entry:
br label %loop
loop:
%iv = phi i32 [ 1, %entry ], [ %iv.next, %loop ]
%iv.next = add nuw nsw i32 %iv, 1
%mul0 = mul nuw nsw i32 30000, %iv
%mul1 = mul nuw i32 %mul0, 30000
%cmp = icmp slt i32 %mul1, 1
br i1 %cmp, label %exit, label %loop
exit:
ret i32 0
}into the
define i32 @test() {
entry:
br label %loop
loop: ; preds = %loop, %entry
%iv = phi i32 [ 1, %entry ], [ %iv.next, %loop ]
%iv.next = add nuw nsw i32 %iv, 1
%mul0 = mul nuw nsw i32 900000000, %iv
%cmp = icmp slt i32 %mul0, 1
br i1 %cmp, label %exit, label %loop
exit: ; preds = %loop
ret i32 0
}https://godbolt.org/z/G5zvEzYEv
The resulting mul instruction has 2 flags nuw nsw, while in the source code it has nuw only. That transformation seems to be incorrect.
If we run instcombine for the case, it would provide mul nuw i32 %iv, 900000000:
https://godbolt.org/z/6oWrPbEMn