Issue |
135531
|
Summary |
[SCEV] Incorrect scev result
|
Labels |
miscompilation,
llvm:SCEV
|
Assignees |
dtcxzyw
|
Reporter |
dtcxzyw
|
Reproducer:
```
; bin/opt -passes="print<scalar-evolution>" test.ll -S
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@g = global i64 1013947741822887439
define i32 @main() {
entry:
%.promoted60.i.i = load i64, ptr @g, align 8
%0 = trunc i64 %.promoted60.i.i to i32
%conv661.i.i = and i32 %0, 16382
%cond.i1408.i.i = sub nsw i32 0, %conv661.i.i
%1 = and i32 %cond.i1408.i.i, 268431360
ret i32 %1
}
```
```
Printing analysis 'Scalar Evolution Analysis' for function 'main':
Classifying expressions for: @main
%.promoted60.i.i = load i64, ptr @g, align 8
--> %.promoted60.i.i U: full-set S: full-set
%0 = trunc i64 %.promoted60.i.i to i32
--> (trunc i64 %.promoted60.i.i to i32) U: full-set S: full-set
%conv661.i.i = and i32 %0, 16382
--> (2 * (zext i13 (trunc i32 ((trunc i64 %.promoted60.i.i to i32) /u 2) to i13) to i32))<nuw><nsw> U: [0,16383) S: [0,16383)
%cond.i1408.i.i = sub nsw i32 0, %conv661.i.i
--> (-2 * (zext i13 (trunc i32 ((trunc i64 %.promoted60.i.i to i32) /u 2) to i13) to i32))<nsw> U: [0,-1) S: [-16382,1)
%1 = and i32 %cond.i1408.i.i, 268431360
--> (4096 * (zext i16 (trunc i32 ((2147483647 * (zext i13 (trunc i32 ((trunc i64 %.promoted60.i.i to i32) /u 2) to i13) to i32))<nuw><nsw> /u 2048) to i16) to i32))<nuw><nsw> U: [0,268431361) S: [0,268431361)
```
llubi output:
```
Entering function main
%.promoted60.i.i = load i64, ptr @g, align 8 -> i64 1013947741822887439
%0 = trunc i64 %.promoted60.i.i to i32 -> i32 1546233359
%conv661.i.i = and i32 %0, 16382 -> i32 9742
%cond.i1408.i.i = sub nsw i32 0, %conv661.i.i -> i32 -9742
%1 = and i32 %cond.i1408.i.i, 268431360 -> i32 268423168 (4096 * (zext i16 (trunc i32 ((2147483647 * (zext i13 (trunc i32 ((trunc i64 %.promoted60.i.i to i32) /u 2) to i13) to i32))<nuw><nsw> /u 2048) to i16) to i32))<nuw><nsw> = poison
(zext i16 (trunc i32 ((2147483647 * (zext i13 (trunc i32 ((trunc i64 %.promoted60.i.i to i32) /u 2) to i13) to i32))<nuw><nsw> /u 2048) to i16) to i32) = poison
(trunc i32 ((2147483647 * (zext i13 (trunc i32 ((trunc i64 %.promoted60.i.i to i32) /u 2) to i13) to i32))<nuw><nsw> /u 2048) to i16) = poison
((2147483647 * (zext i13 (trunc i32 ((trunc i64 %.promoted60.i.i to i32) /u 2) to i13) to i32))<nuw><nsw> /u 2048) = poison
(2147483647 * (zext i13 (trunc i32 ((trunc i64 %.promoted60.i.i to i32) /u 2) to i13) to i32))<nuw><nsw> = poison
(zext i13 (trunc i32 ((trunc i64 %.promoted60.i.i to i32) /u 2) to i13) to i32) = 4871
(trunc i32 ((trunc i64 %.promoted60.i.i to i32) /u 2) to i13) = -3321
((trunc i64 %.promoted60.i.i to i32) /u 2) = 773116679
(trunc i64 %.promoted60.i.i to i32) = 1546233359
%.promoted60.i.i = 1013947741822887439
UB triggered: SCEV result is more poisonous than real value
%1 = and i32 %cond.i1408.i.i, 268431360 = i32 268423168
(4096 * (zext i16 (trunc i32 ((2147483647 * (zext i13 (trunc i32 ((trunc i64 %.promoted60.i.i to i32) /u 2) to i13) to i32))<nuw><nsw> /u 2048) to i16) to i32))<nuw><nsw> = poison
Exited with immediate UB.
Stacktrace:
%1 = and i32 %cond.i1408.i.i, 268431360 at @main
```
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs