1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -indvars < %s | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Check that SCEV does not assume sub nuw X Y == add nuw X, -Y 4*9880d681SAndroid Build Coastguard Workerdefine void @f(i32* %loc) { 5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @f 6*9880d681SAndroid Build Coastguard Worker entry: 7*9880d681SAndroid Build Coastguard Worker br label %loop 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker loop: 10*9880d681SAndroid Build Coastguard Worker %idx = phi i32 [ 6, %entry ], [ %idx.dec, %loop ] 11*9880d681SAndroid Build Coastguard Worker store i32 %idx, i32* %loc 12*9880d681SAndroid Build Coastguard Worker %idx.dec = sub nuw i32 %idx, 1 13*9880d681SAndroid Build Coastguard Worker %cond = icmp uge i32 %idx.dec, 5 14*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %loop, label %exit 15*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: br i1 true, label %loop, label %exit 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker exit: 18*9880d681SAndroid Build Coastguard Worker ret void 19*9880d681SAndroid Build Coastguard Worker} 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerdeclare void @use_i1(i1) 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker; Check that SCEV does not assume sub nsw X Y == add nsw X, -Y 24*9880d681SAndroid Build Coastguard Workerdefine void @g(i32 %lim) { 25*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @g 26*9880d681SAndroid Build Coastguard Worker entry: 27*9880d681SAndroid Build Coastguard Worker br label %loop 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Worker loop: 30*9880d681SAndroid Build Coastguard Worker %idx = phi i32 [ -1, %entry ], [ %idx.dec, %loop ] 31*9880d681SAndroid Build Coastguard Worker %t = icmp sgt i32 %idx, 0 32*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @use_i1(i1 false) 33*9880d681SAndroid Build Coastguard Worker; CHECK: call void @use_i1(i1 %t) 34*9880d681SAndroid Build Coastguard Worker call void @use_i1(i1 %t) 35*9880d681SAndroid Build Coastguard Worker %idx.dec = sub nsw i32 %idx, -2147483648 36*9880d681SAndroid Build Coastguard Worker %cond = icmp eq i32 %idx.dec, %lim 37*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %loop, label %exit 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker exit: 40*9880d681SAndroid Build Coastguard Worker ret void 41*9880d681SAndroid Build Coastguard Worker} 42