1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -loop-reduce -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-i64:64-v16:16-v32:32-n16:32:64" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; for (int i = 0; i < n; ++i) { 6*9880d681SAndroid Build Coastguard Worker; use(i * 5 + 3); 7*9880d681SAndroid Build Coastguard Worker; // i * a + b is ephemeral and shouldn't be promoted by LSR 8*9880d681SAndroid Build Coastguard Worker; __builtin_assume(i * a + b >= 0); 9*9880d681SAndroid Build Coastguard Worker; } 10*9880d681SAndroid Build Coastguard Workerdefine void @ephemeral(i32 %a, i32 %b, i32 %n) { 11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @ephemeral( 12*9880d681SAndroid Build Coastguard Workerentry: 13*9880d681SAndroid Build Coastguard Worker br label %loop 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerloop: 16*9880d681SAndroid Build Coastguard Worker %i = phi i32 [ 0, %entry ], [ %inc, %loop ] 17*9880d681SAndroid Build Coastguard Worker ; Only i and i * 5 + 3 should be indvars, not i * a + b. 18*9880d681SAndroid Build Coastguard Worker; CHECK: phi i32 19*9880d681SAndroid Build Coastguard Worker; CHECK: phi i32 20*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: phi i32 21*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %i, 1 22*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i32 %inc, %n 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Worker %0 = mul nsw i32 %i, 5 25*9880d681SAndroid Build Coastguard Worker %1 = add nsw i32 %0, 3 26*9880d681SAndroid Build Coastguard Worker call void @use(i32 %1) 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker %2 = mul nsw i32 %i, %a 29*9880d681SAndroid Build Coastguard Worker %3 = add nsw i32 %2, %b 30*9880d681SAndroid Build Coastguard Worker %4 = icmp sgt i32 %3, -1 31*9880d681SAndroid Build Coastguard Worker call void @llvm.assume(i1 %4) 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %exit, label %loop 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerexit: 36*9880d681SAndroid Build Coastguard Worker ret void 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdeclare void @use(i32) 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.assume(i1) 42