1 ; RUN: opt -codegenprepare < %s -S | FileCheck %s 2 3 target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" 4 target triple = "aarch64--linux-gnu" 5 6 %struct.match_state = type { i64, i64 } 7 8 ; %add is also promoted by forking an extra sext. 9 define void @promoteTwoOne(i32 %i, i32 %j, i64* %P1, i64* %P2 ) { 10 ; CHECK-LABEL: @promoteTwoOne 11 ; CHECK-LABEL: entry: 12 ; CHECK: %[[SEXT1:.*]] = sext i32 %i to i64 13 ; CHECK: %[[SEXT2:.*]] = sext i32 %j to i64 14 ; CHECK: %add = add nsw i64 %[[SEXT1]], %[[SEXT2]] 15 entry: 16 %add = add nsw i32 %i, %j 17 %s = sext i32 %add to i64 18 %addr1 = getelementptr inbounds i64, i64* %P1, i64 %s 19 store i64 %s, i64* %addr1 20 %s2 = sext i32 %i to i64 21 %addr2 = getelementptr inbounds i64, i64* %P2, i64 %s2 22 store i64 %s2, i64* %addr2 23 ret void 24 } 25 26 ; Both %add1 and %add2 are promoted by forking extra sexts. 27 define void @promoteTwoTwo(i32 %i, i32 %j, i32 %k, i64* %P1, i64* %P2) { 28 ; CHECK-LABEL: @promoteTwoTwo 29 ; CHECK-LABEL:entry: 30 ; CHECK: %[[SEXT1:.*]] = sext i32 %j to i64 31 ; CHECK: %[[SEXT2:.*]] = sext i32 %i to i64 32 ; CHECK: %add1 = add nsw i64 %[[SEXT1]], %[[SEXT2]] 33 ; CHECK: %[[SEXT3:.*]] = sext i32 %k to i64 34 ; CHECK: %add2 = add nsw i64 %[[SEXT1]], %[[SEXT3]] 35 entry: 36 %add1 = add nsw i32 %j, %i 37 %s = sext i32 %add1 to i64 38 %addr1 = getelementptr inbounds i64, i64* %P1, i64 %s 39 store i64 %s, i64* %addr1 40 %add2 = add nsw i32 %j, %k 41 %s2 = sext i32 %add2 to i64 42 %addr2 = getelementptr inbounds i64, i64* %P2, i64 %s2 43 store i64 %s2, i64* %addr2 44 ret void 45 } 46 47 define i64 @promoteGEPSunk(i1 %cond, i64* %base, i32 %i) { 48 ; CHECK-LABEL: @promoteGEPSunk 49 ; CHECK-LABEL: entry: 50 ; CHECK: %[[SEXT:.*]] = sext i32 %i to i64 51 ; CHECK: %add = add nsw i64 %[[SEXT]], 1 52 ; CHECK: %add2 = add nsw i64 %[[SEXT]], 2 53 entry: 54 %add = add nsw i32 %i, 1 55 %s = sext i32 %add to i64 56 %addr = getelementptr inbounds i64, i64* %base, i64 %s 57 %add2 = add nsw i32 %i, 2 58 %s2 = sext i32 %add2 to i64 59 %addr2 = getelementptr inbounds i64, i64* %base, i64 %s2 60 br i1 %cond, label %if.then, label %if.then2 61 if.then: 62 %v = load i64, i64* %addr 63 %v2 = load i64, i64* %addr2 64 %r = add i64 %v, %v2 65 ret i64 %r 66 if.then2: 67 ret i64 0; 68 } 69