1*abaa5319SLiqinWeng; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2*abaa5319SLiqinWeng; RUN: opt -passes='require<profile-summary>,function(codegenprepare)' < %s -S | FileCheck %s 3*abaa5319SLiqinWeng 4*abaa5319SLiqinWengtarget datalayout = "e-i64:64-f80:128-n8:16:32:64-S128" 5*abaa5319SLiqinWengtarget triple = "riscv64" 6*abaa5319SLiqinWeng 7*abaa5319SLiqinWeng%struct.match_state = type { i64, i64 } 8*abaa5319SLiqinWeng 9*abaa5319SLiqinWeng; %add is also promoted by forking an extra sext. 10*abaa5319SLiqinWengdefine void @promoteTwoOne(i32 %i, i32 %j, ptr %P1, ptr %P2 ) { 11*abaa5319SLiqinWeng; CHECK-LABEL: define void @promoteTwoOne( 12*abaa5319SLiqinWeng; CHECK-SAME: i32 [[I:%.*]], i32 [[J:%.*]], ptr [[P1:%.*]], ptr [[P2:%.*]]) { 13*abaa5319SLiqinWeng; CHECK-NEXT: entry: 14*abaa5319SLiqinWeng; CHECK-NEXT: [[S2:%.*]] = sext i32 [[I]] to i64 15*abaa5319SLiqinWeng; CHECK-NEXT: [[PROMOTED2:%.*]] = sext i32 [[J]] to i64 16*abaa5319SLiqinWeng; CHECK-NEXT: [[S:%.*]] = add nsw i64 [[S2]], [[PROMOTED2]] 17*abaa5319SLiqinWeng; CHECK-NEXT: [[ADDR1:%.*]] = getelementptr inbounds i64, ptr [[P1]], i64 [[S]] 18*abaa5319SLiqinWeng; CHECK-NEXT: store i64 [[S]], ptr [[ADDR1]], align 8 19*abaa5319SLiqinWeng; CHECK-NEXT: [[ADDR2:%.*]] = getelementptr inbounds i64, ptr [[P2]], i64 [[S2]] 20*abaa5319SLiqinWeng; CHECK-NEXT: store i64 [[S2]], ptr [[ADDR2]], align 8 21*abaa5319SLiqinWeng; CHECK-NEXT: ret void 22*abaa5319SLiqinWeng; 23*abaa5319SLiqinWengentry: 24*abaa5319SLiqinWeng %add = add nsw i32 %i, %j 25*abaa5319SLiqinWeng %s = sext i32 %add to i64 26*abaa5319SLiqinWeng %addr1 = getelementptr inbounds i64, ptr %P1, i64 %s 27*abaa5319SLiqinWeng store i64 %s, ptr %addr1 28*abaa5319SLiqinWeng %s2 = sext i32 %i to i64 29*abaa5319SLiqinWeng %addr2 = getelementptr inbounds i64, ptr %P2, i64 %s2 30*abaa5319SLiqinWeng store i64 %s2, ptr %addr2 31*abaa5319SLiqinWeng ret void 32*abaa5319SLiqinWeng} 33*abaa5319SLiqinWeng 34*abaa5319SLiqinWeng; Both %add1 and %add2 are promoted by forking extra sexts. 35*abaa5319SLiqinWengdefine void @promoteTwoTwo(i32 %i, i32 %j, i32 %k, ptr %P1, ptr %P2) { 36*abaa5319SLiqinWeng; CHECK-LABEL: define void @promoteTwoTwo( 37*abaa5319SLiqinWeng; CHECK-SAME: i32 [[I:%.*]], i32 [[J:%.*]], i32 [[K:%.*]], ptr [[P1:%.*]], ptr [[P2:%.*]]) { 38*abaa5319SLiqinWeng; CHECK-NEXT: entry: 39*abaa5319SLiqinWeng; CHECK-NEXT: [[PROMOTED3:%.*]] = sext i32 [[J]] to i64 40*abaa5319SLiqinWeng; CHECK-NEXT: [[PROMOTED4:%.*]] = sext i32 [[I]] to i64 41*abaa5319SLiqinWeng; CHECK-NEXT: [[S:%.*]] = add nsw i64 [[PROMOTED3]], [[PROMOTED4]] 42*abaa5319SLiqinWeng; CHECK-NEXT: [[ADDR1:%.*]] = getelementptr inbounds i64, ptr [[P1]], i64 [[S]] 43*abaa5319SLiqinWeng; CHECK-NEXT: store i64 [[S]], ptr [[ADDR1]], align 8 44*abaa5319SLiqinWeng; CHECK-NEXT: [[PROMOTED2:%.*]] = sext i32 [[K]] to i64 45*abaa5319SLiqinWeng; CHECK-NEXT: [[S2:%.*]] = add nsw i64 [[PROMOTED3]], [[PROMOTED2]] 46*abaa5319SLiqinWeng; CHECK-NEXT: [[ADDR2:%.*]] = getelementptr inbounds i64, ptr [[P2]], i64 [[S2]] 47*abaa5319SLiqinWeng; CHECK-NEXT: store i64 [[S2]], ptr [[ADDR2]], align 8 48*abaa5319SLiqinWeng; CHECK-NEXT: ret void 49*abaa5319SLiqinWeng; 50*abaa5319SLiqinWengentry: 51*abaa5319SLiqinWeng %add1 = add nsw i32 %j, %i 52*abaa5319SLiqinWeng %s = sext i32 %add1 to i64 53*abaa5319SLiqinWeng %addr1 = getelementptr inbounds i64, ptr %P1, i64 %s 54*abaa5319SLiqinWeng store i64 %s, ptr %addr1 55*abaa5319SLiqinWeng %add2 = add nsw i32 %j, %k 56*abaa5319SLiqinWeng %s2 = sext i32 %add2 to i64 57*abaa5319SLiqinWeng %addr2 = getelementptr inbounds i64, ptr %P2, i64 %s2 58*abaa5319SLiqinWeng store i64 %s2, ptr %addr2 59*abaa5319SLiqinWeng ret void 60*abaa5319SLiqinWeng} 61*abaa5319SLiqinWeng 62*abaa5319SLiqinWengdefine i64 @promoteGEPSunk(i1 %cond, ptr %base, i32 %i) { 63*abaa5319SLiqinWeng; CHECK-LABEL: define i64 @promoteGEPSunk( 64*abaa5319SLiqinWeng; CHECK-SAME: i1 [[COND:%.*]], ptr [[BASE:%.*]], i32 [[I:%.*]]) { 65*abaa5319SLiqinWeng; CHECK-NEXT: entry: 66*abaa5319SLiqinWeng; CHECK-NEXT: [[PROMOTED1:%.*]] = sext i32 [[I]] to i64 67*abaa5319SLiqinWeng; CHECK-NEXT: [[S:%.*]] = add nsw i64 [[PROMOTED1]], 1 68*abaa5319SLiqinWeng; CHECK-NEXT: [[ADDR:%.*]] = getelementptr inbounds i64, ptr [[BASE]], i64 [[S]] 69*abaa5319SLiqinWeng; CHECK-NEXT: [[S2:%.*]] = add nsw i64 [[PROMOTED1]], 2 70*abaa5319SLiqinWeng; CHECK-NEXT: [[ADDR2:%.*]] = getelementptr inbounds i64, ptr [[BASE]], i64 [[S2]] 71*abaa5319SLiqinWeng; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_THEN2:%.*]] 72*abaa5319SLiqinWeng; CHECK: if.then: 73*abaa5319SLiqinWeng; CHECK-NEXT: [[V:%.*]] = load i64, ptr [[ADDR]], align 8 74*abaa5319SLiqinWeng; CHECK-NEXT: [[V2:%.*]] = load i64, ptr [[ADDR2]], align 8 75*abaa5319SLiqinWeng; CHECK-NEXT: [[R:%.*]] = add i64 [[V]], [[V2]] 76*abaa5319SLiqinWeng; CHECK-NEXT: ret i64 [[R]] 77*abaa5319SLiqinWeng; CHECK: if.then2: 78*abaa5319SLiqinWeng; CHECK-NEXT: ret i64 0 79*abaa5319SLiqinWeng; 80*abaa5319SLiqinWengentry: 81*abaa5319SLiqinWeng %add = add nsw i32 %i, 1 82*abaa5319SLiqinWeng %s = sext i32 %add to i64 83*abaa5319SLiqinWeng %addr = getelementptr inbounds i64, ptr %base, i64 %s 84*abaa5319SLiqinWeng %add2 = add nsw i32 %i, 2 85*abaa5319SLiqinWeng %s2 = sext i32 %add2 to i64 86*abaa5319SLiqinWeng %addr2 = getelementptr inbounds i64, ptr %base, i64 %s2 87*abaa5319SLiqinWeng br i1 %cond, label %if.then, label %if.then2 88*abaa5319SLiqinWengif.then: 89*abaa5319SLiqinWeng %v = load i64, ptr %addr 90*abaa5319SLiqinWeng %v2 = load i64, ptr %addr2 91*abaa5319SLiqinWeng %r = add i64 %v, %v2 92*abaa5319SLiqinWeng ret i64 %r 93*abaa5319SLiqinWengif.then2: 94*abaa5319SLiqinWeng ret i64 0; 95*abaa5319SLiqinWeng} 96