1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -analyze -iv-users | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Provide legal integer types. 4*9880d681SAndroid Build Coastguard Workertarget datalayout = "n8:16:32:64" 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; The value of %r is dependent on a polynomial iteration expression. 7*9880d681SAndroid Build Coastguard Worker; 8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: IV Users for loop %foo.loop 9*9880d681SAndroid Build Coastguard Worker; CHECK: {1,+,3,+,2}<%foo.loop> 10*9880d681SAndroid Build Coastguard Workerdefine i64 @foo(i64 %n) { 11*9880d681SAndroid Build Coastguard Workerentry: 12*9880d681SAndroid Build Coastguard Worker br label %foo.loop 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Workerfoo.loop: 15*9880d681SAndroid Build Coastguard Worker %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %foo.loop ] 16*9880d681SAndroid Build Coastguard Worker %indvar.next = add i64 %indvar, 1 17*9880d681SAndroid Build Coastguard Worker %c = icmp eq i64 %indvar.next, %n 18*9880d681SAndroid Build Coastguard Worker br i1 %c, label %exit, label %foo.loop 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerexit: 21*9880d681SAndroid Build Coastguard Worker %r = mul i64 %indvar.next, %indvar.next 22*9880d681SAndroid Build Coastguard Worker ret i64 %r 23*9880d681SAndroid Build Coastguard Worker} 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard Worker; PR15470: LSR miscompile. The test2 function should return '1'. 26*9880d681SAndroid Build Coastguard Worker; 27*9880d681SAndroid Build Coastguard Worker; SCEV does not know how to denormalize chained recurrences, so make 28*9880d681SAndroid Build Coastguard Worker; sure they aren't marked as post-inc users. 29*9880d681SAndroid Build Coastguard Worker; 30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: IV Users for loop %test2.loop 31*9880d681SAndroid Build Coastguard Worker; CHECK: %sext.us = {0,+,(16777216 + (-16777216 * %sub.us))<nuw><nsw>,+,33554432}<%test2.loop> in %f = ashr i32 %sext.us, 24 32*9880d681SAndroid Build Coastguard Workerdefine i32 @test2() { 33*9880d681SAndroid Build Coastguard Workerentry: 34*9880d681SAndroid Build Coastguard Worker br label %test2.loop 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workertest2.loop: 37*9880d681SAndroid Build Coastguard Worker %inc1115.us = phi i32 [ 0, %entry ], [ %inc11.us, %test2.loop ] 38*9880d681SAndroid Build Coastguard Worker %inc11.us = add nsw i32 %inc1115.us, 1 39*9880d681SAndroid Build Coastguard Worker %cmp.us = icmp slt i32 %inc11.us, 2 40*9880d681SAndroid Build Coastguard Worker br i1 %cmp.us, label %test2.loop, label %for.end 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerfor.end: 43*9880d681SAndroid Build Coastguard Worker %tobool.us = icmp eq i32 %inc1115.us, 0 44*9880d681SAndroid Build Coastguard Worker %sub.us = select i1 %tobool.us, i32 0, i32 0 45*9880d681SAndroid Build Coastguard Worker %mul.us = shl i32 %inc1115.us, 24 46*9880d681SAndroid Build Coastguard Worker %sub.cond.us = sub nsw i32 %inc1115.us, %sub.us 47*9880d681SAndroid Build Coastguard Worker %sext.us = mul i32 %mul.us, %sub.cond.us 48*9880d681SAndroid Build Coastguard Worker %f = ashr i32 %sext.us, 24 49*9880d681SAndroid Build Coastguard Worker br label %exit 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerexit: 52*9880d681SAndroid Build Coastguard Worker ret i32 %f 53*9880d681SAndroid Build Coastguard Worker} 54